21 void checkIfEmpty(
const std::vector<double>& input);
22 std::string printDeltas(
const std::vector<double>& deltas);
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;
47 std::string name()
const override {
return relative_resolution; }
48 std::string printStdDevs()
const override {
return pyfmt::printDouble(m_reldev); }
61 ~ScanSingleAbsoluteResolution()
override =
default;
65 return new ScanSingleAbsoluteResolution(*distribution(), m_stddev);
68 DistrOutput generateSamples(
double mean,
size_t n_times)
const override;
69 DistrOutput generateSamples(
const std::vector<double>& mean)
const override;
70 std::vector<double> stdDevs(
double mean,
size_t n_times)
const override;
71 std::vector<double> stdDevs(
const std::vector<double>& mean)
const override;
74 std::string name()
const override {
return absolute_resolution; }
75 std::string printStdDevs()
const override {
return pyfmt::printDouble(m_stddev); }
84 ScanVectorRelativeResolution(
const RangedDistribution& distr,
const std::vector<double>& reldev)
87 checkIfEmpty(m_reldev);
89 ~ScanVectorRelativeResolution()
override =
default;
93 return new ScanVectorRelativeResolution(*distribution(), m_reldev);
96 DistrOutput generateSamples(
double mean,
size_t n_times)
const override;
97 DistrOutput generateSamples(
const std::vector<double>& mean)
const override;
98 std::vector<double> stdDevs(
double mean,
size_t n_times)
const override;
99 std::vector<double> stdDevs(
const std::vector<double>& mean)
const override;
102 std::string name()
const override {
return relative_resolution; }
103 std::string printStdDevs()
const override {
return printDeltas(m_reldev); }
106 std::vector<double> m_reldev;
112 ScanVectorAbsoluteResolution(
const RangedDistribution& distr,
const std::vector<double>& stddev)
115 checkIfEmpty(m_stddev);
117 ~ScanVectorAbsoluteResolution()
override =
default;
121 return new ScanVectorAbsoluteResolution(*distribution(), m_stddev);
124 DistrOutput generateSamples(
double mean,
size_t n_times)
const override;
125 DistrOutput generateSamples(
const std::vector<double>& mean)
const override;
126 std::vector<double> stdDevs(
double mean,
size_t n_times)
const override;
127 std::vector<double> stdDevs(
const std::vector<double>& mean)
const override;
130 std::string name()
const override {
return absolute_resolution; }
131 std::string printStdDevs()
const override {
return printDeltas(m_stddev); }
134 std::vector<double> m_stddev;
142 ~ScanEmptyResolution()
override =
default;
144 ScanResolution* clone()
const override {
return new ScanEmptyResolution(); }
146 DistrOutput generateSamples(
double mean,
size_t n_times)
const override;
147 DistrOutput generateSamples(
const std::vector<double>& mean)
const override;
148 std::vector<double> stdDevs(
double mean,
size_t n_times)
const override;
149 std::vector<double> stdDevs(
const std::vector<double>& mean)
const override;
152 std::string name()
const override;
153 std::string printStdDevs()
const override;
157 ScanResolution::~ScanResolution() =
default;
162 return new ScanSingleRelativeResolution(distr, stddev);
166 const std::vector<double>& stddevs)
168 return new ScanVectorRelativeResolution(distr, stddevs);
174 return new ScanSingleAbsoluteResolution(distr, stddev);
178 const std::vector<double>& stddevs)
180 return new ScanVectorAbsoluteResolution(distr, stddevs);
185 return new ScanEmptyResolution();
188 size_t ScanResolution::nSamples()
const
191 return m_distr->nSamples();
197 std::stringstream result;
198 result << *m_distr <<
"\n";
200 result <<
"ba." << name();
204 result << printStdDevs();
209 ScanResolution::ScanResolution() =
default;
211 ScanResolution::ScanResolution(
const RangedDistribution& distr) : m_distr(distr.clone()) {}
215 ScanResolution::DistrOutput ScanSingleRelativeResolution::generateSamples(
double mean,
216 size_t n_times)
const
218 const double stddev = mean * m_reldev;
219 return DistrOutput(n_times, distribution()->generateSamples(mean, stddev));
222 ScanResolution::DistrOutput
223 ScanSingleRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
227 result.reserve(mean.size());
228 for (
size_t i = 0, size = mean.size(); i < size; ++i)
229 result.push_back(distribution()->generateSamples(mean[i], mean[i] * m_reldev));
233 std::vector<double> ScanSingleRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
235 return std::vector<double>(n_times, mean * m_reldev);
238 std::vector<double> ScanSingleRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
241 std::vector<double> result;
242 result.reserve(mean.size());
243 for (
size_t i = 0, size = mean.size(); i < size; ++i)
244 result.push_back(mean[i] * m_reldev);
248 ScanResolution::DistrOutput ScanVectorRelativeResolution::generateSamples(
double mean,
249 size_t n_times)
const
251 return generateSamples(std::vector<double>(n_times, mean));
254 ScanResolution::DistrOutput
255 ScanVectorRelativeResolution::generateSamples(
const std::vector<double>& mean)
const
257 const std::vector<double> stddevs = stdDevs(mean);
258 return distribution()->generateSamples(mean, stddevs);
261 std::vector<double> ScanVectorRelativeResolution::stdDevs(
double mean,
size_t n_times)
const
263 return stdDevs(std::vector<double>(n_times, mean));
266 std::vector<double> ScanVectorRelativeResolution::stdDevs(
const std::vector<double>& mean)
const
268 const size_t result_size = mean.size();
269 if (result_size != m_reldev.size())
270 throw std::runtime_error(
271 "Error in ScanVectorRelativeResolution::stdDevs: passed mean values vector "
272 "size shall be of the same size with relative deviations vector");
274 std::vector<double> stddevs(result_size);
275 for (
size_t i = 0; i < result_size; ++i)
276 stddevs[i] = m_reldev[i] * mean[i];
280 ScanResolution::DistrOutput ScanSingleAbsoluteResolution::generateSamples(
double mean,
281 size_t n_times)
const
283 return DistrOutput(n_times, distribution()->generateSamples(mean, m_stddev));
286 ScanResolution::DistrOutput
287 ScanSingleAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
291 result.reserve(mean.size());
292 for (
size_t i = 0, size = mean.size(); i < size; ++i)
293 result.push_back(distribution()->generateSamples(mean[i], m_stddev));
297 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
double,
size_t n_times)
const
299 return std::vector<double>(n_times, m_stddev);
302 std::vector<double> ScanSingleAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
305 return std::vector<double>(mean.size(), m_stddev);
308 ScanResolution::DistrOutput ScanVectorAbsoluteResolution::generateSamples(
double mean,
309 size_t n_times)
const
311 return generateSamples(std::vector<double>(n_times, mean));
314 ScanResolution::DistrOutput
315 ScanVectorAbsoluteResolution::generateSamples(
const std::vector<double>& mean)
const
317 const size_t result_size = mean.size();
318 if (result_size != m_stddev.size())
319 throw std::runtime_error(
320 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
321 "size shall be of the same size with standard deviations vector");
322 return distribution()->generateSamples(mean, m_stddev);
325 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
double mean,
size_t n_times)
const
327 return stdDevs(std::vector<double>(n_times, mean));
330 std::vector<double> ScanVectorAbsoluteResolution::stdDevs(
const std::vector<double>& mean)
const
332 const size_t result_size = mean.size();
333 if (result_size != m_stddev.size())
334 throw std::runtime_error(
335 "Error in ScanVectorAbsoluteResolution::generateSamples: passed mean values vector "
336 "size shall be of the same size with standard deviations vector");
340 ScanEmptyResolution::DistrOutput ScanEmptyResolution::generateSamples(
double mean,
341 size_t n_times)
const
343 return DistrOutput(n_times, std::vector<ParameterSample>{
ParameterSample(mean, 1.)});
346 ScanEmptyResolution::DistrOutput
347 ScanEmptyResolution::generateSamples(
const std::vector<double>& mean)
const
350 result.reserve(mean.size());
351 for (
size_t i = 0, size = mean.size(); i < size; ++i)
356 std::vector<double> ScanEmptyResolution::stdDevs(
double,
size_t n_times)
const
358 return std::vector<double>(n_times, 0.0);
361 std::vector<double> ScanEmptyResolution::stdDevs(
const std::vector<double>& mean)
const
363 return std::vector<double>(mean.size(), 0.0);
366 std::string ScanEmptyResolution::name()
const
368 throw std::runtime_error(
369 "Error in ScanEmptyResolution::name: attempt to get a name of an empty resolution object.");
372 std::string ScanEmptyResolution::printStdDevs()
const
374 throw std::runtime_error(
"Error in ScanEmptyResolution::printStdDevs: attempt to print data "
375 "from empty resolution object.");
378 std::string printDeltas(
const std::vector<double>&)
380 throw std::runtime_error(
"Error in printDeltas: function is not implemented");
383 void checkIfEmpty(
const std::vector<double>& input)
386 throw std::runtime_error(
"Error in ScanResolution: passed vector is empty");
Defines functions in namespace pyfmt.
Defines classes representing ranged one-dimensional distributions.
Defines scan resolution class.
A parameter value with a weight, as obtained when sampling from a distribution.
Interface for one-dimensional ranged distributions.
Container for reflectivity resolution data.
std::string print() const
Prints object definition in python format.
std::string indent(size_t width)
Returns a string of blanks with given width.