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

IUnitConverter class that handles the unit translations for off-specular simulations with a spherical detector Its default units are radians for both axes. More...

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

Public Member Functions

 OffSpecularConverter (const IDetector2D &detector, const Beam &beam, const IAxis &alpha_axis)
 
 ~OffSpecularConverter () 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
 
OffSpecularConverterclone () 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

 OffSpecularConverter (const OffSpecularConverter &other)
 
void addDetectorYAxis (const IDetector2D &detector)
 
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 off-specular simulations with a spherical detector Its default units are radians for both axes.

Definition at line 129 of file SimpleUnitConverters.h.

Constructor & Destructor Documentation

◆ OffSpecularConverter() [1/2]

OffSpecularConverter::OffSpecularConverter ( const IDetector2D detector,
const Beam beam,
const IAxis alpha_axis 
)

Definition at line 319 of file SimpleUnitConverters.cpp.

321  : UnitConverterSimple(beam)
322 {
323  if (detector.dimension() != 2)
324  throw std::runtime_error("Error in OffSpecularConverter constructor: "
325  "detector has wrong dimension: "
326  + std::to_string(static_cast<int>(detector.dimension())));
327  addAxisData(axisName(0), alpha_axis.lowerBound(), alpha_axis.upperBound(), defaultUnits(),
328  alpha_axis.size());
329  addDetectorYAxis(detector);
330 }
virtual double upperBound() const =0
Returns value of last point of axis.
virtual size_t size() const =0
retrieve the number of bins
virtual double lowerBound() const =0
Returns value of first point of axis.
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:46
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
Axes::Units defaultUnits() const override
void addDetectorYAxis(const IDetector2D &detector)
void addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins)
UnitConverterSimple(const Beam &beam)

References UnitConverterSimple::addAxisData(), addDetectorYAxis(), IUnitConverter::axisName(), defaultUnits(), IDetector::dimension(), IAxis::lowerBound(), IAxis::size(), and IAxis::upperBound().

Referenced by clone().

Here is the call graph for this function:

◆ ~OffSpecularConverter()

OffSpecularConverter::~OffSpecularConverter ( )
overridedefault

◆ OffSpecularConverter() [2/2]

OffSpecularConverter::OffSpecularConverter ( const OffSpecularConverter other)
private

Definition at line 344 of file SimpleUnitConverters.cpp.

345  : UnitConverterSimple(other)
346 {
347 }

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

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

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

Here is the call graph for this function:

◆ addDetectorYAxis()

void OffSpecularConverter::addDetectorYAxis ( const IDetector2D detector)
private

Definition at line 369 of file SimpleUnitConverters.cpp.

370 {
371  const auto& axis = detector.axis(1);
372  const auto* p_roi = detector.regionOfInterest();
373  const auto& axis_name = axisName(1);
374  std::unique_ptr<IAxis> P_new_axis;
375  if (p_roi) {
376  P_new_axis = p_roi->clipAxisToRoi(1, axis);
377  } else {
378  P_new_axis.reset(axis.clone());
379  }
380  if (!P_new_axis)
381  throw std::runtime_error("Error in OffSpecularConverter::addDetectorYAxis: "
382  "could not retrieve the y-axis of the detector");
383  if (const auto* P_rect_det = dynamic_cast<const RectangularDetector*>(&detector)) {
384  std::unique_ptr<RectangularPixel> P_det_pixel(P_rect_det->regionOfInterestPixel());
385  const auto k00 = P_det_pixel->getPosition(0.0, 0.0);
386  const auto k01 = P_det_pixel->getPosition(0.0, 1.0);
387  const double alpha_f_min = M_PI_2 - k00.theta();
388  const double alpha_f_max = M_PI_2 - k01.theta();
389  addAxisData(axis_name, alpha_f_min, alpha_f_max, defaultUnits(), P_new_axis->size());
390  } else if (dynamic_cast<const SphericalDetector*>(&detector)) {
391  const double alpha_f_min = P_new_axis->lowerBound();
392  const double alpha_f_max = P_new_axis->upperBound();
393  addAxisData(axis_name, alpha_f_min, alpha_f_max, defaultUnits(), P_new_axis->size());
394  } else {
395  throw std::runtime_error("Error in OffSpecularConverter::addDetectorYAxis: "
396  "wrong detector type");
397  }
398 }
#define M_PI_2
Definition: Constants.h:45
const RegionOfInterest * regionOfInterest() const override
Returns region of interest if exists.
Definition: IDetector2D.cpp:43
A flat rectangular detector with axes and resolution function.
A detector with coordinate axes along angles phi and alpha.

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

Referenced by OffSpecularConverter().

Here is the call graph for this function:

◆ availableUnits()

std::vector< Axes::Units > UnitConverterSimple::availableUnits ( ) const
overridevirtualinherited

Returns the list of all available units.

Implements IUnitConverter.

Reimplemented in DepthProbeConverter, RectangularConverter, and SphericalConverter.

Definition at line 84 of file SimpleUnitConverters.cpp.

85 {
86  return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES};
87 }

Referenced by SphericalConverter::availableUnits(), RectangularConverter::availableUnits(), DepthProbeConverter::availableUnits(), and calculateValue().

◆ 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(), UnitConverterConvSpec::UnitConverterConvSpec(), UnitConverterSimple::addDetectorAxis(), 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 OffSpecularConverter::calculateValue ( size_t  i_axis,
Axes::Units  units_type,
double  value 
) const
overrideprivatevirtual

Implements UnitConverterSimple.

Definition at line 349 of file SimpleUnitConverters.cpp.

350 {
351  switch (units_type) {
352  case Axes::Units::RADIANS:
353  return value;
354  case Axes::Units::DEGREES:
355  return Units::rad2deg(value);
356  default:
357  throwUnitsError("OffSpecularConverter::calculateValue", availableUnits());
358  }
359 }
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
double rad2deg(double angle)
Definition: Units.h:55

References UnitConverterSimple::availableUnits(), Units::rad2deg(), and IUnitConverter::throwUnitsError().

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()

OffSpecularConverter * OffSpecularConverter::clone ( ) const
overridevirtual

Implements IUnitConverter.

Definition at line 334 of file SimpleUnitConverters.cpp.

335 {
336  return new OffSpecularConverter(*this);
337 }
OffSpecularConverter(const IDetector2D &detector, const Beam &beam, const IAxis &alpha_axis)

References OffSpecularConverter().

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

Implements IUnitConverter.

Definition at line 361 of file SimpleUnitConverters.cpp.

362 {
363  std::vector<std::map<Axes::Units, std::string>> result;
364  result.push_back(AxisNames::InitOffSpecularAxis0());
365  result.push_back(AxisNames::InitOffSpecularAxis1());
366  return result;
367 }
std::map< Axes::Units, std::string > InitOffSpecularAxis1()
Definition: AxisNames.cpp:73
std::map< Axes::Units, std::string > InitOffSpecularAxis0()
Definition: AxisNames.cpp:65

References AxisNames::InitOffSpecularAxis0(), and AxisNames::InitOffSpecularAxis1().

Here is the call graph for this function:

◆ defaultUnits()

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

Implements IUnitConverter.

Definition at line 339 of file SimpleUnitConverters.cpp.

340 {
341  return Axes::Units::DEGREES;
342 }

Referenced by OffSpecularConverter(), and addDetectorYAxis().

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

◆ m_axis_data_table

◆ m_phi_i

double UnitConverterSimple::m_phi_i
protectedinherited

◆ m_wavelength


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