BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
TransformToDomain Namespace Reference

Functions

void addBeamDivergencesToScan (const SessionItem &beam_item, AngularSpecScan &simulation)
 
void addDistributionParametersToSimulation (const SessionItem &beam_item, GISASSimulation &simulation)
 adds DistributionParameters to the ISimulation More...
 
std::unique_ptr< MaterialcreateDomainMaterial (const SessionItem &item)
 
std::unique_ptr< IParticlecreateIParticle (const SessionItem &item)
 
std::unique_ptr< LayercreateLayer (const SessionItem &item)
 
std::unique_ptr< LayerRoughnesscreateLayerRoughness (const SessionItem &item)
 
std::unique_ptr< MultiLayercreateMultiLayer (const SessionItem &item)
 
std::unique_ptr< ParticleDistributioncreateParticleDistribution (const SessionItem &item)
 
std::unique_ptr< ParticleLayoutcreateParticleLayout (const SessionItem &item)
 
void setBeamDistribution (const std::string &parameter_name, const BeamDistributionItem &item, ISimulation &simulation)
 
void setPositionInfo (IParticle *result, const SessionItem &item)
 
void setRotationInfo (IParticle *result, const SessionItem &item)
 
void setSimulationOptions (ISimulation *simulation, const SessionItem &item)
 
void setTransformationInfo (IParticle *result, const SessionItem &item)
 

Function Documentation

◆ addBeamDivergencesToScan()

void TransformToDomain::addBeamDivergencesToScan ( const SessionItem beam_item,
AngularSpecScan simulation 
)

Definition at line 163 of file TransformToDomain.cpp.

165 {
166  if (beam_item.modelType() != "SpecularBeam") {
167  ASSERT(beam_item.modelType() == "SpecularBeam");
168  return;
169  }
170 
171  auto resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_WAVELENGTH));
172  if (resolution)
173  scan.setWavelengthResolution(*resolution);
174  resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_INCLINATION_ANGLE));
175  if (resolution)
176  scan.setAngleResolution(*resolution);
177 }
#define ASSERT(condition)
Definition: Assert.h:31
static const QString P_WAVELENGTH
Definition: BeamItems.h:29
static const QString P_INCLINATION_ANGLE
Definition: BeamItems.h:30
QString modelType() const
Get model type.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.

References ASSERT, SessionItem::getItem(), SessionItem::modelType(), BeamItem::P_INCLINATION_ANGLE, BeamItem::P_WAVELENGTH, AngularSpecScan::setAngleResolution(), and AngularSpecScan::setWavelengthResolution().

Here is the call graph for this function:

◆ addDistributionParametersToSimulation()

void TransformToDomain::addDistributionParametersToSimulation ( const SessionItem beam_item,
GISASSimulation simulation 
)

adds DistributionParameters to the ISimulation

Definition at line 147 of file TransformToDomain.cpp.

149 {
150  if (beam_item.modelType() != "GISASBeam") {
151  ASSERT(beam_item.modelType() == "GISASBeam");
152  return;
153  }
154 
155  setParameterDistributionToSimulation<BeamWavelengthItem>(
156  "Wavelength", beam_item.getItem(BeamItem::P_WAVELENGTH), simulation);
157  setParameterDistributionToSimulation<BeamInclinationAngleItem>(
158  "InclinationAngle", beam_item.getItem(BeamItem::P_INCLINATION_ANGLE), simulation);
159  setParameterDistributionToSimulation<BeamAzimuthalAngleItem>(
160  "AzimuthalAngle", beam_item.getItem(BeamItem::P_AZIMUTHAL_ANGLE), simulation);
161 }
static const QString P_AZIMUTHAL_ANGLE
Definition: BeamItems.h:31

References ASSERT, SessionItem::getItem(), SessionItem::modelType(), BeamItem::P_AZIMUTHAL_ANGLE, BeamItem::P_INCLINATION_ANGLE, and BeamItem::P_WAVELENGTH.

Here is the call graph for this function:

◆ createDomainMaterial()

std::unique_ptr< Material > TransformToDomain::createDomainMaterial ( const SessionItem item)

Definition at line 64 of file TransformToDomain.cpp.

