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

Description

ICoordSystem class that handles the unit translations for rectangular detectors Its default units are mm for both axes.

Definition at line 90 of file CoordSystem2D.h.

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

Public Member Functions

 ImageCoords (const OwningVector< IAxis > &axes, RectangularPixel *regionOfInterestPixel, const Direction &direction, double wavelength)
 
 ~ImageCoords () override
 
std::vector< CoordsavailableUnits () const override
 Returns list of units that are available for all 2D detectors. Further units may be added by child classes. More...
 
std::string axisName (size_t i_axis, Coords units=Coords::UNDEFINED) const
 
size_t axisSize (size_t i_axis) const override
 
double calculateMax (size_t i_axis, Coords units) const override
 
double calculateMin (size_t i_axis, Coords units) const override
 
ImageCoordsclone () const override
 
std::vector< IAxis * > convertedAxes (Coords units) const
 
IAxiscreateConvertedAxis (size_t i_axis, Coords units) const override
 
virtual DatafieldcreateConvertedData (const Datafield &data, Coords units) const
 Creates Datafield array in converter units. More...
 
std::vector< IAxis * > defaultAxes () const
 
Coords defaultUnits () const override
 
size_t rank () const override
 
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, size_t nbins)
 
Coords substituteDefaultUnits (Coords units) const
 
void throwUnitsError (std::string method, std::vector< Coords > available) const
 

Protected Attributes

double m_alpha_i
 
OwningVector< IAxism_axes
 
double m_phi_i
 
double m_wavelength
 

Private Member Functions

 ImageCoords (const ImageCoords &other)
 used by clone() More...
 
double calculateValue (size_t i_axis, Coords units, double value) const override
 
std::vector< std::map< Coords, std::string > > createNameMaps () const override
 

Private Attributes

std::unique_ptr< RectangularPixelm_detector_pixel
 

Constructor & Destructor Documentation

◆ ImageCoords() [1/2]

ImageCoords::ImageCoords ( const OwningVector< IAxis > &  axes,
RectangularPixel regionOfInterestPixel,
const Direction direction,
double  wavelength 
)

Definition at line 188 of file CoordSystem2D.cpp.

190  : CoordSystem2D(axes, direction, wavelength)
191  , m_detector_pixel(regionOfInterestPixel)
192 {
193  ASSERT(axes.size() == 2);
194 }
#define ASSERT(condition)
Definition: Assert.h:45
CoordSystem2D(const Direction &direction, double wavelength=0)
std::unique_ptr< RectangularPixel > m_detector_pixel
size_t size() const
Definition: OwningVector.h:70

References ASSERT, and OwningVector< T >::size().

Referenced by clone().

Here is the call graph for this function:

◆ ~ImageCoords()

ImageCoords::~ImageCoords ( )
overridedefault

◆ ImageCoords() [2/2]

ImageCoords::ImageCoords ( const ImageCoords other)
private

used by clone()

Definition at line 196 of file CoordSystem2D.cpp.

197  : CoordSystem2D(other)
198  , m_detector_pixel(other.m_detector_pixel->clone())
199 {
200 }

Member Function Documentation

◆ addAxisData()

void CoordSystem2D::addAxisData ( std::string  name,
double  min,
double  max,
size_t  nbins 
)
protectedinherited

Definition at line 70 of file CoordSystem2D.cpp.

71 {
72  m_axes.emplace_back(new FixedBinAxis(name, min, max, nbins));
73 }
OwningVector< IAxis > m_axes
Definition: CoordSystem2D.h:56
Axis with fixed bin size.
Definition: FixedBinAxis.h:23
void emplace_back(T *e)
Definition: OwningVector.h:62

References OwningVector< T >::emplace_back(), and CoordSystem2D::m_axes.

Here is the call graph for this function:

◆ availableUnits()

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

Returns list of units that are available for all 2D detectors. Further units may be added by child classes.

Reimplemented from CoordSystem2D.

Definition at line 209 of file CoordSystem2D.cpp.

210 {
211  auto result = CoordSystem2D::availableUnits();
212  result.push_back(Coords::QSPACE);
213  result.push_back(Coords::MM);
214  return result;
215 }
std::vector< Coords > availableUnits() const override
Returns list of units that are available for all 2D detectors. Further units may be added by child cl...

References CoordSystem2D::availableUnits(), MM, and QSPACE.

Here is the call graph for this function:

◆ 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 }
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 CoordSystem2D::axisSize ( size_t  i_axis) const
overridevirtualinherited

Implements ICoordSystem.

Definition at line 93 of file CoordSystem2D.cpp.

94 {
95  ASSERT(i_axis < rank());
96  return m_axes[i_axis]->size();
97 }
size_t rank() const override
Definition: CoordSystem2D.h:39

References ASSERT, CoordSystem2D::m_axes, CoordSystem2D::rank(), and OwningVector< T >::size().

Referenced by CoordSystem2D::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMax()

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

Implements ICoordSystem.

Definition at line 84 of file CoordSystem2D.cpp.

85 {
86  ASSERT(i_axis < rank());
87  units = substituteDefaultUnits(units);
88  if (units == Coords::NBINS)
89  return m_axes[i_axis]->size();
90  return calculateValue(i_axis, units, m_axes[i_axis]->max());
91 }
virtual double calculateValue(size_t i_axis, Coords units, double value) const =0
Coords substituteDefaultUnits(Coords units) const

References ASSERT, CoordSystem2D::calculateValue(), CoordSystem2D::m_axes, NBINS, CoordSystem2D::rank(), OwningVector< T >::size(), and ICoordSystem::substituteDefaultUnits().

Referenced by CoordSystem2D::createConvertedAxis().

Here is the call graph for this function:

◆ calculateMin()

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

Implements ICoordSystem.

Definition at line 75 of file CoordSystem2D.cpp.

76 {
77  ASSERT(i_axis < rank());
78  units = substituteDefaultUnits(units);
79  if (units == Coords::NBINS)
80  return 0.0;
81  return calculateValue(i_axis, units, m_axes[i_axis]->min());
82 }

References ASSERT, CoordSystem2D::calculateValue(), CoordSystem2D::m_axes, NBINS, CoordSystem2D::rank(), and ICoordSystem::substituteDefaultUnits().

Referenced by CoordSystem2D::createConvertedAxis().

Here is the call graph for this function:

◆ calculateValue()

double ImageCoords::calculateValue ( size_t  i_axis,
Coords  units,
double  value 
) const
overrideprivatevirtual

Implements CoordSystem2D.

Definition at line 217 of file CoordSystem2D.cpp.

218 {
219  ASSERT(m_wavelength > 0);
220  if (units == Coords::MM)
221  return value;
222  const auto k00 = m_detector_pixel->getPosition(0.0, 0.0);
223  const auto k01 = m_detector_pixel->getPosition(0.0, 1.0);
224  const auto k10 = m_detector_pixel->getPosition(1.0, 0.0);
225  const auto& max_pos = i_axis == 0 ? k10 : k01; // position of max along given axis
226  const double shift = value - m_axes[i_axis]->min();
227  const R3 out_dir = k00 + shift * (max_pos - k00).unit();
228  const R3 k_f = out_dir.unit() * M_TWOPI / m_wavelength;
229 
230  switch (units) {
231  case Coords::RADIANS:
232  return axisAngle(i_axis, k_f);
233  case Coords::DEGREES:
234  return Units::rad2deg(axisAngle(i_axis, k_f));
235  case Coords::QSPACE: {
237  if (i_axis == 0)
238  return (k_i - k_f).y();
239  if (i_axis == 1)
240  return (k_f - k_i).z();
241  } break;
242  case Coords::QXQY: {
244  if (i_axis == 0)
245  return (k_i - k_f).y();
246  if (i_axis == 1)
247  return (k_f - k_i).x();
248  } break;
249  default:
250  break;
251  }
252  ASSERT(0);
253 }
#define M_TWOPI
Definition: Constants.h:54
R3 vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
Definition: Direction.cpp:19
double m_wavelength
Definition: CoordSystem2D.h:57
double m_alpha_i
Definition: CoordSystem2D.h:58
double rad2deg(double angle)
Definition: Units.h:54

