24 : m_qs(std::make_unique<
PointwiseAxis>(
"qs", std::move(qs_nm))),
31 : m_qs(qs_nm.clone()),
38 : m_qs(std::make_unique<
FixedBinAxis>(
"qs", nbins, qz_min, qz_max)),
58 std::vector<SpecularSimulationElement> result;
59 result.reserve(qz.size());
60 for (
size_t i = 0, size = qz.size(); i < size; ++i)
68 throw std::runtime_error(
"Error in QSpecScan::footprint: given index exceeds the "
69 "number of simulation elements");
70 return std::vector<double>(n_elements, 1.0);
82 const size_t axis_size =
m_qs->size();
83 std::vector<double> result(axis_size, 0.0);
88 for (
size_t i = 0; i < axis_size; ++i) {
89 double& current = result[i];
90 for (
size_t j = 0, size = samples[i].size(); j < size; ++j) {
91 current += sim_elements[elem_pos].getIntensity() * samples[i][j].weight;
100 std::stringstream result;
108 result <<
pyfmt::indent() <<
"scan.setQResolution(resolution)";
122 std::unique_ptr<ScanResolution> resolution(
128 const std::vector<double>& rel_dev)
130 std::unique_ptr<ScanResolution> resolution(
137 std::unique_ptr<ScanResolution> resolution(
143 const std::vector<double>& std_dev)
145 std::unique_ptr<ScanResolution> resolution(
152 std::vector<double> axis_values =
m_qs->getBinCenters();
153 if (!std::is_sorted(axis_values.begin(), axis_values.end()))
154 throw std::runtime_error(
"Error in QSpecScan::checkInitialization: q-vector values shall "
155 "be sorted in ascending order.");
157 if (axis_values.front() < 0)
158 throw std::runtime_error(
"Error in QSpecScan::checkInitialization: q-vector values are out "
159 "of acceptable range.");
166 std::vector<double> result;
168 for (
size_t i = 0, size_out = samples.size(); i < size_out; ++i)
169 for (
size_t j = 0, size_in = samples[i].size(); j < size_in; ++j)
170 result.push_back(samples[i][j].value);
Defines class FixedBinAxis.
Defines class PointwiseAxis.
Defines functions in namespace pyfmt.
Declares QSpecScan class.
Defines classes representing ranged one-dimensional distributions.
Defines scan resolution class.
Declares the class SpecularSimulationElement.
Axis with fixed bin size.
Interface for one-dimensional axes.
virtual std::string pyString(const std::string &units, size_t offset) const =0
Axis containing arbitrary (non-equidistant) coordinate values.
Scan type with z-components of scattering vector as coordinate values.
void setRelativeQResolution(const RangedDistribution &distr, double rel_dev)
size_t numberOfSimulationElements() const override
Returns the number of simulation elements.
void setAbsoluteQResolution(const RangedDistribution &distr, double std_dev)
QSpecScan * clone() const override
std::unique_ptr< IAxis > m_qs
std::vector< double > footprint(size_t i, size_t n_elements) const override
Returns footprint correction factor for a range of simulation elements of size n_elements and startin...
virtual const IAxis * coordinateAxis() const override
Returns coordinate axis assigned to the data holder.
std::vector< std::vector< ParameterSample > > m_q_res_cache
std::vector< double > createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
Returns intensity vector corresponding to convolution of given simulation elements.
QSpecScan(std::vector< double > qs_nm)
Accepts qz-value vector (in inverse nm)
std::string print() const override
Print scan definition in python format.
std::unique_ptr< ScanResolution > m_resolution
std::vector< SpecularSimulationElement > generateSimulationElements() const override
Generates simulation elements for specular simulations.
void setQResolution(const ScanResolution &resolution)
Sets q resolution values via ScanResolution object.
void checkInitialization()
std::vector< double > generateQzVector() const
std::vector< std::vector< ParameterSample > > applyQResolution() const
Interface for one-dimensional ranged distributions.
Container for reflectivity resolution data.
static ScanResolution * scanRelativeResolution(const RangedDistribution &distr, double stddev)
ScanResolution * clone() const override=0
static ScanResolution * scanAbsoluteResolution(const RangedDistribution &distr, double stddev)
Data stucture containing both input and output of a single image pixel for specular simulation.
std::string indent(size_t width)
Returns a string of blanks with given width.