MuonTimeModel.h
Go to the documentation of this file.
1 #ifndef _utl_MuonTimeModel_h_
2 #define _utl_MuonTimeModel_h_
3 
4 #include <cmath>
5 
6 
7 namespace utl {
8  class TabulatedFunction;
9  class VRandomSampler;
10  class RandomEngine;
11 }
12 
13 
14 namespace utl {
15 
16  class MuonTimeModel {
17 
18  public:
19  MuonTimeModel(utl::RandomEngine& randomEngine,
20  const double theta = 0,
21  const double logE = 19,
22  const int primary = 1,
23  const bool flagAngularFactorDa_in = true);
24 
25  MuonTimeModel(utl::RandomEngine& randomEngine,
26  const double theta,
27  const utl::TabulatedFunction *LogzDist,
28  const bool flagAngularFactorDa_in = true,
29  const bool flagDecayFactor_in = true);
30 
32 
33  void Info();
34  void SetCoordinates(const double r, const double zeta); // zeta rad
35  void SetCoordinates(const double r, const double zeta, const double delta);
36 
37  double dNdz(const double z);
38  double e_logt(const double logt);
39  double g_logt(const double logt);
40  double TotaldNdlogt(const double logt);
41  double TotaldNdt(const double t);
42  double GetDeltaTime();
43 
44  double GetFirstTime(const int n = 1);
45  double GetTimes(const int n, double* const at);
46  double GetMeanTime(const int n = 1);
47  void GetFirstAndMeanTime(double& t_first, double& t_mean, const int n = 1);
48  double GetLastTime(const int n = 1);
49  void GetMeanAndRMSOfFirstTime(double& mean_t1,
50  double& rms_t1,
51  const int n = 1,
52  const int stats = 1000);
53 
54  private:
55  void UpdateModel();
56  void DefaultSettings();
57 
58  double L_Z(const double z) const { return sqrt(z*z + fR*fR); }
59 
61  //This function was not in the original model
62  //It was added to be able to use the PRODUCTION DISTRIBUTION h(z)
63  //instead of the PRODUCTION DISTRIBUTION at ground dN/dz
64  //depends on the flagDecayFactor
65  double DecayFactor_Z(double Z);
66  double cosaDa(double z);
67  double Z_t(double t);
68  double dZdt(double t);
69  double dNdlogz(double logz);
70 
71  double g_t(double t);
72 
73  double E(double t, double x);
74  double dEdt(double t, double x);
75  double dNdE(double E, double x);
76  double dNdlogE(double logE, double x);
77  double e_t(double t);
78 
79  // *****************************************************************
80  // L. Cazon parametric dN/dz model
81  //
82  double
83  GetParametricLogMean(const double cosTheta, const double /*logE*/,
84  const int /*primary*/)
85  const
86  {
87  return
88  +5.682 + cosTheta*(
89  -5.524 + cosTheta*(
90  +9.180 + cosTheta*(
91  -8.277 + cosTheta*(
92  +2.797))));
93  }
94 
95  double
96  GetParametricLogSigma(const double cosTheta, const double /*logE*/,
97  const int /*primary*/)
98  const
99  {
100  return
101  +0.03266 + cosTheta*(
102  +0.456 + cosTheta*(
103  -1.084 + cosTheta*(
104  +1.199 + cosTheta*(
105  -0.4366))));
106  }
107 
108  /*
109  void MuonTimeModel::GetParametricNorm(const double cosTheta,
110  const double logE,
111  const double primary) {
112  const double norm =
113  -3.673E5
114  +4.467E7 *cosTheta
115  -9.47E7 *cosTheta*cosTheta
116  +2.917E8 *cosTheta*cosTheta*cosTheta
117  -1.781E8 *cosTheta*cosTheta*cosTheta*cosTheta;
118  return norm;
119  }
120  */
121 
122  double
123  GetParametricLogLambda(const double cosTheta, const double /*logE*/,
124  const int /*primary*/)
125  const
126  {
127  const double logLambda =
128  -0.01111 + cosTheta*(
129  +0.2581 + cosTheta*(
130  -0.7385 + cosTheta*(
131  +3.362 + cosTheta*(
132  -2.261))));
133  if (logLambda < 0.03)
134  return 0.03;
135  return logLambda;
136  }
137 
138  // *******************************************************************
139  // Data members
140 
142 
145  static const double fgM2;
146  static const double fgPk;
147  static const double fgKappa;
148  static const double fgLambda;
149  static const double fgQ;
150  static const double fgGamma;
151 
152  // -- Basic shower parameters --
153  double fTheta;
154  double fCosTheta;
155  double fLogE;
156  int fPrimary;
157 
158  double fzMean;
159 
160  double fDelta;
161  double fR;
162  double fZeta;
163 
166 
169 
173 
174  double logstep_g;
175  double logstep_e;
176  double logt_g_up;
177  double logt_g_low;
178  double fLogt_e_up;
179  double fLogt_e_low;
180 
181  private:
182  // utility functions
183 
184  static void gser(double&, const double, const double, double&);
185  static void gcf(double&, const double, const double, double&);
186  static double GammaP(const double, const double);
187  static double GammaQ(const double, const double);
188  static double ErrFC(const double x);
189  static double ErrF(const double);
190 
191  };
192 
193 }
194 
195 
196 #endif
utl::TabulatedFunction * fLogzDist
static const double fgKappa
void GetFirstAndMeanTime(double &t_first, double &t_mean, const int n=1)
double dNdz(const double z)
double e_logt(const double logt)
static double ErrF(const double)
utl::VRandomSampler * fGRDKinematicalLogtDist
double dZdt(double t)
double GetParametricLogLambda(const double cosTheta, const double, const int) const
static void gcf(double &, const double, const double, double &)
Class to hold collection (x,y) points and provide interpolation between them.
double GetParametricLogSigma(const double cosTheta, const double, const int) const
Definition: MuonTimeModel.h:96
static const double fgLambda
double dEdt(double t, double x)
MuonTimeModel(utl::RandomEngine &randomEngine, const double theta=0, const double logE=19, const int primary=1, const bool flagAngularFactorDa_in=true)
double dNdE(double E, double x)
utl::VRandomSampler * fGRDGeometricalLogtDist
utl::RandomEngine & fRandomEngine
double GetMeanTime(const int n=1)
double GetLastTime(const int n=1)
double dNdlogz(double logz)
static const double fgGamma
static double ErrFC(const double x)
double g_logt(const double logt)
double GetParametricLogMean(const double cosTheta, const double, const int) const
Definition: MuonTimeModel.h:83
Wraps the random number engine used to generate distributions.
Definition: RandomEngine.h:27
static double GammaQ(const double, const double)
double GetFirstTime(const int n=1)
double cosaDa(double z)
double g_t(double t)
utl::TabulatedFunction * fKinematicalLogtDist
utl::TabulatedFunction * fGeometricalLogtDist
double TotaldNdt(const double t)
static const double fgQ
double L_Z(const double z) const
Definition: MuonTimeModel.h:58
static const double fgM2
double Z_t(double t)
double e_t(double t)
double TotaldNdlogt(const double logt)
static const double fgPk
double dNdlogE(double logE, double x)
double GetTimes(const int n, double *const at)
void GetMeanAndRMSOfFirstTime(double &mean_t1, double &rms_t1, const int n=1, const int stats=1000)
static void gser(double &, const double, const double, double &)
double E(double t, double x)
int stats
Definition: dump1090.h:293
static double GammaP(const double, const double)
Class to shoot random numbers given by a user-defined distribution function.
double DecayFactor_Z(double Z)
void SetCoordinates(const double r, const double zeta)

, generated on Tue Sep 26 2023.