References ASSERT, DEGREES, CoordSystem2D::m_alpha_i, CoordSystem2D::m_axes, m_detector_pixel, CoordSystem2D::m_phi_i, M_TWOPI, CoordSystem2D::m_wavelength, MM, QSPACE, QXQY, Units::rad2deg(), RADIANS, and vecOfLambdaAlphaPhi().

Here is the call graph for this function:

◆ clone()

ImageCoords * ImageCoords::clone ( ) const
overridevirtual

Implements ICoordSystem.

Definition at line 204 of file CoordSystem2D.cpp.

205 {
206  return new ImageCoords(*this);
207 }
ImageCoords(const OwningVector< IAxis > &axes, RectangularPixel *regionOfInterestPixel, const Direction &direction, double wavelength)

References ImageCoords().

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:

◆ createConvertedAxis()

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

Implements ICoordSystem.

Definition at line 104 of file CoordSystem2D.cpp.

105 {
106  const double min = calculateMin(i_axis, units);
107  const double max = calculateMax(i_axis, units);
108  const auto& axis_name = axisName(i_axis, units);
109  const auto axis_size = axisSize(i_axis);
110  return new FixedBinAxis(axis_name, axis_size, min, max);
111 }
size_t axisSize(size_t i_axis) const override
double calculateMin(size_t i_axis, Coords units) const override
double calculateMax(size_t i_axis, Coords units) const override
std::string axisName(size_t i_axis, Coords units=Coords::UNDEFINED) const

References ICoordSystem::axisName(), CoordSystem2D::axisSize(), CoordSystem2D::calculateMax(), and CoordSystem2D::calculateMin().

Here is the call graph for this function:

◆ createConvertedData()

Datafield * ICoordSystem::createConvertedData ( const Datafield data,
Coords  units 
) const
virtualinherited

Creates Datafield array in converter units.

Reimplemented in CoordSystem1D.

Definition at line 46 of file ICoordSystem.cpp.

47 {
48  std::vector<IAxis*> axes;
49  for (size_t i = 0; i < rank(); ++i)
50  axes.emplace_back(createConvertedAxis(i, units));
51 
52  Datafield* result = new Datafield(axes);
53 
54  result->setVector(data.flatVector());
55  return result;
56 }
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

References ICoordSystem::createConvertedAxis(), Datafield::flatVector(), ICoordSystem::rank(), and Datafield::setVector().

Here is the call graph for this function:

◆ createNameMaps()

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

Implements ICoordSystem.

Definition at line 255 of file CoordSystem2D.cpp.

256 {
258 }
BA_DEVICE_API_ const std::map< Coords, std::string > rectangularAxis1
Definition: AxisNames.cpp:39
BA_DEVICE_API_ const std::map< Coords, std::string > rectangularAxis0
Definition: AxisNames.cpp:35

References DataUtils::AxisNames::rectangularAxis0, and DataUtils::AxisNames::rectangularAxis1.

◆ 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 ImageCoords::defaultUnits ( ) const
inlineoverridevirtual

Implements ICoordSystem.

Definition at line 100 of file CoordSystem2D.h.

100 { return Coords::MM; }

References MM.

◆ rank()

size_t CoordSystem2D::rank ( ) const
inlineoverridevirtualinherited

Implements ICoordSystem.

Definition at line 39 of file CoordSystem2D.h.

39 { return m_axes.size(); }

References CoordSystem2D::m_axes, and OwningVector< T >::size().

Referenced by CoordSystem2D::axisSize(), CoordSystem2D::calculateMax(), and CoordSystem2D::calculateMin().

Here is the call graph for this function:

◆ 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_alpha_i

double CoordSystem2D::m_alpha_i
protectedinherited

Definition at line 58 of file CoordSystem2D.h.

Referenced by SphericalCoords::calculateValue(), and calculateValue().

◆ m_axes

◆ m_detector_pixel

std::unique_ptr<RectangularPixel> ImageCoords::m_detector_pixel
private

Definition at line 107 of file CoordSystem2D.h.

Referenced by calculateValue().

◆ m_phi_i

double CoordSystem2D::m_phi_i
protectedinherited

Definition at line 59 of file CoordSystem2D.h.

Referenced by SphericalCoords::calculateValue(), and calculateValue().

◆ m_wavelength

double CoordSystem2D::m_wavelength
protectedinherited

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