BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
UnitConverterUtils.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Core/Simulation/UnitConverterUtils.cpp
6 //! @brief Implements utilities for unit convertion.
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 
24 
25 std::unique_ptr<OutputData<double>>
27 {
28  std::unique_ptr<OutputData<double>> result = std::make_unique<OutputData<double>>();
29  for (size_t i = 0; i < converter.dimension(); ++i)
30  result->addAxis(*converter.createConvertedAxis(i, units));
31  result->setAllTo(0.0);
32  return result;
33 }
34 
35 std::unique_ptr<IUnitConverter>
37 {
38  const IDetector* const detector = instrument.getDetector();
39 
40  if (const auto* const det = dynamic_cast<const SphericalDetector*>(detector))
41  return std::make_unique<SphericalConverter>(*det, instrument.getBeam());
42  else if (const auto* const det = dynamic_cast<const RectangularDetector*>(detector))
43  return std::make_unique<RectangularConverter>(*det, instrument.getBeam());
44 
45  throw std::runtime_error("Error in createConverterForGISAS: wrong or absent detector type");
46 }
47 
48 std::unique_ptr<IUnitConverter> UnitConverterUtils::createConverter(const Simulation& simulation)
49 {
50  if (auto gisas = dynamic_cast<const GISASSimulation*>(&simulation)) {
51  return createConverterForGISAS(gisas->instrument());
52 
53  } else if (auto spec = dynamic_cast<const SpecularSimulation*>(&simulation)) {
54  return UnitConverter1D::createUnitConverter(*spec->dataHandler());
55 
56  } else if (auto probe = dynamic_cast<const DepthProbeSimulation*>(&simulation)) {
57  return probe->createUnitConverter();
58 
59  } else if (auto off_spec = dynamic_cast<const OffSpecSimulation*>(&simulation)) {
60  return off_spec->createUnitConverter();
61 
62  } else {
63  throw std::runtime_error("UnitConverterUtils::createConverter -> "
64  "Not implemented simulation.");
65  }
66 }
Defines class DepthProbeSimulation.
Defines class GISASSimulation.
Defines class OffSpecSimulation.
Defines class RectangularDetector.
Defines interface UnitConverterSimple and its subclasses.
Defines class SpecularSimulation.
Defines class SphericalDetector.
Defines UnitConverter1D class and derived classes.
Declares utilities for unit converters.
Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
Abstract detector interface.
Definition: IDetector.h:36
Interface to provide axis translations to different units for simulation output.
virtual size_t dimension() const =0
virtual std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const =0
Assembles beam, detector and their relative positions with respect to the sample.
Definition: Instrument.h:34
Beam & getBeam()
Definition: Instrument.h:44
const IDetector * getDetector() const
Definition: Instrument.cpp:121
Main class to run an off-specular simulation.
A flat rectangular detector with axes and resolution function.
Pure virtual base class of OffSpecularSimulation, GISASSimulation and SpecularSimulation.
Definition: Simulation.h:38
Main class to run a specular simulation.
A spherical detector with axes and resolution function.
static std::unique_ptr< UnitConverter1D > createUnitConverter(const ISpecularScan &handler)
Factory function to create unit converter for particular type of specular data.
std::unique_ptr< IUnitConverter > createConverter(const Simulation &simulation)
std::unique_ptr< OutputData< double > > createOutputData(const IUnitConverter &converter, Axes::Units units)
Returns zero-valued output data array in specified units.
std::unique_ptr< IUnitConverter > createConverterForGISAS(const Instrument &instrument)
Helper factory function to use in GISASSimulation.