BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
TransformFromDomain.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/TransformFromDomain.cpp
6 //! @brief Implements namespace TransformFromDomain
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 #include "Device/Mask/Ellipse.h"
31 #include "Device/Mask/Line.h"
32 #include "Device/Mask/Polygon.h"
33 #include "Device/Mask/Rectangle.h"
65 
66 using namespace node_progeny;
67 
68 namespace {
69 void SetPDF1D(SessionItem* item, const IFTDistribution1D* pdf, QString group_name);
70 void setPDF2D(SessionItem* item, const IFTDistribution2D* pdf, QString group_name);
71 void SetDecayFunction1D(SessionItem* item, const IFTDecayFunction1D* pdf, QString group_name);
72 void SetDecayFunction2D(SessionItem* item, const IFTDecayFunction2D* pdf, QString group_name);
73 
74 void set2DLatticeParameters(SessionItem* item, const Lattice2D& lattice);
75 void setPositionVariance(SessionItem* item, const IInterferenceFunction& iff);
76 
77 void setDistribution(SessionItem* item, ParameterDistribution par_distr, QString group_name,
78  double factor = 1.0);
79 
80 void addDistributionToBeamItem(const std::string& parameter_name, const QString& item_name,
81  const ParameterDistribution& distribution,
82  const BeamItem* beam_item);
83 
84 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
85  double std_dev);
86 } // namespace
87 
89  const InterferenceFunction1DLattice& sample)
90 {
93  Units::rad2deg(sample.getXi()));
94 
95  auto pdf = OnlyChildOfType<IFTDecayFunction1D>(sample);
97  SetDecayFunction1D(item, pdf, group_name);
98  setPositionVariance(item, sample);
99 }
100 
102  const InterferenceFunction2DLattice& sample)
103 {
104  set2DLatticeParameters(item, sample.lattice());
105 
107  sample.integrationOverXi());
108 
109  auto p_pdf = OnlyChildOfType<IFTDecayFunction2D>(sample);
111  SetDecayFunction2D(item, p_pdf, group_name);
112  setPositionVariance(item, sample);
113 }
114 
116  const InterferenceFunction2DParaCrystal& sample)
117 {
118  set2DLatticeParameters(item, sample.lattice());
119 
121  sample.dampingLength());
123  sample.domainSizes()[0]);
125  sample.domainSizes()[1]);
127  sample.integrationOverXi());
128 
129  auto pdfs = ChildNodesOfType<IFTDistribution2D>(sample);
130  QStringList group_names;
133  for (unsigned i = 0; i < pdfs.size(); ++i)
134  setPDF2D(item, pdfs[i], group_names[i]);
135  setPositionVariance(item, sample);
136 }
137 
140 {
141  set2DLatticeParameters(item, sample.lattice());
142 
144  sample.numberUnitCells1());
146  sample.numberUnitCells2());
148  sample.positionVariance());
150  sample.integrationOverXi());
151  setPositionVariance(item, sample);
152 }
153 
155  const InterferenceFunctionHardDisk& sample)
156 {
159  setPositionVariance(item, sample);
160 }
161 
164 {
166  sample.peakDistance());
168  sample.dampingLength());
170  sample.domainSize());
172 
173  auto ipdf = OnlyChildOfType<IFTDistribution1D>(sample);
175  SetPDF1D(item, ipdf, group_name);
176  setPositionVariance(item, sample);
177 }
178 
180  const LayerInterface* top_interface)
181 {
182  layerItem->setItemValue(LayerItem::P_THICKNESS, layer->thickness());
183  layerItem->setGroupProperty(LayerItem::P_ROUGHNESS, "LayerZeroRoughness");
184  layerItem->setItemValue(LayerItem::P_NSLICES, (int)layer->numberOfSlices());
185 
186  if (top_interface) {
187  const LayerRoughness* roughness = top_interface->getRoughness();
188  if (TransformFromDomain::isValidRoughness(roughness)) {
189  SessionItem* roughnessItem =
190  layerItem->setGroupProperty(LayerItem::P_ROUGHNESS, "LayerBasicRoughness");
191  TransformFromDomain::setRoughnessItem(roughnessItem, *roughness);
192  }
193  }
194 }
195 
197 {
201  sample.getLatteralCorrLength());
202 }
203 
204 //! Initialization of ParticleDistributionItem
206  const ParticleDistribution& sample)
207 {
208  ParticleDistributionItem* distItem = dynamic_cast<ParticleDistributionItem*>(item);
209  ASSERT(distItem);
210 
211  distItem->setItemValue(ParticleItem::P_ABUNDANCE, sample.abundance());
212 
213  ParameterDistribution par_distr = sample.parameterDistribution();
214  QString main_distr_par_name = QString::fromStdString(par_distr.getMainParameterName());
215  QStringList linked_pars = GUIHelpers::fromStdStrings(par_distr.getLinkedParameterNames());
216 
217  distItem->setDomainCacheNames(main_distr_par_name, linked_pars);
218 
219  double unit_factor(1.0);
220  if (sample.mainUnits() == "rad")
221  unit_factor = 1. / Units::deg;
222 
223  QString group_name = ParticleDistributionItem::P_DISTRIBUTION;
224  setDistribution(distItem, par_distr, group_name, unit_factor);
225 }
226 
227 //! Returns true if given roughness is non-zero roughness
229 {
230  if (!roughness)
231  return false;
232  if (roughness->getSigma() == 0 && roughness->getHurstParameter() == 0.0
233  && roughness->getLatteralCorrLength() == 0.0)
234  return false;
235  return true;
236 }
237 
239 {
240  ASSERT(beam_item);
241  Beam beam = simulation.beam();
242 
243  beam_item->setIntensity(beam.intensity());
244  beam_item->setWavelength(beam.wavelength());
245  beam_item->setInclinationAngle(Units::rad2deg(beam.direction().alpha()));
246  beam_item->setAzimuthalAngle(Units::rad2deg(beam.direction().phi()));
247 
248  // distribution parameters
249  const DistributionHandler::Distributions_t distributions =
251  for (size_t i = 0; i < distributions.size(); ++i) {
252  addDistributionToBeamItem("Wavelength", BeamItem::P_WAVELENGTH, distributions[i],
253  beam_item);
254  addDistributionToBeamItem("InclinationAngle", BeamItem::P_INCLINATION_ANGLE,
255  distributions[i], beam_item);
256  addDistributionToBeamItem("AzimuthalAngle", BeamItem::P_AZIMUTHAL_ANGLE, distributions[i],
257  beam_item);
258  }
259 
260  // polarization parameters
261  beam_item->item<VectorItem>(BeamItem::P_POLARIZATION)->setVector(beam.getBlochVector());
262 }
263 
265  const OffSpecularSimulation& simulation)
266 {
267  Beam beam = simulation.beam();
268 
269  beam_item->setIntensity(beam.intensity());
270  beam_item->setWavelength(beam.wavelength());
271  beam_item->setInclinationAngle(Units::rad2deg(beam.direction().alpha()));
272  beam_item->setAzimuthalAngle(Units::rad2deg(beam.direction().phi()));
273  // TODO implement beam divergence
274 }
275 
277  const SpecularSimulation& simulation)
278 {
279  const Beam& beam = simulation.beam();
280 
281  beam_item->setIntensity(beam.intensity());
282  beam_item->setWavelength(beam.wavelength());
283  beam_item->setInclinationAngle(0.0); // inclination angle is hardcoded
284  beam_item->setAzimuthalAngle(0.0); // azimuthal angle is hardcoded
285 
286  auto axis_item = beam_item->currentInclinationAxisItem();
287  TransformFromDomain::setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg);
288 
289  setFootprintFactor(simulation.footprintFactor(), beam_item);
290 
291  const AngularSpecScan* scan = dynamic_cast<const AngularSpecScan*>(simulation.dataHandler());
292  if (!scan)
293  return;
294 
295  auto resolution = scan->wavelengthResolution();
296  if (!resolution->empty()) {
297  double mean = scan->wavelength();
298  double std_dev = resolution->stdDevs(mean, 1).front();
299  addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_WAVELENGTH),
300  *resolution->distribution(), mean, std_dev);
301  }
302 
303  resolution = scan->angleResolution();
304  if (resolution && !resolution->empty()) {
305  double std_dev = resolution->stdDevs(0.0, 1).front();
306  addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE),
307  *resolution->distribution(), 0.0, std_dev);
308  }
309 }
310 
312  const ISimulation2D& simulation)
313 {
314  const IDetector* p_detector = simulation.getDetector();
315  setDetectorGeometry(instrument_item, *p_detector);
316 
317  auto detector_item = instrument_item->detectorItem();
318 
319  setDetectorResolution(detector_item, *p_detector);
320  setDetectorProperties(detector_item, *p_detector);
321  setDetectorMasks(detector_item, simulation);
322 }
323 
325  const IDetector& detector)
326 {
327  if (auto det = dynamic_cast<const SphericalDetector*>(&detector)) {
328  instrument_item->setDetectorGroup("SphericalDetector");
329  auto item = dynamic_cast<SphericalDetectorItem*>(instrument_item->detectorItem());
330  setSphericalDetector(item, *det);
331  } else if (auto det = dynamic_cast<const RectangularDetector*>(&detector)) {
332  instrument_item->setDetectorGroup("RectangularDetector");
333  auto item = dynamic_cast<RectangularDetectorItem*>(instrument_item->detectorItem());
334  setRectangularDetector(item, *det);
335  } else {
336  throw GUIHelpers::Error(
337  "TransformFromDomain::setDetectorGeometry() -> Unknown detector type.");
338  }
339 }
340 
342  const IDetector& detector)
343 {
344  const IDetectorResolution* p_resfunc = detector.detectorResolution();
345 
346  if (!p_resfunc)
347  return;
348 
349  if (auto p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
350  if (auto resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>(
351  p_convfunc->getResolutionFunction2D())) {
353  "ResolutionFunction2DGaussian");
354  double scale(1.0);
355  if (detector_item->modelType() == "SphericalDetector")
356  scale = 1. / Units::deg;
358  scale * resfunc->getSigmaX());
360  scale * resfunc->getSigmaY());
361  } else {
362  throw GUIHelpers::Error("TransformFromDomain::setDetectorResolution() -> Error. "
363  "Unknown detector resolution function");
364  }
365  } else {
366  throw GUIHelpers::Error("TransformFromDomain::setDetectorResolution() -> Error. "
367  "Not a ConvolutionDetectorResolution function");
368  }
369 }
370 
372  const IDetector& detector)
373 {
374  double total_transmission = detector.detectionProperties().analyzerTotalTransmission();
375  if (total_transmission <= 0.0)
376  return;
377 
378  kvector_t analyzer_dir = detector.detectionProperties().analyzerDirection();
379  double efficiency = detector.detectionProperties().analyzerEfficiency();
380  detector_item->item<VectorItem>(DetectorItem::P_ANALYZER_DIRECTION)->setVector(analyzer_dir);
381  detector_item->setItemValue(DetectorItem::P_ANALYZER_EFFICIENCY, efficiency);
382  detector_item->setItemValue(DetectorItem::P_ANALYZER_TOTAL_TRANSMISSION, total_transmission);
383 }
384 
386  const SphericalDetector& detector)
387 {
388  // Axes
389  const IAxis& phi_axis = detector.axis(0);
390  const IAxis& alpha_axis = detector.axis(1);
391 
392  auto phiAxisItem = detector_item->phiAxisItem();
393  phiAxisItem->setBinCount(phi_axis.size());
394  phiAxisItem->setLowerBound(Units::rad2deg(phi_axis.lowerBound()));
395  phiAxisItem->setUpperBound(Units::rad2deg(phi_axis.upperBound()));
396 
397  auto alphaAxisItem = detector_item->alphaAxisItem();
398  alphaAxisItem->setBinCount(alpha_axis.size());
399  alphaAxisItem->setLowerBound(Units::rad2deg(alpha_axis.lowerBound()));
400  alphaAxisItem->setUpperBound(Units::rad2deg(alpha_axis.upperBound()));
401 }
402 
404  const RectangularDetector& detector)
405 {
406  // Axes
407  auto xAxisItem = detector_item->xAxisItem();
408  xAxisItem->setBinCount(detector.getNbinsX());
409  xAxisItem->setUpperBound(detector.getWidth());
410 
411  auto yAxisItem = detector_item->yAxisItem();
412  yAxisItem->setBinCount((int)detector.getNbinsY());
413  yAxisItem->setUpperBound(detector.getHeight());
414 
416  detector_item->setDetectorAlignment("Generic");
417 
418  kvector_t normal = detector.getNormalVector();
419  detector_item->item<VectorItem>(RectangularDetectorItem::P_NORMAL)->setVector(normal);
420 
421  kvector_t direction = detector.getDirectionVector();
422  detector_item->item<VectorItem>(RectangularDetectorItem::P_DIRECTION)->setVector(direction);
423 
424  detector_item->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
425  detector_item->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
426  }
427 
429  detector_item->setDetectorAlignment("Perpendicular to sample x-axis");
431  detector_item->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
432  detector_item->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
433 
434  } else if (detector.getDetectorArrangment()
436  detector_item->setDetectorAlignment("Perpendicular to direct beam");
438  detector_item->setItemValue(RectangularDetectorItem::P_DBEAM_U0, detector.getU0());
439  detector_item->setItemValue(RectangularDetectorItem::P_DBEAM_V0, detector.getV0());
440 
441  } else if (detector.getDetectorArrangment()
443  detector_item->setDetectorAlignment("Perpendicular to reflected beam");
445  detector_item->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
446  detector_item->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
447 
448  } else if (detector.getDetectorArrangment()
450  detector_item->setDetectorAlignment("Perpendicular to reflected beam (dpos)");
453  detector.getDirectBeamU0());
455  detector.getDirectBeamV0());
456 
457  } else {
458  throw GUIHelpers::Error(
459  "TransformFromDomain::setItemFromSample(RectangularDetectorItem* detectorItem "
460  "Error. Unknown detector arrangement");
461  }
462 }
463 
465  const ISimulation& simulation)
466 {
467  const IDetector* detector = simulation.getDetector();
468  if ((detector->detectorMask() && detector->detectorMask()->numberOfMasks())
469  || detector->regionOfInterest()) {
470  detector_item->createMaskContainer();
471 
472  double scale(1.0);
473  if (detector_item->modelType() == "SphericalDetector")
474  scale = 1. / Units::deg;
475 
476  setMaskContainer(detector_item->maskContainerItem(), *detector, scale);
477  }
478 }
479 
481  const IDetector& detector, double scale)
482 {
483  auto detectorMask = detector.detectorMask();
484  for (size_t i_mask = 0; i_mask < detectorMask->numberOfMasks(); ++i_mask) {
485  bool mask_value(false);
486  const IShape2D* shape = detectorMask->getMaskShape(i_mask, mask_value);
487 
488  if (const Ellipse* ellipse = dynamic_cast<const Ellipse*>(shape)) {
489  EllipseItem* ellipseItem = new EllipseItem();
490  ellipseItem->setItemValue(EllipseItem::P_XCENTER, scale * ellipse->getCenterX());
491  ellipseItem->setItemValue(EllipseItem::P_YCENTER, scale * ellipse->getCenterY());
492  ellipseItem->setItemValue(EllipseItem::P_XRADIUS, scale * ellipse->getRadiusX());
493  ellipseItem->setItemValue(EllipseItem::P_YRADIUS, scale * ellipse->getRadiusY());
494  ellipseItem->setItemValue(EllipseItem::P_ANGLE, scale * ellipse->getTheta());
495  ellipseItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
496  container_item->insertItem(0, ellipseItem);
497  }
498 
499  else if (const Rectangle* rectangle = dynamic_cast<const Rectangle*>(shape)) {
500  RectangleItem* rectangleItem = new RectangleItem();
501  rectangleItem->setItemValue(RectangleItem::P_XLOW, scale * rectangle->getXlow());
502  rectangleItem->setItemValue(RectangleItem::P_YLOW, scale * rectangle->getYlow());
503  rectangleItem->setItemValue(RectangleItem::P_XUP, scale * rectangle->getXup());
504  rectangleItem->setItemValue(RectangleItem::P_YUP, scale * rectangle->getYup());
505  rectangleItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
506  container_item->insertItem(0, rectangleItem);
507 
508  }
509 
510  else if (const Polygon* polygon = dynamic_cast<const Polygon*>(shape)) {
511  PolygonItem* polygonItem = new PolygonItem();
512  std::vector<double> xpos, ypos;
513  polygon->getPoints(xpos, ypos);
514  for (size_t i_point = 0; i_point < xpos.size(); ++i_point) {
515  PolygonPointItem* pointItem = new PolygonPointItem();
516  pointItem->setItemValue(PolygonPointItem::P_POSX, scale * xpos[i_point]);
517  pointItem->setItemValue(PolygonPointItem::P_POSY, scale * ypos[i_point]);
518  polygonItem->insertItem(-1, pointItem);
519  }
520 
521  polygonItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
522  polygonItem->setItemValue(PolygonItem::P_ISCLOSED, true);
523 
524  container_item->insertItem(0, polygonItem);
525  }
526 
527  else if (const VerticalLine* vline = dynamic_cast<const VerticalLine*>(shape)) {
528  VerticalLineItem* lineItem = new VerticalLineItem();
529  lineItem->setItemValue(VerticalLineItem::P_POSX, scale * vline->getXpos());
530  lineItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
531  container_item->insertItem(0, lineItem);
532  }
533 
534  else if (const HorizontalLine* hline = dynamic_cast<const HorizontalLine*>(shape)) {
535  HorizontalLineItem* lineItem = new HorizontalLineItem();
536  lineItem->setItemValue(HorizontalLineItem::P_POSY, scale * hline->getYpos());
537  lineItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
538  container_item->insertItem(0, lineItem);
539  }
540 
541  else if (const InfinitePlane* plane = dynamic_cast<const InfinitePlane*>(shape)) {
542  Q_UNUSED(plane);
543  MaskAllItem* planeItem = new MaskAllItem();
544  planeItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
545  container_item->insertItem(-1, planeItem);
546  }
547 
548  else {
549  throw GUIHelpers::Error("TransformFromDomain::setDetectorMasks() -> Error. "
550  "Unknown shape");
551  }
552  }
553 
554  if (detector.regionOfInterest()) {
557  scale * detector.regionOfInterest()->getXlow());
559  scale * detector.regionOfInterest()->getYlow());
560  roiItem->setItemValue(RectangleItem::P_XUP, scale * detector.regionOfInterest()->getXup());
561  roiItem->setItemValue(RectangleItem::P_YUP, scale * detector.regionOfInterest()->getYup());
562  container_item->insertItem(-1, roiItem);
563  }
564 }
565 
567  const ParameterDistribution& parameter_distribution)
568 {
569  ASSERT(beam_distribution_item);
570 
571  if (parameter_distribution.getMinValue() < parameter_distribution.getMaxValue()) {
572  throw GUIHelpers::Error(
573  "TransformFromDomain::setItemFromSample(BeamDistributionItem* beamDistributionItem,"
574  "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution "
575  "with defined min,max are not yet implemented in GUI");
576  }
577 
578  const double unit_factor = 1.0 / beam_distribution_item->scaleFactor();
579  QString group_name = BeamDistributionItem::P_DISTRIBUTION;
580  setDistribution(beam_distribution_item, parameter_distribution, group_name, unit_factor);
581 }
582 
584  const ISimulation& simulation)
585 {
586  auto p_bg = simulation.background();
587  if (auto p_constant_bg = dynamic_cast<const ConstantBackground*>(p_bg)) {
588  auto constant_bg_item =
589  instrument_item->setGroupProperty(InstrumentItem::P_BACKGROUND, "ConstantBackground");
590  double value = p_constant_bg->backgroundValue();
591  constant_bg_item->setItemValue(ConstantBackgroundItem::P_VALUE, value);
592  } else if (dynamic_cast<const PoissonNoiseBackground*>(p_bg)) {
593  instrument_item->setGroupProperty(InstrumentItem::P_BACKGROUND, "PoissonNoiseBackground");
594  }
595 }
596 
598  SpecularBeamItem* beam_item)
599 {
600  if (!footprint)
601  return;
602  if (const auto gaussian_fp = dynamic_cast<const FootprintGauss*>(footprint)) {
603  auto gaussian_fp_item =
604  beam_item->setGroupProperty(SpecularBeamItem::P_FOOPTPRINT, "GaussianFootrpint");
605  const double value = gaussian_fp->widthRatio();
606  gaussian_fp_item->setItemValue(FootprintGaussianItem::P_VALUE, value);
607  } else if (const auto square_fp = dynamic_cast<const FootprintSquare*>(footprint)) {
608  auto square_fp_item =
609  beam_item->setGroupProperty(SpecularBeamItem::P_FOOPTPRINT, "SquareFootprint");
610  const double value = square_fp->widthRatio();
611  square_fp_item->setItemValue(FootprintSquareItem::P_VALUE, value);
612  }
613 }
614 
615 void TransformFromDomain::setAxisItem(SessionItem* item, const IAxis& axis, double factor)
616 {
617  if (item->modelType() != "BasicAxis")
618  throw GUIHelpers::Error("TransformFromDomain::setAxisItem() -> Error. Unexpected item.");
619 
620  if (!dynamic_cast<const FixedBinAxis*>(&axis))
621  throw GUIHelpers::Error("TransformFromDomain::setAxisItem() -> Error. Unexpected axis");
622 
623  item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size()));
624  item->setItemValue(BasicAxisItem::P_MIN_DEG, factor * axis.lowerBound());
625  item->setItemValue(BasicAxisItem::P_MAX_DEG, factor * axis.upperBound());
626  item->setItemValue(BasicAxisItem::P_TITLE, QString::fromStdString(axis.getName()));
627 }
628 
629 namespace {
630 void SetPDF1D(SessionItem* item, const IFTDistribution1D* ipdf, QString group_name)
631 {
632  if (const FTDistribution1DCauchy* pdf = dynamic_cast<const FTDistribution1DCauchy*>(ipdf)) {
633  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DCauchy");
634  pdfItem->setItemValue(FTDistribution1DCauchyItem::P_OMEGA, pdf->omega());
635  } else if (const FTDistribution1DGauss* pdf =
636  dynamic_cast<const FTDistribution1DGauss*>(ipdf)) {
637  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DGauss");
638  pdfItem->setItemValue(FTDistribution1DGaussItem::P_OMEGA, pdf->omega());
639  } else if (const FTDistribution1DGate* pdf = dynamic_cast<const FTDistribution1DGate*>(ipdf)) {
640  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DGate");
641  pdfItem->setItemValue(FTDistribution1DGateItem::P_OMEGA, pdf->omega());
642  } else if (const FTDistribution1DTriangle* pdf =
643  dynamic_cast<const FTDistribution1DTriangle*>(ipdf)) {
644  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DTriangle");
645  pdfItem->setItemValue(FTDistribution1DTriangleItem::P_OMEGA, pdf->omega());
646  } else if (const FTDistribution1DCosine* pdf =
647  dynamic_cast<const FTDistribution1DCosine*>(ipdf)) {
648  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DCosine");
649  pdfItem->setItemValue(FTDistribution1DCosineItem::P_OMEGA, pdf->omega());
650  } else if (const FTDistribution1DVoigt* pdf =
651  dynamic_cast<const FTDistribution1DVoigt*>(ipdf)) {
652  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution1DVoigt");
653  pdfItem->setItemValue(FTDistribution1DVoigtItem::P_OMEGA, pdf->omega());
654  pdfItem->setItemValue(FTDistribution1DVoigtItem::P_ETA, pdf->eta());
655  } else {
656  throw GUIHelpers::Error("TransformFromDomain::setPDF1D: -> Error");
657  }
658 }
659 
660 void setPDF2D(SessionItem* item, const IFTDistribution2D* pdf, QString group_name)
661 {
662  if (const FTDistribution2DCauchy* pdf_cauchy =
663  dynamic_cast<const FTDistribution2DCauchy*>(pdf)) {
664  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution2DCauchy");
665  pdfItem->setItemValue(FTDistribution2DCauchyItem::P_OMEGA_X, pdf_cauchy->omegaX());
666  pdfItem->setItemValue(FTDistribution2DCauchyItem::P_OMEGA_Y, pdf_cauchy->omegaY());
668  Units::rad2deg(pdf_cauchy->gamma()));
669  } else if (const FTDistribution2DGauss* pdf_gauss =
670  dynamic_cast<const FTDistribution2DGauss*>(pdf)) {
671  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution2DGauss");
672  pdfItem->setItemValue(FTDistribution2DGaussItem::P_OMEGA_X, pdf_gauss->omegaX());
673  pdfItem->setItemValue(FTDistribution2DGaussItem::P_OMEGA_Y, pdf_gauss->omegaY());
675  Units::rad2deg(pdf_gauss->gamma()));
676  } else if (const FTDistribution2DGate* pdf_gate =
677  dynamic_cast<const FTDistribution2DGate*>(pdf)) {
678  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution2DGate");
679  pdfItem->setItemValue(FTDistribution2DGateItem::P_OMEGA_X, pdf_gate->omegaX());
680  pdfItem->setItemValue(FTDistribution2DGateItem::P_OMEGA_Y, pdf_gate->omegaY());
681  pdfItem->setItemValue(FTDistribution2DGateItem::P_GAMMA, Units::rad2deg(pdf_gate->gamma()));
682  } else if (const FTDistribution2DCone* pdf_cone =
683  dynamic_cast<const FTDistribution2DCone*>(pdf)) {
684  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution2DCone");
685  pdfItem->setItemValue(FTDistribution2DConeItem::P_OMEGA_X, pdf_cone->omegaX());
686  pdfItem->setItemValue(FTDistribution2DConeItem::P_OMEGA_Y, pdf_cone->omegaY());
687  pdfItem->setItemValue(FTDistribution2DConeItem::P_GAMMA, Units::rad2deg(pdf_cone->gamma()));
688  } else if (const FTDistribution2DVoigt* pdf_voigt =
689  dynamic_cast<const FTDistribution2DVoigt*>(pdf)) {
690  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDistribution2DVoigt");
691  pdfItem->setItemValue(FTDistribution2DVoigtItem::P_OMEGA_X, pdf_voigt->omegaX());
692  pdfItem->setItemValue(FTDistribution2DVoigtItem::P_OMEGA_Y, pdf_voigt->omegaY());
694  Units::rad2deg(pdf_voigt->gamma()));
695  pdfItem->setItemValue(FTDistribution2DVoigtItem::P_ETA, pdf_voigt->eta());
696  } else {
697  throw GUIHelpers::Error("TransformFromDomain::setPDF2D: -> Error");
698  }
699 }
700 
701 void SetDecayFunction1D(SessionItem* item, const IFTDecayFunction1D* ipdf, QString group_name)
702 {
703  if (const FTDecayFunction1DCauchy* pdf = dynamic_cast<const FTDecayFunction1DCauchy*>(ipdf)) {
704  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction1DCauchy");
705  pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->decayLength());
706  } else if (const FTDecayFunction1DGauss* pdf =
707  dynamic_cast<const FTDecayFunction1DGauss*>(ipdf)) {
708  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction1DGauss");
709  pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->decayLength());
710  } else if (const FTDecayFunction1DTriangle* pdf =
711  dynamic_cast<const FTDecayFunction1DTriangle*>(ipdf)) {
712  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction1DTriangle");
713  pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->decayLength());
714  } else if (const FTDecayFunction1DVoigt* pdf =
715  dynamic_cast<const FTDecayFunction1DVoigt*>(ipdf)) {
716  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction1DVoigt");
717  pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->decayLength());
718  pdfItem->setItemValue(FTDecayFunction1DVoigtItem::P_ETA, pdf->eEta());
719  } else {
720  throw GUIHelpers::Error("TransformFromDomain::SetDecayFunction1D: -> Error");
721  }
722 }
723 
724 void SetDecayFunction2D(SessionItem* item, const IFTDecayFunction2D* pdf, QString group_name)
725 {
726  if (const FTDecayFunction2DCauchy* pdf_cauchy =
727  dynamic_cast<const FTDecayFunction2DCauchy*>(pdf)) {
728  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction2DCauchy");
729  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X, pdf_cauchy->decayLengthX());
730  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y, pdf_cauchy->decayLengthY());
731  pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA, Units::rad2deg(pdf_cauchy->gamma()));
732  } else if (const FTDecayFunction2DGauss* pdf_gauss =
733  dynamic_cast<const FTDecayFunction2DGauss*>(pdf)) {
734  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction2DGauss");
735  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X, pdf_gauss->decayLengthX());
736  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y, pdf_gauss->decayLengthY());
737  pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA, Units::rad2deg(pdf_gauss->gamma()));
738  } else if (const FTDecayFunction2DVoigt* pdf_voigt =
739  dynamic_cast<const FTDecayFunction2DVoigt*>(pdf)) {
740  SessionItem* pdfItem = item->setGroupProperty(group_name, "FTDecayFunction2DVoigt");
741  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X, pdf_voigt->decayLengthX());
742  pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y, pdf_voigt->decayLengthY());
743  pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA, Units::rad2deg(pdf_voigt->gamma()));
744  pdfItem->setItemValue(FTDecayFunction2DVoigtItem::P_ETA, pdf_voigt->eta());
745  } else {
746  throw GUIHelpers::Error("TransformFromDomain::SetDecayFunction2D: -> Error");
747  }
748 }
749 
750 void set2DLatticeParameters(SessionItem* item, const Lattice2D& lattice)
751 {
752  SessionItem* latticeItem(nullptr);
753  if (lattice.getName() == "SquareLattice2D") {
755  "SquareLattice2D");
757 
758  } else if (lattice.getName() == "HexagonalLattice2D") {
760  "HexagonalLattice2D");
762 
763  } else {
765  "BasicLattice2D");
767  latticeItem->setItemValue(BasicLattice2DItem::P_LATTICE_LENGTH2, lattice.length2());
768  latticeItem->setItemValue(BasicLattice2DItem::P_LATTICE_ANGLE,
769  Units::rad2deg(lattice.latticeAngle()));
770  }
771  latticeItem->setItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE,
772  Units::rad2deg(lattice.rotationAngle()));
773 }
774 
775 void setPositionVariance(SessionItem* item, const IInterferenceFunction& iff)
776 {
777  double pos_var = iff.positionVariance();
779 }
780 
781 void setDistribution(SessionItem* part_distr_item, ParameterDistribution par_distr,
782  QString group_name, double factor)
783 {
784  const IDistribution1D* p_distribution = par_distr.getDistribution();
785 
786  SessionItem* item = 0;
787  if (const DistributionGate* distr = dynamic_cast<const DistributionGate*>(p_distribution)) {
788  item = part_distr_item->setGroupProperty(group_name, "DistributionGate");
789  item->setItemValue(DistributionGateItem::P_MIN, factor * distr->lowerBound());
790  item->setItemValue(DistributionGateItem::P_MAX, factor * distr->upperBound());
791  } else if (const DistributionLorentz* distr =
792  dynamic_cast<const DistributionLorentz*>(p_distribution)) {
793  item = part_distr_item->setGroupProperty(group_name, "DistributionLorentz");
794  item->setItemValue(DistributionLorentzItem::P_MEAN, factor * distr->getMean());
795  item->setItemValue(DistributionLorentzItem::P_HWHM, factor * distr->getHWHM());
796  } else if (const DistributionGaussian* distr =
797  dynamic_cast<const DistributionGaussian*>(p_distribution)) {
798  item = part_distr_item->setGroupProperty(group_name, "DistributionGaussian");
799  item->setItemValue(DistributionGaussianItem::P_MEAN, factor * distr->getMean());
800  item->setItemValue(DistributionGaussianItem::P_STD_DEV, factor * distr->getStdDev());
801  } else if (const DistributionLogNormal* distr =
802  dynamic_cast<const DistributionLogNormal*>(p_distribution)) {
803  item = part_distr_item->setGroupProperty(group_name, "DistributionLogNormal");
804  item->setItemValue(DistributionLogNormalItem::P_MEDIAN, factor * distr->getMedian());
805  item->setItemValue(DistributionLogNormalItem::P_SCALE_PAR, distr->getScalePar());
806  } else if (const DistributionCosine* distr =
807  dynamic_cast<const DistributionCosine*>(p_distribution)) {
808  item = part_distr_item->setGroupProperty(group_name, "DistributionCosine");
809  item->setItemValue(DistributionCosineItem::P_MEAN, factor * distr->getMean());
810  item->setItemValue(DistributionCosineItem::P_SIGMA, factor * distr->getSigma());
811  } else if (const DistributionTrapezoid* distr =
812  dynamic_cast<const DistributionTrapezoid*>(p_distribution)) {
813  item = part_distr_item->setGroupProperty(group_name, "DistributionTrapezoid");
814  item->setItemValue(DistributionTrapezoidItem::P_CENTER, factor * distr->getMean());
815  item->setItemValue(DistributionTrapezoidItem::P_LEFTWIDTH, factor * distr->getLeftWidth());
817  factor * distr->getMiddleWidth());
819  factor * distr->getRightWidth());
820  } else {
821  throw GUIHelpers::Error("TransformFromDomain::setDistribution: -> unknown distribution");
822  }
823 
824  DistributionItem* distItem = dynamic_cast<DistributionItem*>(item);
825  ASSERT(distItem);
826 
828 
831 
832  // TODO It's wrong if domain distribution made for angles.
833  if (distItem->isTag(DistributionItem::P_LIMITS))
834  distItem->init_limits_group(par_distr.getLimits(), factor);
835 }
836 
837 void addDistributionToBeamItem(const std::string& parameter_name, const QString& item_name,
838  const ParameterDistribution& distribution, const BeamItem* beam_item)
839 {
840  ParameterPattern pattern;
841  pattern.beginsWith("*").add("Beam").add(parameter_name);
842  if (distribution.getMainParameterName() != pattern.toStdString())
843  return;
844 
845  const auto beam_parameter = dynamic_cast<BeamDistributionItem*>(beam_item->getItem(item_name));
846  TransformFromDomain::setItemFromSample(beam_parameter, distribution);
847 }
848 
849 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
850  double std_dev)
851 {
852  auto distr_item = dynamic_cast<BeamDistributionItem*>(item);
853  if (!distr_item)
854  return;
855  ParameterDistribution par_distr("", *ranged.distribution(mean, std_dev), ranged.nSamples(),
856  ranged.sigmaFactor(), ranged.limits());
857  TransformFromDomain::setItemFromSample(distr_item, par_distr);
858 }
859 } // unnamed namespace
Declares AngularSpecScan class.
#define ASSERT(condition)
Definition: Assert.h:31
Defines various axis items.
Defines BackgroundItem classes.
Defines class BeamAngleItems.
Defines class ConstantBackground.
Defines class ConvolutionDetectorResolution.
Defines classes representing one-dimensional distributions.
Defines class Rectangle.
Defines FTDecayFunction1DItem classes.
Defines FTDistribution1DItem's classes.
Defines class FootprintGauss.
Declares FootprintItem classes.
Defines class FootprintSquare.
Defines class GISASSimulation.
Defines class GUIHelpers functions.
Defines class InfinitePlane.
Defines InstrumentItems classes.
Defines InterferenceFunctionItems's classes.
Includes all interference function definitions.
Defines classes Lattice2DItems.
Defines class LayerInterface.
Defines class LayerItem.
Defines classes LayerRoughnessItems.
Defines class LayerRoughness.
Defines class Layer.
Defines class Line.
Defines MaskItems classes.
Defines namespace node_progeny.
Defines class OffSpecularSimulation.
Defines class ParameterPattern.
Defines class ParticleDistributionItem.
Defines class ParticleItem.
Defines class Particle.
Defines class PoissonNoiseBackground.
Defines class Polygon.
Defines classes representing ranged one-dimensional distributions.
Defines class Rectangle.
Defines class RectangularDetectorItem.
Defines class RectangularDetector.
Defines class RegionOfInterest.
Defines class ResolutionFunction2DGaussian.
Defines family of ResolutionFunctionItem.
Defines scan resolution class.
Declares the class SpecularBeamInclinationItem.
Defines class SpecularSimulation.
Defines class SphericalDetectorItem.
Defines class SphericalDetector.
Defines namespace TransformFromDomain.
Defines some unit conversion factors and other constants in namespace Units.
Defines class VectorItem.
Scan type with inclination angles as coordinate values and a unique wavelength.
const ScanResolution * wavelengthResolution() const
const ScanResolution * angleResolution() const
double wavelength() const
void setBinCount(int value)
Definition: AxesItems.cpp:37
static const QString P_NBINS
Definition: AxesItems.h:26
static const QString P_MAX_DEG
Definition: AxesItems.h:28
static const QString P_TITLE
Definition: AxesItems.h:29
static const QString P_MIN_DEG
Definition: AxesItems.h:27
static const QString P_LATTICE_ANGLE
static const QString P_LATTICE_LENGTH2
static const QString P_LATTICE_LENGTH1
The BeamDistributionItem handles wavelength, inclination and azimuthal parameter distribution for Bea...
static const QString P_DISTRIBUTION
virtual double scaleFactor() const
Scales the values provided by distribution (to perform deg->rad conversion in the case of AngleDistri...
static const QString P_AZIMUTHAL_ANGLE
Definition: BeamItems.h:31
void setWavelength(double value)
Definition: BeamItems.cpp:74
static const QString P_WAVELENGTH
Definition: BeamItems.h:29
static const QString P_INCLINATION_ANGLE
Definition: BeamItems.h:30
virtual void setInclinationAngle(double value)
Definition: BeamItems.cpp:79
void setIntensity(double value)
Definition: BeamItems.cpp:64
void setAzimuthalAngle(double value)
Definition: BeamItems.cpp:89
static const QString P_POLARIZATION
Definition: BeamItems.h:32
An incident neutron or x-ray beam.
Definition: Beam.h:27
Direction direction() const
Definition: Beam.h:45
double intensity() const
Returns the beam intensity in neutrons/sec.
Definition: Beam.h:42
double wavelength() const
Definition: Beam.h:43
kvector_t getBlochVector() const
Definition: Beam.cpp:122
static const QString P_VALUE
Class representing a constant background signal.
Convolutes the intensity in 1 or 2 dimensions with a resolution function.
double analyzerEfficiency() const
will always return positive value
double analyzerTotalTransmission() const
kvector_t analyzerDirection() const
Retrieve the analyzer characteristics.
MaskContainerItem * maskContainerItem() const
static const QString P_ANALYZER_EFFICIENCY
Definition: DetectorItems.h:30
static const QString P_ANALYZER_DIRECTION
Definition: DetectorItems.h:29
static const QString P_RESOLUTION_FUNCTION
Definition: DetectorItems.h:28
static const QString P_ANALYZER_TOTAL_TRANSMISSION
Definition: DetectorItems.h:31
void createMaskContainer()
size_t numberOfMasks() const
double phi() const
Definition: Direction.h:30
double alpha() const
Definition: Direction.h:29
static const QString P_SIGMA
Cosine distribution.
static const QString P_MAX
static const QString P_MIN
Uniform distribution function with half width hwhm.
Definition: Distributions.h:88
static const QString P_STD_DEV
Gaussian distribution with standard deviation std_dev.
const Distributions_t & getDistributions() const
std::vector< ParameterDistribution > Distributions_t
void init_limits_group(const RealLimits &limits, double factor=1.0)
static const QString P_LIMITS
static const QString P_NUMBER_OF_SAMPLES
static const QString P_SIGMA_FACTOR
static const QString P_MEDIAN
static const QString P_SCALE_PAR
Log-normal distribution.
static const QString P_HWHM
Lorentz distribution with half width hwhm.
static const QString P_LEFTWIDTH
static const QString P_RIGHTWIDTH
static const QString P_MIDDLEWIDTH
static const QString P_CENTER
Trapezoidal distribution.
static const QString P_XRADIUS
Definition: MaskItems.h:91
static const QString P_YRADIUS
Definition: MaskItems.h:92
static const QString P_XCENTER
Definition: MaskItems.h:89
static const QString P_ANGLE
Definition: MaskItems.h:93
static const QString P_YCENTER
Definition: MaskItems.h:90
An ellipse, for use in detector masks.
Definition: Ellipse.h:23
One-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-|x|/decay_length) in r...
Definition: FTDecay1D.h:46
One-dimensional Gauss decay function in reciprocal space; corresponds to exp[-x^2/(2*decay_length^2)]...
Definition: FTDecay1D.h:59
static const QString P_DECAY_LENGTH
One-dimensional triangle decay function in reciprocal space; corresponds to 1-|x|/decay_length if |x|...
Definition: FTDecay1D.h:72
One-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*C...
Definition: FTDecay1D.h:85
Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space,...
Definition: FTDecay2D.h:65
Two-dimensional Gauss decay function in reciprocal space; corresponds to exp(-r^2/2) in real space,...
Definition: FTDecay2D.h:79
static const QString P_DECAY_LENGTH_X
static const QString P_DECAY_LENGTH_Y
static const QString P_GAMMA
Two-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*C...
Definition: FTDecay2D.h:92
Exponential IFTDistribution1D exp(-|omega*x|); its Fourier transform evaluate(q) is a Cauchy-Lorentzi...
IFTDistribution1D consisting of one cosine wave [1+cos(pi*x/omega) if |x|<omega, and 0 otherwise]; it...
Square gate IFTDistribution1D; its Fourier transform evaluate(q) is a sinc function starting at evalu...
Gaussian IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1...
static const QString P_OMEGA
Triangle IFTDistribution1D [1-|x|/omega if |x|<omega, and 0 otherwise]; its Fourier transform evaluat...
static const QString P_ETA
IFTDistribution1D that provides a Fourier transform evaluate(q) in form of a pseudo-Voigt decay funct...
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Two-dimensional cone distribution in Fourier space; corresponds to 1-r if r<1 (and 0 otherwise) in re...
Two-dimensional gate distribution in Fourier space; corresponds to normalized constant if r<1 (and 0 ...
Two-dimensional Gauss distribution in Fourier space; corresponds to normalized exp(-r^2/2) in real sp...
static const QString P_OMEGA_X
static const QString P_GAMMA
static const QString P_OMEGA_Y
static const QString P_ETA
Two-dimensional Voigt distribution in Fourier space; corresponds to eta*Gauss + (1-eta)*Cauchy.
Axis with fixed bin size.
Definition: FixedBinAxis.h:23
Gaussian beam footprint.
static const QString P_VALUE
static const QString P_VALUE
Rectangular beam footprint.
Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
static const QString P_LATTICE_LENGTH
static const QString P_POSY
Definition: MaskItems.h:81
An infinite horizontal line.
Definition: Line.h:55
double abundance() const
Interface for one-dimensional axes.
Definition: IAxis.h:25
virtual double upperBound() const =0
Returns value of last point of axis.
virtual size_t size() const =0
retrieve the number of bins
virtual double lowerBound() const =0
Returns value of first point of axis.
std::string getName() const
retrieve the label of the axis
Definition: IAxis.h:40
Interface for detector resolution algorithms.
Abstract detector interface.
Definition: IDetector.h:36
virtual const DetectorMask * detectorMask() const =0
Returns detector masks container.
const IAxis & axis(size_t index) const
Definition: IDetector.cpp:56
const IDetectorResolution * detectorResolution() const
Returns a pointer to detector resolution object.
Definition: IDetector.cpp:138
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
const DetectionProperties & detectionProperties() const
Returns detection properties.
Definition: IDetector.h:82
Interface for one-dimensional distributions.
Definition: Distributions.h:34
Interface for a one-dimensional decay function, with evaluate(q) returning the Fourier transform,...
Definition: FTDecay1D.h:29
Interface for two-dimensional decay function in reciprocal space.
Definition: FTDecay2D.h:27
Interface for a one-dimensional distribution, with normalization adjusted so that the Fourier transfo...
Interface for two-dimensional distributions in Fourier space.
Abstract base for classes that calculate the beam footprint factor.
Abstract base class of interference functions.
double positionVariance() const
Returns the position variance.
const std::string & getName() const
Interface for one-dimensional ranged distributions.
double sigmaFactor() const
Returns sigma factor to use during sampling.
std::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
RealLimits limits() const
Returns current limits of the distribution.
size_t nSamples() const
Returns number of samples to generate.
Basic class for all shapes in 2D.
Definition: IShape2D.h:27
Abstract base class of OffSpecularSimulation and GISASSimulation.
Definition: ISimulation2D.h:27
Abstract base class of OffSpecularSimulation, GISASSimulation and SpecularSimulation.
Definition: ISimulation.h:38
const DistributionHandler & getDistributionHandler() const
Definition: ISimulation.h:88
const IBackground * background() const
Definition: ISimulation.h:74
IDetector * getDetector()
Definition: ISimulation.h:61
Beam & beam()
Definition: ISimulation.h:58
The infinite plane is used for masking the entire detector.
Definition: InfinitePlane.h:28
void setDetectorGroup(const QString &modelType)
DetectorItem * detectorItem() const
static const QString P_BACKGROUND
Interference function of a 1D lattice.
Interference function of a 2D lattice.
Interference function of a 2D paracrystal.
Interference function of a finite 2D lattice.
Percus-Yevick hard disk interference function.
static const QString P_POSITION_VARIANCE
Interference function of radial paracrystal.
static const QString P_LATTICE_ROTATION_ANGLE
A two-dimensional Bravais lattice.
Definition: Lattice2D.h:23
double rotationAngle() const
Definition: Lattice2D.h:40
virtual double latticeAngle() const =0
virtual double length2() const =0
virtual double length1() const =0
static const QString P_LATERAL_CORR_LENGTH
static const QString P_SIGMA
static const QString P_HURST
Interface between two layers, possibly with roughness.
const LayerRoughness * getRoughness() const
Returns roughness of the interface.
static const QString P_THICKNESS
Definition: LayerItem.h:22
static const QString P_ROUGHNESS
Definition: LayerItem.h:23
static const QString P_NSLICES
Definition: LayerItem.h:25
A roughness of interface between two layers.
double getSigma() const
Returns rms of roughness.
double getLatteralCorrLength() const
Returns lateral correlation length.
double getHurstParameter() const
Returns hurst parameter.
A layer in a MultiLayer sample.
Definition: Layer.h:27
double thickness() const
Definition: Layer.h:38
unsigned int numberOfSlices() const
Definition: Layer.h:52
Container holding various masks as children.
Definition: MaskItems.h:24
static const QString P_MASK_VALUE
Definition: MaskItems.h:33
Main class to run an off-specular simulation.
A parametric distribution function, for use with any model parameter.
size_t getNbrSamples() const
get number of samples for this distribution
const IDistribution1D * getDistribution() const
double getSigmaFactor() const
get the sigma factor
std::vector< std::string > getLinkedParameterNames() const
get list of linked parameter names
RealLimits getLimits() const
std::string getMainParameterName() const
get the main parameter's name
Helper class for constructing parameter patterns.
ParameterPattern & beginsWith(std::string start_type)
std::string toStdString() const
ParameterPattern & add(std::string object_type)
static const QString P_DISTRIBUTION
void setDomainCacheNames(const QString &name, const QStringList &linked)
A particle type that is a parametric distribution of IParticle's.
ParameterDistribution parameterDistribution() const
Returns the distributed parameter data.
std::string mainUnits() const
static const QString P_ABUNDANCE
Definition: ParticleItem.h:26
Class representing Poisson noise on top of the scattered intensity.
static const QString P_ISCLOSED
Definition: MaskItems.h:65
static const QString P_POSX
Definition: MaskItems.h:57
static const QString P_POSY
Definition: MaskItems.h:58
A polygon, for use in detector masks.
Definition: Polygon.h:30
static const QString P_XUP
Definition: MaskItems.h:43
static const QString P_YLOW
Definition: MaskItems.h:42
static const QString P_YUP
Definition: MaskItems.h:44
static const QString P_XLOW
Definition: MaskItems.h:41
A rectangle, for use in detector masks.
Definition: Rectangle.h:25
const BasicAxisItem * xAxisItem() const
static const QString P_DIRECTION
void setDetectorAlignment(const QString &alignment)
static const QString P_NORMAL
static const QString P_DBEAM_V0
static const QString P_DISTANCE
static const QString P_DBEAM_U0
const BasicAxisItem * yAxisItem() const
A flat rectangular detector with axes and resolution function.
EDetectorArrangement getDetectorArrangment() const
double getDirectBeamV0() const
kvector_t getDirectionVector() const
double getDirectBeamU0() const
kvector_t getNormalVector() const
double getYlow() const
double getYup() const
double getXlow() const
double getXup() const
Simple gaussian two-dimensional resolution function.
virtual std::vector< double > stdDevs(double mean, size_t n_times) const =0
bool isTag(const QString &name) const
Returns true if tag is available.
bool insertItem(int row, SessionItem *item, const QString &tag="")
Insert item into given tag into given row.
T * item(const QString &tag) const
Definition: SessionItem.h:151
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
SessionItem * setGroupProperty(const QString &groupTag, const QString &modelType) const
Set the current type of group item.
QString modelType() const
Get model type.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
static const QString P_FOOPTPRINT
Definition: BeamItems.h:56
void setInclinationAngle(double value) override
Definition: BeamItems.cpp:148
BasicAxisItem * currentInclinationAxisItem()
Definition: BeamItems.cpp:161
Main class to run a specular simulation.
const IAxis * coordinateAxis() const
Returns a pointer to coordinate axis.
const IFootprintFactor * footprintFactor() const
Returns a pointer to footprint factor holder.
const ISpecularScan * dataHandler() const
Returns internal data handler.
const BasicAxisItem * alphaAxisItem() const
const BasicAxisItem * phiAxisItem() const
A detector with coordinate axes along angles phi and alpha.
static const QString P_LATTICE_LENGTH
static const QString P_MEAN
static const QString P_POSX
Definition: MaskItems.h:73
An infinite vertical line.
Definition: Line.h:38
QStringList fromStdStrings(const std::vector< std::string > &container)
Definition: GUIHelpers.cpp:233
void setFinite2DLatticeItem(SessionItem *item, const InterferenceFunctionFinite2DLattice &sample)
void setRadialParaCrystalItem(SessionItem *item, const InterferenceFunctionRadialParaCrystal &sample)
bool isValidRoughness(const LayerRoughness *roughness)
Returns true if given roughness is non-zero roughness.
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 setItemFromSample(BeamDistributionItem *beam_distribution_item, const ParameterDistribution &parameter_distribution)
void setRectangularDetector(RectangularDetectorItem *detector_item, const RectangularDetector &detector)
void setHardDiskItem(SessionItem *item, const InterferenceFunctionHardDisk &sample)
void set2DParaCrystalItem(SessionItem *item, const InterferenceFunction2DParaCrystal &sample)
void setRoughnessItem(SessionItem *item, const LayerRoughness &sample)
void setSphericalDetector(SphericalDetectorItem *detector_item, const SphericalDetector &detector)
void setDetectorResolution(DetectorItem *detector_item, const IDetector &detector)
void setDetectorGeometry(Instrument2DItem *instrument_item, const IDetector &detector)
void setLayerItem(SessionItem *layer_item, const Layer *layer, const LayerInterface *top_interface)
void setDetector(Instrument2DItem *instrument_item, const ISimulation2D &simulation)
void setMaskContainer(MaskContainerItem *container_item, const IDetector &detector, double scale)
void set2DLatticeItem(SessionItem *item, const InterferenceFunction2DLattice &sample)
void setDetectorProperties(DetectorItem *detector_item, const IDetector &detector)
void setBackground(InstrumentItem *instrument_item, const ISimulation &simulation)
void set1DLatticeItem(SessionItem *item, const InterferenceFunction1DLattice &sample)
void setParticleDistributionItem(SessionItem *item, const ParticleDistribution &sample)
Initialization of ParticleDistributionItem.
void setDetectorMasks(DetectorItem *detector_item, const ISimulation &simulation)
void setFootprintFactor(const IFootprintFactor *footprint, SpecularBeamItem *beam_item)
void setSpecularBeamItem(SpecularBeamItem *beam_item, const SpecularSimulation &simulation)
static constexpr double deg
Definition: Units.h:46
double rad2deg(double angle)
Definition: Units.h:55