19 void checkIfEmpty(
const std::vector<double>& input);
21 const std::string relative_resolution =
"ScanRelativeResolution";
22 const std::string absolute_resolution =
"ScanAbsoluteResolution";
30 ~ScanSingleRelativeResolution()
override =
default;
34 return new ScanSingleRelativeResolution(*
distribution(), m_reldev);
37 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
38 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
39 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
40 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
42 double delta()
const override {
return m_reldev; }
45 std::string
name()
const override {
return relative_resolution; }
57 ~ScanSingleAbsoluteResolution()
override =
default;
61 return new ScanSingleAbsoluteResolution(*
distribution(), m_stddev);
64 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
65 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
66 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
67 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
69 double delta()
const override {
return m_stddev; }
72 std::string
name()
const override {
return absolute_resolution; }
81 const std::vector<double>& reldev)
84 checkIfEmpty(m_reldev);
86 ~ScanVectorRelativeResolution()
override =
default;
90 return new ScanVectorRelativeResolution(*
distribution(), m_reldev);
93 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
94 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
95 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
96 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
98 double delta()
const override {
return 0; }
101 std::string
name()
const override {
return relative_resolution; }
104 std::vector<double> m_reldev;
110 const std::vector<double>& stddev)
113 checkIfEmpty(m_stddev);
115 ~ScanVectorAbsoluteResolution()
override =
default;
119 return new ScanVectorAbsoluteResolution(*
distribution(), m_stddev);
122 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
123 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
124 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
125 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
127 double delta()
const override {
return 0; }
130 std::string
name()
const override {
return absolute_resolution; }
133 std::vector<double> m_stddev;
140 ~ScanEmptyResolution()
override =
default;
144 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
145 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
146 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
147 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
149 double delta()
const override {
return 0; }
152 std::string
name()
const override;
161 return new ScanSingleRelativeResolution(distr, stddev);
165 const std::vector<double>& stddevs)
167 return new ScanVectorRelativeResolution(distr, stddevs);
173 return new ScanSingleAbsoluteResolution(distr, stddev);
177 const std::vector<double>& stddevs)
179 return new ScanVectorAbsoluteResolution(distr, stddevs);
184 return new ScanEmptyResolution();
200 size_t n_times)
const
202 const double stddev = mean * m_reldev;
203 return DistrOutput(n_times, distribution()->generateSamples(mean, stddev));
207 ScanSingleRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
211 result.reserve(mean.size());
212 for (
size_t i = 0, size = mean.size(); i < size; ++i)
213 result.push_back(distribution()->generateSamples(mean[i], mean[i] * m_reldev));
217 std::vector<double> ScanSingleRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
219 return std::vector<double>(n_times, mean * m_reldev);
222 std::vector<double> ScanSingleRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
225 std::vector<double> result;
226 result.reserve(mean.size());
227 for (
size_t i = 0, size = mean.size(); i < size; ++i)
228 result.push_back(mean[i] * m_reldev);
233 size_t n_times)
const
235 return generateSamples(std::vector<double>(n_times, mean));
239 ScanVectorRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
241 const std::vector<double> stddevs = stdDevs(mean);
242 return distribution()->generateSamples(mean, stddevs);
245 std::vector<double> ScanVectorRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
247 return stdDevs(std::vector<double>(n_times, mean));
250 std::vector<double> ScanVectorRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
252 const size_t result_size = mean.size();
253 if (result_size != m_reldev.size())
254 throw std::runtime_error(
255 "Error in ScanVectorRelativeResolution::stdDevs: passed mean values vector "
256 "size shall be of the same size with relative deviations vector");
258 std::vector<double> stddevs(result_size);
259 for (
size_t i = 0; i < result_size; ++i)
260 stddevs[i] = m_reldev[i] * mean[i];
265 size_t n_times)
const
267 return DistrOutput(n_times, distribution()->generateSamples(mean, m_stddev));
271 ScanSingleAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
275 result.reserve(mean.size());
276 for (
size_t i = 0, size = mean.size(); i < size; ++i)
277 result.push_back(distribution()->generateSamples(mean[i], m_stddev));
281 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
double,
size_t n_times)
const
283 return std::vector<double>(n_times, m_stddev);
286 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
289 return std::vector<double>(mean.size(), m_stddev);
293 size_t n_times)
const
295 return generateSamples(std::vector<double>(n_times, mean));
299 ScanVectorAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
301 const size_t result_size = mean.size();
302 if (result_size != m_stddev.size())
303 throw std::runtime_error(
304 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
305 "size shall be of the same size with standard deviations vector");
306 return distribution()->generateSamples(mean, m_stddev);
309 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
double mean,
size_t n_times)
const
311 return stdDevs(std::vector<double>(n_times, mean));
314 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
316 const size_t result_size = mean.size();
317 if (result_size != m_stddev.size())
318 throw std::runtime_error(
319 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
320 "size shall be of the same size with standard deviations vector");
324 ScanEmptyResolution::DistrOutput ScanEmptyResolution::generateSamples(
double mean,
325 size_t n_times)
const
327 return DistrOutput(n_times, std::vector<ParameterSample>{
ParameterSample(mean, 1.)});
330 ScanEmptyResolution::DistrOutput
331 ScanEmptyResolution::generateSamples(
const std::vector<double>& mean)
const
334 result.reserve(mean.size());
335 for (
size_t i = 0, size = mean.size(); i < size; ++i)
340 std::vector<double> ScanEmptyResolution::stdDevs(
double,
size_t n_times)
const
342 return std::vector<double>(n_times, 0.0);
345 std::vector<double> ScanEmptyResolution::stdDevs(
const std::vector<double>& mean)
const
347 return std::vector<double>(mean.size(), 0.0);
352 throw std::runtime_error(
353 "Error in ScanEmptyResolution::name: attempt to get a name of an empty resolution object.");
356 void checkIfEmpty(
const std::vector<double>& input)
359 throw std::runtime_error(
"Error in ScanResolution: passed vector is empty");
Defines classes representing ranged one-dimensional distributions.
Defines scan resolution class.
Interface for one-dimensional ranged distributions.
A parameter value with a weight, as obtained when sampling from a distribution.
Container for reflectivity resolution data.
static ScanResolution * scanAbsoluteResolution(const IRangedDistribution &distr, double stddev)
virtual double delta() const =0
std::vector< std::vector< ParameterSample > > DistrOutput
std::unique_ptr< IRangedDistribution > m_distr
basic distribution function
ScanResolution * clone() const override=0
~ScanResolution() override
static ScanResolution * scanEmptyResolution()
virtual std::string name() const =0
static ScanResolution * scanRelativeResolution(const IRangedDistribution &distr, double stddev)
const IRangedDistribution * distribution() const
virtual std::vector< double > stdDevs(double mean, size_t n_times) const =0
virtual DistrOutput generateSamples(double mean, size_t n_times) const =0
QString const & name(EShape k)