OpticalHalo.cc
Go to the documentation of this file.
1 #include <utl/AugerUnits.h>
2 #include <utl/TabularStream.h>
3 #include "OpticalHalo.h"
4 
5 #include <cmath>
6 #include <iostream>
7 
8 using namespace std;
9 using namespace utl;
10 using namespace FdProfileReconstructorKG;
11 
12 
13 OpticalHalo::OpticalHalo(EHaloType type) :
14  fHaloType(type)
15 { }
16 
17 
18 double
19 OpticalHalo::GetHaloFraction(const double zeta, const double age, const double dist)
20  const
21 {
22  switch (fHaloType) {
23  case eNone:
24  return 1;
25  case eFlasher2005:
26  return Flasher2005Fraction(zeta, age, dist);
27  case eFlasher2008:
28  return Flasher2008Fraction(zeta, age, dist);
29  case eSpotGroup:
30  return SpotGroupFraction(zeta, age, dist);
31  case eSpotGroup2:
32  return SpotGroupFraction2(zeta, age, dist);
33  }
34 
35  return 1;
36 }
37 
38 
39 double
40 OpticalHalo::Flasher2005Fraction(const double zetaAngle, const double /*age*/, const double /*dist*/)
41  const
42 {
43  const double p = 9.30207e-01;
44  const double zeta_1 = 2.26745e-01;
45  const double zeta_2 = 2.90549e+00;
46  const double gamma = 1.48972e+00;
47  const double zeta = zetaAngle/degree;
48 
49  const double f1 = p * (1 - exp(-zeta/zeta_1));
50  const double f2 = (1 - p) * (1 - exp(-pow(zeta/zeta_2, gamma)));
51 
52  return f1 + f2;
53 }
54 
55 
56 double
57 OpticalHalo::Flasher2008Fraction(const double zetaAngle, const double age, const double dist)
58  const
59 {
60  // Flasher2008 analysis only valid above 1.4 degree
61  const unsigned int n = 21;
62  const double angles[n] = {
63  1.4, 1.5, 1.6, 1.7, 1.8,
64  1.9, 2, 3, 4, 5,
65  6, 7, 8, 9, 12,
66  15, 18, 21, 24, 27, 30
67  };
68 
69  const double cumulative[n] = {
70  0.859170, 0.861439, 0.863476,
71  0.865431, 0.867303, 0.869093,
72  0.870800, 0.883968, 0.892440,
73  0.898886, 0.904640, 0.910163,
74  0.915655, 0.921485, 0.937852,
75  0.953002, 0.966389, 0.977545,
76  0.986638, 0.994117, 1.000000
77  };
78 
79  const double zeta = zetaAngle / degree;
80 
81  if (zeta < angles[0]) {
82  const double norm = cumulative[0] / Flasher2005Fraction(angles[0], age, dist);
83  return Flasher2005Fraction(zetaAngle, age, dist) * norm;
84  } else if (zeta > angles[n-1])
85  return 1;
86  else {
87 
89  for (unsigned int i = 0; i < n; ++i)
90  fFlasher2008Table.PushBack(angles[i], cumulative[i]);
91  }
92 
93  return fFlasher2008Table.Y(zeta);
94 
95  }
96 }
97 
98 
99 double
100 OpticalHalo::SpotGroupFraction(const double zetaAngle,
101  const double /*age*/,
102  const double /*dist*/)
103  const
104 {
105  const double zeta = zetaAngle / degree;
106 
107  const double par[4] = { 0.738, 0.0308, 0.818, 0.643 };
108 
109  const double zeta0 = 0.7;
110  const double norm1 = par[0] * (1 - exp(-zeta0/par[1]));
111  const double norm2 = (1 - par[0]) * (1 - exp(-pow(zeta0/par[2], par[3])));
112  const double norm = 1 - norm1 - norm2;
113 
114  const double f1 = par[0] * (1 - exp(-zeta/par[1]));
115  const double f2 = (1 - par[0]) * (1 - exp(-pow(zeta/par[2], par[3])));
116  const double f = 0.15 * (1 - f1 - f2);
117 
118  return 1 - f / norm;
119 }
120 
121 
122 double
123 OpticalHalo::SpotGroupFraction2(const double zetaAngle,
124  const double age,
125  const double dist)
126  const
127 {
128  const double zeta = zetaAngle / degree;
129  const double maxDistance = 30 * km;
130  const double d = fmin(dist, maxDistance) / km;
131 
132  // zeta --> ZetaOpt in degrees
133  // d --> FD-shower distance in kms
134  // age --> shower age
135 
136  const double x10 = d - 10;
137  const double x10Squared = x10 * x10;
138 
139  const double a0 = 18.269707 - x10 * 0.539974 + x10Squared * 0.007218;
140  const double a1 = (0.192196 + x10 * 0.007970 + x10Squared * 0.005581) *
141  exp(-0.001762 * x10Squared);
142 
143  const double b0 = 5.251938 - x10 * 0.294560;
144  const double b1 = 1.245041 - x10 * 0.129958;
145  const double b2 = -0.666616 + x10 * 0.067478;
146 
147  const double z1 = zeta - 1;
148  const double p0 = a0 * exp(-a1 * z1) / (1 + 2 * z1);
149  const double p1 = (b0 + b1 * z1 + b2 * pow(z1, 2)) * exp(-z1);
150 
151  if (p1 < 0) {
152  const double lightExcess = p0;
153  return (lightExcess < 0) ? 1 : 1 - lightExcess / 100;
154  } else {
155  const double lightExcess = p0 + (age - 1) / 0.2 * p1;
156  return (lightExcess < 0) ? 1 : 1 - lightExcess / 100;
157  }
158 
159  /*
160  // nOutside / nInside
161  const double lightExcess = fmax(p1 < 0 ? p0 : p0 + (age - 1) / 0.2 * p1, 0) / 100;
162 
163  // nOutSide / (nOutside + nInside) = 1 / (1 + nOutside / nInside)
164  return 1 / (1 + lightExcess);
165  */
166 
167 }
168 
169 void
171  const
172 {
173  TabularStream tab("|.|.|.|.|.|");
174  tab << hline
175  << " zeta " << endc
176  << " Flasher2005 " << endc
177  << " Flasher2008 " << endc
178  << " SpotGroup " << endc
179  << " SpotGroup2 " << endr
180  << hline;
181 
182  for (double dist = 1000; dist < 1.8; dist += 500)
183  for (double age = 0.7; age < 1.8; age += 0.1)
184  for (double zeta = 0.5*degree; zeta < 10*degree; zeta += 0.5*degree)
185  tab << zeta / degree << endc
186  << Flasher2005Fraction(zeta, age, dist) << endc
187  << Flasher2008Fraction(zeta, age, dist) << endc
188  << SpotGroupFraction(zeta, age, dist) << endc
189  << SpotGroupFraction2(zeta, age, dist) << endr;
190  tab << hline;
191  cout << "\n" << tab << endl;
192 }
unsigned int GetNPoints() const
double Flasher2008Fraction(const double zeta, const double age, const double dist) const
Definition: OpticalHalo.cc:57
const double degree
double SpotGroupFraction(const double zeta, const double age, const double dist) const
Definition: OpticalHalo.cc:100
utl::TabulatedFunction fFlasher2008Table
Definition: OpticalHalo.h:47
void PushBack(const double x, const double y)
double Flasher2005Fraction(const double zet, const double age, const double dist) const
Definition: OpticalHalo.cc:40
double pow(const double x, const unsigned int i)
double GetHaloFraction(const double zeta, const double age, const double dist) const
Definition: OpticalHalo.cc:19
const EndRow endr
const int tab
Definition: SdInspector.cc:35
const double km
class to format data in tabular form
double norm(utl::Vector x)
double SpotGroupFraction2(const double zeta, const double age, const double dist) const
Definition: OpticalHalo.cc:123
double Y(const double x) const
Get or interpolate the Y value that corresponds to parameter x.
const HLine hline('-')
const EndColumn endc

, generated on Tue Sep 26 2023.