Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JGauss.hh
Go to the documentation of this file.
1 #ifndef __JMATH__JGAUSS__
2 #define __JMATH__JGAUSS__
3 
4 #include <istream>
5 #include <ostream>
6 #include <iomanip>
7 #include <cmath>
8 #include <limits>
9 
10 #include "JTools/JConstants.hh"
11 #include "JLang/JEquals.hh"
12 #include "JMath/JMath.hh"
13 #include "Jeep/JPrint.hh"
14 
15 /**
16  * \author mdejong
17  */
18 
19 namespace JMATH {}
20 namespace JPP { using namespace JMATH; }
21 
22 namespace JMATH {
23 
24  using JLANG::JEquals;
25  using JTOOLS::PI;
26 
27  /**
28  * Gauss model.
29  */
30  struct JGauss_t :
31  public JMath<JGauss_t>,
32  public JLANG::JEquals<JGauss_t>
33  {
34  /**
35  * Default constructor.
36  */
38  mean (0.0),
39  sigma (0.0),
40  signal (0.0),
41  background(0.0)
42  {}
43 
44 
45  /**
46  * Constructor.
47  *
48  * \param mean mean
49  * \param sigma sigma
50  * \param signal signal
51  * \param background background
52  */
53  JGauss_t(const double mean,
54  const double sigma,
55  const double signal,
56  const double background) :
57  mean (mean),
58  sigma (sigma),
59  signal (signal),
60  background(background)
61  {}
62 
63 
64  /**
65  * Equality.
66  *
67  * \param gauss gauss
68  * \param eps numerical precision
69  * \return true if gauss's identical; else false
70  */
71  bool equals(const JGauss_t& gauss,
72  const double eps = std::numeric_limits<double>::min()) const
73  {
74  return (fabs(mean - gauss.mean) <= eps &&
75  fabs(sigma - gauss.sigma) <= eps &&
76  fabs(signal - gauss.signal) <= eps &&
77  fabs(background - gauss.background) <= eps);
78  }
79 
80 
81  /**
82  * Add gauss.
83  *
84  * \param gauss gauss
85  * \return this gauss
86  */
87  JGauss_t& add(const JGauss_t& gauss)
88  {
89  mean += gauss.mean;
90  sigma += gauss.sigma;
91  signal += gauss.signal;
92  background += gauss.background;
93 
94  return *this;
95  }
96 
97 
98  /**
99  * Subtract gauss.
100  *
101  * \param gauss gauss
102  * \return this gauss
103  */
104  JGauss_t& sub(const JGauss_t& gauss)
105  {
106  mean -= gauss.mean;
107  sigma -= gauss.sigma;
108  signal -= gauss.signal;
109  background -= gauss.background;
110 
111  return *this;
112  }
113 
114 
115  /**
116  * Scale gauss.
117  *
118  * \param factor multiplication factor
119  * \return this gauss
120  */
121  JGauss_t& mul(const double factor)
122  {
123  mean *= factor;
124  sigma *= factor;
125  signal *= factor;
126  background *= factor;
127 
128  return *this;
129  }
130 
131 
132  /**
133  * Write Gauss to input stream.
134  *
135  * \param in input stream
136  * \param gauss gauss
137  * \return input stream
138  */
139  friend inline std::istream& operator>>(std::istream& in, JGauss_t& gauss)
140  {
141  return in >> gauss.mean >> gauss.sigma >> gauss.signal >> gauss.background;
142  }
143 
144 
145  /**
146  * Write Gauss to output stream.
147  *
148  * \param out output stream
149  * \param gauss gauss
150  * \return output stream
151  */
152  friend inline std::ostream& operator<<(std::ostream& out, const JGauss_t& gauss)
153  {
154  using namespace std;
155 
156  return out << FIXED(7,3) << gauss.mean << ' '
157  << FIXED(7,3) << gauss.sigma << ' '
158  << FIXED(9,3) << gauss.signal << ' '
159  << FIXED(9,3) << gauss.background;
160  }
161 
162  double mean;
163  double sigma;
164  double signal;
165  double background;
166  };
167 
168 
169  /**
170  * Gauss function object.
171  *
172  * Evaluates function, derivative and gradient values.
173  */
174  struct JGauss :
175  public JGauss_t
176  {
177  /**
178  * Type definition of fit parameter.
179  */
180  typedef double JGauss::*parameter_type;
181 
182 
183  /**
184  * Default constructor.
185  */
186  JGauss() :
187  JGauss_t()
188  {}
189 
190 
191  /**
192  * Copy constructor.
193  *
194  * \param gauss gauss
195  */
197  JGauss_t(gauss)
198  {}
199 
200 
201  /**
202  * Constructor.
203  *
204  * \param mean mean
205  * \param sigma sigma
206  * \param signal signal
207  * \param background background
208  */
209  JGauss(const double mean,
210  const double sigma,
211  const double signal,
212  const double background = 0.0) :
213  JGauss_t(mean, sigma, signal, background)
214  {}
215 
216 
217  /**
218  * Function value.
219  *
220  * \param x abscissa value
221  * \return function value
222  */
223  double getValue(const double x) const
224  {
225  const double u = (x - mean) / sigma;
226 
227  return get_signal(u) + background;
228  }
229 
230 
231  /**
232  * Derivative value.
233  *
234  * \param x abscissa value
235  * \return derivative value
236  */
237  double getDerivative(const double x) const
238  {
239  const double u = (x - mean) / sigma;
240 
241  return get_signal(u) * -u;
242  }
243 
244 
245  /**
246  * Function value.
247  *
248  * \param x abscissa value
249  * \return function value
250  */
251  double operator()(const double x) const
252  {
253  return getValue(x);
254  }
255 
256 
257  /**
258  * Get gradient.
259  *
260  * \param x abscissa value
261  * \return gradient
262  */
263  JGauss_t getGradient(const double x) const
264  {
265  JGauss_t gradient;
266 
267  const double u = (x - mean) / sigma;
268  const double fs = get_signal(u);
269 
270  gradient.mean = fs * u / sigma; // d(f)/d(mean)
271  gradient.sigma = fs * u*u / sigma - fs / sigma; // d(f)/d(sigma)
272  gradient.signal = fs / signal; // d(f)/d(signal)
273  gradient.background = 1.0; // d(f)/d(background)
274 
275  return gradient;
276  }
277 
278  private:
279  /**
280  * Get signal.
281  *
282  * \param u value
283  * \return signal
284  */
285  inline double get_signal(const double u) const
286  {
287  return signal * exp(-0.5*u*u) / (sqrt(2.0*PI) * sigma);
288  }
289  };
290 }
291 
292 #endif
bool equals(const JGauss_t &gauss, const double eps=std::numeric_limits< double >::min()) const
Equality.
Definition: JGauss.hh:71
friend std::istream & operator>>(std::istream &in, JGauss_t &gauss)
Write Gauss to input stream.
Definition: JGauss.hh:139
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
Definition: JScale.hh:47
double mean
Definition: JGauss.hh:162
Auxiliary base class for aritmetic operations of derived class types.
Definition: JMath.hh:26
JGauss_t getGradient(const double x) const
Get gradient.
Definition: JGauss.hh:263
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
Definition: JSirene.sh:45
static const double PI
Constants.
Definition: JConstants.hh:20
double operator()(const double x) const
Function value.
Definition: JGauss.hh:251
Auxiliary data structure for floating point format specification.
Definition: JPrint.hh:481
Gauss function object.
Definition: JGauss.hh:174
JGauss_t & sub(const JGauss_t &gauss)
Subtract gauss.
Definition: JGauss.hh:104
double get_signal(const double u) const
Get signal.
Definition: JGauss.hh:285
Constants.
JGauss_t & mul(const double factor)
Scale gauss.
Definition: JGauss.hh:121
I/O formatting auxiliaries.
friend std::ostream & operator<<(std::ostream &out, const JGauss_t &gauss)
Write Gauss to output stream.
Definition: JGauss.hh:152
double JGauss::* parameter_type
Type definition of fit parameter.
Definition: JGauss.hh:180
Template definition of auxiliary base class for comparison of data structures.
Definition: JEquals.hh:24
JGauss_t & add(const JGauss_t &gauss)
Add gauss.
Definition: JGauss.hh:87
JGauss()
Default constructor.
Definition: JGauss.hh:186
Gauss model.
Definition: JGauss.hh:30
JGauss_t()
Default constructor.
Definition: JGauss.hh:37
JGauss(const JGauss_t &gauss)
Copy constructor.
Definition: JGauss.hh:196
JGauss_t(const double mean, const double sigma, const double signal, const double background)
Constructor.
Definition: JGauss.hh:53
double signal
Definition: JGauss.hh:164
double background
Definition: JGauss.hh:165
double sigma
Definition: JGauss.hh:163
double gauss(const double x, const double sigma)
Gauss function (normalised to 1 at x = 0).
Base class for data structures with artithmetic capabilities.
double getValue(const double x) const
Function value.
Definition: JGauss.hh:223
double getDerivative(const double x) const
Derivative value.
Definition: JGauss.hh:237
double u[N+1]
Definition: JPolint.hh:706
JGauss(const double mean, const double sigma, const double signal, const double background=0.0)
Constructor.
Definition: JGauss.hh:209
then set_variable FORMULA *[0] exp(-0.5 *(x-[1])*(x-[1])/([2]*[2]))" set_variable OUTPUT_FILE histogram.root JHistogram1D -o $WORKDIR/$OUTPUT_FILE -F "$FORMULA" -