BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
gui2::QuickSimController Class Reference

Provides quick reflectometry simulations on any change of SampleModel and MaterialModel. More...

Inheritance diagram for gui2::QuickSimController:
[legend]
Collaboration diagram for gui2::QuickSimController:
[legend]

Public Slots

void onInterruptRequest ()
 Requests interruption of running simulaitons. More...
 
void onRealTimeRequest (bool status)
 
void onRunSimulationRequest ()
 Processes multilayer on request. Doesn't work in real time mode. More...
 

Signals

void progressChanged (int value)
 

Public Member Functions

 QuickSimController (QObject *parent=nullptr)
 
 ~QuickSimController ()
 
void setModels (ApplicationModels *models)
 

Private Slots

void onMultiLayerChange ()
 Processes multilayer on any model change. Works only in realtime mode. More...
 
void onSimulationCompleted ()
 Takes simulation results from JobManager and write into the model. More...
 

Private Member Functions

InstrumentModelinstrumentModel () const
 
JobModeljobModel () const
 
void process_multilayer (bool submit_simulation=false)
 Constructs multislice, calculates profile and submits specular simulation. More...
 
void setup_jobmanager_connections ()
 Connect signals going from JobManager. More...
 
void submit_specular_simulation (const multislice_t &multislice)
 Submit data to JobManager for consequent specular simulation in a separate thread. More...
 
void update_sld_profile (const multislice_t &multilayer)
 Calculates sld profile from slice and immediately update data items. More...
 

Private Attributes

std::unique_ptr< ModelView::ModelHasChangedControllerm_instrumentChangedController
 
bool m_isRealTimeMode
 
JobManagerm_jobManager {nullptr}
 
std::unique_ptr< ModelView::ModelHasChangedControllerm_materialChangedController
 Run simulation on every parameter change. More...
 
ApplicationModelsm_models {nullptr}
 
std::unique_ptr< ModelView::ModelHasChangedControllerm_sampleChangedController
 

Detailed Description

Provides quick reflectometry simulations on any change of SampleModel and MaterialModel.

Listens for any change in SampleModel and MaterialModel, extracts the data needed for the simulation, and then submit simulation request to JobManager. As soon as JobManager reports about completed simulations, extract results from there and put them into JobModel.

Definition at line 39 of file quicksimcontroller.h.

Constructor & Destructor Documentation

◆ QuickSimController()

gui2::QuickSimController::QuickSimController ( QObject *  parent = nullptr)

Definition at line 38 of file quicksimcontroller.cpp.

39  : QObject(parent)
40  , m_jobManager(new JobManager(this))
42 {
43 }
const bool live_simulation_default_on
Initial state of some widgets.
Definition: app_constants.h:29

◆ ~QuickSimController()

gui2::QuickSimController::~QuickSimController ( )
default

Member Function Documentation

◆ instrumentModel()

InstrumentModel * gui2::QuickSimController::instrumentModel ( ) const
private

Definition at line 146 of file quicksimcontroller.cpp.

147 {
148  return m_models->instrumentModel();
149 }
InstrumentModel * instrumentModel()
ApplicationModels * m_models

References gui2::ApplicationModels::instrumentModel(), and m_models.

Referenced by submit_specular_simulation().

Here is the call graph for this function:

◆ jobModel()

JobModel * gui2::QuickSimController::jobModel ( ) const
private

Definition at line 141 of file quicksimcontroller.cpp.

142 {
143  return m_models->jobModel();
144 }

References gui2::ApplicationModels::jobModel(), and m_models.

Referenced by onSimulationCompleted(), setModels(), and update_sld_profile().

Here is the call graph for this function:

◆ onInterruptRequest

void gui2::QuickSimController::onInterruptRequest ( )
slot

Requests interruption of running simulaitons.

Definition at line 67 of file quicksimcontroller.cpp.

68 {
70 }
void onInterruptRequest()
Processes interrupt request by setting corresponding flag.
Definition: jobmanager.cpp:59

References m_jobManager, and gui2::JobManager::onInterruptRequest().

Referenced by gui2::QuickSimEditor::setup_toolbar_connections().

Here is the call graph for this function:

◆ onMultiLayerChange

void gui2::QuickSimController::onMultiLayerChange ( )
privateslot

Processes multilayer on any model change. Works only in realtime mode.

Definition at line 86 of file quicksimcontroller.cpp.

87 {
88  process_multilayer(/*submit_simulation*/ m_isRealTimeMode);
89 }
void process_multilayer(bool submit_simulation=false)
Constructs multislice, calculates profile and submits specular simulation.

