BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SphericalConverter Class Reference

IUnitConverter class that handles the unit translations for spherical detectors Its default units are radians for both axes. More...

Inheritance diagram for SphericalConverter:
[legend]
Collaboration diagram for SphericalConverter:
[legend]

Public Member Functions

 SphericalConverter (const SphericalDetector &detector, const Beam &beam)
 
 ~SphericalConverter () override
 
std::vector< Axes::UnitsavailableUnits () const override
 Returns the list of all available units. More...
 
std::string axisName (size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 
size_t axisSize (size_t i_axis) const override
 
double calculateMax (size_t i_axis, Axes::Units units_type) const override
 
double calculateMin (size_t i_axis, Axes::Units units_type) const override
 
SphericalConverterclone () const override
 
std::unique_ptr< IAxiscreateConvertedAxis (size_t i_axis, Axes::Units units) const override
 
virtual std::unique_ptr< OutputData< double > > createConvertedData (const OutputData< double > &data, Axes::Units units) const
 Creates OutputData array in converter units. More...
 
Axes::Units defaultUnits () const override
 
virtual size_t dimension () const override
 
Axes::Units substituteDefaultUnits (Axes::Units units) const
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Protected Member Functions

void addAxisData (std::string name, double min, double max, Axes::Units default_units, size_t nbins)
 
void addDetectorAxis (const IDetector &detector, size_t i_axis)
 
void checkIndex (size_t i_axis) const
 
void throwUnitsError (std::string method, std::vector< Axes::Units > available) const
 

Protected Attributes

double m_alpha_i
 
std::vector< AxisDatam_axis_data_table
 
double m_phi_i
 
double m_wavelength
 

Private Member Functions

 SphericalConverter (const SphericalConverter &other)
 
double calculateValue (size_t i_axis, Axes::Units units_type, double value) const override
 
std::vector< std::map< Axes::Units, std::string > > createNameMaps () const override
 

Detailed Description

IUnitConverter class that handles the unit translations for spherical detectors Its default units are radians for both axes.

Definition at line 80 of file SimpleUnitConverters.h.

Constructor & Destructor Documentation

◆ SphericalConverter() [1/2]

SphericalConverter::SphericalConverter ( const SphericalDetector detector,
const Beam beam 
)

Definition at line 125 of file SimpleUnitConverters.cpp.

126  : UnitConverterSimple(beam)
127 {
128  if (detector.dimension() != 2)
129  throw std::runtime_error("Error in SphericalConverter constructor: "
130  "detector has wrong dimension: "
131  + std::to_string(static_cast<int>(detector.dimension())));
132  addDetectorAxis(detector, 0);
133  addDetectorAxis(detector, 1);
134 }
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:46
void addDetectorAxis(const IDetector &detector, size_t i_axis)
UnitConverterSimple(const Beam &beam)

References UnitConverterSimple::addDetectorAxis(), and IDetector::dimension().

Referenced by clone().

Here is the call graph for this function:

◆ ~SphericalConverter()

SphericalConverter::~SphericalConverter ( )
overridedefault

◆ SphericalConverter() [2/2]

SphericalConverter::SphericalConverter ( const SphericalConverter other)
private

Definition at line 155 of file SimpleUnitConverters.cpp.

155  : UnitConverterSimple(other)
156 {
157 }

Member Function Documentation

◆ addAxisData()

void UnitConverterSimple::addAxisData ( std::string  name,
double  min,
double  max,
Axes::Units  default_units,
size_t  nbins 
)
protectedinherited

Definition at line 51 of file SimpleUnitConverters.cpp.

53 {
54  AxisData axis_data{name, min, max, default_units, nbins};
55  m_axis_data_table.push_back(axis_data);
56 }
std::vector< AxisData > m_axis_data_table
QString const & name(EShape k)
Definition: particles.cpp:21

References UnitConverterSimple::m_axis_data_table, and RealSpace::Particles::name().

Referenced by DepthProbeConverter::DepthProbeConverter(), OffSpecularConverter::OffSpecularConverter(), UnitConverterSimple::addDetectorAxis(), and OffSpecularConverter::addDetectorYAxis().

Here is the call graph for this function:

◆ addDetectorAxis()

void UnitConverterSimple::addDetectorAxis ( const IDetector detector,
size_t  i_axis 
)
protectedinherited

Definition at line 107 of file SimpleUnitConverters.cpp.

108 {
109  const auto& axis = detector.axis(i_axis);
110  const auto* p_roi = detector.regionOfInterest();
111  const auto& axis_name = axisName(i_axis);
112  if (!p_roi) {
113  addAxisData(axis_name, axis.lowerBound(), axis.upperBound(), defaultUnits(), axis.size());
114  return;
115  }
116  auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis);
117  addAxisData(axis_name, P_roi_axis->lowerBound(), P_roi_axis->upperBound(), defaultUnits(),
118  P_roi_axis->size());
119 }
const IAxis & axis(size_t index) const
Definition: IDetector.cpp:56
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
virtual Axes::Units defaultUnits() const =0
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
void addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins)

