STimeVariance.cc
Go to the documentation of this file.
1 #include <utl/Math.h>
2 #include <utl/AugerUnits.h>
3 #include <utl/MathConstants.h>
4 #include <utl/ErrorLogger.h>
5 #include <sdet/STimeVariance.h>
6 
7 using namespace utl;
8 using namespace sdet;
9 
10 
11 namespace sdet {
12 
13  inline
14  double
15  RelativeTrackLength(const double cosTheta)
16  {
17  const double kRadius = 1.8;
18  const double kHeight = 1.2;
19  const double sinTheta = sqrt(1 - Sqr(cosTheta));
20  return 1 / (cosTheta + 2*kHeight*sinTheta/(kPi*kRadius));
21  }
22 
23 
24  inline
25  double
26  MeanT50(const double cosTheta, const double distance)
27  {
28  // this form can produce fake minima in geometry fit
29  //return 0.8*nanosecond * (0.53*cosTheta - 0.11) * distance/meter;
30 
31  // alternative proposed by esteban but with better asymptotic behaviour
32  constexpr double delta = 20;
33  constexpr double p1 = delta * (-0.11);
34  constexpr double p2 = delta * 0.53;
35  const double p3 = p2 * cosTheta;
36  const double p4 = std::exp(p1 + p3);
37  constexpr double p5 = std::exp(0.1*delta);
38  const double fz = std::log(p4 + p5) / delta;
39  return (0.8*nanosecond/meter) * fz * distance;
40  }
41 
42 
43  inline
44  double
45  LimitT50(const double t50, const double cosTheta, const double distance)
46  {
47  // correction a la Xavier -- March 2009
48  const double limit = 0.5 * MeanT50(cosTheta, distance);
49  return (t50 < limit) ? limit : t50;
50  }
51 
52 
53  inline
54  double
55  VarianceForm2006(const double n, const double t50, const double a2, const double b2)
56  {
57  // C. Bonifazi, A. Letessier-Selvon: GAP2006-16
58  return a2 * Sqr(2*t50/n) * (n - 1) / (n + 1) + b2;
59  }
60 
61 
62  inline
63  double
64  VarianceForm2007(const double n, const double t50, const double tmin, const double a2, const double b2)
65  {
66  // M. Horvat, D. Veberic: GAP2007-057
67  return a2 * Sqr((t50 + tmin)/(n + 1)) * n / (n + 2) + b2;
68  }
69 
70 
71  inline
72  double
73  VarianceForm2012(const double n, const double t50, const double a2, const double b2)
74  {
75  // D. Harari, D. Melo, S. Mollerach, E. Roulet, and G. van Aar: GAP2012-145
76  return a2 * Sqr(2*t50/(n - 1)) * n / (n + 2) + b2;
77  }
78 
79 
80  double
81  STimeVariance::GetTimeSigma2(const double signal, const double t50, const double cosTheta, const double distance)
82  const
83  {
84  const double n = signal / RelativeTrackLength(cosTheta);
85 
86  switch (fModel) {
87  case eICRC2005:
88  return (600*nanosecond2 + 1.2*Sqr(t50/signal)) * (0.4 + 1.2*cosTheta);
89  case eGAP2006_016:
90  return VarianceForm2006(n, t50, 1, 147*nanosecond2);
91  case eNIMA:
92  return VarianceForm2006(n, t50, 0.99, 147*nanosecond2);
93  case eCDASv4r4:
94  return VarianceForm2007(n, t50, 15*nanosecond, 5, 134*nanosecond2);
95  case eGAP2007_057:
96  return VarianceForm2007((n < 2) ? 2 : n, t50, 10*nanosecond, 2.4, 134*nanosecond2);
97  case eCDASv4r6:
98  return VarianceForm2006((n < 2) ? 2 : n, t50, 0.36, 212*nanosecond2);
99  case eCDASv4r8:
100  {
101  const double dt = LimitT50(t50, cosTheta, distance);
102  // March 2009
103  const double a2 = 0.67612 + cosTheta*(0.16106 + cosTheta*(-0.47641));
104  const double b2 = (128 + cosTheta*(-184 + cosTheta*413)) * nanosecond2;
105  return VarianceForm2006((n < 2) ? 2 : n, dt, a2, b2);
106  }
107  case eCDASv5r0:
108  {
109  // GAP2018-048
110  const double dt = LimitT50(t50, cosTheta, distance);
111  const double a2 = 0.64871 + cosTheta*(0.22365 + cosTheta*(-0.49971));
112  const double b2 = (141.24 + cosTheta*(-208.90 + cosTheta*412.19)) * nanosecond2;
113  return VarianceForm2006((n < 2) ? 2 : n, dt, a2, b2);
114  }
115  case eGAP2012_145:
116  {
117  const double meanT50 = MeanT50(cosTheta, distance);
118  const double dt = (n < 4 && t50 < meanT50) ? meanT50 : t50;
119  // a and b are the same as in eCDASv5r0:
120  const double a2 = 0.64871 + cosTheta*(0.22365 + cosTheta*(-0.49971));
121  const double b2 = (141.24 + cosTheta*(-208.90 + cosTheta*412.19)) * nanosecond2;
122  return VarianceForm2012((n < 2) ? 2 : n, dt, a2, b2);
123  }
124  case eNone:
125  default:
126  ERROR("You should specify a TimeVariance model!");
127  return 0;
128  }
129  }
130 
131 }
double VarianceForm2012(const double n, const double t50, const double a2, const double b2)
constexpr T Sqr(const T &x)
double RelativeTrackLength(const double cosTheta)
double LimitT50(const double t50, const double cosTheta, const double distance)
constexpr double kPi
Definition: MathConstants.h:24
constexpr double nanosecond
Definition: AugerUnits.h:143
double MeanT50(const double cosTheta, const double distance)
constexpr double meter
Definition: AugerUnits.h:81
double VarianceForm2007(const double n, const double t50, const double tmin, const double a2, const double b2)
double VarianceForm2006(const double n, const double t50, const double a2, const double b2)
constexpr double nanosecond2
Definition: AugerUnits.h:144
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165

, generated on Tue Sep 26 2023.