BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ParameterDistribution.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Param/Distrib/ParameterDistribution.cpp
6 //! @brief Implements class ParameterDistribution.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
17 
19  const IDistribution1D& distribution,
20  size_t nbr_samples, double sigma_factor,
21  const RealLimits& limits)
22  : m_whichParameter(whichParameter)
23  , m_nbr_samples(nbr_samples)
24  , m_sigma_factor(sigma_factor)
25  , m_limits(limits)
26  , m_xmin(1.0)
27  , m_xmax(-1.0)
28 {
29  m_distribution.reset(distribution.clone());
30  if (m_sigma_factor < 0.0)
31  throw std::runtime_error("ParameterDistribution::ParameterDistribution() -> Error."
32  "sigma factor cannot be negative");
33  if (nbr_samples == 0)
34  throw std::runtime_error("ParameterDistribution::ParameterDistribution() -> Error."
35  "Number of samples can't be zero.");
36 }
37 
39  const IDistribution1D& distribution,
40  size_t nbr_samples, double xmin, double xmax)
41  : m_whichParameter(whichParameter)
42  , m_nbr_samples(nbr_samples)
43  , m_sigma_factor(0.0)
44  , m_xmin(xmin)
45  , m_xmax(xmax)
46 {
47  m_distribution.reset(distribution.clone());
48  if (m_sigma_factor < 0.0)
49  throw std::runtime_error("ParameterDistribution::ParameterDistribution() -> Error."
50  "sigma factor cannot be negative");
51  if (nbr_samples == 0)
52  throw std::runtime_error("ParameterDistribution::ParameterDistribution() -> Error."
53  "Number of samples can't be zero.");
54  if (xmin >= xmax)
55  throw std::runtime_error("ParameterDistribution::ParameterDistribution() -> Error."
56  "xmin>=xmax");
57 }
58 
60  : m_whichParameter(other.m_whichParameter)
61  , m_nbr_samples(other.m_nbr_samples)
62  , m_sigma_factor(other.m_sigma_factor)
63  , m_limits(other.m_limits)
64  , m_xmin(other.m_xmin)
65  , m_xmax(other.m_xmax)
66 {
67  m_distribution.reset(other.m_distribution->clone());
68 }
69 
71 
73 {
74  if (this != &other) {
75  this->m_whichParameter = other.m_whichParameter;
78  m_distribution.reset(other.m_distribution->clone());
79  m_limits = other.m_limits;
80  m_xmin = other.m_xmin;
81  m_xmax = other.m_xmax;
82  }
83  return *this;
84 }
85 
87 {
88  return m_whichParameter;
89 }
90 
92 {
93  switch (whichParameter()) {
95  return "ParameterDistribution.BeamWavelength";
97  return "ParameterDistribution.BeamInclinationAngle";
99  return "ParameterDistribution.BeamAzimuthalAngle";
100  default:
101  throw std::runtime_error("printParameterDistribution(): missing implementation");
102  }
103 }
104 
106 {
107  if (m_distribution && m_distribution->isDelta())
108  return 1;
109  return m_nbr_samples;
110 }
111 
112 std::vector<ParameterSample> ParameterDistribution::generateSamples() const
113 {
114  if (m_xmin < m_xmax)
115  return m_distribution->equidistantSamplesInRange(m_nbr_samples, m_xmin, m_xmax);
116  return m_distribution->equidistantSamples(m_nbr_samples, m_sigma_factor, m_limits);
117 }
118 
120 {
121  return m_distribution.get();
122 }
123 
125 {
126  return m_distribution.get();
127 }
Defines classes representing one-dimensional distributions.
Defines class ParameterDistribution.
Interface for one-dimensional distributions.
Definition: Distributions.h:33
IDistribution1D * clone() const override=0
A parametric distribution function, for use with any model parameter.
std::string whichParameterAsPyEnum() const
ParameterDistribution & operator=(const ParameterDistribution &other)
Overload assignment operator.
WhichParameter whichParameter() const
std::unique_ptr< IDistribution1D > m_distribution
const IDistribution1D * getDistribution() const
std::vector< ParameterSample > generateSamples() const
generate list of sampled values with their weight
size_t nDraws() const
get number of samples for this distribution
virtual ~ParameterDistribution()
ParameterDistribution(WhichParameter whichParameter, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
Limits for a real fit parameter.
Definition: RealLimits.h:24