References UnitConverterSimple::addAxisData(), IDetector::axis(), IUnitConverter::axisName(), IUnitConverter::defaultUnits(), and IDetector::regionOfInterest().

Referenced by RectangularConverter::RectangularConverter(), and SphericalConverter().

Here is the call graph for this function:

◆ availableUnits()

std::vector< Axes::Units > SphericalConverter::availableUnits ( ) const
overridevirtual

Returns the list of all available units.

Reimplemented from UnitConverterSimple.

Definition at line 143 of file SimpleUnitConverters.cpp.

144 {
145  auto result = UnitConverterSimple::availableUnits();
146  result.push_back(Axes::Units::QSPACE);
147  return result;
148 }
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.

References UnitConverterSimple::availableUnits().

Referenced by calculateValue().

Here is the call graph for this function:

◆ axisName()

std::string IUnitConverter::axisName ( size_t  i_axis,
Axes::Units  units_type = Axes::Units::DEFAULT 
) const
inherited

Definition at line 20 of file IUnitConverter.cpp.

21 {
22  const auto& name_maps = createNameMaps();
23  if (name_maps.size() <= i_axis)
24  throw std::runtime_error("Error in IUnitConverter::axisName: the size of name map vector "
25  "is smaller or equal to the axis index"
26  + std::to_string(static_cast<int>(i_axis)));
27  const auto& name_map = name_maps[i_axis];
28  units_type = substituteDefaultUnits(units_type);
29  const auto& it = name_map.find(units_type);
30  if (it == name_map.cend())
31  throwUnitsError("IUnitConverter::axisName", availableUnits());
32  return it->second;
33 }
Axes::Units substituteDefaultUnits(Axes::Units units) const
virtual std::vector< Axes::Units > availableUnits() 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

References IUnitConverter::availableUnits(), IUnitConverter::createNameMaps(), IUnitConverter::substituteDefaultUnits(), and IUnitConverter::throwUnitsError().

Referenced by DepthProbeConverter::DepthProbeConverter(), OffSpecularConverter::OffSpecularConverter(), UnitConverterConvSpec::UnitConverterConvSpec(), UnitConverterSimple::addDetectorAxis(), OffSpecularConverter::addDetectorYAxis(), UnitConverter1D::createConvertedAxis(), and UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ axisSize()

size_t UnitConverterSimple::axisSize ( size_t  i_axis) const
overridevirtualinherited

Implements IUnitConverter.

Definition at line 78 of file SimpleUnitConverters.cpp.

79 {
80  checkIndex(i_axis);
81  return m_axis_data_table[i_axis].nbins;
82 }
void checkIndex(size_t i_axis) const

References IUnitConverter::checkIndex(), and UnitConverterSimple::m_axis_data_table.

Referenced by UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMax()

double UnitConverterSimple::calculateMax ( size_t  i_axis,
Axes::Units  units_type 
) const
overridevirtualinherited

Implements IUnitConverter.

Definition at line 68 of file SimpleUnitConverters.cpp.

69 {
70  checkIndex(i_axis);
71  units_type = substituteDefaultUnits(units_type);
72  const auto& axis_data = m_axis_data_table[i_axis];
73  if (units_type == Axes::Units::NBINS)
74  return static_cast<double>(axis_data.nbins);
75  return calculateValue(i_axis, units_type, axis_data.max);
76 }
virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const =0

References UnitConverterSimple::calculateValue(), IUnitConverter::checkIndex(), UnitConverterSimple::m_axis_data_table, and IUnitConverter::substituteDefaultUnits().

Referenced by UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMin()

double UnitConverterSimple::calculateMin ( size_t  i_axis,
Axes::Units  units_type 
) const
overridevirtualinherited

Implements IUnitConverter.

Definition at line 58 of file SimpleUnitConverters.cpp.

59 {
60  checkIndex(i_axis);
61  units_type = substituteDefaultUnits(units_type);
62  const auto& axis_data = m_axis_data_table[i_axis];
63  if (units_type == Axes::Units::NBINS)
64  return 0.0;
65  return calculateValue(i_axis, units_type, axis_data.min);
66 }