65 {
66  auto parent_job = JobModelFunctions::findJobItem(&item);
67  const MaterialItemContainer* container =
68  parent_job ? parent_job->materialContainerItem() : nullptr;
69  QString tag = MaterialItemUtils::materialTag(item);
70  ExternalProperty property = item.getItemValue(tag).value<ExternalProperty>();
71  return container ? MaterialItemUtils::createDomainMaterial(property, *container)
73 }
The ExternalProperty class defines custom QVariant property to carry the text, color and an identifie...
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
const JobItem * findJobItem(const SessionItem *item)
Determines parenting JobItem of a given SessionItem.
QString materialTag(const SessionItem &item)
Returns material tag for given item. Returns empty string, if item doesn't have materials.
std::unique_ptr< Material > createDomainMaterial(const ExternalProperty &material_property)
std::unique_ptr< Material > createDomainMaterial(const SessionItem &item)

References MaterialItemUtils::createDomainMaterial(), JobModelFunctions::findJobItem(), SessionItem::getItemValue(), and MaterialItemUtils::materialTag().

Referenced by createLayer(), and ParticleItem::createParticle().

Here is the call graph for this function:

◆ createIParticle()

std::unique_ptr< IParticle > TransformToDomain::createIParticle ( const SessionItem item)

Definition at line 119 of file TransformToDomain.cpp.

120 {
121  std::unique_ptr<IParticle> P_particle;
122  if (item.modelType() == "Particle") {
123  auto& particle_item = static_cast<const ParticleItem&>(item);
124  P_particle = particle_item.createParticle();
125  } else if (item.modelType() == "ParticleCoreShell") {
126  auto& particle_coreshell_item = static_cast<const ParticleCoreShellItem&>(item);
127  P_particle = particle_coreshell_item.createParticleCoreShell();
128  } else if (item.modelType() == "ParticleComposition") {
129  auto& particle_composition_item = static_cast<const ParticleCompositionItem&>(item);
130  P_particle = particle_composition_item.createParticleComposition();
131  } else if (item.modelType() == "MesoCrystal") {
132  auto& mesocrystal_item = static_cast<const MesoCrystalItem&>(item);
133  P_particle = mesocrystal_item.createMesoCrystal();
134  }
135  return P_particle;
136 }
std::unique_ptr< MesoCrystal > createMesoCrystal() const
std::unique_ptr< ParticleComposition > createParticleComposition() const
std::unique_ptr< ParticleCoreShell > createParticleCoreShell() const
std::unique_ptr< Particle > createParticle() const

References MesoCrystalItem::createMesoCrystal(), ParticleItem::createParticle(), ParticleCompositionItem::createParticleComposition(), ParticleCoreShellItem::createParticleCoreShell(), and SessionItem::modelType().

Referenced by DomainObjectBuilder::buildParticleLayout(), and ParticleDistributionItem::createParticleDistribution().

Here is the call graph for this function:

◆ createLayer()

std::unique_ptr< Layer > TransformToDomain::createLayer ( const SessionItem item)

Definition at line 86 of file TransformToDomain.cpp.

87 {
88  auto P_layer = std::make_unique<Layer>(*createDomainMaterial(item),
89  item.getItemValue(LayerItem::P_THICKNESS).toDouble());
90  P_layer->setNumberOfSlices(item.getItemValue(LayerItem::P_NSLICES).toUInt());
91  return P_layer;
92 }
static const QString P_THICKNESS
Definition: LayerItem.h:22
static const QString P_NSLICES
Definition: LayerItem.h:25

References createDomainMaterial(), SessionItem::getItemValue(), LayerItem::P_NSLICES, and LayerItem::P_THICKNESS.

Referenced by DomainObjectBuilder::buildLayer().

Here is the call graph for this function:

◆ createLayerRoughness()

std::unique_ptr< LayerRoughness > TransformToDomain::createLayerRoughness ( const SessionItem item)

Definition at line 95 of file TransformToDomain.cpp.

96 {
97  if (roughnessItem.modelType() == "LayerZeroRoughness") {
98  return nullptr;
99  } else if (roughnessItem.modelType() == "LayerBasicRoughness") {
100  return std::make_unique<LayerRoughness>(
101  roughnessItem.getItemValue(LayerBasicRoughnessItem::P_SIGMA).toDouble(),
102  roughnessItem.getItemValue(LayerBasicRoughnessItem::P_HURST).toDouble(),
103  roughnessItem.getItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH).toDouble());
104  } else {
105  throw GUIHelpers::Error("TransformToDomain::createLayerRoughness() -> Error.");
106  }
107 }
static const QString P_LATERAL_CORR_LENGTH
static const QString P_SIGMA
static const QString P_HURST

