BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GUIObjectBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/GUIObjectBuilder.cpp
6 //! @brief Implements GUIObjectBuilder namespace
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "Base/Const/Units.h"
29 
30 namespace {
31 GISASInstrumentItem* createGISASInstrumentItem(InstrumentModel* model,
32  const GISASSimulation& simulation,
33  const QString& name);
34 
35 OffSpecularInstrumentItem* createOffSpecularInstrumentItem(InstrumentModel* model,
36  const OffSpecularSimulation& simulation,
37  const QString& name);
38 
39 SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentModel* model,
40  const SpecularSimulation& simulation,
41  const QString& name);
42 } // namespace
43 
45  MaterialModel* materialModel,
46  const ISimulation& simulation)
47 {
48  std::unique_ptr<ISimulation> sim(simulation.clone());
49  sim->prepareSimulation();
50  SessionItem* item = populateSampleModel(sampleModel, materialModel, *sim->sample());
51  return item;
52 }
53 
55  MaterialModel* materialModel,
56  const MultiLayer& sample,
57  const QString& sample_name)
58 {
59  GUIDomainSampleVisitor visitor;
60  return visitor.populateSampleModel(sampleModel, materialModel, sample, sample_name);
61 }
62 
64  const ISimulation& simulation,
65  const QString& instrument_name)
66 {
67  ASSERT(p_instrument_model);
68 
69  QString name = instrument_name.isEmpty()
70  ? QString::fromStdString(simulation.instrument().getName())
71  : instrument_name;
72 
73  if (auto gisasSimulation = dynamic_cast<const GISASSimulation*>(&simulation)) {
74  return createGISASInstrumentItem(p_instrument_model, *gisasSimulation, name);
75  } else if (auto offSpecSimulation = dynamic_cast<const OffSpecularSimulation*>(&simulation)) {
76  return createOffSpecularInstrumentItem(p_instrument_model, *offSpecSimulation, name);
77  } else if (auto spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation)) {
78  return createSpecularInstrumentItem(p_instrument_model, *spec_simulation, name);
79  }
80 
81  throw GUIHelpers::Error("GUIObjectBuilder::populateInstrumentModel() -> Error. ISimulation is "
82  "not yet supported");
83 }
84 
86  const ISimulation& simulation)
87 {
88  auto p_options_item = p_document_model->insertItem<SimulationOptionsItem>();
89  if (simulation.getOptions().isIntegrate()) {
90  p_options_item->setComputationMethod("Monte-Carlo Integration");
91  p_options_item->setNumberOfMonteCarloPoints(
92  static_cast<int>(simulation.getOptions().getMcPoints()));
93  }
94  if (simulation.getOptions().useAvgMaterials()) {
95  p_options_item->setFresnelMaterialMethod("Average Layer Material");
96  }
97  if (simulation.getOptions().includeSpecular()) {
98  p_options_item->setIncludeSpecularPeak("Yes");
99  }
100  return p_options_item;
101 }
102 
103 namespace {
104 GISASInstrumentItem* createGISASInstrumentItem(InstrumentModel* model,
105  const GISASSimulation& simulation,
106  const QString& name)
107 {
108  auto result = model->insertItem<GISASInstrumentItem>();
109  result->setItemName(name);
110  TransformFromDomain::setGISASBeamItem(result->beamItem(), simulation);
111  TransformFromDomain::setDetector(result, simulation);
112  TransformFromDomain::setBackground(result, simulation);
113 
114  return result;
115 }
116 
117 OffSpecularInstrumentItem* createOffSpecularInstrumentItem(InstrumentModel* model,
118  const OffSpecularSimulation& simulation,
119  const QString& name)
120 {
121  auto result = model->insertItem<OffSpecularInstrumentItem>();
122  result->setItemName(name);
123  TransformFromDomain::setOffSpecularBeamItem(result->beamItem(), simulation);
124  TransformFromDomain::setDetector(result, simulation);
125  TransformFromDomain::setBackground(result, simulation);
126 
127  auto axisItem = result->getItem(OffSpecularInstrumentItem::P_ALPHA_AXIS);
128  TransformFromDomain::setAxisItem(axisItem, *simulation.beamAxis(), 1. / Units::deg);
129 
130  return result;
131 }
132 
133 SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentModel* model,
134  const SpecularSimulation& simulation,
135  const QString& name)
136 {
137  auto result = model->insertItem<SpecularInstrumentItem>();
138  result->setItemName(name);
139  TransformFromDomain::setSpecularBeamItem(result->beamItem(), simulation);
140  TransformFromDomain::setBackground(result, simulation);
141 
142  return result;
143 }
144 } // namespace
#define ASSERT(condition)
Definition: Assert.h:31
Defines class DocumentModel.
Defines class GISASSimulation.
Defines class GUIDomainSampleVisitor.
Defines class GUIHelpers functions.
Defines GUIObjectBuilder namespace.
Defines InstrumentItems classes.
Defines class InstrumentModel.
Defines class MultiLayer.
Defines class OffSpecularSimulation.
Defines class SampleModel.
Defines class SimulationOptionsItem.
Defines class SpecularSimulation.
Defines namespace TransformFromDomain.
Defines some unit conversion factors and other constants in namespace Units.
The DocumentModel class is a model with GUI settings related to the opened project.
Definition: DocumentModel.h:25
Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
Visits domain sample tree to build GUI presentation.
SessionItem * populateSampleModel(SampleModel *sampleModel, MaterialModel *materialModel, const MultiLayer &sample, const QString &sample_name="")
const std::string & getName() const
Abstract base class of OffSpecularSimulation, GISASSimulation and SpecularSimulation.
Definition: ISimulation.h:38
virtual ISimulation * clone() const =0
const Instrument & instrument() const
Definition: ISimulation.h:55
const SimulationOptions & getOptions() const
Definition: ISimulation.h:91
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:41
static const QString P_ALPHA_AXIS
Main class to run an off-specular simulation.
const IAxis * beamAxis() const
Returns axis of the beam.
Main model to hold sample items.
Definition: SampleModel.h:24
void setItemName(const QString &name)
Set item name, add property if necessary.
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
Definition: SessionModel.h:125
The SimulationOptionsItem class holds simulation status (run policy, number of threads,...
void setComputationMethod(const QString &name)
size_t getMcPoints() const
bool includeSpecular() const
bool isIntegrate() const
bool useAvgMaterials() const
Main class to run a specular simulation.
SessionItem * populateInstrumentModel(InstrumentModel *p_instrument_model, const ISimulation &simulation, const QString &instrument_name="")
SessionItem * populateDocumentModel(DocumentModel *p_documentModel, const ISimulation &simulation)
SessionItem * populateSampleModelFromSim(SampleModel *sampleModel, MaterialModel *materialModel, const ISimulation &simulation)
SessionItem * populateSampleModel(SampleModel *sampleModel, MaterialModel *materialModel, const MultiLayer &sample, const QString &sample_name="")
QString const & name(EShape k)
Definition: particles.cpp:21
void setGISASBeamItem(BeamItem *beam_item, const GISASSimulation &simulation)
void setOffSpecularBeamItem(BeamItem *beam_item, const OffSpecularSimulation &simulation)
void setAxisItem(SessionItem *item, const IAxis &axis, double factor=1.0)
void setDetector(Instrument2DItem *instrument_item, const ISimulation2D &simulation)
void setBackground(InstrumentItem *instrument_item, const ISimulation &simulation)
void setSpecularBeamItem(SpecularBeamItem *beam_item, const SpecularSimulation &simulation)
static constexpr double deg
Definition: Units.h:46