BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
AngularReflectometryCoordinates Class Reference

Description

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

Definition at line 69 of file CoordSystem1D.h.

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

Public Member Functions

 AngularReflectometryCoordinates (double wavelength, const IAxis &axis, Coords axis_units=Coords::RADIANS)
 Constructs the object for unit conversion. More...
 
 ~AngularReflectometryCoordinates () override
 
std::vector< CoordsavailableUnits () const override
 Returns the list of all available units. More...
 
std::string axisName (size_t i_axis, Coords units=Coords::UNDEFINED) const
 
size_t axisSize (size_t i_axis) const override
 Returns the size of underlying axis. More...
 
double calculateMax (size_t i_axis, Coords units) const override
 Calculates maximum on-axis value in given units. More...
 
double calculateMin (size_t i_axis, Coords units) const override
 Calculates minimum on-axis value in given units. More...
 
AngularReflectometryCoordinatesclone () const override
 
std::vector< IAxis * > convertedAxes (Coords units) const
 
IAxiscreateConvertedAxis (size_t i_axis, Coords units) const override
 Creates axis in converted units. More...
 
DatafieldcreateConvertedData (const Datafield &data, Coords units) const override
 Creates Datafield array in converter units. More...
 
std::vector< IAxis * > defaultAxes () const
 
Coords defaultUnits () const override
 Returns default units to convert to. More...
 
size_t rank () const override
 Returns dimensionality of converted canvas. More...
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Protected Member Functions

const IAxiscoordinateAxis () const
 
Coords substituteDefaultUnits (Coords units) const
 
void throwUnitsError (std::string method, std::vector< Coords > available) const
 

Protected Attributes

std::unique_ptr< const IAxism_axis
 semantics depends on subclass More...
 

Private Member Functions

 AngularReflectometryCoordinates (const AngularReflectometryCoordinates &other)
 
std::vector< std::map< Coords, std::string > > createNameMaps () const override
 Creates name map for axis in various units. More...
 
std::function< double(double)> getTraslatorTo (Coords units) const override
 Returns translating functional (rads --> desired units) More...
 

Private Attributes

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

Constructor & Destructor Documentation

◆ AngularReflectometryCoordinates() [1/2]

AngularReflectometryCoordinates::AngularReflectometryCoordinates ( double  wavelength,
const IAxis axis,
Coords  axis_units = Coords::RADIANS 
)

Constructs the object for unit conversion.

Definition at line 147 of file CoordSystem1D.cpp.

150  : CoordSystem1D(createAxisFrom(axis, axis_units, angularAxisName(axis_units), wavelength))
151  , m_wavelength(wavelength)
152 {
153  if (m_axis->min() < 0 || m_axis->max() > M_PI_2)
154  throw std::runtime_error("Error in CoordSystem1D: input axis range is out of bounds");
155 }
#define M_PI_2
Definition: Constants.h:45
double m_wavelength
basic wavelength in nm (for translation to q-space).
Definition: CoordSystem1D.h:94
std::unique_ptr< const IAxis > m_axis
semantics depends on subclass
Definition: CoordSystem1D.h:64
CoordSystem1D(const IAxis *&&axis)
Takes ownership of axis.

References CoordSystem1D::m_axis, and M_PI_2.

Referenced by clone().

◆ ~AngularReflectometryCoordinates()

AngularReflectometryCoordinates::~AngularReflectometryCoordinates ( )
overridedefault

◆ AngularReflectometryCoordinates() [2/2]

AngularReflectometryCoordinates::AngularReflectometryCoordinates ( const AngularReflectometryCoordinates other)
private

Definition at line 157 of file CoordSystem1D.cpp.

159  : CoordSystem1D(other.m_axis->clone())
160  , m_wavelength(other.m_wavelength)
161 {
162 }

Member Function Documentation

◆ availableUnits()

std::vector< Coords > AngularReflectometryCoordinates::availableUnits ( ) const
overridevirtual

Returns the list of all available units.

Implements ICoordSystem.

Definition at line 171 of file CoordSystem1D.cpp.

References DEGREES, NBINS, QSPACE, RADIANS, and RQ4.

◆ axisName()

