Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ProbFuncMathCore.cxx
Go to the documentation of this file.
1// @(#)root/mathcore:$Id$
2// Authors: L. Moneta, A. Zsenei 06/2005
3
4
5
6#include "Math/Math.h"
7#include "Math/Error.h"
10#include <cstdio>
11#include <limits>
12
13namespace ROOT {
14namespace Math {
15
16 static const double kSqrt2 = 1.41421356237309515; // sqrt(2.)
17
18 double beta_cdf_c(double x, double a, double b)
19 {
20 // use the fact that I(x,a,b) = 1. - I(1-x,b,a)
21 return ROOT::Math::inc_beta(1-x, b, a);
22 }
23
24
25 double beta_cdf(double x, double a, double b )
26 {
27 return ROOT::Math::inc_beta(x, a, b);
28 }
29
30
31 double breitwigner_cdf_c(double x, double gamma, double x0)
32 {
33 return 0.5 - std::atan(2.0 * (x-x0) / gamma) / M_PI;
34 }
35
36
37 double breitwigner_cdf(double x, double gamma, double x0)
38 {
39 return 0.5 + std::atan(2.0 * (x-x0) / gamma) / M_PI;
40 }
41
42
43 double cauchy_cdf_c(double x, double b, double x0)
44 {
45 return 0.5 - std::atan( (x-x0) / b) / M_PI;
46 }
47
48
49 double cauchy_cdf(double x, double b, double x0)
50 {
51 return 0.5 + std::atan( (x-x0) / b) / M_PI;
52 }
53
54
55 double chisquared_cdf_c(double x, double r, double x0)
56 {
57 return ROOT::Math::inc_gamma_c ( 0.5 * r , 0.5* (x-x0) );
58 }
59
60 double chisquared_cdf(double x, double r, double x0)
61 {
62 return ROOT::Math::inc_gamma ( 0.5 * r , 0.5* (x-x0) );
63 }
64
65 double crystalball_cdf(double x, double alpha, double n, double sigma, double mean )
66 {
67 if (n <= 1.) {
68 MATH_ERROR_MSG("crystalball_cdf","CrystalBall cdf not defined for n <=1");
69 return std::numeric_limits<double>::quiet_NaN();
70 }
71
72 double abs_alpha = std::abs(alpha);
73 double C = n/abs_alpha * 1./(n-1.) * std::exp(-alpha*alpha/2.);
74 double D = std::sqrt(M_PI/2.)*(1.+ROOT::Math::erf(abs_alpha/std::sqrt(2.)));
75 double totIntegral = sigma*(C+D);
76
77 double integral = crystalball_integral(x, alpha, n, sigma, mean);
78 return (alpha > 0) ? 1. - integral / totIntegral : integral / totIntegral;
79 }
80 double crystalball_cdf_c(double x, double alpha, double n, double sigma, double mean )
81 {
82 if (n <= 1.) {
83 MATH_ERROR_MSG("crystalball_cdf_c","CrystalBall cdf not defined for n <=1");
84 return std::numeric_limits<double>::quiet_NaN();
85 }
86 double abs_alpha = std::abs(alpha);
87 double C = n/abs_alpha * 1./(n-1.) * std::exp(-alpha*alpha/2.);
88 double D = std::sqrt(M_PI/2.)*(1.+ROOT::Math::erf(abs_alpha/std::sqrt(2.)));
89 double totIntegral = sigma*(C+D);
90
91 double integral = crystalball_integral(x, alpha, n, sigma, mean);
92 return (alpha > 0) ? integral / totIntegral : 1. - (integral / totIntegral);
93 }
94 double crystalball_integral(double x, double alpha, double n, double sigma, double mean)
95 {
96 // compute the integral of the crystal ball function (ROOT::Math::crystalball_function)
97 // If alpha > 0 the integral is the right tail integral.
98 // If alpha < 0 is the left tail integrals which are always finite for finite x.
99 // parameters:
100 // alpha : is non equal to zero, define the # of sigma from which it becomes a power-law function
101 // (from mean-alpha*sigma)
102 // n > 1 : is integer, is the power of the low tail
103 // add a value xmin for cases when n <=1 the integral diverges
104 if (sigma == 0)
105 return 0;
106 if (alpha == 0) {
107 MATH_ERROR_MSG("crystalball_integral", "CrystalBall function not defined at alpha=0");
108 return 0.;
109 }
110 bool useLog = (n == 1.0);
111 if (n <= 0)
112 MATH_WARN_MSG("crystalball_integral", "No physical meaning when n<=0");
113
114 double z = (x - mean) / sigma;
115 if (alpha < 0)
116 z = -z;
117
118 double abs_alpha = std::abs(alpha);
119
120 // double D = *(1.+ROOT::Math::erf(abs_alpha/std::sqrt(2.)));
121 // double N = 1./(sigma*(C+D));
122 double intgaus = 0.;
123 double intpow = 0.;
124
125 const double sqrtpiover2 = std::sqrt(M_PI / 2.);
126 const double sqrt2pi = std::sqrt(2. * M_PI);
127 const double oneoversqrt2 = 1. / sqrt(2.);
128 if (z <= -abs_alpha)
129 {
130 double r = n / abs_alpha;
131 double A = r * std::exp(-0.5 * alpha * alpha);
132 double B = r - abs_alpha;
133
134 if (!useLog) {
135 intpow = A * (1 - std::pow(r / (B - z), n - 1)) / (n - 1);
136 }
137 else {
138 // for n=1 the primitive of 1/x is log(x)
139 intpow = A * std::pow(r, n - 1) * (std::log(B - z) - std::log(r));
140 }
142 }
143 else
144 {
146 intgaus *= sqrt2pi;
147 intpow = 0;
148 }
149 return sigma * (intgaus + intpow);
150 }
151
152 double exponential_cdf_c(double x, double lambda, double x0)
153 {
154 if ((x-x0) < 0) return 1.0;
155 else return std::exp(- lambda * (x-x0));
156 }
157
158
159 double exponential_cdf(double x, double lambda, double x0)
160 {
161 if ((x-x0) < 0) return 0.0;
162 else // use expm1 function to avoid errors at small x
163 return - ROOT::Math::expm1( - lambda * (x-x0) ) ;
164 }
165
166
167 double fdistribution_cdf_c(double x, double n, double m, double x0)
168 {
169 // f distribution is defined only for both n and m > 0
170 if (n < 0 || m < 0) return std::numeric_limits<double>::quiet_NaN();
171
172 double z = m/(m + n*(x-x0));
173 // fox z->1 and large a and b IB looses precision use complement function
174 if (z > 0.9 && n > 1 && m > 1) return 1.- fdistribution_cdf(x,n,m,x0);
175
176 // for the complement use the fact that IB(x,a,b) = 1. - IB(1-x,b,a)
177 return ROOT::Math::inc_beta(m/(m + n*(x-x0)), .5*m, .5*n);
178 }
179
180
181 double fdistribution_cdf(double x, double n, double m, double x0)
182 {
183 // f distribution is defined only for both n and m > 0
184 if (n < 0 || m < 0)
185 return std::numeric_limits<double>::quiet_NaN();
186
187 double z = n*(x-x0)/(m + n*(x-x0));
188 // fox z->1 and large a and b IB looses precision use complement function
189 if (z > 0.9 && n > 1 && m > 1)
190 return 1. - fdistribution_cdf_c(x,n,m,x0);
191
192 return ROOT::Math::inc_beta(z, .5*n, .5*m);
193 }
194
195
196 double gamma_cdf_c(double x, double alpha, double theta, double x0)
197 {
198 return ROOT::Math::inc_gamma_c(alpha, (x-x0)/theta);
199 }
200
201
202 double gamma_cdf(double x, double alpha, double theta, double x0)
203 {
204 return ROOT::Math::inc_gamma(alpha, (x-x0)/theta);
205 }
206
207
208 double lognormal_cdf_c(double x, double m, double s, double x0)
209 {
210 double z = (std::log((x-x0))-m)/(s*kSqrt2);
211 if (z > 1.) return 0.5*ROOT::Math::erfc(z);
212 else return 0.5*(1.0 - ROOT::Math::erf(z));
213 }
214
215
216 double lognormal_cdf(double x, double m, double s, double x0)
217 {
218 double z = (std::log((x-x0))-m)/(s*kSqrt2);
219 if (z < -1.) return 0.5*ROOT::Math::erfc(-z);
220 else return 0.5*(1.0 + ROOT::Math::erf(z));
221 }
222
223
224 double normal_cdf_c(double x, double sigma, double x0)
225 {
226 double z = (x-x0)/(sigma*kSqrt2);
227 if (z > 1.) return 0.5*ROOT::Math::erfc(z);
228 else return 0.5*(1.-ROOT::Math::erf(z));
229 }
230
231
232 double normal_cdf(double x, double sigma, double x0)
233 {
234 double z = (x-x0)/(sigma*kSqrt2);
235 if (z < -1.) return 0.5*ROOT::Math::erfc(-z);
236 else return 0.5*(1.0 + ROOT::Math::erf(z));
237 }
238
239
240 double tdistribution_cdf_c(double x, double r, double x0)
241 {
242 double p = x-x0;
243 double sign = (p>0) ? 1. : -1;
244 return .5 - .5*ROOT::Math::inc_beta(p*p/(r + p*p), .5, .5*r)*sign;
245 }
246
247
248 double tdistribution_cdf(double x, double r, double x0)
249 {
250 double p = x-x0;
251 double sign = (p>0) ? 1. : -1;
252 return .5 + .5*ROOT::Math::inc_beta(p*p/(r + p*p), .5, .5*r)*sign;
253 }
254
255
256 double uniform_cdf_c(double x, double a, double b, double x0)
257 {
258 if ((x-x0) < a) return 1.0;
259 else if ((x-x0) >= b) return 0.0;
260 else return (b-(x-x0))/(b-a);
261 }
262
263
264 double uniform_cdf(double x, double a, double b, double x0)
265 {
266 if ((x-x0) < a) return 0.0;
267 else if ((x-x0) >= b) return 1.0;
268 else return ((x-x0)-a)/(b-a);
269 }
270
271 /// discrete distributions
272
273 double poisson_cdf_c(unsigned int n, double mu)
274 {
275 // mu must be >= 0 . Use poisson - gamma relation
276 // Pr ( x <= n) = Pr( y >= a) where x is poisson and y is gamma distributed ( a = n+1)
277 double a = (double) n + 1.0;
278 return ROOT::Math::gamma_cdf(mu, a, 1.0);
279 }
280
281 double poisson_cdf(unsigned int n, double mu)
282 {
283 // mu must be >= 0 . Use poisson - gamma relation
284 // Pr ( x <= n) = Pr( y >= a) where x is poisson and y is gamma distributed ( a = n+1)
285 double a = (double) n + 1.0;
286 return ROOT::Math::gamma_cdf_c(mu, a, 1.0);
287 }
288
289 double binomial_cdf_c(unsigned int k, double p, unsigned int n)
290 {
291 // use relation with in beta distribution
292 // p must be 0 <=p <= 1
293 if ( k >= n) return 0;
294 double a = (double) k + 1.0;
295 double b = (double) n - k;
296 return ROOT::Math::beta_cdf(p, a, b);
297 }
298
299 double binomial_cdf(unsigned int k, double p, unsigned int n)
300 {
301 // use relation with in beta distribution
302 // p must be 0 <=p <= 1
303 if ( k >= n) return 1.0;
304
305 double a = (double) k + 1.0;
306 double b = (double) n - k;
307 return ROOT::Math::beta_cdf_c(p, a, b);
308 }
309
310 double negative_binomial_cdf(unsigned int k, double p, double n)
311 {
312 // use relation with in beta distribution
313 // p must be 0 <=p <= 1
314 if (n < 0) return 0;
315 if (p < 0 || p > 1) return 0;
316 return ROOT::Math::beta_cdf(p, n, k+1.0);
317 }
318
319 double negative_binomial_cdf_c(unsigned int k, double p, double n)
320 {
321 // use relation with in beta distribution
322 // p must be 0 <=p <= 1
323 if ( n < 0) return 0;
324 if ( p < 0 || p > 1) return 0;
325 return ROOT::Math::beta_cdf_c(p, n, k+1.0);
326 }
327
328
329 double landau_cdf(double x, double xi, double x0)
330 {
331 // implementation of landau distribution (from DISLAN)
332 //The algorithm was taken from the Cernlib function dislan(G110)
333 //Reference: K.S.Kolbig and B.Schorr, "A program package for the Landau
334 //distribution", Computer Phys.Comm., 31(1984), 97-111
335
336 static double p1[5] = {0.2514091491e+0,-0.6250580444e-1, 0.1458381230e-1,-0.2108817737e-2, 0.7411247290e-3};
337 static double q1[5] = {1.0 ,-0.5571175625e-2, 0.6225310236e-1,-0.3137378427e-2, 0.1931496439e-2};
338
339 static double p2[4] = {0.2868328584e+0, 0.3564363231e+0, 0.1523518695e+0, 0.2251304883e-1};
340 static double q2[4] = {1.0 , 0.6191136137e+0, 0.1720721448e+0, 0.2278594771e-1};
341
342 static double p3[4] = {0.2868329066e+0, 0.3003828436e+0, 0.9950951941e-1, 0.8733827185e-2};
343 static double q3[4] = {1.0 , 0.4237190502e+0, 0.1095631512e+0, 0.8693851567e-2};
344
345 static double p4[4] = {0.1000351630e+1, 0.4503592498e+1, 0.1085883880e+2, 0.7536052269e+1};
346 static double q4[4] = {1.0 , 0.5539969678e+1, 0.1933581111e+2, 0.2721321508e+2};
347
348 static double p5[4] = {0.1000006517e+1, 0.4909414111e+2, 0.8505544753e+2, 0.1532153455e+3};
349 static double q5[4] = {1.0 , 0.5009928881e+2, 0.1399819104e+3, 0.4200002909e+3};
350
351 static double p6[4] = {0.1000000983e+1, 0.1329868456e+3, 0.9162149244e+3,-0.9605054274e+3};
352 static double q6[4] = {1.0 , 0.1339887843e+3, 0.1055990413e+4, 0.5532224619e+3};
353
354 static double a1[4] = {0 ,-0.4583333333e+0, 0.6675347222e+0,-0.1641741416e+1};
355 static double a2[4] = {0 , 1.0 ,-0.4227843351e+0,-0.2043403138e+1};
356
357 double v = (x - x0)/xi;
358 double u;
359 double lan;
360
361 if (v < -5.5)
362 {
363 u = std::exp(v+1);
364 lan = 0.3989422803*std::exp(-1./u)*std::sqrt(u)*(1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
365 }
366 else if (v < -1 )
367 {
368 u = std::exp(-v-1);
369 lan = (std::exp(-u)/std::sqrt(u))*(p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*v)*v)*v)*v)/
370 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*v);
371 }
372 else if (v < 1)
373 lan = (p2[0]+(p2[1]+(p2[2]+p2[3]*v)*v)*v)/(q2[0]+(q2[1]+(q2[2]+q2[3]*v)*v)*v);
374
375 else if (v < 4)
376 lan = (p3[0]+(p3[1]+(p3[2]+p3[3]*v)*v)*v)/(q3[0]+(q3[1]+(q3[2]+q3[3]*v)*v)*v);
377
378 else if (v < 12)
379 {
380 u = 1./v;
381 lan = (p4[0]+(p4[1]+(p4[2]+p4[3]*u)*u)*u)/(q4[0]+(q4[1]+(q4[2]+q4[3]*u)*u)*u);
382 }
383 else if (v < 50)
384 {
385 u = 1./v;
386 lan = (p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/(q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
387 }
388 else if (v < 300)
389 {
390 u = 1./v;
391 lan = (p6[0]+(p6[1]+(p6[2]+p6[3]*u)*u)*u)/(q6[0]+(q6[1]+(q6[2]+q6[3]*u)*u)*u);
392 }
393 else
394 {
395 u = 1./(v-v*std::log(v)/(v+1));
396 lan = 1-(a2[1]+(a2[2]+a2[3]*u)*u)*u;
397 }
398 return lan;
399 }
400
401
402 double landau_xm1(double x, double xi, double x0)
403 {
404 // implementation of first momentum of Landau distribution
405 // translated from Cernlib (XM1LAN function) by Benno List
406
407 static double p1[5] = {-0.8949374280E+0, 0.4631783434E+0,-0.4053332915E-1,
408 0.1580075560E-1,-0.3423874194E-2};
409 static double q1[5] = { 1.0 , 0.1002930749E+0, 0.3575271633E-1,
410 -0.1915882099E-2, 0.4811072364E-4};
411 static double p2[5] = {-0.8933384046E+0, 0.1161296496E+0, 0.1200082940E+0,
412 0.2185699725E-1, 0.2128892058E-2};
413 static double q2[5] = { 1.0 , 0.4935531886E+0, 0.1066347067E+0,
414 0.1250161833E-1, 0.5494243254E-3};
415 static double p3[5] = {-0.8933322067E+0, 0.2339544896E+0, 0.8257653222E-1,
416 0.1411226998E-1, 0.2892240953E-3};
417 static double q3[5] = { 1.0 , 0.3616538408E+0, 0.6628026743E-1,
418 0.4839298984E-2, 0.5248310361E-4};
419 static double p4[4] = { 0.9358419425E+0, 0.6716831438E+2,-0.6765069077E+3,
420 0.9026661865E+3};
421 static double q4[4] = { 1.0 , 0.7752562854E+2,-0.5637811998E+3,
422 -0.5513156752E+3};
423 static double p5[4] = { 0.9489335583E+0, 0.5561246706E+3, 0.3208274617E+5,
424 -0.4889926524E+5};
425 static double q5[4] = { 1.0 , 0.6028275940E+3, 0.3716962017E+5,
426 0.3686272898E+5};
427 static double a0[6] = {-0.4227843351E+0,-0.1544313298E+0, 0.4227843351E+0,
428 0.3276496874E+1, 0.2043403138E+1,-0.8681296500E+1};
429 static double a1[4] = { 0, -0.4583333333E+0, 0.6675347222E+0,
430 -0.1641741416E+1};
431 static double a2[5] = { 0, -0.1958333333E+1, 0.5563368056E+1,
432 -0.2111352961E+2, 0.1006946266E+3};
433
434 double v = (x-x0)/xi;
435 double xm1lan;
436 if (v < -4.5)
437 {
438 double u = std::exp(v+1);
439 xm1lan = v-u*(1+(a2[1]+(a2[2]+(a2[3]+a2[4]*u)*u)*u)*u)/
440 (1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
441 }
442 else if (v < -2)
443 {
444 xm1lan = (p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*v)*v)*v)*v)/
445 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*v);
446 }
447 else if (v < 2)
448 {
449 xm1lan = (p2[0]+(p2[1]+(p2[2]+(p2[3]+p2[4]*v)*v)*v)*v)/
450 (q2[0]+(q2[1]+(q2[2]+(q2[3]+q2[4]*v)*v)*v)*v);
451 }
452 else if (v < 10)
453 {
454 xm1lan = (p3[0]+(p3[1]+(p3[2]+(p3[3]+p3[4]*v)*v)*v)*v)/
455 (q3[0]+(q3[1]+(q3[2]+(q3[3]+q3[4]*v)*v)*v)*v);
456 }
457 else if (v < 40)
458 {
459 double u = 1/v;
460 xm1lan = std::log(v)*(p4[0]+(p4[1]+(p4[2]+p4[3]*u)*u)*u)/
461 (q4[0]+(q4[1]+(q4[2]+q4[3]*u)*u)*u);
462 }
463 else if (v < 200)
464 {
465 double u = 1/v;
466 xm1lan = std::log(v)*(p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/
467 (q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
468 }
469 else
470 {
471 double u = v-v*std::log(v)/(v+1);
472 v = 1/(u-u*(u+ std::log(u)-v)/(u+1));
473 u = -std::log(v);
474 xm1lan = (u+a0[0]+(-u+a0[1]+(a0[2]*u+a0[3]+(a0[4]*u+a0[5])*v)*v)*v)/
475 (1-(1-(a0[2]+a0[4]*v)*v)*v);
476 }
477 return xm1lan*xi + x0;
478 }
479
480
481
482 double landau_xm2(double x, double xi, double x0)
483 {
484 // implementation of second momentum of Landau distribution
485 // translated from Cernlib (XM2LAN function) by Benno List
486
487 static double p1[5] = { 0.1169837582E+1,-0.4834874539E+0, 0.4383774644E+0,
488 0.3287175228E-2, 0.1879129206E-1};
489 static double q1[5] = { 1.0 , 0.1795154326E+0, 0.4612795899E-1,
490 0.2183459337E-2, 0.7226623623E-4};
491 static double p2[5] = { 0.1157939823E+1,-0.3842809495E+0, 0.3317532899E+0,
492 0.3547606781E-1, 0.6725645279E-2};
493 static double q2[5] = { 1.0 , 0.2916824021E+0, 0.5259853480E-1,
494 0.3840011061E-2, 0.9950324173E-4};
495 static double p3[4] = { 0.1178191282E+1, 0.1011623342E+2,-0.1285585291E+2,
496 0.3641361437E+2};
497 static double q3[4] = { 1.0 , 0.8614160194E+1, 0.3118929630E+2,
498 0.1514351300E+0};
499 static double p4[5] = { 0.1030763698E+1, 0.1216758660E+3, 0.1637431386E+4,
500 -0.2171466507E+4, 0.7010168358E+4};
501 static double q4[5] = { 1.0 , 0.1022487911E+3, 0.1377646350E+4,
502 0.3699184961E+4, 0.4251315610E+4};
503 static double p5[4] = { 0.1010084827E+1, 0.3944224824E+3, 0.1773025353E+5,
504 -0.7075963938E+5};
505 static double q5[4] = { 1.0 , 0.3605950254E+3, 0.1392784158E+5,
506 -0.1881680027E+5};
507 static double a0[7] = {-0.2043403138E+1,-0.8455686702E+0,-0.3088626596E+0,
508 0.5821346754E+1, 0.4227843351E+0, 0.6552993748E+1,
509 -0.1076714945E+2};
510 static double a1[4] = { 0. ,-0.4583333333E+0, 0.6675347222E+0,
511 -0.1641741416E+1};
512 static double a2[4] = {-0.1958333333E+1, 0.5563368056E+1,-0.2111352961E+2,
513 0.1006946266E+3};
514 static double a3[4] = {-1.0 , 0.4458333333E+1,-0.2116753472E+2,
515 0.1163674359E+3};
516
517 double v = (x-x0)/xi;
518 double xm2lan;
519 if (v < -4.5)
520 {
521 double u = std::exp(v+1);
522 xm2lan = v*v-2*u*u*
523 (v/u+a2[0]*v+a3[0]+(a2[1]*v+a3[1]+(a2[2]*v+a3[2]+
524 (a2[3]*v+a3[3])*u)*u)*u)/
525 (1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
526 }
527 else if (v < -2)
528 {
529 xm2lan = (p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*v)*v)*v)*v)/
530 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*v);
531 }
532 else if (v < 2)
533 {
534 xm2lan = (p2[0]+(p2[1]+(p2[2]+(p2[3]+p2[4]*v)*v)*v)*v)/
535 (q2[0]+(q2[1]+(q2[2]+(q2[3]+q2[4]*v)*v)*v)*v);
536 }
537 else if (v < 5)
538 {
539 double u = 1/v;
540 xm2lan = v*(p3[0]+(p3[1]+(p3[2]+p3[3]*u)*u)*u)/
541 (q3[0]+(q3[1]+(q3[2]+q3[3]*u)*u)*u);
542 }
543 else if (v < 50)
544 {
545 double u = 1/v;
546 xm2lan = v*(p4[0]+(p4[1]+(p4[2]+(p4[3]+p4[4]*u)*u)*u)*u)/
547 (q4[0]+(q4[1]+(q4[2]+(q4[3]+q4[4]*u)*u)*u)*u);
548 }
549 else if (v < 200)
550 {
551 double u = 1/v;
552 xm2lan = v*(p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/
553 (q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
554 }
555 else
556 {
557 double u = v-v*std::log(v)/(v+1);
558 v = 1/(u-u*(u+log(u)-v)/(u+1));
559 u = -std::log(v);
560 xm2lan = (1/v+u*u+a0[0]+a0[1]*u+(-u*u+a0[2]*u+a0[3]+
561 (a0[4]*u*u+a0[5]*u+a0[6])*v)*v)/(1-(1-a0[4]*v)*v);
562 }
563 if (x0 == 0) return xm2lan*xi*xi;
564 double xm1lan = ROOT::Math::landau_xm1(x, xi, x0);
565 return xm2lan*xi*xi + (2*xm1lan-x0)*x0;
566 }
567
568} // namespace Math
569} // namespace ROOT
570
571
572
#define MATH_ERROR_MSG(loc, str)
Definition Error.h:83
#define MATH_WARN_MSG(loc, str)
Definition Error.h:80
#define b(i)
Definition RSha256.hxx:100
#define a(i)
Definition RSha256.hxx:99
#define M_PI
Definition Rotated.cxx:105
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
double poisson_cdf(unsigned int n, double mu)
Cumulative distribution function of the Poisson distribution Lower tail of the integral of the poisso...
double crystalball_integral(double x, double alpha, double n, double sigma, double x0=0)
Integral of the not-normalized Crystal Ball function.
double uniform_cdf(double x, double a, double b, double x0=0)
Cumulative distribution function of the uniform (flat) distribution (lower tail).
double binomial_cdf_c(unsigned int k, double p, unsigned int n)
Complement of the cumulative distribution function of the Binomial distribution.
double lognormal_cdf(double x, double m, double s, double x0=0)
Cumulative distribution function of the lognormal distribution (lower tail).
double cauchy_cdf_c(double x, double b, double x0=0)
Complement of the cumulative distribution function (upper tail) of the Cauchy distribution which is a...
double fdistribution_cdf(double x, double n, double m, double x0=0)
Cumulative distribution function of the F-distribution (lower tail).
double binomial_cdf(unsigned int k, double p, unsigned int n)
Cumulative distribution function of the Binomial distribution Lower tail of the integral of the binom...
double landau_cdf(double x, double xi=1, double x0=0)
Cumulative distribution function of the Landau distribution (lower tail).
double lognormal_cdf_c(double x, double m, double s, double x0=0)
Complement of the cumulative distribution function of the lognormal distribution (upper tail).
double uniform_cdf_c(double x, double a, double b, double x0=0)
Complement of the cumulative distribution function of the uniform (flat) distribution (upper tail).
double fdistribution_cdf_c(double x, double n, double m, double x0=0)
Complement of the cumulative distribution function of the F-distribution (upper tail).
double crystalball_cdf_c(double x, double alpha, double n, double sigma, double x0=0)
Complement of the Cumulative distribution for the Crystal Ball distribution.
double normal_cdf_c(double x, double sigma=1, double x0=0)
Complement of the cumulative distribution function of the normal (Gaussian) distribution (upper tail)...
double chisquared_cdf(double x, double r, double x0=0)
Cumulative distribution function of the distribution with degrees of freedom (lower tail).
double negative_binomial_cdf_c(unsigned int k, double p, double n)
Complement of the cumulative distribution function of the Negative Binomial distribution.
double gamma_cdf_c(double x, double alpha, double theta, double x0=0)
Complement of the cumulative distribution function of the gamma distribution (upper tail).
double beta_cdf(double x, double a, double b)
Cumulative distribution function of the beta distribution Upper tail of the integral of the beta_pdf.
double crystalball_cdf(double x, double alpha, double n, double sigma, double x0=0)
Cumulative distribution for the Crystal Ball distribution function.
double negative_binomial_cdf(unsigned int k, double p, double n)
Cumulative distribution function of the Negative Binomial distribution Lower tail of the integral of ...
double breitwigner_cdf_c(double x, double gamma, double x0=0)
Complement of the cumulative distribution function (upper tail) of the Breit_Wigner distribution and ...
double normal_cdf(double x, double sigma=1, double x0=0)
Cumulative distribution function of the normal (Gaussian) distribution (lower tail).
double breitwigner_cdf(double x, double gamma, double x0=0)
Cumulative distribution function (lower tail) of the Breit_Wigner distribution and it is similar (jus...
double exponential_cdf_c(double x, double lambda, double x0=0)
Complement of the cumulative distribution function of the exponential distribution (upper tail).
double tdistribution_cdf(double x, double r, double x0=0)
Cumulative distribution function of Student's t-distribution (lower tail).
double beta_cdf_c(double x, double a, double b)
Complement of the cumulative distribution function of the beta distribution.
double poisson_cdf_c(unsigned int n, double mu)
Complement of the cumulative distribution function of the Poisson distribution.
double chisquared_cdf_c(double x, double r, double x0=0)
Complement of the cumulative distribution function of the distribution with degrees of freedom (upp...
double cauchy_cdf(double x, double b, double x0=0)
Cumulative distribution function (lower tail) of the Cauchy distribution which is also Lorentzian dis...
double tdistribution_cdf_c(double x, double r, double x0=0)
Complement of the cumulative distribution function of Student's t-distribution (upper tail).
double gamma_cdf(double x, double alpha, double theta, double x0=0)
Cumulative distribution function of the gamma distribution (lower tail).
double exponential_cdf(double x, double lambda, double x0=0)
Cumulative distribution function of the exponential distribution (lower tail).
double inc_gamma_c(double a, double x)
Calculates the normalized (regularized) upper incomplete gamma function (upper integral)
double inc_beta(double x, double a, double b)
Calculates the normalized (regularized) incomplete beta function.
double erfc(double x)
Complementary error function.
double inc_gamma(double a, double x)
Calculates the normalized (regularized) lower incomplete gamma function (lower integral)
double erf(double x)
Error function encountered in integrating the normal distribution.
double landau_xm1(double x, double xi=1, double x0=0)
First moment (mean) of the truncated Landau distribution.
double landau_xm2(double x, double xi=1, double x0=0)
Second moment of the truncated Landau distribution.
const Double_t sigma
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
Namespace for new Math classes and functions.
double expm1(double x)
exp(x) -1 with error cancellation when x is small
Definition Math.h:110
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
static const double kSqrt2
double gaussian_cdf_c(double x, double sigma=1, double x0=0)
Alternative name for same function.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
TMarker m
Definition textangle.C:8