Keilhauer2008FluorescenceModel.cc
Go to the documentation of this file.
1 
9 #include <utl/TabulatedFunction.h>
10 #include <utl/Reader.h>
11 #include <utl/ErrorLogger.h>
12 #include <utl/MathConstants.h>
13 #include <utl/PhysicalConstants.h>
14 #include <fwk/CentralConfig.h>
15 #include <det/Detector.h>
16 #include <atm/Atmosphere.h>
17 #include <atm/ProfileResult.h>
18 #include <atm/Keilhauer2008FluorescenceModel.h>
19 
20 using namespace utl;
21 using namespace atm;
22 using namespace fwk;
23 using namespace std;
24 
25 
26 void
28 {
29  Branch topB =
30  CentralConfig::GetInstance()->GetTopBranch("Keilhauer2008FluorescenceModel");
31 
32  string tempParam, HumParam;
33 
34  topB.GetChild("collisionalCrossSection").GetData(tempParam);
35  if (tempParam == "eAIRFLY")
36  fTempParam = eAIRFLY;
37  else if (tempParam == "eNONE")
38  fTempParam = eNoTempParam;
39  else {
40  ERROR("Parametrization not implemented");
42  }
43 
44  topB.GetChild("humidity").GetData(HumParam);
45  if (HumParam == "eMorozov")
46  fHumParam = eMorozov;
47  else if (HumParam == "eTilo")
48  fHumParam = eTilo;
49  else if (HumParam == "eNONE")
50  fHumParam = eNoHumParam;
51  else {
52  ERROR("Parametrization not implemented");
54  }
55 
56  const int nWaveLength = 23;
57  double wavelength[nWaveLength] =
58  {
59  3117*angstrom, 3136*angstrom,3159*angstrom,3285*angstrom,
60  3309*angstrom, 3339*angstrom,3371*angstrom,3469*angstrom,
61  3500*angstrom, 3537*angstrom,3577*angstrom,3672*angstrom,
62  3711*angstrom, 3756*angstrom,3805*angstrom,3894*angstrom,
63  3914*angstrom, 3943*angstrom,3998*angstrom,4059*angstrom,
64  4141*angstrom, 4201*angstrom,4270*angstrom
65  };
66 
67  for (int i = 0; i < nWaveLength; ++i)
68  fWavelength.push_back(wavelength[i]);
69 }
70 
71 
72 const
74 Keilhauer2008FluorescenceModel::EvaluateFluorescenceYield(const double heightAboveSeaLevel)
75  const
76 {
77 
78  const Atmosphere& atmo = det::Detector::GetInstance().GetAtmosphere();
79  const ProfileResult& pressureProfile = atmo.EvaluatePressureVsHeight();
80  const ProfileResult& tempProfile = atmo.EvaluateTemperatureVsHeight();
81  const ProfileResult& densityProfile = atmo.EvaluateDensityVsHeight();
82  const ProfileResult& pvaporProfile = atmo.EvaluateVaporPressureVsHeight();
83  const double pressure = pressureProfile.Y(heightAboveSeaLevel);
84  const double temperature = tempProfile.Y(heightAboveSeaLevel);
85  const double density = densityProfile.Y(heightAboveSeaLevel);
86  const double vaporPressure = pvaporProfile.Y(heightAboveSeaLevel);
87 
88  fFluorescenceSpectrum.Clear();
89 
90  const unsigned int nWaveLength=23;
91  const double sigma_nn[nWaveLength]={1.2e-19*m2 ,8.8e-20*m2 ,3.77e-20*m2,1.2e-19*m2,
92  8.8e-20*m2 ,3.77e-20*m2,1.82e-20*m2,1.2e-19*m2,
93  8.8e-20*m2 ,3.77e-20*m2,1.82e-20*m2,1.2e-19*m2,
94  8.8e-20*m2 ,3.77e-20*m2,1.82e-20*m2,1.2e-19*m2,
95  4.37e-19*m2,8.8e-20*m2 ,3.77e-20*m2,1.82e-20*m2,
96  1.2e-19*m2 ,8.8e-20*m2 ,3.77e-20*m2};
97 
98  const double sigma_no[nWaveLength]={8.e-19*m2 ,7.e-19*m2,5.e-19*m2,8.e-19*m2,7.0e-19*m2,
99  5.e-19*m2,2.1e-19*m2,8.e-19*m2,7.e-19*m2,5.0e-19*m2,
100  2.1e-19*m2,8.e-19*m2,7.e-19*m2,5.e-19*m2,2.1e-19*m2,
101  8.e-19*m2,13.e-19*m2,7.e-19*m2,5.e-19*m2,2.1e-19*m2,
102  8.e-19*m2 ,7.e-19*m2,5.e-19*m2};
103 
104 
105  const double eff[nWaveLength]={0.005*percent*percent,0.029*percent,0.05*percent,0.0154*percent,0.002*percent,
106  0.0041*percent,0.082*percent,0.0063*percent,0.004*percent,0.029*percent,
107  0.0615*percent,0.0046*percent,0.01*percent,0.0271*percent,0.0213*percent,
108  0.003*percent,0.33*percent,0.0064*percent,0.016*percent,0.0067*percent,
109  0.0017*percent,0.0046*percent,0.0035*percent};
110 
111  const double tau[nWaveLength]={6.65e-8*s,4.45e-8*s,4.17e-8*s,6.65e-8*s,4.45e-8*s,4.17e-8*s,
112  4.17e-8*s,6.65e-8*s,4.45e-8*s,4.17e-8*s,4.17e-8*s,6.65e-8*s,
113  4.45e-8*s,4.17e-8*s,4.17e-8*s,6.65e-8*s,6.58e-8*s,4.45e-8*s,
114  4.17e-8*s,4.17e-8*s,6.65e-8*s,4.45e-8*s,4.17e-8*s};
115 
116 
117  const double alphaAirfly[nWaveLength]={0.,-0.09,-0.21,0.,-0.09,-0.21,-0.36,0.,-0.09,-0.21,-0.36,0.,
118  -0.09,-0.21,-0.36,0.,-0.8,-0.09,-0.21,-0.36,0.,-0.09,-0.21};
119  const double alphaNone[nWaveLength]={0.,0.,0.,0.,0.,0.,0.,0.,0.,
120  0.,0.,0.,0.,0.,0.,0.,0.,0.,
121  0.,0.,0.,0.,0.};
122 
123  const double * alpha = (fTempParam == eAIRFLY) ? alphaAirfly : alphaNone;
124 
125  const double sigma_nvMorozov[nWaveLength]={0.*m2,0.*m2,8.91e-19*m2,0.*m2,0.*m2,8.91e-19*m2,
126  9.45e-19*m2,0.*m2,0.*m2,8.91e-19*m2,9.45e-19*m2,
127  0.*m2,0.*m2,8.91e-19*m2,9.45e-19*m2,0.*m2,0.*m2,
128  0.*m2,8.91e-19*m2,9.45e-19*m2,0.*m2,0.*m2,8.91e-19*m2};
129  const double sigma_nvTilo[nWaveLength]={0.*m2,0.*m2,7.71e-19*m2,0.*m2,0.*m2,7.71e-19*m2,
130  7.25e-19*m2,0.*m2,0.*m2,7.71e-19*m2,7.25e-19*m2,
131  0.*m2,0.*m2,7.71e-19*m2,7.25e-19*m2,0.*m2,0.*m2,
132  0.*m2,7.71e-19*m2,7.25e-19*m2,0.*m2,0.*m2,7.71e-19*m2};
133  const double sigma_nvNone[nWaveLength]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
134  0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
135 
136  const double * sigma_nv = (fHumParam == eMorozov) ?
137  sigma_nvMorozov :
138  (fHumParam == eTilo) ?
139  sigma_nvTilo : sigma_nvNone;
140 
141  // Get water vapor pressure, then calculate the H20, N2, O2 volume fractions.
142  const double volV = vaporPressure / pressure;
143  const double volN = (1. - volV) * kN2AirFraction;
144  const double volO = (1. - volV) * kO2AirFraction;
145 
146  const double preFactor = pressure*kAvogadro / (kMolarGasConstant*temperature)
147  * sqrt(kBoltzmann*temperature * kAvogadro / kPi);
148 
149  for (unsigned int iwl = 0; iwl < nWaveLength; ++iwl)
150  {
151  const double snn = sigma_nn[iwl] * pow(293 * kelvin, -alpha[iwl]);
152  const double sno = sigma_no[iwl] * pow(293 * kelvin, -alpha[iwl]);
153 
154  const double nnQuenching = 4 * volN * snn * pow(temperature, alpha[iwl])
155  * sqrt(1/kN2MolarMass);
156  const double noQuenching = 2 * volO * sno * pow(temperature, alpha[iwl])
157  * sqrt(2 * (1 / kN2MolarMass + 1 / kO2MolarMass));
158  const double nvQuenching = 2 * volV * sigma_nv[iwl]
159  * sqrt(2 * (1 / kN2MolarMass + 1 / kH2OMolarMass));
160  const double pOverpPrime = tau[iwl] * preFactor
161  * (nnQuenching + noQuenching + nvQuenching);
162 
163  const double deff = eff[iwl] / (1 + pOverpPrime);
164  const double dscn = deff * fWavelength[iwl] / (kPlanck * kSpeedOfLight);
165 
166  const double fluorescenceYield = dscn * GetdEdX0() * density;
167 
168  fFluorescenceSpectrum.PushBack(fWavelength[iwl], fluorescenceYield);
169  }
170 
171  return fFluorescenceSpectrum;
172 }
173 
174 
175 double
176 Keilhauer2008FluorescenceModel::GetdEdX0()
177  const
178 {
179  // Energy loss evaluated for an electron of .85 MeV
180  return 1.675*MeV/(g/cm/cm);
181 }
182 
183 const std::vector<double>&
184 Keilhauer2008FluorescenceModel::GetWavelengths() const{
185 
186  return fWavelength;
187 
188 }
189 
190 
191 // Configure (x)emacs for this file ...
192 // Local Variables:
193 // mode: c++
194 // compile-command: "make -C .. -k"
195 // End:
Branch GetTopBranch() const
Definition: Branch.cc:63
Top of the interface to Atmosphere information.
constexpr double kO2MolarMass
constexpr double kPlanck
Class to hold collection (x,y) points and provide interpolation between them.
const atm::ProfileResult & EvaluatePressureVsHeight() const
Tabulated function giving Y=air pressure as a function of X=height.
const atm::ProfileResult & EvaluateDensityVsHeight() const
Tabulated function giving Y=density as a function of X=height.
constexpr double percent
Definition: AugerUnits.h:283
void Init()
Initialise the registry.
constexpr double m2
Definition: AugerUnits.h:122
Base class for exceptions trying to access non-existing components.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
constexpr double kN2AirFraction
double pow(const double x, const unsigned int i)
double Y(const double x) const
Get the Y value (coordinate) for given X (ordinate)
constexpr double MeV
Definition: AugerUnits.h:184
Class representing a document branch.
Definition: Branch.h:107
constexpr double s
Definition: AugerUnits.h:163
constexpr double kAvogadro
Class describing the Atmospheric profile.
Definition: ProfileResult.h:25
constexpr double kPi
Definition: MathConstants.h:24
constexpr double g
Definition: AugerUnits.h:200
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
constexpr double kN2MolarMass
constexpr double kelvin
Definition: AugerUnits.h:259
constexpr double kH2OMolarMass
constexpr double kSpeedOfLight
constexpr double kMolarGasConstant
constexpr double kBoltzmann
constexpr double kO2AirFraction
constexpr double cm
Definition: AugerUnits.h:117
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
const atm::ProfileResult & EvaluateVaporPressureVsHeight() const
Tabulated function giving Y=H20 vapor pressure as a function of X=height.
constexpr double angstrom
Definition: AugerUnits.h:103
const atm::ProfileResult & EvaluateTemperatureVsHeight() const
Tabulated function giving Y=temperature as a function of X=height.

, generated on Tue Sep 26 2023.