References m_isRealTimeMode, and process_multilayer().

Referenced by setModels().

Here is the call graph for this function:

◆ onRealTimeRequest

void gui2::QuickSimController::onRealTimeRequest ( bool  status)
slot

Definition at line 72 of file quicksimcontroller.cpp.

73 {
74  m_isRealTimeMode = status;
75 }

References m_isRealTimeMode.

Referenced by gui2::QuickSimEditor::setup_toolbar_connections().

◆ onRunSimulationRequest

void gui2::QuickSimController::onRunSimulationRequest ( )
slot

Processes multilayer on request. Doesn't work in real time mode.

Definition at line 79 of file quicksimcontroller.cpp.

80 {
81  process_multilayer(/*submit_simulation*/ true);
82 }

References process_multilayer().

Referenced by gui2::QuickSimEditor::setup_toolbar_connections().

Here is the call graph for this function:

◆ onSimulationCompleted

void gui2::QuickSimController::onSimulationCompleted ( )
privateslot

Takes simulation results from JobManager and write into the model.

Definition at line 93 of file quicksimcontroller.cpp.

94 {
96 }
SimulationResult simulationResult()
Returns vector representing results of a simulation.
Definition: jobmanager.cpp:36
void updateSpecularData(const SimulationResult &data)
Updates specular data in JobItem from simulation results.
Definition: jobmodel.cpp:71

References jobModel(), m_jobManager, gui2::JobManager::simulationResult(), and gui2::JobModel::updateSpecularData().

Referenced by setup_jobmanager_connections().

Here is the call graph for this function:

◆ process_multilayer()

void gui2::QuickSimController::process_multilayer ( bool  submit_simulation = false)
private

Constructs multislice, calculates profile and submits specular simulation.

Definition at line 100 of file quicksimcontroller.cpp.

101 {
102  auto multilayer = m_models->sampleModel()->topItem<MultiLayerItem>();
103  auto slices = Utils::CreateMultiSlice(*multilayer);
104  update_sld_profile(slices);
105  if (submit_simulation)
107 }
T * topItem() const
Returns top item of the given type.
Definition: sessionmodel.h:126
void update_sld_profile(const multislice_t &multilayer)
Calculates sld profile from slice and immediately update data items.
void submit_specular_simulation(const multislice_t &multislice)
Submit data to JobManager for consequent specular simulation in a separate thread.
DAREFLCORE_EXPORT multislice_t CreateMultiSlice(const MultiLayerItem &multilayer)
Creates multi-slice presentation of internal multilayer structure.

References gui2::Utils::CreateMultiSlice(), m_models, gui2::ApplicationModels::sampleModel(), submit_specular_simulation(), ModelView::SessionModel::topItem(), and update_sld_profile().

Referenced by onMultiLayerChange(), and onRunSimulationRequest().

Here is the call graph for this function:

◆ progressChanged

void gui2::QuickSimController::progressChanged ( int  value)
signal

◆ setModels()

void gui2::QuickSimController::setModels ( ApplicationModels models)

Definition at line 47 of file quicksimcontroller.cpp.

48 {
49  m_models = models;
50 
51  auto on_model_change = [this]() { onMultiLayerChange(); };
52  m_materialChangedController = std::make_unique<ModelView::ModelHasChangedController>(
53  m_models->materialModel(), on_model_change);
54  m_sampleChangedController = std::make_unique<ModelView::ModelHasChangedController>(
55  m_models->sampleModel(), on_model_change);
56  m_instrumentChangedController = std::make_unique<ModelView::ModelHasChangedController>(
57  m_models->instrumentModel(), on_model_change);
58 
60 
63 }
virtual void setViewportToContent(double left, double top, double right, double bottom)
Sets range of x,y window to show all data.
MaterialModel * materialModel()
ModelView::GraphViewportItem * sldViewport() const
Definition: jobmodel.cpp:49
std::unique_ptr< ModelView::ModelHasChangedController > m_sampleChangedController
std::unique_ptr< ModelView::ModelHasChangedController > m_instrumentChangedController
void onMultiLayerChange()
Processes multilayer on any model change. Works only in realtime mode.
std::unique_ptr< ModelView::ModelHasChangedController > m_materialChangedController
Run simulation on every parameter change.
void setup_jobmanager_connections()
Connect signals going from JobManager.

