BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SphericalConverter Class Reference
Inheritance diagram for SphericalConverter:
Collaboration diagram for SphericalConverter:

Public Member Functions

 SphericalConverter (const SphericalDetector &detector, const Beam &beam)
 
 ~SphericalConverter () final
 
SphericalConverterclone () const final
 
std::vector< Axes::UnitsavailableUnits () const final
 
Axes::Units defaultUnits () const final
 
virtual size_t dimension () const final
 
double calculateMin (size_t i_axis, Axes::Units units_type) const final
 
double calculateMax (size_t i_axis, Axes::Units units_type) const final
 
size_t axisSize (size_t i_axis) const final
 
std::unique_ptr< IAxiscreateConvertedAxis (size_t i_axis, Axes::Units units) const final
 
std::string axisName (size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 
Axes::Units substituteDefaultUnits (Axes::Units units) const
 
virtual std::unique_ptr< OutputData< double > > createConvertedData (const OutputData< double > &data, Axes::Units units) const
 
virtual void transferToCPP ()
 

Protected Member Functions

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

Protected Attributes

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

Private Member Functions

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

Detailed Description

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

Definition at line 76 of file SimpleUnitConverters.h.

Constructor & Destructor Documentation

◆ SphericalConverter() [1/2]

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

Definition at line 118 of file SimpleUnitConverters.cpp.

119  : UnitConverterSimple(beam)
120 {
121  if (detector.dimension() != 2)
122  throw std::runtime_error("Error in SphericalConverter constructor: "
123  "detector has wrong dimension: "
124  + std::to_string(static_cast<int>(detector.dimension())));
125  addDetectorAxis(detector, 0);
126  addDetectorAxis(detector, 1);
127 }
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:44
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 ( )
finaldefault

◆ SphericalConverter() [2/2]

SphericalConverter::SphericalConverter ( const SphericalConverter other)
private

Definition at line 148 of file SimpleUnitConverters.cpp.

148  : UnitConverterSimple(other)
149 {
150 }

Member Function Documentation

◆ clone()

SphericalConverter * SphericalConverter::clone ( ) const
finalvirtual

Implements IUnitConverter.

Definition at line 131 of file SimpleUnitConverters.cpp.

132 {
133  return new SphericalConverter(*this);
134 }
SphericalConverter(const SphericalDetector &detector, const Beam &beam)

References SphericalConverter().

Here is the call graph for this function:

◆ availableUnits()

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

Returns the list of all available units.

Reimplemented from UnitConverterSimple.

Definition at line 136 of file SimpleUnitConverters.cpp.

137 {
138  auto result = UnitConverterSimple::availableUnits();
139  result.push_back(Axes::Units::QSPACE);
140  return result;
141 }
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:

◆ defaultUnits()

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

Implements IUnitConverter.

Definition at line 143 of file SimpleUnitConverters.cpp.

144 {
145  return Axes::Units::DEGREES;
146 }

◆ calculateValue()

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

Implements UnitConverterSimple.

Definition at line 152 of file SimpleUnitConverters.cpp.

153 {
154  switch (units_type) {
155  case Axes::Units::RADIANS:
156  return value;
157  case Axes::Units::DEGREES:
158  return Units::rad2deg(value);
159  case Axes::Units::QSPACE: {
161  if (i_axis == 0) {
162  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
163  return (k_i - k_f).y();
164  } else if (i_axis == 1) {
165  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, value, 0.0);
166  return (k_f - k_i).z();
167  }
168  throw std::runtime_error("Error in SphericalConverter::calculateValue: "
169  "incorrect axis index: "
170  + std::to_string(static_cast<int>(i_axis)));
171  }
172  case Axes::Units::QXQY: {
174  if (i_axis == 0) {
175  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
176  return (k_i - k_f).y();
177  } else if (i_axis == 1) {
178  const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, value, 0.0);
179  return (k_f - k_i).x();
180  }
181  throw std::runtime_error("Error in SphericalConverter::calculateValue: "
182  "incorrect axis index: "
183  + std::to_string(static_cast<int>(i_axis)));
184  }
185  default:
186  throwUnitsError("SphericalConverter::calculateValue", availableUnits());
187  }
188 }
BasicVector3D< double > vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
Creates a vector<double> as a wavevector with given wavelength and angles.
void throwUnitsError(std::string method, std::vector< Axes::Units > available) const
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
double rad2deg(double angle)
Definition: Units.h:43

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:

◆ createNameMaps()

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

Implements IUnitConverter.

Definition at line 190 of file SimpleUnitConverters.cpp.

191 {
192  std::vector<std::map<Axes::Units, std::string>> result;
193  result.push_back(AxisNames::InitSphericalAxis0());
194  result.push_back(AxisNames::InitSphericalAxis1());
195  return result;
196 }
std::map< Axes::Units, std::string > InitSphericalAxis0()
Definition: AxisNames.cpp:21
std::map< Axes::Units, std::string > InitSphericalAxis1()
Definition: AxisNames.cpp:31

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

Here is the call graph for this function:

◆ dimension()

