Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
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 "JLang/JEquals.hh"
11#include "JLang/JManip.hh"
12#include "JMath/JMath.hh"
13#include "JMath/JConstants.hh"
14
15/**
16 * \author mdejong
17 */
18
19namespace JMATH {}
20namespace JPP { using namespace JMATH; }
21
22namespace JMATH {
23
24 using JLANG::JEquals;
25
26 /**
27 * Gauss model.
28 */
29 struct JGauss_t :
30 public JMath<JGauss_t>,
31 public JEquals<JGauss_t>
32 {
33 /**
34 * Default constructor.
35 */
37 mean (0.0),
38 sigma (0.0),
39 signal (0.0),
40 background(0.0)
41 {}
42
43
44 /**
45 * Constructor.
46 *
47 * \param mean mean
48 * \param sigma sigma
49 * \param signal signal
50 * \param background background
51 */
52 JGauss_t(const double mean,
53 const double sigma,
54 const double signal,
55 const double background) :
56 mean (mean),
57 sigma (sigma),
58 signal (signal),
60 {}
61
62
63 /**
64 * Equality.
65 *
66 * \param gauss gauss
67 * \param eps numerical precision
68 * \return true if gauss's identical; else false
69 */
70 bool equals(const JGauss_t& gauss,
71 const double eps = std::numeric_limits<double>::min()) const
72 {
73 return (fabs(mean - gauss.mean) <= eps &&
74 fabs(sigma - gauss.sigma) <= eps &&
75 fabs(signal - gauss.signal) <= eps &&
76 fabs(background - gauss.background) <= eps);
77 }
78
79
80 /**
81 * Add gauss.
82 *
83 * \param gauss gauss
84 * \return this gauss
85 */
87 {
88 mean += gauss.mean;
89 sigma += gauss.sigma;
90 signal += gauss.signal;
91 background += gauss.background;
92
93 return *this;
94 }
95
96
97 /**
98 * Subtract gauss.
99 *
100 * \param gauss gauss
101 * \return this gauss
102 */
104 {
105 mean -= gauss.mean;
106 sigma -= gauss.sigma;
107 signal -= gauss.signal;
108 background -= gauss.background;
109
110 return *this;
111 }
112
113
114 /**
115 * Scale gauss.
116 *
117 * \param factor multiplication factor
118 * \return this gauss
119 */
120 JGauss_t& mul(const double factor)
121 {
122 mean *= factor;
123 sigma *= factor;
124 signal *= factor;
125 background *= factor;
126
127 return *this;
128 }
129
130
131 /**
132 * Write Gauss to input stream.
133 *
134 * \param in input stream
135 * \param gauss gauss
136 * \return input stream
137 */
138 friend inline std::istream& operator>>(std::istream& in, JGauss_t& gauss)
139 {
140 return in >> gauss.mean >> gauss.sigma >> gauss.signal >> gauss.background;
141 }
142
143
144 /**
145 * Write Gauss to output stream.
146 *
147 * \param out output stream
148 * \param gauss gauss
149 * \return output stream
150 */
151 friend inline std::ostream& operator<<(std::ostream& out, const JGauss_t& gauss)
152 {
153 using namespace std;
154
155 return out << FIXED(7,3) << gauss.mean << ' '
156 << FIXED(7,3) << gauss.sigma << ' '
157 << FIXED(9,3) << gauss.signal << ' '
158 << FIXED(9,3) << gauss.background;
159 }
160
161 double mean;
162 double sigma;
163 double signal;
165 };
166
167
168 /**
169 * Gauss function object.
170 *
171 * Evaluates function, derivative and gradient values.
172 */
173 struct JGauss :
174 public JGauss_t
175 {
176 /**
177 * Type definition of fit parameter.
178 */
179 typedef double JGauss::*parameter_type;
180
181
182 /**
183 * Default constructor.
184 */
186 JGauss_t()
187 {}
188
189
190 /**
191 * Copy constructor.
192 *
193 * \param gauss gauss
194 */
197 {}
198
199
200 /**
201 * Constructor.
202 *
203 * \param mean mean
204 * \param sigma sigma
205 * \param signal signal
206 * \param background background
207 */
208 JGauss(const double mean,
209 const double sigma,
210 const double signal = 1.0,
211 const double background = 0.0) :
213 {}
214
215
216 /**
217 * Function value.
218 *
219 * \param x abscissa value
220 * \return function value
221 */
222 double getValue(const double x) const
223 {
224 const double u = (x - mean) / sigma;
225
226 return signal * get(u) + background;
227 }
228
229
230 /**
231 * Derivative value.
232 *
233 * \param x abscissa value
234 * \return derivative value
235 */
236 double getDerivative(const double x) const
237 {
238 const double u = (x - mean) / sigma;
239
240 return signal * get(u) * -u / sigma;
241 }
242
243
244 /**
245 * Function value.
246 *
247 * \param x abscissa value
248 * \return function value
249 */
250 double operator()(const double x) const
251 {
252 return getValue(x);
253 }
254
255
256 /**
257 * Get gradient.
258 *
259 * \param x abscissa value
260 * \return gradient
261 */
262 const JGauss_t& getGradient(const double x) const
263 {
264 const double w = 1.0 / sigma;
265 const double u = (x - mean) * w;
266 const double f0 = get(u);
267 const double fs = signal * f0;
268
269 gradient.mean = fs * (u) * w; // d(f)/d(mean)
270 gradient.sigma = fs * (u + 1.0) * (u - 1.0) * w; // d(f)/d(sigma)
271 gradient.signal = f0; // d(f)/d(signal)
272 gradient.background = 1.0; // d(f)/d(background)
273
274 return gradient;
275 }
276
277 private:
278 /**
279 * Get ordinate value.
280 *
281 * \param u abscissa value
282 * \return ordinate value
283 */
284 inline double get(const double u) const
285 {
286 return exp(-0.5*u*u) / (sqrt(2.0*PI) * sigma);
287 }
288
290 };
291}
292
293#endif
I/O manipulators.
Mathematical constants.
Base class for data structures with artithmetic capabilities.
Auxiliary classes and methods for mathematical operations.
Definition JEigen3D.hh:88
double gauss(const double x, const double sigma)
Gauss function (normalised to 1 at x = 0).
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448
Template definition of auxiliary base class for comparison of data structures.
Definition JEquals.hh:84
Gauss model.
Definition JGauss.hh:32
JGauss_t & sub(const JGauss_t &gauss)
Subtract gauss.
Definition JGauss.hh:103
double background
Definition JGauss.hh:164
JGauss_t(const double mean, const double sigma, const double signal, const double background)
Constructor.
Definition JGauss.hh:52
double signal
Definition JGauss.hh:163
friend std::istream & operator>>(std::istream &in, JGauss_t &gauss)
Write Gauss to input stream.
Definition JGauss.hh:138
bool equals(const JGauss_t &gauss, const double eps=std::numeric_limits< double >::min()) const
Equality.
Definition JGauss.hh:70
JGauss_t()
Default constructor.
Definition JGauss.hh:36
friend std::ostream & operator<<(std::ostream &out, const JGauss_t &gauss)
Write Gauss to output stream.
Definition JGauss.hh:151
JGauss_t & mul(const double factor)
Scale gauss.
Definition JGauss.hh:120
JGauss_t & add(const JGauss_t &gauss)
Add gauss.
Definition JGauss.hh:86
Gauss function object.
Definition JMathlib.hh:1589
JGauss(const JGauss_t &gauss)
Copy constructor.
Definition JGauss.hh:195
double operator()(const double x) const
Function value.
Definition JGauss.hh:250
double sigma
sigma
Definition JMathlib.hh:1665
double getDerivative(const double x) const
Derivative value.
Definition JGauss.hh:236
JGauss()
Default constructor.
Definition JGauss.hh:185
double JGauss::* parameter_type
Type definition of fit parameter.
Definition JGauss.hh:179
double getValue(const double x) const
Function value.
Definition JGauss.hh:222
JGauss_t gradient
Definition JGauss.hh:289
JGauss(const double mean, const double sigma, const double signal=1.0, const double background=0.0)
Constructor.
Definition JGauss.hh:208
double get(const double u) const
Get ordinate value.
Definition JGauss.hh:284
const JGauss_t & getGradient(const double x) const
Get gradient.
Definition JGauss.hh:262
Auxiliary base class for aritmetic operations of derived class types.
Definition JMath.hh:347