26 double getQ(
double wavelength,
double angle);
28 double getInvQ(
double wavelength,
double q);
30 std::unique_ptr<PointwiseAxis>
31 createTranslatedAxis(
const IAxis& axis, std::function<
double(
double)> translator, std::string
name);
37 return std::make_unique<UnitConverterConvSpec>(*aScan);
39 if (
const auto* qScan =
dynamic_cast<const QSpecScan*
>(&scan))
40 return std::make_unique<UnitConverterQSpec>(*qScan);
42 throw std::runtime_error(
"Bug in UnitConverter1D::createUnitConverter: invalid case");
54 if (units_type == Axes::Units::NBINS)
65 if (units_type == Axes::Units::NBINS)
66 return static_cast<double>(coordinate_axis->size());
68 return translator(coordinate_axis->binCenter(coordinate_axis->size() - 1));
75 if (units == Axes::Units::NBINS)
81 std::unique_ptr<OutputData<double>>
85 throw std::runtime_error(
"Error in UnitConverter1D::createConvertedData: unexpected "
86 "dimensions of the input data");
90 result->addAxis(*q_axis);
92 if (units != Axes::Units::RQ4) {
97 for (
size_t i = 0, size = result->getAllocatedSize(); i < size; ++i)
98 (*result)[i] = data[i] * std::pow((*q_axis)[i], 4);
104 : m_wavelength(beam.wavelength())
108 throw std::runtime_error(
"Error in UnitConverter1D: input axis range is out of bounds");
112 : m_wavelength(handler.wavelength()), m_axis(handler.coordinateAxis()->clone())
131 return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE,
137 return Axes::Units::DEGREES;
141 : m_wavelength(other.m_wavelength), m_axis(other.m_axis->clone())
147 std::vector<std::map<Axes::Units, std::string>> result;
154 switch (units_type) {
155 case Axes::Units::RADIANS:
156 return [](
double value) {
return value; };
157 case Axes::Units::DEGREES:
159 case Axes::Units::QSPACE:
160 return [
this](
double value) {
return getInvQ(
m_wavelength, value); };
163 {Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE});
169 switch (units_type) {
170 case Axes::Units::RADIANS:
171 return [](
double value) {
return value; };
172 case Axes::Units::DEGREES:
174 case Axes::Units::QSPACE:
175 return [wl =
m_wavelength](
double value) {
return getQ(wl, value); };
176 case Axes::Units::RQ4:
177 return [wl =
m_wavelength](
double value) {
return getQ(wl, value); };
184 : m_axis(handler.coordinateAxis()->clone())
205 return {Axes::Units::NBINS, Axes::Units::QSPACE, Axes::Units::RQ4};
211 return Axes::Units::QSPACE;
215 : m_axis(
std::unique_ptr<
IAxis>(other.coordinateAxis()->clone()))
222 std::vector<std::map<Axes::Units, std::string>> result;
230 switch (units_type) {
231 case Axes::Units::QSPACE:
232 return [](
double value) {
return value; };
233 case Axes::Units::RQ4:
234 return [](
double value) {
return value; };
241 double getQ(
double wavelength,
double angle)
243 return 4.0 *
M_PI * std::sin(angle) / wavelength;
246 double getInvQ(
double wavelength,
double q)
248 double sin_angle = q * wavelength / (4.0 *
M_PI);
249 return std::asin(sin_angle);
252 std::unique_ptr<PointwiseAxis>
253 createTranslatedAxis(
const IAxis& axis, std::function<
double(
double)> translator, std::string
name)
256 for (
size_t i = 0, size = coordinates.size(); i < size; ++i)
257 coordinates[i] = translator(coordinates[i]);
258 return std::make_unique<PointwiseAxis>(
name, coordinates);
Declares AngularSpecScan class.
Defines namespace AxisNames.
Defines M_PI and some more mathematical constants.
Defines and implements templated class OutputData.
Defines class PointwiseAxis.
Declares QSpecScan class.
Defines UnitConverter1D class and derived classes.
Defines some unit conversion factors and other constants in namespace Units.
Scan type with inclination angles as coordinate values and a unique wavelength.
An incident neutron or x-ray beam.
Interface for one-dimensional axes.
virtual std::vector< double > binCenters() const
Abstract base class for all types of specular scans.
Axes::Units substituteDefaultUnits(Axes::Units units) const
void checkIndex(size_t i_axis) const
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
size_t rank() const
Returns number of dimensions.
std::vector< T > getRawDataVector() const
Returns copy of raw data vector.
Scan type with z-components of scattering vector as coordinate values.
static std::unique_ptr< UnitConverter1D > createUnitConverter(const ISpecularScan &handler)
Factory function to create unit converter for particular type of specular data.
size_t dimension() const override
Returns dimensionality of converted canvas.
std::unique_ptr< OutputData< double > > createConvertedData(const OutputData< double > &data, Axes::Units units) const override
Creates OutputData array in converter units.
std::unique_ptr< IAxis > createConvertedAxis(size_t i_axis, Axes::Units units) const override
Creates axis in converted units.
double calculateMax(size_t i_axis, Axes::Units units_type) const override
Calculates maximum on-axis value in given units.
virtual const IAxis * coordinateAxis() const =0
double calculateMin(size_t i_axis, Axes::Units units_type) const override
Calculates minimum on-axis value in given units.
virtual std::function< double(double)> getTraslatorTo(Axes::Units units_type) const =0
Returns translating functional (rads --> output units)
Conversion of axis units for the case of conventional (angle-based) reflectometry.
UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
Constructs the object for unit conversion.
size_t axisSize(size_t i_axis) const override
Returns the size of underlying axis.
double m_wavelength
basic wavelength in nm (for translation to q-space).
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Creates name map for axis in various units.
UnitConverterConvSpec * clone() const override
~UnitConverterConvSpec() override
std::function< double(double)> getTraslatorTo(Axes::Units units_type) const override
Returns translating functional (rads --> desired units)
std::function< double(double)> getTraslatorFrom(Axes::Units units_type) const
Returns translating functional (input units --> rads)
Axes::Units defaultUnits() const override
Returns default units to convert to.
std::unique_ptr< IAxis > m_axis
basic inclination angles (in rads).
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
Conversion of axis units for the case of q-defined reflectometry.
UnitConverterQSpec(const QSpecScan &handler)
std::function< double(double)> getTraslatorTo(Axes::Units units_type) const override
Returns translating functional (inv. nm --> desired units)
~UnitConverterQSpec() override
std::unique_ptr< IAxis > m_axis
qz values (in inv. nm).
std::vector< std::map< Axes::Units, std::string > > createNameMaps() const override
Creates name map for axis in various units.
UnitConverterQSpec * clone() const override
Axes::Units defaultUnits() const override
Returns default units to convert to.
size_t axisSize(size_t i_axis) const override
Returns the size of underlying axis.
std::vector< Axes::Units > availableUnits() const override
Returns the list of all available units.
std::map< Axes::Units, std::string > InitSpecAxisQ()
std::map< Axes::Units, std::string > InitSpecAxis()
QString const & name(EShape k)
double deg2rad(double angle)
double rad2deg(double angle)