References UnitConverterSimple::calculateValue(), IUnitConverter::checkIndex(), UnitConverterSimple::m_axis_data_table, and IUnitConverter::substituteDefaultUnits().

Referenced by UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ calculateValue()

double SphericalConverter::calculateValue ( size_t  i_axis,
Axes::Units  units_type,
double  value 
) const
overrideprivatevirtual

Implements UnitConverterSimple.

Definition at line 159 of file SimpleUnitConverters.cpp.

160 {
161  switch (units_type) {
162  case Axes::Units::RADIANS:
163  return value;
164  case Axes::Units::DEGREES:
165  return Units::rad2deg(value);
166  case Axes::Units::QSPACE: {
168  if (i_axis == 0) {
169  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
170  return (k_i - k_f).y();
171  } else if (i_axis == 1) {
172  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, value, 0.0);
173  return (k_f - k_i).z();
174  }
175  throw std::runtime_error("Error in SphericalConverter::calculateValue: "
176  "incorrect axis index: "
177  + std::to_string(static_cast<int>(i_axis)));
178  }
179  case Axes::Units::QXQY: {
181  if (i_axis == 0) {
182  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
183  return (k_i - k_f).y();
184  } else if (i_axis == 1) {
185  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, value, 0.0);
186  return (k_f - k_i).x();
187  }
188  throw std::runtime_error("Error in SphericalConverter::calculateValue: "
189  "incorrect axis index: "
190  + std::to_string(static_cast<int>(i_axis)));
191  }
192  default:
193  throwUnitsError("SphericalConverter::calculateValue", availableUnits());
194  }
195 }
kvector_t vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
Definition: Direction.cpp:19
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
double rad2deg(double angle)
Definition: Units.h:55

References availableUnits(), UnitConverterSimple::m_alpha_i, UnitConverterSimple::m_phi_i, UnitConverterSimple::m_wavelength, Units::rad2deg(), IUnitConverter::throwUnitsError(), and vecOfLambdaAlphaPhi().

Here is the call graph for this function:

◆ checkIndex()

void IUnitConverter::checkIndex ( size_t  i_axis) const
protectedinherited

Definition at line 46 of file IUnitConverter.cpp.

47 {
48  if (i_axis < dimension())
49  return;
50  throw std::runtime_error("Error in IUnitConverter::checkIndex: passed axis index too big: "
51  + std::to_string(static_cast<int>(i_axis)));
52 }
virtual size_t dimension() const =0

References IUnitConverter::dimension().

Referenced by UnitConverterConvSpec::axisSize(), UnitConverterQSpec::axisSize(), UnitConverterSimple::axisSize(), UnitConverter1D::calculateMax(), UnitConverterSimple::calculateMax(), UnitConverter1D::calculateMin(), UnitConverterSimple::calculateMin(), and UnitConverter1D::createConvertedAxis().

Here is the call graph for this function:

◆ clone()

SphericalConverter * SphericalConverter::clone ( ) const
overridevirtual

Implements IUnitConverter.

Definition at line 138 of file SimpleUnitConverters.cpp.

139 {
140  return new SphericalConverter(*this);
141 }
SphericalConverter(const SphericalDetector &detector, const Beam &beam)

References SphericalConverter().

Here is the call graph for this function:

◆ createConvertedAxis()

std::unique_ptr< IAxis > UnitConverterSimple::createConvertedAxis ( size_t  i_axis,
Axes::Units  units 
) const
overridevirtualinherited

Implements IUnitConverter.

Definition at line 89 of file SimpleUnitConverters.cpp.

91 {
92  const double min = calculateMin(i_axis, units);
93  const double max = calculateMax(i_axis, units);
94  const auto& axis_name = axisName(i_axis, units);
95  const auto axis_size = axisSize(i_axis);
96  return std::make_unique<FixedBinAxis>(axis_name, axis_size, min, max);
97 }
double calculateMax(size_t i_axis, Axes::Units units_type) const override
size_t axisSize(size_t i_axis) const override
double calculateMin(size_t i_axis, Axes::Units units_type) const override

References IUnitConverter::axisName(), UnitConverterSimple::axisSize(), UnitConverterSimple::calculateMax(), and UnitConverterSimple::calculateMin().

Here is the call graph for this function:

◆ createConvertedData()

std::unique_ptr< OutputData< double > > IUnitConverter::createConvertedData ( const OutputData< double > &  data,
Axes::Units  units 
) const
virtualinherited

