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

Public Member Functions

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

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

Private Attributes

std::unique_ptr< RectangularPixelmP_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 100 of file SimpleUnitConverters.h.

Constructor & Destructor Documentation

◆ RectangularConverter() [1/2]

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

Definition at line 200 of file SimpleUnitConverters.cpp.

201  : UnitConverterSimple(beam)
202 {
203  if (detector.dimension() != 2)
204  throw std::runtime_error("Error in RectangularConverter constructor: "
205  "detector has wrong dimension: "
206  + std::to_string(static_cast<int>(detector.dimension())));
207  addDetectorAxis(detector, 0);
208  addDetectorAxis(detector, 1);
209  mP_detector_pixel.reset(detector.regionOfInterestPixel());
210 }
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:44
std::unique_ptr< RectangularPixel > mP_detector_pixel
RectangularPixel * regionOfInterestPixel() const
void addDetectorAxis(const IDetector &detector, size_t i_axis)
UnitConverterSimple(const Beam &beam)

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

Referenced by clone().

Here is the call graph for this function:

◆ ~RectangularConverter()

RectangularConverter::~RectangularConverter ( )
finaldefault

◆ RectangularConverter() [2/2]

RectangularConverter::RectangularConverter ( const RectangularConverter other)
private

Definition at line 232 of file SimpleUnitConverters.cpp.

234 {
235 }

Member Function Documentation

◆ clone()

RectangularConverter * RectangularConverter::clone ( ) const
finalvirtual

Implements IUnitConverter.

Definition at line 214 of file SimpleUnitConverters.cpp.

215 {
216  return new RectangularConverter(*this);
217 }
RectangularConverter(const RectangularDetector &detector, const Beam &beam)

References RectangularConverter().

Here is the call graph for this function:

◆ availableUnits()

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

Returns the list of all available units.

Reimplemented from UnitConverterSimple.

Definition at line 219 of file SimpleUnitConverters.cpp.

220 {
221  auto result = UnitConverterSimple::availableUnits();
222  result.push_back(Axes::Units::QSPACE);
223  result.push_back(Axes::Units::MM);
224  return result;
225 }
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 RectangularConverter::defaultUnits ( ) const
finalvirtual

Implements IUnitConverter.

Definition at line 227 of file SimpleUnitConverters.cpp.

228 {
229  return Axes::Units::MM;
230 }

◆ calculateValue()

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

Implements UnitConverterSimple.

Definition at line 237 of file SimpleUnitConverters.cpp.

239 {
240  if (units_type == Axes::Units::MM)
241  return value;
242  const auto k00 = mP_detector_pixel->getPosition(0.0, 0.0);
243  const auto k01 = mP_detector_pixel->getPosition(0.0, 1.0);
244  const auto k10 = mP_detector_pixel->getPosition(1.0, 0.0);
245  const auto& max_pos = i_axis == 0 ? k10 : k01; // position of max along given axis
246  const double shift = value - m_axis_data_table[i_axis].min;
247  const auto k_f = normalizeToWavelength(k00 + shift * (max_pos - k00).unit());
248  switch (units_type) {
249  case Axes::Units::RADIANS:
250  return axisAngle(i_axis, k_f);
251  case Axes::Units::DEGREES:
252  return Units::rad2deg(axisAngle(i_axis, k_f));
253  case Axes::Units::QSPACE: {
255  if (i_axis == 0) {
256  return (k_i - k_f).y();
257  } else if (i_axis == 1) {
258  return (k_f - k_i).z();
259  }
260  throw std::runtime_error("Error in RectangularConverter::calculateValue: "
261  "incorrect axis index: "
262  + std::to_string(static_cast<int>(i_axis)));
263  }
264  case Axes::Units::QXQY: {
266  if (i_axis == 0) {
267  return (k_i - k_f).y();
268  } else if (i_axis == 1) {
269  return (k_f - k_i).x();
270  }
271  throw std::runtime_error("Error in RectangularConverter::calculateValue: "
272  "incorrect axis index: "
273  + std::to_string(static_cast<int>(i_axis)));
274  }
275  default:
276  throwUnitsError("RectangularConverter::calculateValue", availableUnits());
277  }
278 }
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
kvector_t normalizeToWavelength(kvector_t vector) const
double axisAngle(size_t i_axis, kvector_t k_f) const
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
std::vector< AxisData > m_axis_data_table
double rad2deg(double angle)
Definition: Units.h:43

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

Here is the call graph for this function:

◆ createNameMaps()

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

Implements IUnitConverter.

Definition at line 280 of file SimpleUnitConverters.cpp.

281 {
282  std::vector<std::map<Axes::Units, std::string>> result;
283  result.push_back(AxisNames::InitRectangularAxis0());
284  result.push_back(AxisNames::InitRectangularAxis1());
285  return result;
286 }
std::map< Axes::Units, std::string > InitRectangularAxis0()
Definition: AxisNames.cpp:42
std::map< Axes::Units, std::string > InitRectangularAxis1()
Definition: AxisNames.cpp:53

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

Here is the call graph for this function:

◆ normalizeToWavelength()

kvector_t RectangularConverter::normalizeToWavelength ( kvector_t  vector) const
private

Definition at line 288 of file SimpleUnitConverters.cpp.

289 {
290  if (m_wavelength <= 0.0)
291  throw std::runtime_error("Error in RectangularConverter::normalizeToWavelength: "
292  "wavelength <= 0");
293  double K = M_TWOPI / m_wavelength;
294  return vector.unit() * K;
295 }
#define M_TWOPI
Definition: MathConstants.h:49
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:

◆ axisAngle()

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

Definition at line 297 of file SimpleUnitConverters.cpp.

298 {
299  if (i_axis == 0) {
300  return k_f.phi();
301  } else if (i_axis == 1) {
302  return M_PI_2 - k_f.theta();
303  }
304  throw std::runtime_error("Error in RectangularConverter::axisAngle: "
305  "incorrect axis index: "
306  + std::to_string(static_cast<int>(i_axis)));
307 }
#define M_PI_2
Definition: MathConstants.h:40
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:

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

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

◆ mP_detector_pixel

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

Definition at line 119 of file SimpleUnitConverters.h.

Referenced by calculateValue(), and RectangularConverter().

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

◆ m_phi_i

double UnitConverterSimple::m_phi_i
protectedinherited

Definition at line 66 of file SimpleUnitConverters.h.

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


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