BornAgain  1.19.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 reflection and scattering
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 #ifdef SWIG
16 #error no need to expose this header to Swig
17 #endif
18 
19 #ifndef USER_API
20 #ifndef BORNAGAIN_DEVICE_DETECTOR_SIMPLEUNITCONVERTERS_H
21 #define BORNAGAIN_DEVICE_DETECTOR_SIMPLEUNITCONVERTERS_H
22 
23 #include "Base/Vector/Vectors3D.h"
25 
26 class Beam;
27 class IDetector;
28 class IDetector2D;
30 class RectangularPixel;
31 class SphericalDetector;
32 
33 //! Interface for objects that provide axis translations to different units for IDetector objects
34 //! @ingroup simulation_internal
35 
37 public:
38  UnitConverterSimple(const Beam& beam);
39  ~UnitConverterSimple() override = default;
40 
41  virtual size_t dimension() const override;
42 
43  double calculateMin(size_t i_axis, Axes::Units units_type) const override;
44  double calculateMax(size_t i_axis, Axes::Units units_type) const override;
45  size_t axisSize(size_t i_axis) const override;
46 
47  //! Returns the list of all available units
48  std::vector<Axes::Units> availableUnits() const override;
49 
50  std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const override;
51 
52 protected:
54  void addDetectorAxis(const IDetector& detector, size_t i_axis);
55 
56  void addAxisData(std::string name, double min, double max, Axes::Units default_units,
57  size_t nbins);
58 
59 #ifndef SWIG
60  struct AxisData {
61  std::string name;
62  double min, max;
64  size_t nbins;
65  };
66  std::vector<AxisData> m_axis_data_table;
67 #endif
68  double m_wavelength;
69  double m_alpha_i;
70  double m_phi_i;
71 
72 private:
73  virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const = 0;
74 };
75 
76 //! IUnitConverter class that handles the unit translations for spherical detectors
77 //! Its default units are radians for both axes
78 //! @ingroup simulation_internal
79 
81 public:
82  SphericalConverter(const SphericalDetector& detector, const Beam& beam);
83 
84  ~SphericalConverter() override;
85 
86  SphericalConverter* clone() const override;
87 
88  //! Returns the list of all available units
89  std::vector<Axes::Units> availableUnits() const override;
90 
91  Axes::Units defaultUnits() const override;
92 
93 private:
95  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override;
96  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
97 };
98 
99 //! IUnitConverter class that handles the unit translations for rectangular detectors
100 //! Its default units are mm for both axes
101 //! @ingroup simulation_internal
102 
104 public:
105  RectangularConverter(const RectangularDetector& detector, const Beam& beam);
107 
108  RectangularConverter* clone() const override;
109 
110  //! Returns the list of all available units
111  std::vector<Axes::Units> availableUnits() const override;
112 
113  Axes::Units defaultUnits() const override;
114 
115 private:
117  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override;
118  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
120  double axisAngle(size_t i_axis, kvector_t k_f) const;
121  std::unique_ptr<RectangularPixel> m_detector_pixel;
122 };
123 
124 //! IUnitConverter class that handles the unit translations for off-specular simulations
125 //! with a spherical detector
126 //! Its default units are radians for both axes
127 //! @ingroup simulation_internal
128 
130 public:
131  OffSpecularConverter(const IDetector2D& detector, const Beam& beam, const IAxis& alpha_axis);
133 
134  OffSpecularConverter* clone() const override;
135 
136  Axes::Units defaultUnits() const override;
137 
138 private:
140  double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override;
141  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
142  void addDetectorYAxis(const IDetector2D& detector);
143 };
144 
145 //! DepthProbeConverter class handles the unit translations for depth probe simulations
146 //! Its default units are radians for x-axis and nm for y-axis
147 //! @ingroup simulation_internal
148 
150 public:
151  DepthProbeConverter(const Beam& beam, const IAxis& alpha_axis, const IAxis& z_axis);
153 
154  DepthProbeConverter* clone() const override;
155 
156  //! Returns the list of all available units
157  std::vector<Axes::Units> availableUnits() const override;
158 
159  Axes::Units defaultUnits() const override { return Axes::Units::DEGREES; }
160 
161 private:
163  double calculateValue(size_t, Axes::Units units_type, double value) const override;
164  std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
165  void checkUnits(Axes::Units units_type) const;
166 };
167 
168 #endif // BORNAGAIN_DEVICE_DETECTOR_SIMPLEUNITCONVERTERS_H
169 #endif // USER_API
Defines interface IUnitConverter and possible axis units.
Defines basic vectors in Z^3, R^3, C^3.
An incident neutron or x-ray beam.
Definition: Beam.h:27
DepthProbeConverter class handles the unit translations for depth probe simulations Its default units...
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
DepthProbeConverter(const Beam &beam, const IAxis &alpha_axis, const IAxis &z_axis)
~DepthProbeConverter() override
double calculateValue(size_t, Axes::Units units_type, double value) const override
void checkUnits(Axes::Units units_type) const
Axes::Units defaultUnits() const override
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
DepthProbeConverter * clone() const override
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(const IDetector2D &detector, const Beam &beam, const IAxis &alpha_axis)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
OffSpecularConverter * clone() const override
Axes::Units defaultUnits() const override
~OffSpecularConverter() override
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
void addDetectorYAxis(const IDetector2D &detector)
IUnitConverter class that handles the unit translations for rectangular detectors Its default units a...
kvector_t normalizeToWavelength(kvector_t vector) const
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
RectangularConverter(const RectangularDetector &detector, const Beam &beam)
~RectangularConverter() override
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
double axisAngle(size_t i_axis, kvector_t k_f) const
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Axes::Units defaultUnits() const override
RectangularConverter * clone() const override
std::unique_ptr< RectangularPixel > m_detector_pixel
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...
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
~SphericalConverter() override
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
SphericalConverter(const SphericalDetector &detector, const Beam &beam)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
SphericalConverter * clone() const override
Axes::Units defaultUnits() const override
A detector with coordinate axes along angles phi and alpha.
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 override
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 override
double calculateMin(size_t i_axis, Axes::Units units_type) const override
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const override
~UnitConverterSimple() override=default
virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const =0
virtual size_t dimension() const override
UnitConverterSimple(const Beam &beam)
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
QString const & name(EShape k)
Definition: particles.cpp:21