References SessionItem::getItemValue(), SessionItem::modelType(), LayerBasicRoughnessItem::P_HURST, LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH, and LayerBasicRoughnessItem::P_SIGMA.

Referenced by DomainObjectBuilder::buildMultiLayer().

Here is the call graph for this function:

◆ createMultiLayer()

std::unique_ptr< MultiLayer > TransformToDomain::createMultiLayer ( const SessionItem item)

Definition at line 75 of file TransformToDomain.cpp.

76 {
77  auto P_multilayer = std::make_unique<MultiLayer>();
78  auto cross_corr_length = item.getItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH).toDouble();
79  if (cross_corr_length > 0)
80  P_multilayer->setCrossCorrLength(cross_corr_length);
81  auto external_field = item.item<VectorItem>(MultiLayerItem::P_EXTERNAL_FIELD)->getVector();
82  P_multilayer->setExternalField(external_field);
83  return P_multilayer;
84 }
static const QString P_CROSS_CORR_LENGTH
static const QString P_EXTERNAL_FIELD
T * item(const QString &tag) const
Definition: SessionItem.h:151

References SessionItem::getItemValue(), SessionItem::item(), MultiLayerItem::P_CROSS_CORR_LENGTH, and MultiLayerItem::P_EXTERNAL_FIELD.

Referenced by DomainObjectBuilder::buildMultiLayer().

Here is the call graph for this function:

◆ createParticleDistribution()

std::unique_ptr< ParticleDistribution > TransformToDomain::createParticleDistribution ( const SessionItem item)

Definition at line 139 of file TransformToDomain.cpp.

140 {
141  auto& particle_distribution = static_cast<const ParticleDistributionItem&>(item);
142  auto P_part_distr = particle_distribution.createParticleDistribution();
143  return P_part_distr;
144 }
std::unique_ptr< ParticleDistribution > createParticleDistribution() const

References ParticleDistributionItem::createParticleDistribution().

Referenced by DomainObjectBuilder::buildParticleLayout().

Here is the call graph for this function:

◆ createParticleLayout()

std::unique_ptr< ParticleLayout > TransformToDomain::createParticleLayout ( const SessionItem item)

Definition at line 109 of file TransformToDomain.cpp.

110 {
111  auto P_layout = std::make_unique<ParticleLayout>();
112  auto total_density = item.getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).value<double>();
113  auto layout_weight = item.getItemValue(ParticleLayoutItem::P_WEIGHT).value<double>();
114  P_layout->setTotalParticleSurfaceDensity(total_density);
115  P_layout->setWeight(layout_weight);
116  return P_layout;
117 }
static const QString P_TOTAL_DENSITY
static const QString P_WEIGHT

References SessionItem::getItemValue(), ParticleLayoutItem::P_TOTAL_DENSITY, and ParticleLayoutItem::P_WEIGHT.

Referenced by DomainObjectBuilder::buildParticleLayout().

Here is the call graph for this function:

◆ setBeamDistribution()

void TransformToDomain::setBeamDistribution ( const std::string &  parameter_name,
const BeamDistributionItem item,
ISimulation simulation 
)

Definition at line 179 of file TransformToDomain.cpp.

