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

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

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

Public Member Functions

 RectangularConverter (const RectangularDetector &detector, const Beam &beam)
 
 ~RectangularConverter () 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
 
RectangularConverterclone () 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

 RectangularConverter (const RectangularConverter &other)
 
double axisAngle (size_t i_axis, kvector_t k_f) const
 
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
 
kvector_t normalizeToWavelength (kvector_t vector) const
 

Private Attributes

std::unique_ptr< RectangularPixelm_detector_pixel
 

Detailed Description

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

Definition at line 103 of file SimpleUnitConverters.h.

Constructor & Destructor Documentation

◆ RectangularConverter() [1/2]

RectangularConverter::RectangularConverter ( const RectangularDetector detector,
const Beam beam 
)

Definition at line 209 of file SimpleUnitConverters.cpp.

210  : UnitConverterSimple(beam)
211 {
212  if (detector.dimension() != 2)
213  throw std::runtime_error("Error in RectangularConverter constructor: "
214  "detector has wrong dimension: "
215  + std::to_string(static_cast<int>(detector.dimension())));
216  addDetectorAxis(detector, 0);
217  addDetectorAxis(detector, 1);
218  m_detector_pixel.reset(detector.regionOfInterestPixel());
219 }
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:46
std::unique_ptr< RectangularPixel > m_detector_pixel
RectangularPixel * regionOfInterestPixel() const
void addDetectorAxis(const IDetector &detector, size_t i_axis)
UnitConverterSimple(const Beam &beam)

References UnitConverterSimple::addDetectorAxis(), IDetector::dimension(), m_detector_pixel, and RectangularDetector::regionOfInterestPixel().

Referenced by clone().

Here is the call graph for this function:

◆ ~RectangularConverter()

RectangularConverter::~RectangularConverter ( )
overridedefault

◆ RectangularConverter() [2/2]

RectangularConverter::RectangularConverter ( const RectangularConverter other)
private

Definition at line 241 of file SimpleUnitConverters.cpp.

242  : UnitConverterSimple(other), m_detector_pixel(other.m_detector_pixel->clone())
243 {
244 }

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(), and SphericalConverter::SphericalConverter().

Here is the call graph for this function:

◆ availableUnits()

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

Returns the list of all available units.

Reimplemented from UnitConverterSimple.

Definition at line 228 of file SimpleUnitConverters.cpp.

229 {
230  auto result = UnitConverterSimple::availableUnits();
231  result.push_back(Axes::Units::QSPACE);
232  result.push_back(Axes::Units::MM);
233  return result;
234 }
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:

◆ axisAngle()

double RectangularConverter::axisAngle ( size_t  i_axis,
kvector_t  k_f 
) const
private

Definition at line 304 of file SimpleUnitConverters.cpp.

305 {
306  if (i_axis == 0)
307  return k_f.phi();
308  if (i_axis == 1)
309  return M_PI_2 - k_f.theta();
310  throw std::runtime_error("Error in RectangularConverter::axisAngle: "
311  "incorrect axis index: "
312  + std::to_string(static_cast<int>(i_axis)));
313 }
#define M_PI_2
Definition: Constants.h:45
double theta() const
Returns polar angle.
double phi() const
Returns azimuth angle.

References M_PI_2, BasicVector3D< T >::phi(), and BasicVector3D< T >::theta().

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 RectangularConverter::calculateValue ( size_t  i_axis,
Axes::Units  units_type,
double  value 
) const
overrideprivatevirtual

Implements UnitConverterSimple.

Definition at line 246 of file SimpleUnitConverters.cpp.

