24     : m_qs(std::make_unique<
PointwiseAxis>(
"qs", std::move(qs_nm))),
 
   27     checkInitialization();
 
   31     : m_qs(qs_nm.clone()),
 
   34     checkInitialization();
 
   38     : m_qs(std::make_unique<
FixedBinAxis>(
"qs", nbins, qz_min, qz_max)),
 
   41     checkInitialization();
 
   44 QSpecScan::~QSpecScan() = 
default;
 
   49     result->setQResolution(*m_resolution);
 
   56     const std::vector<double> qz = generateQzVector();
 
   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);
 
   76     return m_qs->size() * m_resolution->nSamples();
 
   82     const size_t axis_size = m_qs->size();
 
   83     std::vector<double> result(axis_size, 0.0);
 
   85     const auto samples = applyQResolution();
 
   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;
 
  102     result << axis_def << 
coordinateAxis()->pyString(
"", axis_def.size()) << 
"\n";
 
  105     if (!m_resolution->empty()) {
 
  107         result << *m_resolution << 
"\n";
 
  108         result << 
pyfmt::indent() << 
"scan.setQResolution(resolution)";
 
  115     m_resolution.reset(resolution.clone());
 
  116     m_q_res_cache.clear();
 
  117     m_q_res_cache.shrink_to_fit();
 
  120 void QSpecScan::setRelativeQResolution(
const RangedDistribution& distr, 
double rel_dev)
 
  122     std::unique_ptr<ScanResolution> resolution(
 
  123         ScanResolution::scanRelativeResolution(distr, rel_dev));
 
  128                                        const std::vector<double>& rel_dev)
 
  130     std::unique_ptr<ScanResolution> resolution(
 
  131         ScanResolution::scanRelativeResolution(distr, rel_dev));
 
  135 void QSpecScan::setAbsoluteQResolution(
const RangedDistribution& distr, 
double std_dev)
 
  137     std::unique_ptr<ScanResolution> resolution(
 
  138         ScanResolution::scanAbsoluteResolution(distr, std_dev));
 
  143                                        const std::vector<double>& std_dev)
 
  145     std::unique_ptr<ScanResolution> resolution(
 
  146         ScanResolution::scanAbsoluteResolution(distr, std_dev));
 
  150 void QSpecScan::checkInitialization()
 
  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.");
 
  162 std::vector<double> QSpecScan::generateQzVector()
 const 
  164     const auto samples = applyQResolution();
 
  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);
 
  174 std::vector<std::vector<ParameterSample>> QSpecScan::applyQResolution()
 const 
  176     if (m_q_res_cache.empty())
 
  177         m_q_res_cache = m_resolution->generateSamples(m_qs->getBinCenters());
 
  178     return m_q_res_cache;
 
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.
 
Axis containing arbitrary (non-equidistant) coordinate values.
 
Scan type with z-components of scattering vector as coordinate values.
 
size_t numberOfSimulationElements() const override
Returns the number of simulation elements.
 
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< 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::vector< SpecularSimulationElement > generateSimulationElements() const override
Generates simulation elements for specular simulations.
 
void setQResolution(const ScanResolution &resolution)
Sets q resolution values via ScanResolution object.
 
Interface for one-dimensional ranged distributions.
 
Container for reflectivity resolution data.
 
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.