References gui2::ApplicationModels::instrumentModel(), jobModel(), m_instrumentChangedController, m_materialChangedController, m_models, m_sampleChangedController, gui2::ApplicationModels::materialModel(), onMultiLayerChange(), gui2::ApplicationModels::sampleModel(), setup_jobmanager_connections(), ModelView::ViewportItem::setViewportToContent(), and gui2::JobModel::sldViewport().

Referenced by gui2::QuickSimEditor::setModels().

Here is the call graph for this function:

◆ setup_jobmanager_connections()

void gui2::QuickSimController::setup_jobmanager_connections ( )
private

Connect signals going from JobManager.

Connections are made queued since signals are emitted from non-GUI thread and we want to deal with widgets.

Definition at line 129 of file quicksimcontroller.cpp.

130 {
131 
132  // Simulation progress is propagated from JobManager to this controller for further forwarding.
134  Qt::QueuedConnection);
135 
136  // Notification about completed simulation from jobManager to this controller.
138  &QuickSimController::onSimulationCompleted, Qt::QueuedConnection);
139 }
void simulationCompleted()
void progressChanged(int value)
void onSimulationCompleted()
Takes simulation results from JobManager and write into the model.
void progressChanged(int value)

References m_jobManager, onSimulationCompleted(), gui2::JobManager::progressChanged(), progressChanged(), and gui2::JobManager::simulationCompleted().

Referenced by setModels().

Here is the call graph for this function:

◆ submit_specular_simulation()

void gui2::QuickSimController::submit_specular_simulation ( const multislice_t multislice)
private

Submit data to JobManager for consequent specular simulation in a separate thread.

Definition at line 119 of file quicksimcontroller.cpp.

120 {
121  auto instrument = instrumentModel()->topItem<SpecularInstrumentItem>();
122  auto beam = instrument->beamItem();
123  m_jobManager->requestSimulation(multislice, beam->qScanValues(), beam->intensity());
124 }
SpecularBeamItem * beamItem() const override
void requestSimulation(const multislice_t &multislice, const std::vector< double > &qvalues, double intensity)
Performs simulation request.
Definition: jobmanager.cpp:45
InstrumentModel * instrumentModel() const

References gui2::SpecularInstrumentItem::beamItem(), instrumentModel(), m_jobManager, gui2::JobManager::requestSimulation(), and ModelView::SessionModel::topItem().

Referenced by process_multilayer().

Here is the call graph for this function:

◆ update_sld_profile()

void gui2::QuickSimController::update_sld_profile ( const multislice_t multilayer)
private

Calculates sld profile from slice and immediately update data items.

Definition at line 111 of file quicksimcontroller.cpp.

112 {
113  auto data = SpecularToySimulation::sld_profile(multislice, profile_points_count);
114  jobModel()->updateSLDProfile(data);
115 }
void updateSLDProfile(const SLDProfile &data)
Updates SLD profile data.
Definition: jobmodel.cpp:83
static SLDProfile sld_profile(const multislice_t &multislice, int n_points)

References jobModel(), gui2::SpecularToySimulation::sld_profile(), and gui2::JobModel::updateSLDProfile().

Referenced by process_multilayer().

Here is the call graph for this function:

Member Data Documentation

◆ m_instrumentChangedController

std::unique_ptr<ModelView::ModelHasChangedController> gui2::QuickSimController::m_instrumentChangedController
private

Definition at line 76 of file quicksimcontroller.h.

Referenced by setModels().

◆ m_isRealTimeMode

bool gui2::QuickSimController::m_isRealTimeMode
private

Definition at line 72 of file quicksimcontroller.h.

Referenced by onMultiLayerChange(), and onRealTimeRequest().

◆ m_jobManager

JobManager* gui2::QuickSimController::m_jobManager {nullptr}
private

◆ m_materialChangedController

std::unique_ptr<ModelView::ModelHasChangedController> gui2::QuickSimController::m_materialChangedController
private

Run simulation on every parameter change.

Definition at line 74 of file quicksimcontroller.h.

Referenced by setModels().

◆ m_models

ApplicationModels* gui2::QuickSimController::m_models {nullptr}
private

Definition at line 69 of file quicksimcontroller.h.

Referenced by instrumentModel(), jobModel(), process_multilayer(), and setModels().

◆ m_sampleChangedController

std::unique_ptr<ModelView::ModelHasChangedController> gui2::QuickSimController::m_sampleChangedController
private

Definition at line 75 of file quicksimcontroller.h.

Referenced by setModels().


The documentation for this class was generated from the following files: