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