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

Public Member Functions

 ~UnitConverter1D () override=default
 
UnitConverter1Dclone () const override=0
 
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
 
virtual size_t axisSize (size_t i_axis) const =0
 
std::string axisName (size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 
virtual std::vector< Axes::UnitsavailableUnits () const =0
 
virtual Axes::Units defaultUnits () const =0
 
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

virtual std::function< double(double)> getTraslatorTo (Axes::Units units_type) const =0
 
virtual const IAxiscoordinateAxis () const =0
 
void checkIndex (size_t i_axis) const
 
void throwUnitsError (std::string method, std::vector< Axes::Units > available) const
 

Private Member Functions

virtual std::vector< std::map< Axes::Units, std::string > > createNameMaps () const =0
 

Detailed Description

Conversion of axis units for the case of 1D simulation result.

Definition at line 29 of file UnitConverter1D.h.

Constructor & Destructor Documentation

◆ ~UnitConverter1D()

UnitConverter1D::~UnitConverter1D ( )
overridedefault

Member Function Documentation

◆ createUnitConverter()

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

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

◆ clone()

UnitConverter1D* UnitConverter1D::clone ( ) const
overridepure virtual

Implements IUnitConverter.

Implemented in UnitConverterQSpec, and UnitConverterConvSpec.

◆ dimension()

size_t UnitConverter1D::dimension ( ) const
overridevirtual

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
overridevirtual

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
void checkIndex(size_t i_axis) 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(), coordinateAxis(), getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by createConvertedAxis().

Here is the call graph for this function:

◆ calculateMax()

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

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(), coordinateAxis(), getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by createConvertedAxis().

Here is the call graph for this function:

◆ createConvertedAxis()

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

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 }
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 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.
std::unique_ptr< PointwiseAxis > createTranslatedAxis(const IAxis &axis, std::function< double(double)> translator, std::string name)

References IUnitConverter::axisName(), calculateMax(), calculateMin(), IUnitConverter::checkIndex(), coordinateAxis(), anonymous_namespace{UnitConverter1D.cpp}::createTranslatedAxis(), getTraslatorTo(), and IUnitConverter::substituteDefaultUnits().

Referenced by 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
overridevirtual

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 createConvertedAxis(), OutputData< T >::getRank(), and OutputData< T >::getRawDataVector().

Here is the call graph for this function:

◆ getTraslatorTo()

virtual std::function<double(double)> UnitConverter1D::getTraslatorTo ( Axes::Units  units_type) const
protectedpure virtual

Returns translating functional (rads --> output units)

Implemented in UnitConverterQSpec, and UnitConverterConvSpec.

Referenced by calculateMax(), calculateMin(), and createConvertedAxis().

◆ coordinateAxis()

virtual const IAxis* UnitConverter1D::coordinateAxis ( ) const
protectedpure virtual

◆ axisSize()

virtual size_t IUnitConverter::axisSize ( size_t  i_axis) const
pure virtualinherited

◆ 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
void throwUnitsError(std::string method, std::vector< Axes::Units > available) const

References IUnitConverter::availableUnits(), IUnitConverter::createNameMaps(), IUnitConverter::substituteDefaultUnits(), and IUnitConverter::throwUnitsError().

Referenced by UnitConverterSimple::addDetectorAxis(), OffSpecularConverter::addDetectorYAxis(), UnitConverterSimple::createConvertedAxis(), createConvertedAxis(), DepthProbeConverter::DepthProbeConverter(), OffSpecularConverter::OffSpecularConverter(), and UnitConverterConvSpec::UnitConverterConvSpec().

Here is the call graph for this function:

◆ availableUnits()

virtual std::vector<Axes::Units> IUnitConverter::availableUnits ( ) const
pure virtualinherited

◆ defaultUnits()

◆ 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(), calculateMax(), UnitConverterSimple::calculateMin(), calculateMin(), and 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(), UnitConverterConvSpec::axisSize(), UnitConverterQSpec::axisSize(), UnitConverterSimple::calculateMax(), calculateMax(), UnitConverterSimple::calculateMin(), calculateMin(), and 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(), UnitConverterConvSpec::getTraslatorFrom(), UnitConverterConvSpec::getTraslatorTo(), and UnitConverterQSpec::getTraslatorTo().

◆ createNameMaps()

virtual std::vector<std::map<Axes::Units, std::string> > IUnitConverter::createNameMaps ( ) const
privatepure virtualinherited

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 34 of file ICloneable.h.


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