182 {
183  ParameterPattern parameter_pattern;
184  parameter_pattern.beginsWith("*").add("Beam").add(parameter_name);
185 
186  auto P_par_distr = item.getParameterDistributionForName(parameter_pattern.toStdString());
187  if (P_par_distr)
188  simulation.addParameterDistribution(*P_par_distr);
189 }
std::unique_ptr< ParameterDistribution > getParameterDistributionForName(const std::string &parameter_name) const
returns parameter distribution to add into the ISimulation
void addParameterDistribution(const std::string &param_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
Helper class for constructing parameter patterns.
ParameterPattern & beginsWith(std::string start_type)
std::string toStdString() const
ParameterPattern & add(std::string object_type)

References ParameterPattern::add(), ISimulation::addParameterDistribution(), ParameterPattern::beginsWith(), BeamDistributionItem::getParameterDistributionForName(), and ParameterPattern::toStdString().

Referenced by DepthProbeInstrumentItem::createSimulation().

Here is the call graph for this function:

◆ setPositionInfo()

void TransformToDomain::setPositionInfo ( IParticle result,
const SessionItem item 
)

Definition at line 214 of file TransformToDomain.cpp.

215 {
216  kvector_t pos = item.item<VectorItem>(ParticleItem::P_POSITION)->getVector();
217  result->setPosition(pos.x(), pos.y(), pos.z());
218 }
T z() const
Returns z-component in cartesian coordinate system.
Definition: BasicVector3D.h:67
T y() const
Returns y-component in cartesian coordinate system.
Definition: BasicVector3D.h:65
T x() const
Returns x-component in cartesian coordinate system.
Definition: BasicVector3D.h:63
void setPosition(kvector_t position)
Sets relative position of the particle's reference point in the coordinate system of parent.
Definition: IParticle.h:50
static const QString P_POSITION
Definition: ParticleItem.h:28

References SessionItem::item(), ParticleItem::P_POSITION, IParticle::setPosition(), BasicVector3D< T >::x(), BasicVector3D< T >::y(), and BasicVector3D< T >::z().

Referenced by setTransformationInfo().

Here is the call graph for this function:

◆ setRotationInfo()

void TransformToDomain::setRotationInfo ( IParticle result,
const SessionItem item 
)

Definition at line 220 of file TransformToDomain.cpp.

221 {
222  QVector<SessionItem*> children = item.children();
223  for (int i = 0; i < children.size(); ++i) {
224  if (children[i]->modelType() == "Rotation") {
225  auto& rot_item = children[i]->groupItem<RotationItem>(TransformationItem::P_ROT);
226  auto rotation = rot_item.createRotation();
227  if (rotation)
228  result->setRotation(*rotation);
229  break;
230  }
231  }
232 }
void setRotation(const IRotation &rotation)
Sets transformation.
Definition: IParticle.cpp:44
virtual std::unique_ptr< IRotation > createRotation() const =0
QVector< SessionItem * > children() const
Returns vector of all children.
static const QString P_ROT

References SessionItem::children(), RotationItem::createRotation(), TransformationItem::P_ROT, and IParticle::setRotation().

Referenced by setTransformationInfo().

Here is the call graph for this function:

◆ setSimulationOptions()

void TransformToDomain::setSimulationOptions ( ISimulation simulation,
const SessionItem item 
)

Definition at line 191 of file TransformToDomain.cpp.

192 {
193  ASSERT(item.modelType() == "SimulationOptions");
194 
195  if (auto optionItem = dynamic_cast<const SimulationOptionsItem*>(&item)) {
196  simulation->getOptions().setNumberOfThreads(optionItem->getNumberOfThreads());
197  if (optionItem->getComputationMethod() == "Monte-Carlo Integration") {
198  simulation->getOptions().setMonteCarloIntegration(
199  true, optionItem->getNumberOfMonteCarloPoints());
200  }
201  if (optionItem->getFresnelMaterialMethod() == "Average Layer Material")
202  simulation->getOptions().setUseAvgMaterials(true);
203  if (optionItem->getIncludeSpecularPeak() == "Yes")
204  simulation->getOptions().setIncludeSpecular(true);
205  }
206 }
const SimulationOptions & getOptions() const
Definition: ISimulation.h:91
The SimulationOptionsItem class holds simulation status (run policy, number of threads,...
void setUseAvgMaterials(bool use_avg_materials)
void setIncludeSpecular(bool include_specular)
void setNumberOfThreads(int nthreads)
Sets number of threads to use during the simulation (0 - take the default value from the hardware)
void setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
Enables/disables MonetCarlo integration.

References ASSERT, ISimulation::getOptions(), SessionItem::modelType(), SimulationOptions::setIncludeSpecular(), SimulationOptions::setMonteCarloIntegration(), SimulationOptions::setNumberOfThreads(), and SimulationOptions::setUseAvgMaterials().

Here is the call graph for this function:

◆ setTransformationInfo()

void TransformToDomain::setTransformationInfo ( IParticle result,
const SessionItem item 
)

Definition at line 208 of file TransformToDomain.cpp.

209 {
210  setPositionInfo(result, item);
211  setRotationInfo(result, item);
212 }
void setPositionInfo(IParticle *result, const SessionItem &item)
void setRotationInfo(IParticle *result, const SessionItem &item)

References setPositionInfo(), and setRotationInfo().

Referenced by MesoCrystalItem::createMesoCrystal(), ParticleItem::createParticle(), ParticleCompositionItem::createParticleComposition(), and ParticleCoreShellItem::createParticleCoreShell().

Here is the call graph for this function: