37 : m_wavelength(beam.getWavelength()), m_alpha_i(-beam.getAlpha()), m_phi_i(beam.getPhi())
49 AxisData axis_data{name, min, max, default_units, nbins};
58 if (units_type == Axes::Units::NBINS) {
69 if (units_type == Axes::Units::NBINS) {
70 return static_cast<double>(axis_data.nbins);
83 return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES};
91 const auto& axis_name =
axisName(i_axis, units);
92 const auto axis_size =
axisSize(i_axis);
93 return std::make_unique<FixedBinAxis>(axis_name, axis_size, min, max);
97 : m_axis_data_table(other.m_axis_data_table), m_wavelength(other.m_wavelength),
98 m_alpha_i(other.m_alpha_i), m_phi_i(other.m_phi_i)
104 const auto& axis = detector.
getAxis(i_axis);
106 const auto& axis_name =
axisName(i_axis);
108 auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis);
122 throw std::runtime_error(
"Error in SphericalConverter constructor: "
123 "detector has wrong dimension: "
124 + std::to_string(
static_cast<int>(detector.
dimension())));
139 result.push_back(Axes::Units::QSPACE);
145 return Axes::Units::DEGREES;
154 switch (units_type) {
155 case Axes::Units::RADIANS:
157 case Axes::Units::DEGREES:
159 case Axes::Units::QSPACE: {
163 return (k_i - k_f).y();
164 }
else if (i_axis == 1) {
166 return (k_f - k_i).z();
168 throw std::runtime_error(
"Error in SphericalConverter::calculateValue: "
169 "incorrect axis index: "
170 + std::to_string(
static_cast<int>(i_axis)));
172 case Axes::Units::QXQY: {
176 return (k_i - k_f).y();
177 }
else if (i_axis == 1) {
179 return (k_f - k_i).x();
181 throw std::runtime_error(
"Error in SphericalConverter::calculateValue: "
182 "incorrect axis index: "
183 + std::to_string(
static_cast<int>(i_axis)));
192 std::vector<std::map<Axes::Units, std::string>> result;
204 throw std::runtime_error(
"Error in RectangularConverter constructor: "
205 "detector has wrong dimension: "
206 + std::to_string(
static_cast<int>(detector.
dimension())));
222 result.push_back(Axes::Units::QSPACE);
223 result.push_back(Axes::Units::MM);
229 return Axes::Units::MM;
240 if (units_type == Axes::Units::MM)
245 const auto& max_pos = i_axis == 0 ? k10 : k01;
248 switch (units_type) {
249 case Axes::Units::RADIANS:
251 case Axes::Units::DEGREES:
253 case Axes::Units::QSPACE: {
256 return (k_i - k_f).y();
257 }
else if (i_axis == 1) {
258 return (k_f - k_i).z();
260 throw std::runtime_error(
"Error in RectangularConverter::calculateValue: "
261 "incorrect axis index: "
262 + std::to_string(
static_cast<int>(i_axis)));
264 case Axes::Units::QXQY: {
267 return (k_i - k_f).y();
268 }
else if (i_axis == 1) {
269 return (k_f - k_i).x();
271 throw std::runtime_error(
"Error in RectangularConverter::calculateValue: "
272 "incorrect axis index: "
273 + std::to_string(
static_cast<int>(i_axis)));
282 std::vector<std::map<Axes::Units, std::string>> result;
291 throw std::runtime_error(
"Error in RectangularConverter::normalizeToWavelength: "
294 return vector.
unit() * K;
301 }
else if (i_axis == 1) {
304 throw std::runtime_error(
"Error in RectangularConverter::axisAngle: "
305 "incorrect axis index: "
306 + std::to_string(
static_cast<int>(i_axis)));
312 const IAxis& alpha_axis)
316 throw std::runtime_error(
"Error in OffSpecularConverter constructor: "
317 "detector has wrong dimension: "
318 + std::to_string(
static_cast<int>(detector.
dimension())));
333 return Axes::Units::DEGREES;
343 switch (units_type) {
344 case Axes::Units::RADIANS:
346 case Axes::Units::DEGREES:
355 std::vector<std::map<Axes::Units, std::string>> result;
363 const auto& axis = detector.
getAxis(1);
365 const auto& axis_name =
axisName(1);
366 std::unique_ptr<IAxis> P_new_axis;
368 P_new_axis = p_roi->clipAxisToRoi(1, axis);
370 P_new_axis.reset(axis.clone());
373 throw std::runtime_error(
"Error in OffSpecularConverter::addDetectorYAxis: "
374 "could not retrieve the y-axis of the detector");
376 std::unique_ptr<RectangularPixel> P_det_pixel(P_rect_det->regionOfInterestPixel());
377 const auto k00 = P_det_pixel->getPosition(0.0, 0.0);
378 const auto k01 = P_det_pixel->getPosition(0.0, 1.0);
379 const double alpha_f_min =
M_PI_2 - k00.theta();
380 const double alpha_f_max =
M_PI_2 - k01.theta();
383 const double alpha_f_min = P_new_axis->getMin();
384 const double alpha_f_max = P_new_axis->getMax();
387 throw std::runtime_error(
"Error in OffSpecularConverter::addDetectorYAxis: "
388 "wrong detector type");
400 const auto& alpha_axis_name =
axisName(0);
417 result.push_back(Axes::Units::QSPACE);
432 switch (units_type) {
433 case Axes::Units::DEGREES:
435 case Axes::Units::QSPACE:
444 std::vector<std::map<Axes::Units, std::string>> result;
453 if (std::find(available_units.begin(), available_units.end(), units_type)
454 == available_units.cend())
Defines namespace AxisNames.
BasicVector3D< double > vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
Creates a vector<double> as a wavevector with given wavelength and angles.
Defines M_PI and some more mathematical constants.
Defines class RectangularDetector.
Defines class RectangularPixel.
Defines class RegionOfInterest.
const std::string z_axis_name
Defines interface UnitConverterSimple and its subclasses.
Defines class SphericalDetector.
Defines some unit conversion factors and other constants in namespace Units.
BasicVector3D< T > unit() const
Returns unit vector in direction of this. Throws for null vector.
double theta() const
Returns polar angle.
double phi() const
Returns azimuth angle.
Beam defined by wavelength, direction and intensity.
DepthProbeConverter class handles the unit translations for depth probe simulations Its default units...
Axes::Units defaultUnits() const final
double calculateValue(size_t, Axes::Units units_type, double value) const final
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const final
DepthProbeConverter(const Beam &beam, const IAxis &alpha_axis, const IAxis &z_axis)
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
~DepthProbeConverter() final
DepthProbeConverter * clone() const final
void checkUnits(Axes::Units units_type) const
Interface for one-dimensional axes.
virtual double getMin() const =0
Returns value of first point of axis.
virtual size_t size() const =0
retrieve the number of bins
virtual double getMax() const =0
Returns value of last point of axis.
Abstract 2D detector interface.
const RegionOfInterest * regionOfInterest() const override
Returns region of interest if exists.
Abstract detector interface.
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
const IAxis & getAxis(size_t index) const
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
Axes::Units substituteDefaultUnits(Axes::Units units) const
void checkIndex(size_t i_axis) const
virtual Axes::Units defaultUnits() const =0
void throwUnitsError(std::string method, std::vector< Axes::Units > available) const
std::string axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
IUnitConverter class that handles the unit translations for off-specular simulations with a spherical...
OffSpecularConverter(const IDetector2D &detector, const Beam &beam, const IAxis &alpha_axis)
Axes::Units defaultUnits() const final
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const final
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final
OffSpecularConverter * clone() const final
void addDetectorYAxis(const IDetector2D &detector)
~OffSpecularConverter() final
IUnitConverter class that handles the unit translations for rectangular detectors Its default units a...
kvector_t normalizeToWavelength(kvector_t vector) const
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const final
RectangularConverter(const RectangularDetector &detector, const Beam &beam)
double axisAngle(size_t i_axis, kvector_t k_f) const
~RectangularConverter() final
RectangularConverter * clone() const final
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final
Axes::Units defaultUnits() const final
std::unique_ptr< RectangularPixel > mP_detector_pixel
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
A flat rectangular detector with axes and resolution function.
RectangularPixel * regionOfInterestPixel() const
IUnitConverter class that handles the unit translations for spherical detectors Its default units are...
SphericalConverter(const SphericalDetector &detector, const Beam &beam)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const final
SphericalConverter * clone() const final
~SphericalConverter() final
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final
std::vector< Axes::Units > availableUnits() const final
Returns the list of all available units.
Axes::Units defaultUnits() const final
A spherical detector with axes and resolution function.
Interface for objects that provide axis translations to different units for IDetector objects.
void addDetectorAxis(const IDetector &detector, size_t i_axis)
double calculateMax(size_t i_axis, Axes::Units units_type) const final
double calculateMin(size_t i_axis, Axes::Units units_type) const final
void addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins)
std::vector< AxisData > m_axis_data_table
size_t axisSize(size_t i_axis) const final
virtual size_t dimension() const final
virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const =0
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const final
UnitConverterSimple(const Beam &beam)
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
std::map< Axes::Units, std::string > InitOffSpecAxis1()
std::map< Axes::Units, std::string > InitRectangularAxis0()
std::map< Axes::Units, std::string > InitRectangularAxis1()
std::map< Axes::Units, std::string > InitSphericalAxis0()
std::map< Axes::Units, std::string > InitOffSpecAxis0()
std::map< Axes::Units, std::string > InitSphericalAxis1()
std::map< Axes::Units, std::string > InitSpecAxis()
std::map< Axes::Units, std::string > InitSampleDepthAxis()
double rad2deg(double angle)
double getQ(double wavelength, double angle)
const double wavelength(0.154)