18 static const double kSqrt2 = 1.41421356237309515;
72 MATH_ERROR_MSG(
"crystalball_cdf",
"CrystalBall cdf not defined for n <=1");
73 return std::numeric_limits<double>::quiet_NaN();
76 double abs_alpha = std::abs(alpha);
77 double C = n/abs_alpha * 1./(n-1.) *
std::exp(-alpha*alpha/2.);
79 double totIntegral = sigma*(C+D);
82 return (alpha > 0) ? 1. - integral/totIntegral : integral/totIntegral;
87 MATH_ERROR_MSG(
"crystalball_cdf_c",
"CrystalBall cdf not defined for n <=1");
88 return std::numeric_limits<double>::quiet_NaN();
90 double abs_alpha = std::abs(alpha);
91 double C = n/abs_alpha * 1./(n-1.) *
std::exp(-alpha*alpha/2.);
93 double totIntegral = sigma*(C+D);
96 return (alpha > 0) ? integral/totIntegral : 1. - (integral/totIntegral);
107 if (sigma == 0)
return 0;
110 MATH_ERROR_MSG(
"crystalball_integral",
"CrystalBall function not defined at alpha=0");
113 bool useLog = (n == 1.0);
114 if (n<=0)
MATH_WARN_MSG(
"crystalball_integral",
"No physical meaning when n<=0");
116 double z = (x-mean)/sigma;
117 if (alpha < 0 ) z = -
z;
119 double abs_alpha = std::abs(alpha);
128 const double oneoversqrt2 = 1./
sqrt(2.);
132 double B = n/abs_alpha - abs_alpha;
135 double C = (n/abs_alpha) * (1./(n-1)) *
std::exp(-alpha*alpha/2.);
136 intpow = C - A /(n-1.) *
std::pow(B-z,-n+1) ;
150 return sigma * (intgaus + intpow);
156 if ((x-x0) < 0)
return 1.0;
157 else return std::exp(- lambda * (x-x0));
163 if ((x-x0) < 0)
return 0.0;
172 if (n < 0 || m < 0)
return std::numeric_limits<double>::quiet_NaN();
174 double z = m/(m + n*(x-x0));
187 return std::numeric_limits<double>::quiet_NaN();
189 double z = n*(x-x0)/(m + n*(x-x0));
191 if (z > 0.9 && n > 1 && m > 1)
204 double gamma_cdf(
double x,
double alpha,
double theta,
double x0)
228 double z = (x-x0)/(sigma*kSqrt2);
236 double z = (x-x0)/(sigma*kSqrt2);
245 double sign = (p>0) ? 1. : -1;
253 double sign = (p>0) ? 1. : -1;
260 if ((x-x0) < a)
return 1.0;
261 else if ((x-x0) >= b)
return 0.0;
262 else return (b-(x-x0))/(b-
a);
268 if ((x-x0) < a)
return 0.0;
269 else if ((x-x0) >= b)
return 1.0;
270 else return ((x-x0)-a)/(b-
a);
279 double a = (double) n + 1.0;
288 double a = (double) n + 1.0;
297 if ( k >= n)
return 0;
298 double a = (double) k + 1.0;
299 double b = (double) n - k;
308 if ( k >= n)
return 1.0;
310 double a = (double) k + 1.0;
311 double b = (double) n - k;
321 if (p < 0 || p > 1)
return 0;
330 if ( n < 0)
return 0;
331 if ( p < 0 || p > 1)
return 0;
343 static double p1[5] = {0.2514091491e+0,-0.6250580444e-1, 0.1458381230e-1,-0.2108817737e-2, 0.7411247290e-3};
344 static double q1[5] = {1.0 ,-0.5571175625e-2, 0.6225310236e-1,-0.3137378427e-2, 0.1931496439e-2};
346 static double p2[4] = {0.2868328584e+0, 0.3564363231e+0, 0.1523518695e+0, 0.2251304883e-1};
347 static double q2[4] = {1.0 , 0.6191136137e+0, 0.1720721448e+0, 0.2278594771e-1};
349 static double p3[4] = {0.2868329066e+0, 0.3003828436e+0, 0.9950951941e-1, 0.8733827185e-2};
350 static double q3[4] = {1.0 , 0.4237190502e+0, 0.1095631512e+0, 0.8693851567e-2};
352 static double p4[4] = {0.1000351630e+1, 0.4503592498e+1, 0.1085883880e+2, 0.7536052269e+1};
353 static double q4[4] = {1.0 , 0.5539969678e+1, 0.1933581111e+2, 0.2721321508e+2};
355 static double p5[4] = {0.1000006517e+1, 0.4909414111e+2, 0.8505544753e+2, 0.1532153455e+3};
356 static double q5[4] = {1.0 , 0.5009928881e+2, 0.1399819104e+3, 0.4200002909e+3};
358 static double p6[4] = {0.1000000983e+1, 0.1329868456e+3, 0.9162149244e+3,-0.9605054274e+3};
359 static double q6[4] = {1.0 , 0.1339887843e+3, 0.1055990413e+4, 0.5532224619e+3};
361 static double a1[4] = {0 ,-0.4583333333e+0, 0.6675347222e+0,-0.1641741416e+1};
362 static double a2[4] = {0 , 1.0 ,-0.4227843351e+0,-0.2043403138e+1};
364 double v = (x - x0)/xi;
377 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*
v);
380 lan = (p2[0]+(p2[1]+(p2[2]+p2[3]*
v)*v)*
v)/(q2[0]+(q2[1]+(q2[2]+q2[3]*v)*
v)*v);
383 lan = (p3[0]+(p3[1]+(p3[2]+p3[3]*
v)*v)*
v)/(q3[0]+(q3[1]+(q3[2]+q3[3]*v)*
v)*v);
388 lan = (p4[0]+(p4[1]+(p4[2]+p4[3]*u)*u)*u)/(q4[0]+(q4[1]+(q4[2]+q4[3]*u)*u)*u);
393 lan = (p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/(q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
398 lan = (p6[0]+(p6[1]+(p6[2]+p6[3]*u)*u)*u)/(q6[0]+(q6[1]+(q6[2]+q6[3]*u)*u)*u);
403 lan = 1-(a2[1]+(a2[2]+a2[3]*u)*u)*u;
414 static double p1[5] = {-0.8949374280E+0, 0.4631783434E+0,-0.4053332915E-1,
415 0.1580075560E-1,-0.3423874194E-2};
416 static double q1[5] = { 1.0 , 0.1002930749E+0, 0.3575271633E-1,
417 -0.1915882099E-2, 0.4811072364E-4};
418 static double p2[5] = {-0.8933384046E+0, 0.1161296496E+0, 0.1200082940E+0,
419 0.2185699725E-1, 0.2128892058E-2};
420 static double q2[5] = { 1.0 , 0.4935531886E+0, 0.1066347067E+0,
421 0.1250161833E-1, 0.5494243254E-3};
422 static double p3[5] = {-0.8933322067E+0, 0.2339544896E+0, 0.8257653222E-1,
423 0.1411226998E-1, 0.2892240953E-3};
424 static double q3[5] = { 1.0 , 0.3616538408E+0, 0.6628026743E-1,
425 0.4839298984E-2, 0.5248310361E-4};
426 static double p4[4] = { 0.9358419425E+0, 0.6716831438E+2,-0.6765069077E+3,
428 static double q4[4] = { 1.0 , 0.7752562854E+2,-0.5637811998E+3,
430 static double p5[4] = { 0.9489335583E+0, 0.5561246706E+3, 0.3208274617E+5,
432 static double q5[4] = { 1.0 , 0.6028275940E+3, 0.3716962017E+5,
434 static double a0[6] = {-0.4227843351E+0,-0.1544313298E+0, 0.4227843351E+0,
435 0.3276496874E+1, 0.2043403138E+1,-0.8681296500E+1};
436 static double a1[4] = { 0, -0.4583333333E+0, 0.6675347222E+0,
438 static double a2[5] = { 0, -0.1958333333E+1, 0.5563368056E+1,
439 -0.2111352961E+2, 0.1006946266E+3};
441 double v = (x-x0)/xi;
446 xm1lan = v-u*(1+(a2[1]+(a2[2]+(a2[3]+a2[4]*u)*u)*u)*u)/
447 (1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
451 xm1lan = (p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*
v)*v)*
v)*v)/
452 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*
v)*v)*
v)*v);
456 xm1lan = (p2[0]+(p2[1]+(p2[2]+(p2[3]+p2[4]*
v)*v)*
v)*v)/
457 (q2[0]+(q2[1]+(q2[2]+(q2[3]+q2[4]*
v)*v)*
v)*v);
461 xm1lan = (p3[0]+(p3[1]+(p3[2]+(p3[3]+p3[4]*
v)*v)*
v)*v)/
462 (q3[0]+(q3[1]+(q3[2]+(q3[3]+q3[4]*
v)*v)*
v)*v);
467 xm1lan =
std::log(v)*(p4[0]+(p4[1]+(p4[2]+p4[3]*u)*u)*u)/
468 (q4[0]+(q4[1]+(q4[2]+q4[3]*u)*u)*u);
473 xm1lan =
std::log(v)*(p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/
474 (q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
481 xm1lan = (u+a0[0]+(-u+a0[1]+(a0[2]*u+a0[3]+(a0[4]*u+a0[5])*v)*
v)*v)/
482 (1-(1-(a0[2]+a0[4]*
v)*v)*
v);
484 return xm1lan*xi + x0;
494 static double p1[5] = { 0.1169837582E+1,-0.4834874539E+0, 0.4383774644E+0,
495 0.3287175228E-2, 0.1879129206E-1};
496 static double q1[5] = { 1.0 , 0.1795154326E+0, 0.4612795899E-1,
497 0.2183459337E-2, 0.7226623623E-4};
498 static double p2[5] = { 0.1157939823E+1,-0.3842809495E+0, 0.3317532899E+0,
499 0.3547606781E-1, 0.6725645279E-2};
500 static double q2[5] = { 1.0 , 0.2916824021E+0, 0.5259853480E-1,
501 0.3840011061E-2, 0.9950324173E-4};
502 static double p3[4] = { 0.1178191282E+1, 0.1011623342E+2,-0.1285585291E+2,
504 static double q3[4] = { 1.0 , 0.8614160194E+1, 0.3118929630E+2,
506 static double p4[5] = { 0.1030763698E+1, 0.1216758660E+3, 0.1637431386E+4,
507 -0.2171466507E+4, 0.7010168358E+4};
508 static double q4[5] = { 1.0 , 0.1022487911E+3, 0.1377646350E+4,
509 0.3699184961E+4, 0.4251315610E+4};
510 static double p5[4] = { 0.1010084827E+1, 0.3944224824E+3, 0.1773025353E+5,
512 static double q5[4] = { 1.0 , 0.3605950254E+3, 0.1392784158E+5,
514 static double a0[7] = {-0.2043403138E+1,-0.8455686702E+0,-0.3088626596E+0,
515 0.5821346754E+1, 0.4227843351E+0, 0.6552993748E+1,
517 static double a1[4] = { 0. ,-0.4583333333E+0, 0.6675347222E+0,
519 static double a2[4] = {-0.1958333333E+1, 0.5563368056E+1,-0.2111352961E+2,
521 static double a3[4] = {-1.0 , 0.4458333333E+1,-0.2116753472E+2,
524 double v = (x-x0)/xi;
530 (v/u+a2[0]*v+a3[0]+(a2[1]*v+a3[1]+(a2[2]*v+a3[2]+
531 (a2[3]*v+a3[3])*u)*u)*u)/
532 (1+(a1[1]+(a1[2]+a1[3]*u)*u)*u);
536 xm2lan = (p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*
v)*v)*
v)*v)/
537 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*
v)*v)*
v)*v);
541 xm2lan = (p2[0]+(p2[1]+(p2[2]+(p2[3]+p2[4]*
v)*v)*
v)*v)/
542 (q2[0]+(q2[1]+(q2[2]+(q2[3]+q2[4]*
v)*v)*
v)*v);
547 xm2lan = v*(p3[0]+(p3[1]+(p3[2]+p3[3]*u)*u)*u)/
548 (q3[0]+(q3[1]+(q3[2]+q3[3]*u)*u)*u);
553 xm2lan = v*(p4[0]+(p4[1]+(p4[2]+(p4[3]+p4[4]*u)*u)*u)*u)/
554 (q4[0]+(q4[1]+(q4[2]+(q4[3]+q4[4]*u)*u)*u)*u);
559 xm2lan = v*(p5[0]+(p5[1]+(p5[2]+p5[3]*u)*u)*u)/
560 (q5[0]+(q5[1]+(q5[2]+q5[3]*u)*u)*u);
565 v = 1/(u-u*(u+
log(u)-
v)/(u+1));
567 xm2lan = (1/v+u*u+a0[0]+a0[1]*u+(-u*u+a0[2]*u+a0[3]+
568 (a0[4]*u*u+a0[5]*u+a0[6])*v)*
v)/(1-(1-a0[4]*v)*
v);
570 if (x0 == 0)
return xm2lan*xi*xi;
572 return xm2lan*xi*xi + (2*xm1lan-x0)*x0;
double erf(double x)
Error function encountered in integrating the normal distribution.
double tdistribution_cdf(double x, double r, double x0=0)
Cumulative distribution function of Student's t-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...
static double p3(double t, double a, double b, double c, double d)
Namespace for new ROOT classes and functions.
double crystalball_cdf(double x, double alpha, double n, double sigma, double x0=0)
Cumulative distribution for the Crystal Ball distribution function.
double inc_beta(double x, double a, double b)
Calculates the normalized (regularized) incomplete beta function.
double negative_binomial_cdf_c(unsigned int k, double p, double n)
Complement of the cumulative distribution function of the Negative Binomial distribution.
double poisson_cdf(unsigned int n, double mu)
Cumulative distribution function of the Poisson distribution Lower tail of the integral of the poisso...
double poisson_cdf_c(unsigned int n, double mu)
Complement of the cumulative distribution function of the Poisson distribution.
double binomial_cdf_c(unsigned int k, double p, unsigned int n)
Complement of the cumulative distribution function of the Binomial distribution.
static const double kSqrt2
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 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)...
#define MATH_WARN_MSG(loc, str)
double landau_xm1(double x, double xi=1, double x0=0)
First moment (mean) of the truncated Landau distribution.
double lognormal_cdf(double x, double m, double s, double x0=0)
Cumulative distribution function of the lognormal distribution (lower tail).
double erfc(double x)
Complementary error function.
double inc_gamma_c(double a, double x)
Calculates the normalized (regularized) upper incomplete gamma function (upper integral) ...
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 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 normal_cdf(double x, double sigma=1, double x0=0)
Cumulative distribution function of the normal (Gaussian) distribution (lower tail).
static double p2(double t, double a, double b, double c)
double pow(double, double)
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 uniform_cdf(double x, double a, double b, double x0=0)
Cumulative distribution function of the uniform (flat) distribution (lower tail). ...
#define MATH_ERROR_MSG(loc, str)
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 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 landau_cdf(double x, double xi=1, double x0=0)
Cumulative distribution function of the Landau distribution (lower tail).
double landau_xm2(double x, double xi=1, double x0=0)
Second moment of the truncated Landau distribution.
double exponential_cdf_c(double x, double lambda, double x0=0)
Complement of the cumulative distribution function of the exponential distribution (upper tail)...
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 expm1(double x)
exp(x) -1 with error cancellation when x is small
static double p1(double t, double a, double b)
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 tdistribution_cdf_c(double x, double r, double x0=0)
Complement of the cumulative distribution function of Student's t-distribution (upper tail)...
double gaussian_cdf_c(double x, double sigma=1, double x0=0)
Alternative name for same function.
static constexpr double s
Namespace for new Math classes and functions.
double beta_cdf_c(double x, double a, double b)
Complement of the cumulative distribution function of the beta distribution.
you should not use this method at all Int_t Int_t z
double gamma_cdf(double x, double alpha, double theta, double x0=0)
Cumulative distribution function of the gamma distribution (lower tail).
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 crystalball_integral(double x, double alpha, double n, double sigma, double x0=0)
Integral of the not-normalized Crystal Ball function.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
double chisquared_cdf(double x, double r, double x0=0)
Cumulative distribution function of the distribution with degrees of freedom (lower tail)...
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 inc_gamma(double a, double x)
Calculates the normalized (regularized) lower incomplete gamma function (lower integral) ...
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 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 exponential_cdf(double x, double lambda, double x0=0)
Cumulative distribution function of the exponential distribution (lower tail).