1 #ifndef _utl_MuonArrivalTime_h_
2 #define _utl_MuonArrivalTime_h_
4 #include <utl/MathConstants.h>
5 #include <utl/PhysicalConstants.h>
6 #include <utl/AugerUnits.h>
7 #include <utl/Integrator.h>
9 #include <utl/NormalDistribution.h>
17 inline double pow(
const double x,
const unsigned int i) {
return std::pow(x,
int(i)); }
57 const double c = std::cos(theta);
59 const double pars1[] = { 5.682, -5.524, 9.180, -8.277, 2.797 };
62 const double pars2[] = { 0.03266, 0.456, -1.084, 1.199, -0.4366 };
65 const double pars3[] = { -0.01111, 0.2581, -0.7385, 3.362, -2.261 };
87 double result[4] = { 0, 0, 0, 0 };
90 for (
int i =
fStart; i < 20; ++i)
93 fSuper.GetIntegral(delta, i, i+1);
94 result[0] += delta[0];
95 result[1] += delta[1];
96 result[2] += delta[2];
97 result[3] += delta[3];
98 if (result[0] == 0)
fStart = i+1;
99 if (delta[0] < 1e-5*result[0])
break;
103 fMean = result[2]/result[1];
109 TimePDF(
const double t)
112 if (t <= 0)
return 0;
119 TimeCDF(
const double t)
122 if (t <= 0)
return 0;
123 const double lnt = std::log(t);
127 const double delta =
fTimeCDF.GetIntegral(i, i+1 < lnt ? i+1 : lnt);
129 if (delta < 1e-5*result)
break;
136 FirstTimePDF(
const double t,
const unsigned int nmuons)
139 if (nmuons <= 1)
return TimePDF(t);
140 return nmuons*
std::pow(1.0 - TimeCDF(t), nmuons-1)*TimePDF(t);
145 ApproximateTimePDF(
const double t)
148 if (t <= 0)
return 0;
155 ApproximateTimeCDF(
const double t)
158 if (t <= 0)
return 0;
165 ApproximateFirstTimePDF(
const double t,
const unsigned int nmuons)
168 if (nmuons <= 1)
return ApproximateTimePDF(t);
169 return nmuons*
std::pow(1.0 - ApproximateTimeCDF(t), nmuons-1)*ApproximateTimePDF(t);
173 GetApproximateMeanAndStDev(
double&
mean,
double&
stdev,
const unsigned int nmuon)
177 double result[2] = { 0, 0 };
182 result[0] += delta[0];
183 result[1] += delta[1];
184 if (delta[1] < 1e-5*result[1])
break;
195 PDF_dNdt_G(
const double t)
198 if (t <= 0)
return 0.0;
204 const double z0 = 0.5*(r*r/(c*t)-c*t);
206 if (z <= 0)
return 0.0;
208 const double dzdt = 0.5*(r*r/(c*t*t)+c);
212 const double lgZ = std::log10(z);
220 PDF_dNdt_E(
const double t)
223 if (t <= 0)
return 0.0;
226 const double z0 = zMean -
fDelta;
229 const double m2 = 0.011;
230 const double pk = 0.0002;
234 const double dEdt = 0.5*pk*x*1.0/
std::sqrt(1.0+2.0*m2/(pk*pk*x*c*t))*m2/(pk*pk*x*c*t*t);
241 PDF_dNdlgZ(
const double logz)
254 PDF_dNdE(
const double energy,
const double x,
const double r)
257 const double pk=0.0002;
262 return (1.0-r*r/(x*x))
271 EvalPoly(
const double x,
const int n,
const double* pars)
274 double result = pars[n-1];
275 for (
int i = 1; i < n; ++i)
278 result += pars[n-1-i];
310 const double t = std::exp(lnt);
327 const double t = std::exp(lnt);
334 result[3] = f*lnt*
lnt;
350 const double t = std::exp(lnt);
351 const double f =
fParent.ApproximateFirstTimePDF(t,
fNMuon)*t;
TimePDFArg(const MuonArrivalTime &parent)
utl::VectorIntegrator< ApproxMomentArg, 2 > fApproxMoment
return PDF_dNdE(energy, x, fR)*dEdt
utl::VectorIntegrator< SuperArg, 4 > fSuper
double operator()(const double lnt) const
Class for integration of functions with one independent parameter.
void SetThetaAndDistance(const double theta, const double distance)
setup model for given zenith angle and mean production distance
utl::Integrator< TimePDFArg > fTimePDF
double pow(const double x, const unsigned int i)
const MuonArrivalTime & fParent
return cosaDa *dNdz * dzdt
double operator()(const double t) const
double NormalPDF(const double x)
void operator()(double *result, const double lnt) const
ApproxMomentArg(const MuonArrivalTime &parent)
const MuonArrivalTime & fParent
double EvalPoly(const T &a, const double x)
Simple polynomial evaluator.
void SetTheta(const double theta)
setup of model for given zenith angle
void operator()(double *result, const double lnt) const
ApproxMomentArg fApproxMomentArg
all time delays are relative to arrival time of shower front plane
const MuonArrivalTime & fParent
constexpr double kSpeedOfLight
SuperArg(const MuonArrivalTime &parent)
utl::Integrator< TimeCDFArg > fTimeCDF
return std::exp(f1+f2)*erfc(f3+f4)/(2.0 *fLogLambda)
TimeCDFArg(const MuonArrivalTime &parent)
void SetCoordinates(const double r, const double delta)
const MuonArrivalTime & fParent