size_t UnitConverterSimple::dimension ( ) const
finalvirtualinherited

Implements IUnitConverter.

Definition at line 41 of file SimpleUnitConverters.cpp.

42 {
43  return m_axis_data_table.size();
44 }
std::vector< AxisData > m_axis_data_table

References UnitConverterSimple::m_axis_data_table.

◆ calculateMin()

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

Implements IUnitConverter.

Definition at line 53 of file SimpleUnitConverters.cpp.

54 {
55  checkIndex(i_axis);
56  units_type = substituteDefaultUnits(units_type);
57  const auto& axis_data = m_axis_data_table[i_axis];
58  if (units_type == Axes::Units::NBINS) {
59  return 0.0;
60  }
61  return calculateValue(i_axis, units_type, axis_data.min);
62 }
Axes::Units substituteDefaultUnits(Axes::Units units) const
void checkIndex(size_t i_axis) const
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:

◆ calculateMax()

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

Implements IUnitConverter.

Definition at line 64 of file SimpleUnitConverters.cpp.

65 {
66  checkIndex(i_axis);
67  units_type = substituteDefaultUnits(units_type);
68  const auto& axis_data = m_axis_data_table[i_axis];
69  if (units_type == Axes::Units::NBINS) {
70  return static_cast<double>(axis_data.nbins);
71  }
72  return calculateValue(i_axis, units_type, axis_data.max);
73 }

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:

◆ axisSize()

size_t UnitConverterSimple::axisSize ( size_t  i_axis) const
finalvirtualinherited

Implements IUnitConverter.

Definition at line 75 of file SimpleUnitConverters.cpp.

76 {
77  checkIndex(i_axis);
78  return m_axis_data_table[i_axis].nbins;
79 }

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

Referenced by UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ createConvertedAxis()

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

Implements IUnitConverter.

Definition at line 86 of file SimpleUnitConverters.cpp.

88 {
89  const double min = calculateMin(i_axis, units);
90  const double max = calculateMax(i_axis, units);
91  const auto& axis_name = axisName(i_axis, units);
92  const auto axis_size = axisSize(i_axis);
93  return std::make_unique<FixedBinAxis>(axis_name, axis_size, min, max);
94 }
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
double calculateMax(size_t i_axis, Axes::Units units_type) const final
double calculateMin(size_t i_axis, Axes::Units units_type) const final
size_t axisSize(size_t i_axis) const final

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

Here is the call graph for this function:

◆ addDetectorAxis()

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

Definition at line 102 of file SimpleUnitConverters.cpp.

103 {
104  const auto& axis = detector.getAxis(i_axis);
105  const auto* p_roi = detector.regionOfInterest();
106  const auto& axis_name = axisName(i_axis);
107  if (p_roi) {
108  auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis);
109  addAxisData(axis_name, P_roi_axis->getMin(), P_roi_axis->getMax(), defaultUnits(),
110  P_roi_axis->size());
111  } else {
112  addAxisData(axis_name, axis.getMin(), axis.getMax(), defaultUnits(), axis.size());
113  }
114 }
const IAxis & getAxis(size_t index) const
Definition: IDetector.cpp:54
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
virtual Axes::Units defaultUnits() const =0
void addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins)

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

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

Here is the call graph for this function:

◆ addAxisData()

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

Definition at line 46 of file SimpleUnitConverters.cpp.

48 {
49  AxisData axis_data{name, min, max, default_units, nbins};
50  m_axis_data_table.push_back(axis_data);
51 }

References UnitConverterSimple::m_axis_data_table.

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

◆ 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 }
virtual std::vector< Axes::Units > availableUnits() const =0
virtual std::vector< std::map< Axes::Units, std::string > > createNameMaps() const =0

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

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

Here is the call graph for this function:

◆ 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(), UnitConverterSimple::calculateMax(), UnitConverter1D::calculateMax(), UnitConverterSimple::calculateMin(), UnitConverter1D::calculateMin(), and UnitConverter1D::createConvertedAxis().

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.getRank();
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
std::vector< T > getRawDataVector() const
Returns copy of raw data vector.
Definition: OutputData.h:335
size_t getRank() const
Returns number of dimensions.
Definition: OutputData.h:59

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

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 UnitConverterSimple::axisSize(), UnitConverterConvSpec::axisSize(), UnitConverterQSpec::axisSize(), UnitConverterSimple::calculateMax(), UnitConverter1D::calculateMax(), UnitConverterSimple::calculateMin(), UnitConverter1D::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 << axisUnitName.at(unit) << "\n";
62  throw std::runtime_error(ss.str());
63 }
const std::map< Axes::Units, const char * > axisUnitName

References axisUnitName.

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_axis_data_table

◆ m_wavelength

double UnitConverterSimple::m_wavelength
protectedinherited

◆ m_alpha_i

double UnitConverterSimple::m_alpha_i
protectedinherited

Definition at line 65 of file SimpleUnitConverters.h.

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

◆ m_phi_i

double UnitConverterSimple::m_phi_i
protectedinherited

Definition at line 66 of file SimpleUnitConverters.h.

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


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