35 , m_scan(scan.clone())
39 throw std::runtime_error(
"Invalid scan: minimum value on coordinate axis is negative");
48 return m_scan->numberOfElements();
60 return m_scan->coordinateAxis()->size();
66 return m_scan->createCoordSystem();
80 size_t start,
size_t n_elements)
83 const auto& begin =
m_eles.begin() +
static_cast<long>(start);
84 return std::make_unique<SpecularComputation>(re_sample,
options(),
progress(), begin,
85 begin +
static_cast<long>(n_elements));
107 std::vector<double> footprints =
m_scan->footprint(start_ind, n_elements);
109 for (
size_t i = start_ind, k = 0; i < start_ind + n_elements; ++i, ++k) {
110 auto& element =
m_eles[i];
111 element.setIntensity(element.intensity() * footprints[k]);
119 for (
size_t i = start_ind, stop_point = start_ind + n_elements; i < stop_point; ++i) {
120 auto& element =
m_eles[i];
121 element.setIntensity(
background()->addBackground(element.intensity()));
128 for (
size_t i = 0, size =
m_eles.size(); i < size; ++i)
135 for (
size_t i = 0, size =
m_eles.size(); i < size; ++i)
142 return m_scan->polarized();
Declares AlphaScan class.
Defines the macro ASSERT.
#define ASSERT(condition)
Defines CoordSystem1D class and derived classes.
Defines and implements templated class Datafield.
Defines classes representing one-dimensional distributions.
Defines interface IBackground.
Defines class PointwiseAxis.
Defines class SimulationResult.
Defines class SpecularComputation.
Declares the class SpecularElement.
Defines class SpecularSimulation.
Stores radiation power per bin.
virtual double min() const =0
Returns value of first point of axis.
Interface to provide axis translations to different units for simulation output.
virtual double mean() const =0
Returns the distribution-specific mean.
Abstract base class, holds the infrastructure to run a simulation.
ProgressHandler & progress()
const IBackground * background() const
const SimulationOptions & options() const
Abstract base class for all types of specular scans.
virtual const IAxis * coordinateAxis() const =0
Returns coordinate axis assigned to the data holder.
Our sample model: a stack of layers one below the other.
A parametric distribution function, for use with any model parameter.
const IDistribution1D * getDistribution() const
Wrapper around Datafield that also provides unit conversions.
Specular reflectometry simulation.
SimulationResult pack_result() override
Sets m_result.
void initElementVector() override
Initializes the vector of ISimulation elements.
std::vector< double > m_cache
bool force_polarized() const override
Force polarized computation even in absence of sample magnetization or external fields.
void addDataToCache(double weight) override
ICoordSystem * createCoordSystem() const override
std::unique_ptr< IComputation > createComputation(const reSample &re_sample, size_t start, size_t n_elements) override
Generate a single threaded computation for a given range of simulation elements.
const ISpecularScan * scan() const
Returns internal data handler.
size_t intensityMapSize() const override
Returns the total number of the intensity values in the simulation result.
~SpecularSimulation() override
std::unique_ptr< const ISpecularScan > m_scan
void addBackgroundIntensity(size_t start_ind, size_t n_elements) override
void moveDataFromCache() override
void validateParametrization(const ParameterDistribution &par_distr) const override
Checks the distribution validity for simulation.
std::vector< SpecularElement > m_eles
void normalize(size_t start_ind, size_t n_elements) override
Normalize the detector counts to beam intensity, to solid angle, and to exposure angle.
SpecularSimulation(const ISpecularScan &scan, const MultiLayer &sample)
size_t numberOfElements() const override
Gets the number of elements this simulation needs to calculate.
Data structure that contains all the necessary data for scattering calculations.