29 double getQ(
double wavelength,
double angle)
31 return 4.0 *
M_PI * std::sin(angle) / wavelength;
40 : m_wavelength(beam.wavelength())
41 , m_alpha_i(-beam.direction().alpha())
42 , m_phi_i(beam.direction().phi())
54 AxisData axis_data{
name, min, max, default_units, nbins};
63 if (units_type == Axes::Units::NBINS)
73 if (units_type == Axes::Units::NBINS)
74 return static_cast<double>(axis_data.nbins);
86 return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES};
94 const auto& axis_name =
axisName(i_axis, units);
95 const auto axis_size =
axisSize(i_axis);
96 return std::make_unique<FixedBinAxis>(axis_name, axis_size, min, max);
100 : m_axis_data_table(other.m_axis_data_table)
101 , m_wavelength(other.m_wavelength)
102 , m_alpha_i(other.m_alpha_i)
103 , m_phi_i(other.m_phi_i)
109 const auto& axis = detector.
axis(i_axis);
111 const auto& axis_name =
axisName(i_axis);
116 auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis);
129 throw std::runtime_error(
"Error in SphericalConverter constructor: "
130 "detector has wrong dimension: "
131 + std::to_string(
static_cast<int>(detector.
dimension())));
146 result.push_back(Axes::Units::QSPACE);
152 return Axes::Units::DEGREES;
161 switch (units_type) {
162 case Axes::Units::RADIANS:
164 case Axes::Units::DEGREES:
166 case Axes::Units::QSPACE: {
170 return (k_i - k_f).y();
171 }
else if (i_axis == 1) {
173 return (k_f - k_i).z();
175 throw std::runtime_error(
"Error in SphericalConverter::calculateValue: "
176 "incorrect axis index: "
177 + std::to_string(
static_cast<int>(i_axis)));
179 case Axes::Units::QXQY: {
183 return (k_i - k_f).y();
184 }
else if (i_axis == 1) {
186 return (k_f - k_i).x();
188 throw std::runtime_error(
"Error in SphericalConverter::calculateValue: "
189 "incorrect axis index: "
190 + std::to_string(
static_cast<int>(i_axis)));
199 std::vector<std::map<Axes::Units, std::string>> result;
213 throw std::runtime_error(
"Error in RectangularConverter constructor: "
214 "detector has wrong dimension: "
215 + std::to_string(
static_cast<int>(detector.
dimension())));
231 result.push_back(Axes::Units::QSPACE);
232 result.push_back(Axes::Units::MM);
238 return Axes::Units::MM;
249 if (units_type == Axes::Units::MM)
254 const auto& max_pos = i_axis == 0 ? k10 : k01;
257 switch (units_type) {
258 case Axes::Units::RADIANS:
260 case Axes::Units::DEGREES:
262 case Axes::Units::QSPACE: {
265 return (k_i - k_f).y();
267 return (k_f - k_i).z();
268 throw std::runtime_error(
"Error in RectangularConverter::calculateValue: "
269 "incorrect axis index: "
270 + std::to_string(
static_cast<int>(i_axis)));
272 case Axes::Units::QXQY: {
275 return (k_i - k_f).y();
277 return (k_f - k_i).x();
278 throw std::runtime_error(
"Error in RectangularConverter::calculateValue: "
279 "incorrect axis index: "
280 + std::to_string(
static_cast<int>(i_axis)));
289 std::vector<std::map<Axes::Units, std::string>> result;
298 throw std::runtime_error(
"Error in RectangularConverter::normalizeToWavelength: "
301 return vector.
unit() * K;
310 throw std::runtime_error(
"Error in RectangularConverter::axisAngle: "
311 "incorrect axis index: "
312 + std::to_string(
static_cast<int>(i_axis)));
320 const IAxis& alpha_axis)
324 throw std::runtime_error(
"Error in OffSpecularConverter constructor: "
325 "detector has wrong dimension: "
326 + std::to_string(
static_cast<int>(detector.
dimension())));
341 return Axes::Units::DEGREES;
351 switch (units_type) {
352 case Axes::Units::RADIANS:
354 case Axes::Units::DEGREES:
363 std::vector<std::map<Axes::Units, std::string>> result;
371 const auto& axis = detector.
axis(1);
373 const auto& axis_name =
axisName(1);
374 std::unique_ptr<IAxis> P_new_axis;
376 P_new_axis = p_roi->clipAxisToRoi(1, axis);
378 P_new_axis.reset(axis.clone());
381 throw std::runtime_error(
"Error in OffSpecularConverter::addDetectorYAxis: "
382 "could not retrieve the y-axis of the detector");
384 std::unique_ptr<RectangularPixel> P_det_pixel(P_rect_det->regionOfInterestPixel());
385 const auto k00 = P_det_pixel->getPosition(0.0, 0.0);
386 const auto k01 = P_det_pixel->getPosition(0.0, 1.0);
387 const double alpha_f_min =
M_PI_2 - k00.theta();
388 const double alpha_f_max =
M_PI_2 - k01.theta();
391 const double alpha_f_min = P_new_axis->lowerBound();
392 const double alpha_f_max = P_new_axis->upperBound();
395 throw std::runtime_error(
"Error in OffSpecularConverter::addDetectorYAxis: "
396 "wrong detector type");
410 const auto& alpha_axis_name =
axisName(0);
428 result.push_back(Axes::Units::QSPACE);
443 switch (units_type) {
444 case Axes::Units::DEGREES:
446 case Axes::Units::QSPACE:
455 std::vector<std::map<Axes::Units, std::string>> result;
464 if (std::find(available_units.begin(), available_units.end(), units_type)
465 == available_units.cend())
Defines namespace AxisNames.
Defines M_PI and some more mathematical constants.
kvector_t vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)
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.
An incident neutron or x-ray beam.
DepthProbeConverter class handles the unit translations for depth probe simulations Its default units...
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
DepthProbeConverter(const Beam &beam, const IAxis &alpha_axis, const IAxis &z_axis)
~DepthProbeConverter() override
double calculateValue(size_t, Axes::Units units_type, double value) const override
void checkUnits(Axes::Units units_type) const
Axes::Units defaultUnits() const override
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
DepthProbeConverter * clone() const override
Interface for one-dimensional axes.
virtual double upperBound() const =0
Returns value of last point of axis.
virtual size_t size() const =0
retrieve the number of bins
virtual double lowerBound() const =0
Returns value of first 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 & axis(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)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
OffSpecularConverter * clone() const override
Axes::Units defaultUnits() const override
~OffSpecularConverter() override
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
void addDetectorYAxis(const IDetector2D &detector)
IUnitConverter class that handles the unit translations for rectangular detectors Its default units a...
kvector_t normalizeToWavelength(kvector_t vector) const
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
RectangularConverter(const RectangularDetector &detector, const Beam &beam)
~RectangularConverter() override
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
double axisAngle(size_t i_axis, kvector_t k_f) const
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Axes::Units defaultUnits() const override
RectangularConverter * clone() const override
std::unique_ptr< RectangularPixel > m_detector_pixel
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...
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
~SphericalConverter() override
double calculateValue(size_t i_axis, Axes::Units units_type, double value) const override
SphericalConverter(const SphericalDetector &detector, const Beam &beam)
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
SphericalConverter * clone() const override
Axes::Units defaultUnits() const override
A detector with coordinate axes along angles phi and alpha.
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 override
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 override
double calculateMin(size_t i_axis, Axes::Units units_type) const override
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const override
virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const =0
virtual size_t dimension() const override
UnitConverterSimple(const Beam &beam)
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
std::map< Axes::Units, std::string > InitOffSpecularAxis1()
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 > InitSphericalAxis1()
std::map< Axes::Units, std::string > InitSpecAxis()
std::map< Axes::Units, std::string > InitOffSpecularAxis0()
std::map< Axes::Units, std::string > InitSampleDepthAxis()
QString const & name(EShape k)
double rad2deg(double angle)