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

Conversion of axis units for the case of conventional (angle-based) reflectometry. More...

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

Public Member Functions

 UnitConverterConvSpec (const AngularSpecScan &handler)
 
 UnitConverterConvSpec (const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
 Constructs the object for unit conversion. More...
 
 ~UnitConverterConvSpec () 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
 Returns the size of underlying axis. More...
 
double calculateMax (size_t i_axis, Axes::Units units_type) const override
 Calculates maximum on-axis value in given units. More...
 
double calculateMin (size_t i_axis, Axes::Units units_type) const override
 Calculates minimum on-axis value in given units. More...
 
UnitConverterConvSpecclone () const override
 
std::unique_ptr< IAxiscreateConvertedAxis (size_t i_axis, Axes::Units units) const override
 Creates axis in converted units. More...
 
std::unique_ptr< OutputData< double > > createConvertedData (const OutputData< double > &data, Axes::Units units) const override
 Creates OutputData array in converter units. More...
 
Axes::Units defaultUnits () const override
 Returns default units to convert to. More...
 
size_t dimension () const override
 Returns dimensionality of converted canvas. More...
 
Axes::Units substituteDefaultUnits (Axes::Units units) const
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Static Public Member Functions

static std::unique_ptr< UnitConverter1DcreateUnitConverter (const ISpecularScan &handler)
 Factory function to create unit converter for particular type of specular data. More...
 

Protected Member Functions

 UnitConverterConvSpec (const UnitConverterConvSpec &other)
 
void checkIndex (size_t i_axis) const
 
const IAxiscoordinateAxis () const override
 
std::vector< std::map< Axes::Units, std::string > > createNameMaps () const override
 Creates name map for axis in various units. More...
 
std::function< double(double)> getTraslatorFrom (Axes::Units units_type) const
 Returns translating functional (input units --> rads) More...
 
std::function< double(double)> getTraslatorTo (Axes::Units units_type) const override
 Returns translating functional (rads --> desired units) More...
 
void throwUnitsError (std::string method, std::vector< Axes::Units > available) const
 

Protected Attributes

std::unique_ptr< IAxism_axis
 basic inclination angles (in rads). More...
 
double m_wavelength
 basic wavelength in nm (for translation to q-space). More...
 

Detailed Description

Conversion of axis units for the case of conventional (angle-based) reflectometry.

Definition at line 67 of file UnitConverter1D.h.

Constructor & Destructor Documentation

◆ UnitConverterConvSpec() [1/3]

UnitConverterConvSpec::UnitConverterConvSpec ( const Beam beam,
const IAxis axis,
Axes::Units  axis_units = Axes::Units::RADIANS 
)

Constructs the object for unit conversion.

Definition at line 102 of file UnitConverter1D.cpp.

104  : m_wavelength(beam.wavelength())
105 {
106  m_axis = createTranslatedAxis(axis, getTraslatorFrom(axis_units), axisName(0, axis_units));
107  if (m_axis->lowerBound() < 0 || m_axis->upperBound() > M_PI_2)
108  throw std::runtime_error("Error in UnitConverter1D: input axis range is out of bounds");
109 }
#define M_PI_2
Definition: Constants.h:45
double wavelength() const
Definition: Beam.h:43
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
double m_wavelength
basic wavelength in nm (for translation to q-space).
std::function< double(double)> getTraslatorFrom(Axes::Units units_type) const
Returns translating functional (input units --> rads)
std::unique_ptr< IAxis > m_axis
basic inclination angles (in rads).

References IUnitConverter::axisName(), getTraslatorFrom(), m_axis, and M_PI_2.

Referenced by clone().

Here is the call graph for this function:

◆ UnitConverterConvSpec() [2/3]

UnitConverterConvSpec::UnitConverterConvSpec ( const AngularSpecScan handler)

Definition at line 111 of file UnitConverter1D.cpp.

112  : m_wavelength(handler.wavelength()), m_axis(handler.coordinateAxis()->clone())
113 {
114 }
virtual const IAxis * coordinateAxis() const override
Returns coordinate axis assigned to the data holder.
double wavelength() const
virtual IAxis * clone() const =0
clone function

◆ ~UnitConverterConvSpec()

UnitConverterConvSpec::~UnitConverterConvSpec ( )
overridedefault

◆ UnitConverterConvSpec() [3/3]

UnitConverterConvSpec::UnitConverterConvSpec ( const UnitConverterConvSpec other)
protected

Definition at line 140 of file UnitConverter1D.cpp.

141  : m_wavelength(other.m_wavelength), m_axis(other.m_axis->clone())
142 {
143 }

Member Function Documentation

◆ availableUnits()

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

Returns the list of all available units.

Implements IUnitConverter.

Definition at line 129 of file UnitConverter1D.cpp.

130 {
131  return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE,
132  Axes::Units::RQ4};
133 }

Referenced by getTraslatorTo().

◆ 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(), UnitConverterSimple::addDetectorAxis(), OffSpecularConverter::addDetectorYAxis(), UnitConverter1D::createConvertedAxis(), and UnitConverterSimple::createConvertedAxis().

Here is the call graph for this function:

◆ axisSize()

size_t UnitConverterConvSpec::axisSize ( size_t  i_axis) const
overridevirtual

Returns the size of underlying axis.

Implements IUnitConverter.

Definition at line 123 of file UnitConverter1D.cpp.

124 {
125  checkIndex(i_axis);
126  return m_axis->size();
127 }
void checkIndex(size_t i_axis) const

References IUnitConverter::checkIndex(), and m_axis.

Here is the call graph for this function:

◆ calculateMax()

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

Calculates maximum on-axis value in given units.

Implements IUnitConverter.

Definition at line 60 of file UnitConverter1D.cpp.

61 {
62  checkIndex(i_axis);
63  units_type = substituteDefaultUnits(units_type);
64  auto coordinate_axis = coordinateAxis();
65  if (units_type == Axes::Units::NBINS)
66  return static_cast<double>(coordinate_axis->size());
67  auto translator = getTraslatorTo(units_type);
68  return translator(coordinate_axis->binCenter(coordinate_axis->size() - 1));
69 }
virtual const IAxis * coordinateAxis() const =0
virtual std::function< double(double)> getTraslatorTo(Axes::Units units_type) const =0
Returns translating functional (rads --> output units)

References IUnitConverter::checkIndex(), UnitConverter1D::coordinateAxis(), UnitConverter1D::getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by UnitConverter1D::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMin()

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

Calculates minimum on-axis value in given units.

Implements IUnitConverter.

Definition at line 50 of file UnitConverter1D.cpp.

51 {
52  checkIndex(i_axis);
53  units_type = substituteDefaultUnits(units_type);
54  if (units_type == Axes::Units::NBINS)
55  return 0.0;
56  auto translator = getTraslatorTo(units_type);
57  return translator(coordinateAxis()->binCenter(0));
58 }

References IUnitConverter::checkIndex(), UnitConverter1D::coordinateAxis(), UnitConverter1D::getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by UnitConverter1D::createConvertedAxis().

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

UnitConverterConvSpec * UnitConverterConvSpec::clone ( ) const
overridevirtual

Implements UnitConverter1D.

Definition at line 118 of file UnitConverter1D.cpp.

119 {
120  return new UnitConverterConvSpec(*this);
121 }
UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
Constructs the object for unit conversion.

References UnitConverterConvSpec().

Here is the call graph for this function:

◆ coordinateAxis()

const IAxis* UnitConverterConvSpec::coordinateAxis ( ) const
inlineoverrideprotectedvirtual

Implements UnitConverter1D.

Definition at line 98 of file UnitConverter1D.h.

98 { return m_axis.get(); }

References m_axis.

◆ createConvertedAxis()

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

Creates axis in converted units.

Implements IUnitConverter.

Definition at line 71 of file UnitConverter1D.cpp.

72 {
73  checkIndex(i_axis);
74  units = substituteDefaultUnits(units);
75  if (units == Axes::Units::NBINS)
76  return std::make_unique<FixedBinAxis>(axisName(0, units), coordinateAxis()->size(),
77  calculateMin(0, units), calculateMax(0, units));
78  return createTranslatedAxis(*coordinateAxis(), getTraslatorTo(units), axisName(0, units));
79 }
double calculateMax(size_t i_axis, Axes::Units units_type) const override
Calculates maximum on-axis value in given units.
double calculateMin(size_t i_axis, Axes::Units units_type) const override
Calculates minimum on-axis value in given units.

References IUnitConverter::axisName(), UnitConverter1D::calculateMax(), UnitConverter1D::calculateMin(), IUnitConverter::checkIndex(), UnitConverter1D::coordinateAxis(), UnitConverter1D::getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by UnitConverter1D::createConvertedData().

Here is the call graph for this function:

◆ createConvertedData()

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

Creates OutputData array in converter units.

Reimplemented from IUnitConverter.

Definition at line 82 of file UnitConverter1D.cpp.

83 {
84  if (data.rank() != 1)
85  throw std::runtime_error("Error in UnitConverter1D::createConvertedData: unexpected "
86  "dimensions of the input data");
87 
88  std::unique_ptr<OutputData<double>> result(new OutputData<double>);
89  auto q_axis = createConvertedAxis(0, units);
90  result->addAxis(*q_axis);
91 
92  if (units != Axes::Units::RQ4) {
93  result->setRawDataVector(data.getRawDataVector());
94  return result;
95  }
96 
97  for (size_t i = 0, size = result->getAllocatedSize(); i < size; ++i)
98  (*result)[i] = data[i] * std::pow((*q_axis)[i], 4);
99  return result;
100 }
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
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const override
Creates axis in converted units.

References UnitConverter1D::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 > > UnitConverterConvSpec::createNameMaps ( ) const
overrideprotectedvirtual

Creates name map for axis in various units.

Implements IUnitConverter.

Definition at line 145 of file UnitConverter1D.cpp.

146 {
147  std::vector<std::map<Axes::Units, std::string>> result;
148  result.push_back(AxisNames::InitSpecAxis());
149  return result;
150 }
std::map< Axes::Units, std::string > InitSpecAxis()
Definition: AxisNames.cpp:82

References AxisNames::InitSpecAxis().

Here is the call graph for this function:

◆ createUnitConverter()

std::unique_ptr< UnitConverter1D > UnitConverter1D::createUnitConverter ( const ISpecularScan handler)
staticinherited

Factory function to create unit converter for particular type of specular data.

Definition at line 34 of file UnitConverter1D.cpp.

35 {
36  if (const auto* aScan = dynamic_cast<const AngularSpecScan*>(&scan))
37  return std::make_unique<UnitConverterConvSpec>(*aScan);
38 
39  if (const auto* qScan = dynamic_cast<const QSpecScan*>(&scan))
40  return std::make_unique<UnitConverterQSpec>(*qScan);
41 
42  throw std::runtime_error("Bug in UnitConverter1D::createUnitConverter: invalid case");
43 }
Scan type with inclination angles as coordinate values and a unique wavelength.
Scan type with z-components of scattering vector as coordinate values.
Definition: QSpecScan.h:28

Referenced by UnitConverterUtils::createConverter(), and SpecularSimulation::result().

◆ defaultUnits()

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

Returns default units to convert to.

Implements IUnitConverter.

Definition at line 135 of file UnitConverter1D.cpp.

136 {
137  return Axes::Units::DEGREES;
138 }

◆ dimension()

size_t UnitConverter1D::dimension ( ) const
overridevirtualinherited

Returns dimensionality of converted canvas.

Implements IUnitConverter.

Definition at line 45 of file UnitConverter1D.cpp.

46 {
47  return 1u;
48 }

◆ getTraslatorFrom()

std::function< double(double)> UnitConverterConvSpec::getTraslatorFrom ( Axes::Units  units_type) const
protected

Returns translating functional (input units --> rads)

Definition at line 152 of file UnitConverter1D.cpp.

153 {
154  switch (units_type) {
155  case Axes::Units::RADIANS:
156  return [](double value) { return value; };
157  case Axes::Units::DEGREES:
158  return [](double value) { return Units::deg2rad(value); };
159  case Axes::Units::QSPACE:
160  return [this](double value) { return getInvQ(m_wavelength, value); };
161  default:
162  throwUnitsError("UnitConverterConvSpec::getTraslatorFrom",
163  {Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE});
164  }
165 }
double deg2rad(double angle)
Definition: Units.h:59

References Units::deg2rad(), m_wavelength, and IUnitConverter::throwUnitsError().

Referenced by UnitConverterConvSpec().

Here is the call graph for this function:

◆ getTraslatorTo()

std::function< double(double)> UnitConverterConvSpec::getTraslatorTo ( Axes::Units  units_type) const
overrideprotectedvirtual

Returns translating functional (rads --> desired units)

Implements UnitConverter1D.

Definition at line 167 of file UnitConverter1D.cpp.

168 {
169  switch (units_type) {
170  case Axes::Units::RADIANS:
171  return [](double value) { return value; };
172  case Axes::Units::DEGREES:
173  return [](double value) { return Units::rad2deg(value); };
174  case Axes::Units::QSPACE:
175  return [wl = m_wavelength](double value) { return getQ(wl, value); };
176  case Axes::Units::RQ4:
177  return [wl = m_wavelength](double value) { return getQ(wl, value); };
178  default:
179  throwUnitsError("UnitConverterConvSpec::getTraslatorTo", availableUnits());
180  }
181 }
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
double rad2deg(double angle)
Definition: Units.h:55

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

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 }
virtual Axes::Units defaultUnits() const =0

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(), OffSpecularConverter::calculateValue(), DepthProbeConverter::checkUnits(), getTraslatorFrom(), 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

std::unique_ptr<IAxis> UnitConverterConvSpec::m_axis
protected

basic inclination angles (in rads).

Definition at line 101 of file UnitConverter1D.h.

Referenced by UnitConverterConvSpec(), axisSize(), and coordinateAxis().

◆ m_wavelength

double UnitConverterConvSpec::m_wavelength
protected

basic wavelength in nm (for translation to q-space).

Definition at line 100 of file UnitConverter1D.h.

Referenced by getTraslatorFrom(), and getTraslatorTo().


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