21 #include <Math/PdfFuncMathCore.h>
22 #include <Math/ProbFuncMathCore.h>
23 #include <Math/QuantFuncMathCore.h>
25 using namespace GeomAsymNS;
30 if (DetectorType < 0 || DetectorType > 2) {
31 printf(
"GeomAsym: Wrong Detector Type %d \n", DetectorType);
47 return ROOT::Math::gamma_cdf(x, alpha, beta, 0.);
54 return ROOT::Math::gamma_quantile(q, alpha, beta);
65 if (ipar < 0 || ipar >
nPar)
68 const double* par = 0;
76 printf(
"unknown combination");
80 const double r_km = r / 1e5;
81 const double val0km = par[0];
82 const double val1km = par[1];
83 const double B = par[2];
85 const double C = (val1km - val0km) / (exp(-B) - 1);
86 const double A = val0km - C;
88 double val = A + C * exp(-B * r_km);
98 if (icomp < 0 || icomp > 3)
106 return (valDX1 + valDX0) / 2.;
108 double DX0 =
DX_Eval[icomp][0];
109 double DX1 =
DX_Eval[icomp][1];
111 double X = (DX - DX0) / (DX1 - DX0);
112 double C = (valDX1 - valDX0) / (exp(-1.) - 1.0);
113 double A = valDX0 - C;
114 double pz_mean = A + C * exp(-X);
132 if (ipar < 0 || ipar >
nPar)
135 const double* par = 0;
143 double r_km = r / 1.e5;
144 double val0km = par[0];
145 double val1km = par[1];
148 double C = (val1km - val0km) / (exp(-B) - 1.0);
149 double A = val0km - C;
151 double val = A + C * exp(-B * r_km);
161 if (icomp < 0 || icomp > 3)
169 double DX0 =
DX_Eval[icomp][0];
170 double DX1 =
DX_Eval[icomp][1];
172 double X = (DX - DX0) / (DX1 - DX0);
173 double C = (valDX1 - valDX0) / (exp(-1.) - 1.0);
174 double A = valDX0 - C;
175 double pz_rms = A + C * exp(-X);
193 const double r_km = r / 1e5;
195 const double* par = 0;
204 printf(
"unknow combination\n");
207 }
else if (ipar == 1) {
215 printf(
"unknown combination\n");
218 }
else if (ipar == 2) {
226 printf(
"unknown combination\n");
234 const bool UseCte = ((
fDetectorType == 0 && ipar == 2 && icomp > 0) ||
236 (
fDetectorType == 1 && ipar == 0 && !(icomp > 0 && itheta == 0)) ||
238 (
fDetectorType == 1 && ipar == 2 && !(icomp > 0 && itheta == 0)));
247 double C = (y1 - y0) / (exp(-B) - 1.0);
250 val = A + C * exp(-B * r_km);
259 double cthetaEval[2] = { 0.3, 0.6 };
261 double x = 1 - ctheta_p;
262 double x0 = 1 - cthetaEval[0];
263 double x1 = 1 - cthetaEval[1];
269 val = 1 + x * (y0 - 1) / x0;
275 double b = ((y1 - 1) / x1 - (y0 - 1) / x0) / (x1 - x0);
276 double a = (y0 - 1 - x0 * x0 *
b) / x0;
278 val = 1 + x * a + x * x *
b;
297 for (
int itheta = 0; itheta < 2; itheta++) {
315 double C = (p1 - p0) / (exp(-B) - 1.0);
318 par[itheta] = A + C * exp(-B * x);
321 double TmodAmod =
GetTmodAmod(ctheta_p, par, icomp);
323 TmodAmod *= ctheta_p;
338 double r_km = r / 1e5;
340 const double* par = 0;
348 printf(
"unknown combination\n");
356 double C = (y1 - y0) / (exp(-B) - 1);
359 double val = A + C * exp(-B * r_km);
367 if (pz > 1 || pz < -1)
369 const double ARad =
GetARad(r, icomp);
370 const double cosTheta_p = pz * cos(theta) + ARad *
sqrt(1 - pz * pz) * sin(theta) * cos(psi);
383 if (fabs(psi - M_PI / 2) < 1e-5 * 180 / M_PI)
384 return cut / cos(theta);
386 const double ARad =
GetARad(r, icomp);
387 const double alpha = sin(theta) * cos(psi) * ARad;
388 const double a = cos(theta) * cos(theta) + alpha * alpha;
389 const double b = -2*cut * cos(theta);
390 const double c = (cut * cut - alpha * alpha);
392 double d = b * b - 4*a *
c;
397 pz_cut = (-b -
sqrt(d)) / 2 / a;
399 pz_cut = (-b +
sqrt(d)) / 2 / a;
417 const double A =
gamma_cdf(1 - pz0, alpha + 1, beta) -
gamma_cdf(1 - pz1, alpha + 1, beta);
418 const double pz = 1 - alpha * beta * A / B;
430 const double pz_mean =
GetPzMean(DX, r, icomp);
431 const double pz_variance =
pow(
GetPzRMS(DX, r, icomp), 2.);
435 const double beta = pz_variance / (1 - pz_mean);
436 const double alpha = (1 - pz_mean) * (1 - pz_mean) / pz_variance;
437 const double I0 =
gamma_cdf(2, alpha, beta);
440 double pz_cut =
GetPzCut(r, theta, psi, icomp);
443 const double fshadow =
gamma_cdf(1 - pz_cut, alpha, beta) / I0;
457 return GetGeomAsym(DX, r, theta, psi, icomp, nSteps);
470 const double pz_mean =
GetPzMean(DX, r, icomp);
471 const double pz_variance =
pow(
GetPzRMS(DX, r, icomp), 2.);
475 const double beta = pz_variance / (1 - pz_mean);
476 const double alpha = (1 - pz_mean) * (1 - pz_mean) / pz_variance;
477 const double I0 =
gamma_cdf(2, alpha, beta);
480 const double pz_cut =
GetPzCut(r, theta, psi, icomp);
482 double cdf[2], pz[2];
484 cdf[0] =
gamma_cdf(1 - pz[0], alpha, beta) / I0;
486 double cdfStep = cdf[0] / double(nSteps);
489 cdf[1] = cdf[0] - cdfStep;
494 cdfStep = cdf[0] / double(nSteps);
501 for (
int istep = 0; istep < nSteps; ++istep) {
508 cdf[1] = cdf[0] - cdfStep;
517 const double ctheta_p =
GetCosTheta_p(pzBin, r, theta, psi, icomp);
518 const double AmodTmod =
GetTmodAmod(ctheta_p, pzBin , r, icomp);
519 val += ((cdf[0] - cdf[1]) * AmodTmod);
const double parR2_MD[4][2][3]
double GetCosTheta_p(double pz, double r, double theta, double psi, int icomp)
const double parPzRMS_MD[2][4][3]
const double ARadPar_MD[4][3]
double GetGeomAsym(double DX, double r, double theta, double psi, int icomp)
const double PzEval[4][2]
double GetTmodAmod_Par_i(double r, int itheta, int icomp, int ipar)
GeomAsym(int DetectorType)
const double ARadPar_Scin[4][3]
double pow(const double x, const unsigned int i)
const double parPzMean_WCD[2][4][3]
double GetPzCut(double r, double theta, double psi, int icomp)
double GetTmodAmod(double ctheta_p, double *par, int icomp)
double GetPzMean(double DX, double r, int icomp)
double gamma_cdf(double x, double alpha, double beta)
const double parR1_WCD[4][2][3]
const double parR0_WCD[4][2][3]
double GetPzRMS(double DX, double r, int icomp)
const double parR1_Scin[4][2][3]
const double parR0_MD[4][2][3]
double GetARad(double r, int icomp)
const double ctheta_pCut[3]
const double parPzMean_MD[2][4][3]
const double parR2_Scin[4][2][3]
const double parR1_MD[4][2][3]
const double parPzRMS_Scin[2][4][3]
const double DX_Eval[4][2]
const double parPzMean_Scin[2][4][3]
const double parPzRMS_WCD[2][4][3]
double GetPzMeanRange(double alpha, double beta, double pz0, double pz1)
double gamma_quantile(double x, double alpha, double beta)
double GetShadow(double DX, double r, double theta, double psi, int icomp)
double GetPzRMSPar(double r, int icomp, int ipar)
double GetPzMeanPar(double r, int icomp, int ipar)
const double ARadPar_WCD[4][3]
const double parR0_Scin[4][2][3]
const double parR2_WCD[4][2][3]