BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SimpleUnitConverters.h
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Device/Detector/SimpleUnitConverters.h
6 //! @brief Defines interface UnitConverterSimple and its subclasses.
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_SIMPLEUNITCONVERTERS_H
16 #define BORNAGAIN_CORE_INTENSITY_SIMPLEUNITCONVERTERS_H
17 
18 #include "Base/Vector/Vectors3D.h"
20 
21 class Beam;
22 class IDetector;
23 class IDetector2D;
25 class RectangularPixel;
26 class SphericalDetector;
27 
28 //! Interface for objects that provide axis translations to different units for IDetector objects
29 //! @ingroup simulation_internal
30 
32 {
33 public:
34  UnitConverterSimple(const Beam& beam);
35  ~UnitConverterSimple() override = default;
36 
37  virtual size_t dimension() const final;
38 
39  double calculateMin(size_t i_axis, Axes::Units units_type) const final;
40  double calculateMax(size_t i_axis, Axes::Units units_type) const final;
41  size_t axisSize(size_t i_axis) const final;
42 
43  //! Returns the list of all available units
44  std::vector<Axes::Units> availableUnits() const override;
45 
46  std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const final;
47 
48 protected:
50  void addDetectorAxis(const IDetector& detector, size_t i_axis);
51 
52  void addAxisData(std::string name, double min, double max, Axes::Units default_units,
53  size_t nbins);
54 
55 #ifndef SWIG
56  struct AxisData {
57  std::string name;
58  double min, max;
60  size_t nbins;
61  };
62  std::vector<AxisData> m_axis_data_table;
63 #endif
64  double m_wavelength;
65  double m_alpha_i;
66  double m_phi_i;
67 
68 private:
69  virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const = 0;
70 };
71 
72 //! IUnitConverter class that handles the unit translations for spherical detectors
73 //! Its default units are radians for both axes
74 //! @ingroup simulation_internal
75 
77 {
78 public:
79  SphericalConverter(const SphericalDetector& detector, const Beam& beam);
80 
82 
83  SphericalConverter* clone() const final;
84 
85  //! Returns the list of all available units
86  std::vector<Axes::Units> availableUnits() const final;
87 
88  Axes::Units defaultUnits() const final;
89 
90 private:
92  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
93  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
94 };
95 
96 //! IUnitConverter class that handles the unit translations for rectangular detectors
97 //! Its default units are mm for both axes
98 //! @ingroup simulation_internal
99 
101 {
102 public:
103  RectangularConverter(const RectangularDetector& detector, const Beam& beam);
105 
106  RectangularConverter* clone() const final;
107 
108  //! Returns the list of all available units
109  std::vector<Axes::Units> availableUnits() const final;
110 
111  Axes::Units defaultUnits() const final;
112 
113 private:
115  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
116  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
117  kvector_t normalizeToWavelength(kvector_t vector) const;
118  double axisAngle(size_t i_axis, kvector_t k_f) const;
119  std::unique_ptr<RectangularPixel> mP_detector_pixel;
120 };
121 
122 //! IUnitConverter class that handles the unit translations for off-specular simulations
123 //! with a spherical detector
124 //! Its default units are radians for both axes
125 //! @ingroup simulation_internal
126 
128 {
129 public:
130  OffSpecularConverter(const IDetector2D& detector, const Beam& beam, const IAxis& alpha_axis);
132 
133  OffSpecularConverter* clone() const final;
134 
135  Axes::Units defaultUnits() const final;
136 
137 private:
139  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
140  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
141  void addDetectorYAxis(const IDetector2D& detector);
142 };
143 
144 //! DepthProbeConverter class handles the unit translations for depth probe simulations
145 //! Its default units are radians for x-axis and nm for y-axis
146 //! @ingroup simulation_internal
147 
149 {
150 public:
151  DepthProbeConverter(const Beam& beam, const IAxis& alpha_axis, const IAxis& z_axis);
153 
154  DepthProbeConverter* clone() const final;
155 
156  //! Returns the list of all available units
157  std::vector<Axes::Units> availableUnits() const final;
158 
159  Axes::Units defaultUnits() const final { return Axes::Units::DEGREES; }
160 
161 private:
163  double calculateValue(size_t, Axes::Units units_type, double value) const final;
164  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
165  void checkUnits(Axes::Units units_type) const;
166 };
167 
168 #endif // BORNAGAIN_CORE_INTENSITY_SIMPLEUNITCONVERTERS_H
Defines interface IUnitConverter and possible axis units.
Defines basic vectors in R^3 and C^3.
Wrapper for detector axes units, required for a better representation of detector axes units in pytho...
Beam defined by wavelength, direction and intensity.
Definition: Beam.h:27
DepthProbeConverter class handles the unit translations for depth probe simulations Its default units...
~DepthProbeConverter() final
Interface for one-dimensional axes.
Definition: IAxis.h:25
Abstract 2D detector interface.
Definition: IDetector2D.h:31
Abstract detector interface.
Definition: IDetector.h:36
Interface to provide axis translations to different units for simulation output.
IUnitConverter class that handles the unit translations for off-specular simulations with a spherical...
~OffSpecularConverter() final
IUnitConverter class that handles the unit translations for rectangular detectors Its default units a...
~RectangularConverter() final
A flat rectangular detector with axes and resolution function.
A pixel in a RectangularDetector.
IUnitConverter class that handles the unit translations for spherical detectors Its default units are...
SphericalConverter(const SphericalDetector &detector, const Beam &beam)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const final
SphericalConverter * clone() const final
~SphericalConverter() final
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
Axes::Units defaultUnits() const final
A spherical detector with axes and resolution function.
Interface for objects that provide axis translations to different units for IDetector objects.
void addDetectorAxis(const IDetector &detector, size_t i_axis)
double calculateMax(size_t i_axis, Axes::Units units_type) const final
double calculateMin(size_t i_axis, Axes::Units units_type) const final
void addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins)
std::vector< AxisData > m_axis_data_table
size_t axisSize(size_t i_axis) const final
~UnitConverterSimple() override=default
virtual size_t dimension() const final
virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const =0
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const final
UnitConverterSimple(const Beam &beam)
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
Constants and functions for physical unit conversions.
Definition: Units.h:21