Creates OutputData array in converter units.

Reimplemented in UnitConverter1D.

Definition at line 36 of file IUnitConverter.cpp.

37 {
38  const size_t dim = data.rank();
39  std::unique_ptr<OutputData<double>> result(new OutputData<double>);
40  for (size_t i = 0; i < dim; ++i)
41  result->addAxis(*createConvertedAxis(i, units));
42  result->setRawDataVector(data.getRawDataVector());
43  return result;
44 }
virtual std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const =0
size_t rank() const
Returns number of dimensions.
Definition: OutputData.h:56
std::vector< T > getRawDataVector() const
Returns copy of raw data vector.
Definition: OutputData.h:334

References IUnitConverter::createConvertedAxis(), OutputData< T >::getRawDataVector(), and OutputData< T >::rank().

Here is the call graph for this function:

◆ createNameMaps()

std::vector< std::map< Axes::Units, std::string > > SphericalConverter::createNameMaps ( ) const
overrideprivatevirtual

Implements IUnitConverter.

Definition at line 197 of file SimpleUnitConverters.cpp.

198 {
199  std::vector<std::map<Axes::Units, std::string>> result;
200  result.push_back(AxisNames::InitSphericalAxis0());
201  result.push_back(AxisNames::InitSphericalAxis1());
202  return result;
203 }
std::map< Axes::Units, std::string > InitSphericalAxis0()
Definition: AxisNames.cpp:20
std::map< Axes::Units, std::string > InitSphericalAxis1()
Definition: AxisNames.cpp:30

References AxisNames::InitSphericalAxis0(), and AxisNames::InitSphericalAxis1().

Here is the call graph for this function:

◆ defaultUnits()

Axes::Units SphericalConverter::defaultUnits ( ) const
overridevirtual

Implements IUnitConverter.

Definition at line 150 of file SimpleUnitConverters.cpp.

151 {
152  return Axes::Units::DEGREES;
153 }

◆ dimension()

size_t UnitConverterSimple::dimension ( ) const
overridevirtualinherited

Implements IUnitConverter.

Definition at line 46 of file SimpleUnitConverters.cpp.

47 {
48  return m_axis_data_table.size();
49 }

References UnitConverterSimple::m_axis_data_table.

◆ substituteDefaultUnits()

Axes::Units IUnitConverter::substituteDefaultUnits ( Axes::Units  units) const
inherited

Definition at line 65 of file IUnitConverter.cpp.

66 {
67  return units == Axes::Units::DEFAULT ? defaultUnits() : units;
68 }

References IUnitConverter::defaultUnits().

Referenced by IUnitConverter::axisName(), UnitConverter1D::calculateMax(), UnitConverterSimple::calculateMax(), UnitConverter1D::calculateMin(), UnitConverterSimple::calculateMin(), and UnitConverter1D::createConvertedAxis().

Here is the call graph for this function:

◆ throwUnitsError()

void IUnitConverter::throwUnitsError ( std::string  method,
std::vector< Axes::Units available 
) const
protectedinherited

Definition at line 54 of file IUnitConverter.cpp.

55 {
56  std::stringstream ss;
57  ss << "Unit type error in " << method
58  << ": unknown or unsupported unit type. Available units "
59  "are:\n";
60  for (auto unit : available)
61  ss << axisUnitLabel.at(unit) << "\n";
62  throw std::runtime_error(ss.str());
63 }
const std::map< Axes::Units, const char * > axisUnitLabel

References axisUnitLabel.

Referenced by IUnitConverter::axisName(), calculateValue(), RectangularConverter::calculateValue(), OffSpecularConverter::calculateValue(), DepthProbeConverter::checkUnits(), UnitConverterConvSpec::getTraslatorFrom(), UnitConverterConvSpec::getTraslatorTo(), and UnitConverterQSpec::getTraslatorTo().

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 34 of file ICloneable.h.

Member Data Documentation

◆ m_alpha_i

double UnitConverterSimple::m_alpha_i
protectedinherited

Definition at line 69 of file SimpleUnitConverters.h.

Referenced by calculateValue(), and RectangularConverter::calculateValue().

◆ m_axis_data_table

◆ m_phi_i

double UnitConverterSimple::m_phi_i
protectedinherited

Definition at line 70 of file SimpleUnitConverters.h.

Referenced by calculateValue(), and RectangularConverter::calculateValue().

◆ m_wavelength

double UnitConverterSimple::m_wavelength
protectedinherited

The documentation for this class was generated from the following files: