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

Public Member Functions

 UnitConverterConvSpec (const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
 
 UnitConverterConvSpec (const AngularSpecScan &handler)
 
 ~UnitConverterConvSpec () override
 
UnitConverterConvSpecclone () const override
 
size_t axisSize (size_t i_axis) const override
 
std::vector< Axes::UnitsavailableUnits () const override
 
Axes::Units defaultUnits () const override
 
size_t dimension () const override
 
double calculateMin (size_t i_axis, Axes::Units units_type) const override
 
double calculateMax (size_t i_axis, Axes::Units units_type) const override
 
std::unique_ptr< IAxiscreateConvertedAxis (size_t i_axis, Axes::Units units) const override
 
std::unique_ptr< OutputData< double > > createConvertedData (const OutputData< double > &data, Axes::Units units) const override
 
std::string axisName (size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 
Axes::Units substituteDefaultUnits (Axes::Units units) const
 
virtual void transferToCPP ()
 

Static Public Member Functions

static std::unique_ptr< UnitConverter1DcreateUnitConverter (const ISpecularScan &handler)
 

Protected Member Functions

 UnitConverterConvSpec (const UnitConverterConvSpec &other)
 
std::vector< std::map< Axes::Units, std::string > > createNameMaps () const override
 
std::function< double(double)> getTraslatorFrom (Axes::Units units_type) const
 
std::function< double(double)> getTraslatorTo (Axes::Units units_type) const override
 
const IAxiscoordinateAxis () const override
 
void checkIndex (size_t i_axis) const
 
void throwUnitsError (std::string method, std::vector< Axes::Units > available) const
 

Protected Attributes

double m_wavelength
 
std::unique_ptr< IAxism_axis
 

Detailed Description

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

Definition at line 63 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 103 of file UnitConverter1D.cpp.

105  : m_wavelength(beam.getWavelength())
106 {
107  m_axis = createTranslatedAxis(axis, getTraslatorFrom(axis_units), axisName(0, axis_units));
108  if (m_axis->getMin() < 0 || m_axis->getMax() > M_PI_2)
109  throw std::runtime_error("Error in UnitConverter1D: input axis range is out of bounds");
110 }
#define M_PI_2
Definition: MathConstants.h:40
double getWavelength() const
Definition: Beam.h:69
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).
std::unique_ptr< PointwiseAxis > createTranslatedAxis(const IAxis &axis, std::function< double(double)> translator, std::string name)

References IUnitConverter::axisName(), anonymous_namespace{UnitConverter1D.cpp}::createTranslatedAxis(), 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 112 of file UnitConverter1D.cpp.

113  : m_wavelength(handler.wavelength()), m_axis(handler.coordinateAxis()->clone())
114 {
115 }
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 141 of file UnitConverter1D.cpp.

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

Member Function Documentation

◆ clone()

UnitConverterConvSpec * UnitConverterConvSpec::clone ( ) const
overridevirtual

Implements UnitConverter1D.

Definition at line 119 of file UnitConverter1D.cpp.

120 {
121  return new UnitConverterConvSpec(*this);
122 }
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:

◆ axisSize()

size_t UnitConverterConvSpec::axisSize ( size_t  i_axis) const
overridevirtual

Returns the size of underlying axis.

Implements IUnitConverter.

Definition at line 124 of file UnitConverter1D.cpp.

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

References IUnitConverter::checkIndex(), and m_axis.

Here is the call graph for this function:

◆ availableUnits()

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

Returns the list of all available units.

Implements IUnitConverter.

Definition at line 130 of file UnitConverter1D.cpp.

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

Referenced by getTraslatorTo().

◆ defaultUnits()

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

Returns default units to convert to.

Implements IUnitConverter.

Definition at line 136 of file UnitConverter1D.cpp.

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

◆ 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 146 of file UnitConverter1D.cpp.

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

References AxisNames::InitSpecAxis().

Here is the call graph for this function:

◆ getTraslatorFrom()

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

Returns translating functional (input units --> rads)

Definition at line 153 of file UnitConverter1D.cpp.

154 {
155  switch (units_type) {
156  case Axes::Units::RADIANS:
157  return [](double value) { return value; };
158  case Axes::Units::DEGREES:
159  return [](double value) { return Units::deg2rad(value); };
160  case Axes::Units::QSPACE:
161  return [this](double value) { return getInvQ(m_wavelength, value); };
162  default:
163  throwUnitsError("UnitConverterConvSpec::getTraslatorFrom",
164  {Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE});
165  }
166 }
void throwUnitsError(std::string method, std::vector< Axes::Units > available) const
double deg2rad(double angle)
Definition: Units.h:47
double getInvQ(double wavelength, double q)

References Units::deg2rad(), anonymous_namespace{UnitConverter1D.cpp}::getInvQ(), 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 168 of file UnitConverter1D.cpp.

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

References availableUnits(), anonymous_namespace{UnitConverter1D.cpp}::getQ(), m_wavelength, Units::rad2deg(), and IUnitConverter::throwUnitsError().

Here is the call graph for this function:

◆ coordinateAxis()

const IAxis* UnitConverterConvSpec::coordinateAxis ( ) const
inlineoverrideprotectedvirtual

Implements UnitConverter1D.

Definition at line 95 of file UnitConverter1D.h.

95 { return m_axis.get(); }

References m_axis.

◆ 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 35 of file UnitConverter1D.cpp.

36 {
37  if (const auto* aScan = dynamic_cast<const AngularSpecScan*>(&scan))
38  return std::make_unique<UnitConverterConvSpec>(*aScan);
39 
40  if (const auto* qScan = dynamic_cast<const QSpecScan*>(&scan))
41  return std::make_unique<UnitConverterQSpec>(*qScan);
42 
43  throw std::runtime_error("Bug in UnitConverter1D::createUnitConverter: invalid case");
44 }
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:29

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

◆ dimension()

size_t UnitConverter1D::dimension ( ) const
overridevirtualinherited

Returns dimensionality of converted canvas.

Implements IUnitConverter.

Definition at line 46 of file UnitConverter1D.cpp.

47 {
48  return 1u;
49 }

◆ 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 51 of file UnitConverter1D.cpp.

52 {
53  checkIndex(i_axis);
54  units_type = substituteDefaultUnits(units_type);
55  if (units_type == Axes::Units::NBINS)
56  return 0.0;
57  auto translator = getTraslatorTo(units_type);
58  return translator(coordinateAxis()->getBinCenter(0));
59 }
Axes::Units substituteDefaultUnits(Axes::Units units) const
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:

◆ 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 61 of file UnitConverter1D.cpp.

62 {
63  checkIndex(i_axis);
64  units_type = substituteDefaultUnits(units_type);
65  auto coordinate_axis = coordinateAxis();
66  if (units_type == Axes::Units::NBINS)
67  return static_cast<double>(coordinate_axis->size());
68  auto translator = getTraslatorTo(units_type);
69  return translator(coordinate_axis->getBinCenter(coordinate_axis->size() - 1));
70 }

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

Referenced by UnitConverter1D::createConvertedAxis().

Here is the call graph for this function:

◆ 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 72 of file UnitConverter1D.cpp.

73 {
74  checkIndex(i_axis);
75  units = substituteDefaultUnits(units);
76  if (units == Axes::Units::NBINS)
77  return std::make_unique<FixedBinAxis>(axisName(0, units), coordinateAxis()->size(),
78  calculateMin(0, units), calculateMax(0, units));
79  return createTranslatedAxis(*coordinateAxis(), getTraslatorTo(units), axisName(0, units));
80 }
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(), anonymous_namespace{UnitConverter1D.cpp}::createTranslatedAxis(), 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 83 of file UnitConverter1D.cpp.

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

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

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

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(), UnitConverterSimple::calculateMax(), UnitConverter1D::calculateMax(), UnitConverterSimple::calculateMin(), UnitConverter1D::calculateMin(), and 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 UnitConverterSimple::axisSize(), 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(), 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_wavelength

double UnitConverterConvSpec::m_wavelength
protected

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

Definition at line 97 of file UnitConverter1D.h.

Referenced by getTraslatorFrom(), and getTraslatorTo().

◆ m_axis

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

basic inclination angles (in rads).

Definition at line 98 of file UnitConverter1D.h.

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


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