BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
IUnitConverter.h
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Device/Unit/IUnitConverter.h
6 //! @brief Defines interface IUnitConverter and possible axis units.
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_IUNITCONVERTER_H
16 #define BORNAGAIN_CORE_INTENSITY_IUNITCONVERTER_H
17 
18 #include "Base/Types/ICloneable.h"
19 #include <map>
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 class IAxis;
25 template <class T> class OutputData;
26 
27 //! Wrapper for detector axes units, required for a better representation of
28 //! detector axes units in python
29 //! @ingroup detector
30 
31 class Axes
32 {
33 public:
35 };
36 
37 const std::map<Axes::Units, const char*> axisUnitName = {
38  {Axes::Units::NBINS, "Axes::Units::UNDEFINED"}, {Axes::Units::NBINS, "Axes::Units::NBINS"},
39  {Axes::Units::RADIANS, "Axes::Units::RADIANS"}, {Axes::Units::DEGREES, "Axes::Units::DEGREES"},
40  {Axes::Units::MM, "Axes::Units::MM"}, {Axes::Units::QSPACE, "Axes::Units::QSPACE"},
41  {Axes::Units::QXQY, "Axes::Units::QXQY"}, {Axes::Units::RQ4, "Axes::Units::RQ4"}};
42 
43 const std::map<Axes::Units, const char*> axisUnitLabel = {
44  {Axes::Units::NBINS, "undefined"}, {Axes::Units::NBINS, "bin"}, {Axes::Units::RADIANS, "rad"},
45  {Axes::Units::DEGREES, "deg"}, {Axes::Units::MM, "mm"}, {Axes::Units::QSPACE, "1/nm"},
46  {Axes::Units::QXQY, "1/nm"}, {Axes::Units::RQ4, "nm^-4?"}};
47 
48 //! Interface to provide axis translations to different units for simulation output
49 //! @ingroup simulation_internal
50 
51 class IUnitConverter : public ICloneable
52 {
53 public:
54  virtual ~IUnitConverter();
55 
56  virtual IUnitConverter* clone() const = 0;
57 
58  virtual size_t dimension() const = 0;
59 
60  virtual double calculateMin(size_t i_axis, Axes::Units units_type) const = 0;
61  virtual double calculateMax(size_t i_axis, Axes::Units units_type) const = 0;
62  virtual size_t axisSize(size_t i_axis) const = 0;
63 
64  std::string axisName(size_t i_axis, Axes::Units units_type = Axes::Units::DEFAULT) const;
65 
66  virtual std::vector<Axes::Units> availableUnits() const = 0;
67  virtual Axes::Units defaultUnits() const = 0;
69 
70 #ifndef SWIG
71  virtual std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const = 0;
72 
73  //! Creates OutputData array in converter units.
74  virtual std::unique_ptr<OutputData<double>> createConvertedData(const OutputData<double>& data,
75  Axes::Units units) const;
76 #endif // SWIG
77 
78 protected:
79  void checkIndex(size_t i_axis) const;
80 #ifndef SWIG
81  [[noreturn]] void throwUnitsError(std::string method, std::vector<Axes::Units> available) const;
82 #endif // SWIG
83 
84 private:
85  virtual std::vector<std::map<Axes::Units, std::string>> createNameMaps() const = 0;
86 };
87 
88 #endif // BORNAGAIN_CORE_INTENSITY_IUNITCONVERTER_H
Defines and implements the standard mix-in ICloneable.
const std::map< Axes::Units, const char * > axisUnitName
const std::map< Axes::Units, const char * > axisUnitLabel
Wrapper for detector axes units, required for a better representation of detector axes units in pytho...
Interface for one-dimensional axes.
Definition: IAxis.h:25
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:25
Interface to provide axis translations to different units for simulation output.
Axes::Units substituteDefaultUnits(Axes::Units units) const
virtual size_t dimension() const =0
virtual ~IUnitConverter()
virtual size_t axisSize(size_t i_axis) const =0
void checkIndex(size_t i_axis) const
virtual Axes::Units defaultUnits() const =0
virtual std::vector< Axes::Units > availableUnits() const =0
virtual std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const =0
virtual std::unique_ptr< OutputData< double > > createConvertedData(const OutputData< double > &data, Axes::Units units) const
Creates OutputData array in converter units.
virtual double calculateMin(size_t i_axis, Axes::Units units_type) const =0
virtual double calculateMax(size_t i_axis, Axes::Units units_type) const =0
virtual std::vector< std::map< Axes::Units, std::string > > createNameMaps() const =0
void throwUnitsError(std::string method, std::vector< Axes::Units > available) const
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
virtual IUnitConverter * clone() const =0
Template class to store data of any type in multi-dimensional space.
Definition: OutputData.h:33
Constants and functions for physical unit conversions.
Definition: Units.h:21