std::string ICoordSystem::axisName ( size_t  i_axis,
Coords  units = Coords::UNDEFINED 
) const
inherited

Definition at line 36 of file ICoordSystem.cpp.

37 {
38  const auto& name_maps = createNameMaps();
39  ASSERT(i_axis < name_maps.size());
40  const auto& name_map = name_maps[i_axis];
41  const auto& it = name_map.find(units == Coords::UNDEFINED ? defaultUnits() : units);
42  ASSERT(it != name_map.cend());
43  return it->second;
44 }
#define ASSERT(condition)
Definition: Assert.h:45
virtual std::vector< std::map< Coords, std::string > > createNameMaps() const =0
virtual Coords defaultUnits() const =0

References ASSERT, ICoordSystem::createNameMaps(), ICoordSystem::defaultUnits(), and UNDEFINED.

Referenced by CoordSystem1D::createConvertedAxis(), and CoordSystem2D::createConvertedAxis().

Here is the call graph for this function:

◆ axisSize()

size_t CoordSystem1D::axisSize ( size_t  i_axis) const
overridevirtualinherited

Returns the size of underlying axis.

Implements ICoordSystem.

Definition at line 83 of file CoordSystem1D.cpp.

84 {
85  ASSERT(i_axis == 0);
86  return coordinateAxis()->size();
87 }
const IAxis * coordinateAxis() const
Definition: CoordSystem1D.h:62
virtual size_t size() const =0
Returns the number of bins.

References ASSERT, CoordSystem1D::coordinateAxis(), and IAxis::size().

Here is the call graph for this function:

◆ calculateMax()

double CoordSystem1D::calculateMax ( size_t  i_axis,
Coords  units 
) const
overridevirtualinherited

Calculates maximum on-axis value in given units.

Implements ICoordSystem.

Definition at line 99 of file CoordSystem1D.cpp.

100 {
101  ASSERT(i_axis == 0);
102  units = substituteDefaultUnits(units);
103  const IAxis* const coordinate_axis = coordinateAxis();
104  if (units == Coords::NBINS)
105  return static_cast<double>(coordinate_axis->size());
106  auto translator = getTraslatorTo(units);
107  return translator(coordinate_axis->binCenter(coordinate_axis->size() - 1));
108 }
virtual std::function< double(double)> getTraslatorTo(Coords units) const =0
Returns translating functional (rads --> output units)
Abstract base class for one-dimensional axes.
Definition: IAxis.h:27
virtual double binCenter(size_t index) const =0
Coords substituteDefaultUnits(Coords units) const

References ASSERT, IAxis::binCenter(), CoordSystem1D::coordinateAxis(), CoordSystem1D::getTraslatorTo(), NBINS, IAxis::size(), and ICoordSystem::substituteDefaultUnits().

Referenced by CoordSystem1D::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMin()

double CoordSystem1D::calculateMin ( size_t  i_axis,
Coords  units 
) const
overridevirtualinherited

Calculates minimum on-axis value in given units.

Implements ICoordSystem.

Definition at line 89 of file CoordSystem1D.cpp.

90 {
91  ASSERT(i_axis == 0);
92  units = substituteDefaultUnits(units);
93  if (units == Coords::NBINS)
94  return 0.0;
95  auto translator = getTraslatorTo(units);
96  return translator(coordinateAxis()->binCenter(0));
97 }

References ASSERT, CoordSystem1D::coordinateAxis(), CoordSystem1D::getTraslatorTo(), NBINS, and ICoordSystem::substituteDefaultUnits().

Referenced by CoordSystem1D::createConvertedAxis().

Here is the call graph for this function:

◆ clone()

AngularReflectometryCoordinates * AngularReflectometryCoordinates::clone ( ) const
overridevirtual

Implements CoordSystem1D.

Definition at line 166 of file CoordSystem1D.cpp.

167 {
168  return new AngularReflectometryCoordinates(*this);
169 }
AngularReflectometryCoordinates(double wavelength, const IAxis &axis, Coords axis_units=Coords::RADIANS)
Constructs the object for unit conversion.

References AngularReflectometryCoordinates().

Here is the call graph for this function:

◆ convertedAxes()

std::vector< IAxis * > ICoordSystem::convertedAxes ( Coords  units) const
inherited

Definition at line 28 of file ICoordSystem.cpp.

29 {
30  std::vector<IAxis*> result;
31  for (size_t i = 0; i < rank(); ++i)
32  result.emplace_back(createConvertedAxis(i, units));
33  return result;
34 }
virtual IAxis * createConvertedAxis(size_t i_axis, Coords units) const =0
virtual size_t rank() const =0

References ICoordSystem::createConvertedAxis(), and ICoordSystem::rank().

Referenced by ICoordSystem::defaultAxes().

Here is the call graph for this function:

◆ coordinateAxis()

const IAxis* CoordSystem1D::coordinateAxis ( ) const
inlineprotectedinherited

◆ createConvertedAxis()

IAxis * CoordSystem1D::createConvertedAxis ( size_t  i_axis,
Coords  units 
) const
overridevirtualinherited

Creates axis in converted units.

Implements ICoordSystem.

Definition at line 110 of file CoordSystem1D.cpp.

111 {
112  ASSERT(i_axis == 0);
113  units = substituteDefaultUnits(units);
114  if (units == Coords::NBINS)
115  return new FixedBinAxis(axisName(0, units), coordinateAxis()->size(),
116  calculateMin(0, units), calculateMax(0, units));
117 
118  std::function<double(double)> translator = getTraslatorTo(units);
119  auto coords = coordinateAxis()->binCenters();
120  for (size_t i = 0, size = coords.size(); i < size; ++i)
121  coords[i] = translator(coords[i]);
122  return new PointwiseAxis(axisName(0, units), coords);
123 }
double calculateMax(size_t i_axis, Coords units) const override
Calculates maximum on-axis value in given units.
double calculateMin(size_t i_axis, Coords units) const override
Calculates minimum on-axis value in given units.
Axis with fixed bin size.
Definition: FixedBinAxis.h:23
virtual std::vector< double > binCenters() const
Definition: IAxis.cpp:25
std::string axisName(size_t i_axis, Coords units=Coords::UNDEFINED) const
Axis containing arbitrary (non-equidistant) coordinate values. Lower boundary of the first bin and up...
Definition: PointwiseAxis.h:33

References ASSERT, ICoordSystem::axisName(), IAxis::binCenters(), CoordSystem1D::calculateMax(), CoordSystem1D::calculateMin(), CoordSystem1D::coordinateAxis(), CoordSystem1D::getTraslatorTo(), NBINS, and ICoordSystem::substituteDefaultUnits().

Referenced by CoordSystem1D::createConvertedData().

Here is the call graph for this function:

◆ createConvertedData()

Datafield * CoordSystem1D::createConvertedData ( const Datafield data,
Coords  units 
) const
overridevirtualinherited

Creates Datafield array in converter units.

Reimplemented from ICoordSystem.

Definition at line 125 of file CoordSystem1D.cpp.

126 {
127  ASSERT(data.rank() == 1);
128 
129  auto q_axis = createConvertedAxis(0, units);
130  Datafield* result = new Datafield({q_axis});
131 
132  if (units != Coords::RQ4) {
133  result->setVector(data.flatVector());
134  return result;
135  }
136 
137  for (size_t i = 0, size = result->size(); i < size; ++i)
138  (*result)[i] = data[i] * std::pow((*q_axis)[i], 4);
139  return result;
140 }
IAxis * createConvertedAxis(size_t i_axis, Coords units) const override
Creates axis in converted units.
Stores radiation power per bin.
Definition: Datafield.h:30
void setVector(const std::vector< double > &data_vector)
Sets new values to raw data vector.
Definition: Datafield.cpp:69
std::vector< double > flatVector() const
Returns copy of raw data vector.
Definition: Datafield.cpp:119
size_t rank() const
Definition: Datafield.cpp:75
size_t size() const
Returns total size of data buffer (product of bin number in every dimension).
Definition: Datafield.cpp:80

References ASSERT, CoordSystem1D::createConvertedAxis(), Datafield::flatVector(), Datafield::rank(), RQ4, Datafield::setVector(), and Datafield::size().

Here is the call graph for this function:

◆ createNameMaps()