248 {
249  if (units_type == Axes::Units::MM)
250  return value;
251  const auto k00 = m_detector_pixel->getPosition(0.0, 0.0);
252  const auto k01 = m_detector_pixel->getPosition(0.0, 1.0);
253  const auto k10 = m_detector_pixel->getPosition(1.0, 0.0);
254  const auto& max_pos = i_axis == 0 ? k10 : k01; // position of max along given axis
255  const double shift = value - m_axis_data_table[i_axis].min;
256  const auto k_f = normalizeToWavelength(k00 + shift * (max_pos - k00).unit());
257  switch (units_type) {
258  case Axes::Units::RADIANS:
259  return axisAngle(i_axis, k_f);
260  case Axes::Units::DEGREES:
261  return Units::rad2deg(axisAngle(i_axis, k_f));
262  case Axes::Units::QSPACE: {
264  if (i_axis == 0)
265  return (k_i - k_f).y();
266  if (i_axis == 1)
267  return (k_f - k_i).z();
268  throw std::runtime_error("Error in RectangularConverter::calculateValue: "
269  "incorrect axis index: "
270  + std::to_string(static_cast<int>(i_axis)));
271  }
272  case Axes::Units::QXQY: {
274  if (i_axis == 0)
275  return (k_i - k_f).y();
276  if (i_axis == 1)
277  return (k_f - k_i).x();
278  throw std::runtime_error("Error in RectangularConverter::calculateValue: "
279  "incorrect axis index: "
280  + std::to_string(static_cast<int>(i_axis)));
281  }
282  default:
283  throwUnitsError("RectangularConverter::calculateValue", availableUnits());
284  }
285 }
kvector_t vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
Definition: Direction.cpp:19
kvector_t normalizeToWavelength(kvector_t vector) const
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
double rad2deg(double angle)
Definition: Units.h:55

References availableUnits(), axisAngle(), UnitConverterSimple::m_alpha_i, UnitConverterSimple::m_axis_data_table, m_detector_pixel, UnitConverterSimple::m_phi_i, UnitConverterSimple::m_wavelength, normalizeToWavelength(), 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()

RectangularConverter * RectangularConverter::clone ( ) const
overridevirtual

Implements IUnitConverter.

Definition at line 223 of file SimpleUnitConverters.cpp.

224 {
225  return new RectangularConverter(*this);
226 }
RectangularConverter(const RectangularDetector &detector, const Beam &beam)

References RectangularConverter().

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 > > RectangularConverter::createNameMaps ( ) const
overrideprivatevirtual

Implements IUnitConverter.

Definition at line 287 of file SimpleUnitConverters.cpp.

288 {
289  std::vector<std::map<Axes::Units, std::string>> result;
290  result.push_back(AxisNames::InitRectangularAxis0());
291  result.push_back(AxisNames::InitRectangularAxis1());
292  return result;
293 }
std::map< Axes::Units, std::string > InitRectangularAxis0()
Definition: AxisNames.cpp:41
std::map< Axes::Units, std::string > InitRectangularAxis1()
Definition: AxisNames.cpp:52

References AxisNames::InitRectangularAxis0(), and AxisNames::InitRectangularAxis1().

Here is the call graph for this function:

◆ defaultUnits()

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

Implements IUnitConverter.

Definition at line 236 of file SimpleUnitConverters.cpp.

237 {
238  return Axes::Units::MM;
239 }

◆ 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.

◆ normalizeToWavelength()

kvector_t RectangularConverter::normalizeToWavelength ( kvector_t  vector) const
private

Definition at line 295 of file SimpleUnitConverters.cpp.

296 {
297  if (m_wavelength <= 0.0)
298  throw std::runtime_error("Error in RectangularConverter::normalizeToWavelength: "
299  "wavelength <= 0");
300  double K = M_TWOPI / m_wavelength;
301  return vector.unit() * K;
302 }
#define M_TWOPI
Definition: Constants.h:54
BasicVector3D< T > unit() const
Returns unit vector in direction of this. Throws for null vector.

References M_TWOPI, UnitConverterSimple::m_wavelength, and BasicVector3D< T >::unit().

Referenced by calculateValue().

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(), 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(), SphericalConverter::calculateValue(), 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 SphericalConverter::calculateValue(), and calculateValue().

◆ m_axis_data_table

◆ m_detector_pixel

std::unique_ptr<RectangularPixel> RectangularConverter::m_detector_pixel
private

Definition at line 121 of file SimpleUnitConverters.h.

Referenced by RectangularConverter(), and calculateValue().

◆ m_phi_i

double UnitConverterSimple::m_phi_i
protectedinherited

Definition at line 70 of file SimpleUnitConverters.h.

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

◆ m_wavelength

double UnitConverterSimple::m_wavelength
protectedinherited

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