BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RealParameter.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Param/Base/RealParameter.cpp
6 //! @brief Implements class RealParameter.
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 
16 #include <sstream>
17 
18 RealParameter::RealParameter(const std::string& name, double* par, const std::string& parent_name,
19  const std::function<void()>& onChange, const RealLimits& limits,
20  const Attributes& attr)
21  : IParameter<double>(name, par, parent_name, onChange), m_limits(limits), m_attr(attr)
22 {
23  if (!m_limits.isInRange(value())) {
24  std::ostringstream message;
25  message << "Cannot initialize parameter " << fullName() << " with value " << value()
26  << ": out of bounds [" << limits << "]\n";
27  throw std::runtime_error(message.str());
28  }
29 }
30 
31 RealParameter* RealParameter::clone(const std::string& new_name) const
32 {
33  auto* ret = new RealParameter(new_name != "" ? new_name : getName(), m_data, m_parent_name,
35  ret->setUnit(unit());
36  return ret;
37 }
38 
39 void RealParameter::setValue(double value)
40 {
41  if (value == *m_data)
42  return; // nothing to do
43 
44  if (isNull())
45  throw std::runtime_error("RealParameter::setValue() -> Error. Non-initialized parameter '"
46  + fullName() + "'");
47 
48  if (!m_limits.isInRange(value)) {
49  std::ostringstream message;
50  message << "Cannot set parameter " << fullName() << " to value " << value
51  << ": out of bounds [" << m_limits << "]\n";
52  throw std::runtime_error(message.str());
53  }
54 
55  if (m_attr.isFixed())
56  throw std::runtime_error("Parameter " + fullName() + " is fixed");
57 
58  *m_data = value;
59  if (m_onChange)
60  m_onChange();
61 }
62 
63 double RealParameter::value() const
64 {
65  return *m_data;
66 }
67 
69 {
70  m_limits = limits;
71  return *this;
72 }
73 
75 {
76  return m_limits;
77 }
78 
79 RealParameter& RealParameter::setLimited(double lower, double upper)
80 {
81  setLimits(RealLimits::limited(lower, upper));
82  return *this;
83 }
84 
86 {
88  return *this;
89 }
90 
92 {
94  return *this;
95 }
96 
97 RealParameter& RealParameter::setUnit(const std::string& name)
98 {
99  if (!(name == "" || name == "nm" || name == "rad" || name == "nm^2"))
100  throw std::runtime_error("RealParameter::setUnit() -> Error. Unexpected unit name " + name);
101 
102  m_unit.setUnit(name);
103  return *this;
104 }
105 
106 std::string RealParameter::unit() const
107 {
108  return m_unit.getName();
109 }
Defines class RealParameter.
Attributes for a fit parameter.
Definition: Attributes.h:24
bool isFixed() const
Definition: Attributes.h:32
Pure virtual base class for parameter wrapper classes RealParameter, ComponentParameter.
Definition: IParameter.h:29
const std::string & getName() const
Definition: IParameter.h:49
virtual bool isNull() const
Returns true if wrapped parameter was not initialized with proper real value.
Definition: IParameter.h:39
const std::function< void()> m_onChange
Definition: IParameter.h:55
const std::string m_parent_name
Definition: IParameter.h:54
std::string fullName() const
For use in error messages.
Definition: IParameter.h:58
Limits for a real fit parameter.
Definition: RealLimits.h:25
static RealLimits positive()
Creates an object which can have only positive values (>0., zero is not included)
Definition: RealLimits.cpp:108
bool isInRange(double value) const
returns true if proposed value is in limits range
Definition: RealLimits.cpp:94
static RealLimits nonnegative()
Creates an object which can have only positive values with 0. included.
Definition: RealLimits.cpp:113
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:123
Wraps a parameter of type double.
Definition: RealParameter.h:32
RealLimits limits() const
RealParameter & setLimits(const RealLimits &limits)
RealParameter * clone(const std::string &new_name="") const
RealParameter & setNonnegative()
Attributes m_attr
Definition: RealParameter.h:60
RealParameter & setLimited(double lower, double upper)
double value() const
Returns value of wrapped parameter.
RealParameter & setPositive()
std::string unit() const
RealParameter(const std::string &name, double *par, const std::string &parent_name="", const std::function< void()> &onChange=std::function< void()>(), const RealLimits &limits=RealLimits::limitless(), const Attributes &attr=Attributes::free())
RealParameter & setUnit(const std::string &name)
RealLimits m_limits
Definition: RealParameter.h:59
void setValue(double value)
Sets value of wrapped parameter and emit signal.
void setUnit(const std::string &name)
Definition: Unit.h:26
const std::string & getName() const
Definition: Unit.h:27