BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
UnitConverter1D.h
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Core/Scan/UnitConverter1D.h
6 //! @brief Defines UnitConverter1D class and derived classes.
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 
15 #ifndef BORNAGAIN_CORE_INTENSITY_UNITCONVERTER1D_H
16 #define BORNAGAIN_CORE_INTENSITY_UNITCONVERTER1D_H
17 
19 
20 #include <functional>
21 
22 class Beam;
23 class ISpecularScan;
24 class AngularSpecScan;
25 class QSpecScan;
26 
27 //! Conversion of axis units for the case of 1D simulation result.
28 
30 {
31 public:
32  //! Factory function to create unit converter for particular type of specular data
33  static std::unique_ptr<UnitConverter1D> createUnitConverter(const ISpecularScan& handler);
34 
35  ~UnitConverter1D() override = default;
36 
37  UnitConverter1D* clone() const override = 0;
38 
39  //! Returns dimensionality of converted canvas.
40  size_t dimension() const override;
41 
42  //! Calculates minimum on-axis value in given units.
43  double calculateMin(size_t i_axis, Axes::Units units_type) const override;
44 
45  //! Calculates maximum on-axis value in given units.
46  double calculateMax(size_t i_axis, Axes::Units units_type) const override;
47 
48  //! Creates axis in converted units.
49  std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const override;
50 
51  //! Creates OutputData array in converter units.
52  std::unique_ptr<OutputData<double>> createConvertedData(const OutputData<double>& data,
53  Axes::Units units) const override;
54 
55 protected:
56  //! Returns translating functional (rads --> output units)
57  virtual std::function<double(double)> getTraslatorTo(Axes::Units units_type) const = 0;
58 
59  virtual const IAxis* coordinateAxis() const = 0;
60 };
61 
62 //! Conversion of axis units for the case of conventional (angle-based) reflectometry.
64 {
65 public:
66  //! Constructs the object for unit conversion.
67  UnitConverterConvSpec(const Beam& beam, const IAxis& axis,
68  Axes::Units axis_units = Axes::Units::RADIANS);
69  UnitConverterConvSpec(const AngularSpecScan& handler);
71 
72  UnitConverterConvSpec* clone() const override;
73 
74  //! Returns the size of underlying axis.
75  size_t axisSize(size_t i_axis) const override;
76 
77  //! Returns the list of all available units
78  std::vector<Axes::Units> availableUnits() const override;
79 
80  //! Returns default units to convert to.
81  Axes::Units defaultUnits() const override;
82 
83 protected:
85 
86  //! Creates name map for axis in various units
87  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
88 
89  //! Returns translating functional (input units --> rads)
90  std::function<double(double)> getTraslatorFrom(Axes::Units units_type) const;
91 
92  //! Returns translating functional (rads --> desired units)
93  std::function<double(double)> getTraslatorTo(Axes::Units units_type) const override;
94 
95  const IAxis* coordinateAxis() const override { return m_axis.get(); }
96 
97  double m_wavelength; //!< basic wavelength in nm (for translation to q-space).
98  std::unique_ptr<IAxis> m_axis; //!< basic inclination angles (in rads).
99 };
100 
101 //! Conversion of axis units for the case of q-defined reflectometry.
103 {
104 public:
105  UnitConverterQSpec(const QSpecScan& handler);
107 
108  UnitConverterQSpec* clone() const override;
109 
110  //! Returns the size of underlying axis.
111  size_t axisSize(size_t i_axis) const override;
112 
113  //! Returns the list of all available units
114  std::vector<Axes::Units> availableUnits() const override;
115 
116  //! Returns default units to convert to.
117  Axes::Units defaultUnits() const override;
118 
119 protected:
121 
122  //! Creates name map for axis in various units
123  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
124 
125  //! Returns translating functional (inv. nm --> desired units)
126  std::function<double(double)> getTraslatorTo(Axes::Units units_type) const override;
127 
128  const IAxis* coordinateAxis() const override { return m_axis.get(); }
129 
130  std::unique_ptr<IAxis> m_axis; //!< qz values (in inv. nm).
131 };
132 #endif // BORNAGAIN_CORE_INTENSITY_UNITCONVERTER1D_H
Defines interface IUnitConverter and possible axis units.
Scan type with inclination angles as coordinate values and a unique wavelength.
Beam defined by wavelength, direction and intensity.
Definition: Beam.h:27
Interface for one-dimensional axes.
Definition: IAxis.h:25
Pure virtual base class for all types of specular scans.
Definition: ISpecularScan.h:31
Interface to provide axis translations to different units for simulation output.
Scan type with z-components of scattering vector as coordinate values.
Definition: QSpecScan.h:29
Conversion of axis units for the case of 1D simulation result.
static std::unique_ptr< UnitConverter1D > createUnitConverter(const ISpecularScan &handler)
Factory function to create unit converter for particular type of specular data.
size_t dimension() const override
Returns dimensionality of converted canvas.
std::unique_ptr< OutputData< double > > createConvertedData(const OutputData< double > &data, Axes::Units units) const override
Creates OutputData array in converter units.
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const override
Creates axis in converted units.
double calculateMax(size_t i_axis, Axes::Units units_type) const override
Calculates maximum on-axis value in given units.
virtual const IAxis * coordinateAxis() const =0
double calculateMin(size_t i_axis, Axes::Units units_type) const override
Calculates minimum on-axis value in given units.
virtual std::function< double(double)> getTraslatorTo(Axes::Units units_type) const =0
Returns translating functional (rads --> output units)
UnitConverter1D * clone() const override=0
~UnitConverter1D() override=default
Conversion of axis units for the case of conventional (angle-based) reflectometry.
UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
Constructs the object for unit conversion.
size_t axisSize(size_t i_axis) const override
Returns the size of underlying axis.
double m_wavelength
basic wavelength in nm (for translation to q-space).
const IAxis * coordinateAxis() const override
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Creates name map for axis in various units.
UnitConverterConvSpec * clone() const override
~UnitConverterConvSpec() override
std::function< double(double)> getTraslatorTo(Axes::Units units_type) const override
Returns translating functional (rads --> desired units)
std::function< double(double)> getTraslatorFrom(Axes::Units units_type) const
Returns translating functional (input units --> rads)
Axes::Units defaultUnits() const override
Returns default units to convert to.
std::unique_ptr< IAxis > m_axis
basic inclination angles (in rads).
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
Conversion of axis units for the case of q-defined reflectometry.
UnitConverterQSpec(const QSpecScan &handler)
std::function< double(double)> getTraslatorTo(Axes::Units units_type) const override
Returns translating functional (inv. nm --> desired units)
const IAxis * coordinateAxis() const override
~UnitConverterQSpec() override
std::unique_ptr< IAxis > m_axis
qz values (in inv. nm).
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Creates name map for axis in various units.
UnitConverterQSpec * clone() const override
Axes::Units defaultUnits() const override
Returns default units to convert to.
size_t axisSize(size_t i_axis) const override
Returns the size of underlying axis.
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.