std::vector< std::map< Coords, std::string > > AngularReflectometryCoordinates::createNameMaps ( ) const
overrideprivatevirtual

Creates name map for axis in various units.

Implements ICoordSystem.

Definition at line 176 of file CoordSystem1D.cpp.

177 {
179 }
BA_DEVICE_API_ const std::map< Coords, std::string > specAxis
Definition: AxisNames.cpp:55

References DataUtils::AxisNames::specAxis.

◆ defaultAxes()

std::vector< IAxis * > ICoordSystem::defaultAxes ( ) const
inherited

Definition at line 23 of file ICoordSystem.cpp.

24 {
25  return convertedAxes(defaultUnits());
26 }
std::vector< IAxis * > convertedAxes(Coords units) const

References ICoordSystem::convertedAxes(), and ICoordSystem::defaultUnits().

Referenced by SimDataPair::execSimulation().

Here is the call graph for this function:

◆ defaultUnits()

Coords AngularReflectometryCoordinates::defaultUnits ( ) const
inlineoverridevirtual

Returns default units to convert to.

Implements ICoordSystem.

Definition at line 82 of file CoordSystem1D.h.

82 { return Coords::DEGREES; }

References DEGREES.

◆ getTraslatorTo()

std::function< double(double)> AngularReflectometryCoordinates::getTraslatorTo ( Coords  units) const
overrideprivatevirtual

Returns translating functional (rads --> desired units)

Implements CoordSystem1D.

Definition at line 181 of file CoordSystem1D.cpp.

182 {
183  switch (units) {
184  case Coords::RADIANS:
185  return [](double value) { return value; };
186  case Coords::DEGREES:
187  return [](double value) { return Units::rad2deg(value); };
188  case Coords::QSPACE:
189  return [wl = m_wavelength](double value) { return getQ(wl, value); };
190  case Coords::RQ4:
191  return [wl = m_wavelength](double value) { return getQ(wl, value); };
192  default:
193  ASSERT(0);
194  }
195 }
double rad2deg(double angle)
Definition: Units.h:54

References ASSERT, DEGREES, m_wavelength, QSPACE, Units::rad2deg(), RADIANS, and RQ4.

Here is the call graph for this function:

◆ rank()

size_t CoordSystem1D::rank ( ) const
inlineoverridevirtualinherited

Returns dimensionality of converted canvas.

Implements ICoordSystem.

Definition at line 41 of file CoordSystem1D.h.

41 { return 1u; }

◆ substituteDefaultUnits()

Coords ICoordSystem::substituteDefaultUnits ( Coords  units) const
protectedinherited

Definition at line 69 of file ICoordSystem.cpp.

70 {
71  return units == Coords::UNDEFINED ? defaultUnits() : units;
72 }

References ICoordSystem::defaultUnits(), and UNDEFINED.

Referenced by CoordSystem1D::calculateMax(), CoordSystem2D::calculateMax(), CoordSystem1D::calculateMin(), CoordSystem2D::calculateMin(), and CoordSystem1D::createConvertedAxis().

Here is the call graph for this function:

◆ throwUnitsError()

void ICoordSystem::throwUnitsError ( std::string  method,
std::vector< Coords available 
) const
protectedinherited

Definition at line 58 of file ICoordSystem.cpp.

59 {
60  std::stringstream ss;
61  ss << "Unit type error in " << method
62  << ": unknown or unsupported unit type. Available units "
63  "are:\n";
64  for (auto unit : available)
65  ss << axisUnitLabel.at(unit) << "\n";
66  throw std::runtime_error(ss.str());
67 }
const std::map< Coords, const char * > axisUnitLabel
Definition: AxisNames.h:28

References axisUnitLabel.

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

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

Definition at line 32 of file ICloneable.h.

Member Data Documentation

◆ m_axis

std::unique_ptr<const IAxis> CoordSystem1D::m_axis
protectedinherited

semantics depends on subclass

Definition at line 64 of file CoordSystem1D.h.

Referenced by AngularReflectometryCoordinates(), and CoordSystem1D::coordinateAxis().

◆ m_wavelength

double AngularReflectometryCoordinates::m_wavelength
private

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

Definition at line 94 of file CoordSystem1D.h.

Referenced by getTraslatorTo().


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