LDFFunctions.h
Go to the documentation of this file.
1 #ifndef _LDFFinderOG_LDFFunctions_h_
2 #define _LDFFinderOG_LDFFunctions_h_
3 
4 
5 #include <cmath>
6 #include <utl/AugerUnits.h>
7 #include <utl/Math.h>
8 
9 namespace LDFFinderOG {
10 
11  using namespace std;
12  using namespace utl;
13 
14 
16  ePL,
19  };
20 
21 
22  namespace {
23 
24  inline
25  double
26  PowerLawFunction(const double r, const double beta, const double gamma = 0)
27  {
28  const double kNearRadius = 300*meter;
29  const double k1000m = 1000*meter;
30  const double nearCore = kNearRadius / k1000m;
31  const double relR = r / k1000m;
32  if (relR > nearCore)
33  return pow(relR, beta + gamma*log(relR));
34 
35  const double gf = gamma*log(nearCore);
36  return pow(relR, beta + 2*gf) * pow(nearCore, -gf);
37  }
38 
39  inline
40  double
41  NKGFunction(const double r, const double beta, const double gamma = 0)
42  {
43  const double k700 = 700*meter;
44  const double k1000 = 1000*meter;
45  return pow(r/k1000, beta) *
46  pow((k700 + r)/(k1000 + k700), beta+gamma);
47  }
48 
49  inline
50  double
51  NKGFermiFunction(const double r, const double beta, const double gamma = 0,
52  const double mu = 2660.*meter, const double tau = 242.*meter)
53  {
54  const double k700 = 700*meter;
55  const double k1000 = 1000*meter;
56  return pow(r/k1000, beta) *
57  pow((k700 + r)/(k1000 + k700), beta+gamma) / (exp((r - mu)/tau) + 1) *
58  (exp((k1000 - mu)/tau) + 1); // normalization of LDF at 1000m
59  }
60 
61  } // NS
62 
63 
64  inline
65  double
67  const double r, const double beta, const double gamma = 0,
68  const double mu = 2660.*meter, const double tau = 242.*meter)
69  {
70  if (type == ePL)
71  return PowerLawFunction(r, beta, gamma);
72 
73  if (type == eNKG)
74  return NKGFunction(r, beta, gamma);
75 
76  return NKGFermiFunction(r, beta, gamma, mu, tau);
77  }
78 
79 
80  namespace {
81 
82  inline
83  double
84  PowerLawSecondDerivative(const double r, const double beta, const double gamma = 0)
85  {
86  const double kNearRadius = 300*meter;
87  const double k1000m = 1000*meter;
88  const double nearCore = kNearRadius / k1000m;
89  const double relR = r / k1000m;
90  if (relR > nearCore) {
91  const double tgl = 2 * gamma * log(relR);
92  return PowerLawFunction(r, beta, gamma) * (
93  (beta-1)*beta + 2*gamma + tgl*(tgl + 2*beta - 1)
94  ) / Sqr(r);
95  }
96 
97  const double bgl = beta + gamma * log(nearCore);
98  return (bgl - 1)*bgl * pow(relR, bgl) / Sqr(r);
99  }
100 
101 
102  inline
103  double
104  NKGSecondDerivative(const double r, const double beta, const double gamma = 0)
105  {
106  const double k700 = 700*meter;
107  const double tbg = 2*beta + gamma;
108  const double r2 = Sqr(r);
109  return NKGFunction(r, beta, gamma) * (
110  Sqr(k700)*beta*(beta-1) +
111  (tbg-1)*(2*k700*beta*r + tbg*r2)
112  ) / (r2 * Sqr(r+k700));
113  }
114 
115  inline
116  double
117  NKGFermiSecondDerivative(const double r, const double beta, const double gamma = 0,
118  const double mu = 2660.*meter, const double tau = 242.*meter)
119  {
120  const double k700 = 700*meter;
121  //const double tbg = 2*beta + gamma;
122  const double expofunc = exp((r - mu)/tau);
123  const double fermi = 1 / (expofunc + 1);
124  const double fermi2 = Sqr(fermi);
125  const double nkgFirstDerivative = NKGFunction(r, beta, gamma) * (2.*beta*r + beta*k700 + gamma*r) / (r * (r + k700));
126  return NKGSecondDerivative(r, beta, gamma) * fermi +
127  nkgFirstDerivative * (expofunc/tau * fermi2) +
128  NKGFunction(r, beta, gamma) * fermi2 / (tau*tau) * expofunc * (2*fermi + 1);
129  }
130 
131  } // NS
132 
133 
134  inline
135  double
137  const double r, const double beta, const double gamma = 0,
138  const double mu = 2660.*meter, const double tau = 242.*meter)
139  {
140  if (type == ePL)
141  return PowerLawSecondDerivative(r, beta, gamma);
142 
143  if (type == eNKG)
144  return NKGSecondDerivative(r, beta, gamma);
145 
146  return NKGFermiSecondDerivative(r, beta, gamma, mu, tau);
147 
148  }
149 
150 
151  inline
152  double
153  SigmaForFixedBeta(const double s1000)
154  {
155  const double lgS1000 = log10(s1000);
156  return 0.428623 /* +-0.49688 */ * exp(-0.406203 /* +-0.612831*/ * lgS1000);
157  }
158 
159 
160  namespace {
161 
162  inline
163  void
164  PowerLawEstimateBetaGamma(double& beta, double& gamma,
165  const double cosTheta, const double s1000)
166  {
167  if (s1000 > 0) {
168  const double log10s1000 = log10(s1000);
169  const double secTheta = 1/cosTheta;
170  const double sec2Theta = Sqr(secTheta);
171  const double a0 = -4.73;
172  const double a1 = -0.519;
173  const double b0 = 1.32;
174  const double b1 = 0.405;
175  const double c0 = -0.105;
176  const double c1 = -0.117;
177  beta =
178  a0 + a1*log10s1000 +
179  (b0 + b1*log10s1000) * secTheta +
180  (c0 + c1*log10s1000) * sec2Theta;
181  } else
182  beta = 0.7 * atan(6*(0.65 - cosTheta)) - 3;
183 
184  gamma = 0.05*sin(8*(cosTheta - 0.6)) - 0.5;
185  }
186 
187 
188  inline
189  void
190  NKGEstimateBetaGamma(double& beta, double& gamma,
191  const double cosTheta, const double s1000)
192  {
193  if (s1000 > 0) {
194  const double log10s1000 = log10(s1000);
195  const double secTheta = 1/cosTheta;
196  const double sec2Theta = Sqr(secTheta);
197  const double cos2Theta = Sqr(cosTheta);
198 
199  // parameters from GAP_2010_046
200  const double a0 = -3.72;
201  const double a1 = 0.0967;
202  const double b0 = 1.74;
203  const double b1 = -0.242;
204  const double c0 = -0.274;
205  const double c1 = 0.0349;
206  /* parameters from GAP_2007_106
207  const double a0 = -3.35;
208  const double a1 = -0.125;
209  const double b0 = 1.33;
210  const double b1 = -0.0324;
211  const double c0 = -0.191;
212  const double c1 = -0.00573;
213  */
214 
215  // parameters from GAP_2010_046
216  const double fo0 = -1.87;
217  const double fo1 = -0.183;
218  const double fa0 = 0.490;
219  const double fa1 = -0.0650;
220  const double fp0 = 0.483;
221  const double fp1 = 0.005;
222  const double fs0 = 19.6;
223  const double fs1 = -2.10;
224  const double fb = -0.272;
225  const double fet = 2.32;
226  const double fps = 1.95;
227  const double fss = 18.01;
228 
229  beta =
230  a0 + a1*log10s1000 +
231  (b0 + b1*log10s1000) * secTheta +
232  (c0 + c1*log10s1000) * sec2Theta;
233  gamma =
234  fo0 + fo1 * log10s1000 +
235  (fa0 + fa1 * log10s1000) / (exp((fs0 + fs1 * log10s1000) *
236  (cos2Theta - (fp0 + fp1 * log10s1000))) + 1) +
237  fb * pow(cos2Theta, fet) / (exp((log10s1000 - fps) * fss) + 1) -
238  beta; // define as modification of exponent on second term for backwards compatibility
239  // gamma = 0.;
240 
241  } else {
242  beta = 0.9 / cosTheta - 3.3;
243  if (beta > -0.5)
244  beta = -0.5;
245  gamma = beta;
246  }
247  }
248 
249  } // NS
250 
251  inline
252  void
253  EstimateBetaGamma(double& beta, double& gamma,
254  const LDFFunctionType type,
255  const double cosTheta, const double s1000 = 0)
256  {
257  if (type == ePL)
258  return PowerLawEstimateBetaGamma(beta, gamma, cosTheta, s1000);
259 
260  return NKGEstimateBetaGamma(beta, gamma, cosTheta, s1000);
261  }
262 
263 } // NS LDFFinderOG
264 
265 
266 #endif
constexpr T Sqr(const T &x)
double LDFFunction(const LDFFunctionType type, const double r, const double beta, const double gamma=0, const double mu=2660.*meter, const double tau=242.*meter)
Definition: LDFFunctions.h:66
void EstimateBetaGamma(double &beta, double &gamma, const LDFFunctionType type, const double cosTheta, const double s1000=0)
Definition: LDFFunctions.h:253
double SigmaForFixedBeta(const double s1000)
Definition: LDFFunctions.h:153
const double meter
Definition: GalacticUnits.h:29
double pow(const double x, const unsigned int i)
double LDFFunctionSecondDerivative(const LDFFunctionType type, const double r, const double beta, const double gamma=0, const double mu=2660.*meter, const double tau=242.*meter)
Definition: LDFFunctions.h:136
constexpr double fermi
Definition: AugerUnits.h:104

, generated on Tue Sep 26 2023.