22 void checkIfEmpty(
const std::vector<double>& input);
24 const std::string relative_resolution =
"ScanRelativeResolution";
25 const std::string absolute_resolution =
"ScanAbsoluteResolution";
34 ~ScanSingleRelativeResolution()
override =
default;
38 return new ScanSingleRelativeResolution(*
distribution(), m_reldev);
41 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
42 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
43 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
44 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
46 double delta()
const override {
return m_reldev; }
49 std::string
name()
const override {
return relative_resolution; }
62 ~ScanSingleAbsoluteResolution()
override =
default;
66 return new ScanSingleAbsoluteResolution(*
distribution(), m_stddev);
69 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
70 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
71 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
72 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
74 double delta()
const override {
return m_stddev; }
77 std::string
name()
const override {
return absolute_resolution; }
87 , m_reldev(std::move(reldev))
89 checkIfEmpty(m_reldev);
91 ~ScanVectorRelativeResolution()
override =
default;
95 return new ScanVectorRelativeResolution(*
distribution(), m_reldev);
98 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
99 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
100 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
101 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
103 double delta()
const override {
return 0; }
106 std::string
name()
const override {
return relative_resolution; }
109 std::vector<double> m_reldev;
116 , m_stddev(std::move(stddev))
118 checkIfEmpty(m_stddev);
120 ~ScanVectorAbsoluteResolution()
override =
default;
124 return new ScanVectorAbsoluteResolution(*
distribution(), m_stddev);
127 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
128 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
129 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
130 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
132 double delta()
const override {
return 0; }
135 std::string
name()
const override {
return absolute_resolution; }
138 std::vector<double> m_stddev;
143 ScanEmptyResolution() =
default;
145 ~ScanEmptyResolution()
override =
default;
149 DistrOutput
generateSamples(
double mean,
size_t n_times)
const override;
150 DistrOutput
generateSamples(
const std::vector<double>& mean)
const override;
151 std::vector<double>
stdDevs(
double mean,
size_t n_times)
const override;
152 std::vector<double>
stdDevs(
const std::vector<double>& mean)
const override;
154 double delta()
const override {
return 0; }
157 std::string
name()
const override;
167 return new ScanSingleRelativeResolution(distr, stddev);
171 const std::vector<double>& stddevs)
173 return new ScanVectorRelativeResolution(distr, stddevs);
179 return new ScanSingleAbsoluteResolution(distr, stddev);
183 const std::vector<double>& stddevs)
185 return new ScanVectorAbsoluteResolution(distr, stddevs);
190 return new ScanEmptyResolution();
203 : m_distr(distr.clone())
210 size_t n_times)
const
212 const double stddev = mean * m_reldev;
213 return DistrOutput(n_times, distribution()->generateSamples(mean, stddev));
217 ScanSingleRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
221 result.reserve(mean.size());
222 for (
size_t i = 0, size = mean.size(); i < size; ++i)
223 result.push_back(distribution()->generateSamples(mean[i], mean[i] * m_reldev));
227 std::vector<double> ScanSingleRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
229 return std::vector<double>(n_times, mean * m_reldev);
232 std::vector<double> ScanSingleRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
235 std::vector<double> result;
236 result.reserve(mean.size());
237 for (
size_t i = 0, size = mean.size(); i < size; ++i)
238 result.push_back(mean[i] * m_reldev);
243 size_t n_times)
const
245 return generateSamples(std::vector<double>(n_times, mean));
249 ScanVectorRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
251 const std::vector<double> stddevs = stdDevs(mean);
252 return distribution()->generateSamples(mean, stddevs);
255 std::vector<double> ScanVectorRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
257 return stdDevs(std::vector<double>(n_times, mean));
260 std::vector<double> ScanVectorRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
262 const size_t result_size = mean.size();
263 if (result_size != m_reldev.size())
264 throw std::runtime_error(
265 "Error in ScanVectorRelativeResolution::stdDevs: passed mean values vector "
266 "size shall be of the same size with relative deviations vector");
268 std::vector<double> stddevs(result_size);
269 for (
size_t i = 0; i < result_size; ++i)
270 stddevs[i] = m_reldev[i] * mean[i];
275 size_t n_times)
const
277 return DistrOutput(n_times, distribution()->generateSamples(mean, m_stddev));
281 ScanSingleAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
285 result.reserve(mean.size());
286 for (
size_t i = 0, size = mean.size(); i < size; ++i)
287 result.push_back(distribution()->generateSamples(mean[i], m_stddev));
291 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
double,
size_t n_times)
const
293 return std::vector<double>(n_times, m_stddev);
296 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
299 return std::vector<double>(mean.size(), m_stddev);
303 size_t n_times)
const
305 return generateSamples(std::vector<double>(n_times, mean));
309 ScanVectorAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
311 const size_t result_size = mean.size();
312 if (result_size != m_stddev.size())
313 throw std::runtime_error(
314 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
315 "size shall be of the same size with standard deviations vector");
316 return distribution()->generateSamples(mean, m_stddev);
319 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
double mean,
size_t n_times)
const
321 return stdDevs(std::vector<double>(n_times, mean));
324 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
326 const size_t result_size = mean.size();
327 if (result_size != m_stddev.size())
328 throw std::runtime_error(
329 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
330 "size shall be of the same size with standard deviations vector");
334 ScanEmptyResolution::DistrOutput ScanEmptyResolution::generateSamples(
double mean,
335 size_t n_times)
const
337 return DistrOutput(n_times, std::vector<ParameterSample>{
ParameterSample(mean, 1.)});
340 ScanEmptyResolution::DistrOutput
341 ScanEmptyResolution::generateSamples(
const std::vector<double>& mean)
const
344 result.reserve(mean.size());
345 for (
size_t i = 0, size = mean.size(); i < size; ++i)
350 std::vector<double> ScanEmptyResolution::stdDevs(
double,
size_t n_times)
const
352 return std::vector<double>(n_times, 0.0);
355 std::vector<double> ScanEmptyResolution::stdDevs(
const std::vector<double>& mean)
const
357 return std::vector<double>(mean.size(), 0.0);
360 std::string ScanEmptyResolution::name()
const
362 throw std::runtime_error(
363 "Error in ScanEmptyResolution::name: attempt to get a name of an empty resolution object.");
366 void checkIfEmpty(
const std::vector<double>& input)
369 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. All derived distributions allow for generating sa...
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