1 #ifndef _LDFFinderOG_LDFFunctions_h_
2 #define _LDFFinderOG_LDFFunctions_h_
6 #include <utl/AugerUnits.h>
9 namespace LDFFinderOG {
26 PowerLawFunction(
const double r,
const double beta,
const double gamma = 0)
28 const double kNearRadius = 300*
meter;
29 const double k1000m = 1000*
meter;
30 const double nearCore = kNearRadius / k1000m;
31 const double relR = r / k1000m;
33 return pow(relR, beta + gamma*log(relR));
35 const double gf = gamma*log(nearCore);
36 return pow(relR, beta + 2*gf) *
pow(nearCore, -gf);
41 NKGFunction(
const double r,
const double beta,
const double gamma = 0)
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);
51 NKGFermiFunction(
const double r,
const double beta,
const double gamma = 0,
52 const double mu = 2660.*
meter,
const double tau = 242.*
meter)
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);
67 const double r,
const double beta,
const double gamma = 0,
68 const double mu = 2660.*
meter,
const double tau = 242.*
meter)
71 return PowerLawFunction(r, beta, gamma);
74 return NKGFunction(r, beta, gamma);
76 return NKGFermiFunction(r, beta, gamma, mu, tau);
84 PowerLawSecondDerivative(
const double r,
const double beta,
const double gamma = 0)
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)
97 const double bgl = beta + gamma * log(nearCore);
98 return (bgl - 1)*bgl *
pow(relR, bgl) /
Sqr(r);
104 NKGSecondDerivative(
const double r,
const double beta,
const double gamma = 0)
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));
117 NKGFermiSecondDerivative(
const double r,
const double beta,
const double gamma = 0,
118 const double mu = 2660.*
meter,
const double tau = 242.*
meter)
120 const double k700 = 700*
meter;
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);
137 const double r,
const double beta,
const double gamma = 0,
138 const double mu = 2660.*
meter,
const double tau = 242.*
meter)
141 return PowerLawSecondDerivative(r, beta, gamma);
144 return NKGSecondDerivative(r, beta, gamma);
146 return NKGFermiSecondDerivative(r, beta, gamma, mu, tau);
155 const double lgS1000 = log10(s1000);
156 return 0.428623 * exp(-0.406203 * lgS1000);
164 PowerLawEstimateBetaGamma(
double& beta,
double& gamma,
165 const double cosTheta,
const double s1000)
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;
179 (b0 + b1*log10s1000) * secTheta +
180 (c0 + c1*log10s1000) * sec2Theta;
182 beta = 0.7 * atan(6*(0.65 - cosTheta)) - 3;
184 gamma = 0.05*sin(8*(cosTheta - 0.6)) - 0.5;
190 NKGEstimateBetaGamma(
double& beta,
double& gamma,
191 const double cosTheta,
const double s1000)
194 const double log10s1000 = log10(s1000);
195 const double secTheta = 1/cosTheta;
196 const double sec2Theta =
Sqr(secTheta);
197 const double cos2Theta =
Sqr(cosTheta);
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;
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;
231 (b0 + b1*log10s1000) * secTheta +
232 (c0 + c1*log10s1000) * sec2Theta;
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) -
242 beta = 0.9 / cosTheta - 3.3;
255 const double cosTheta,
const double s1000 = 0)
258 return PowerLawEstimateBetaGamma(beta, gamma, cosTheta, s1000);
260 return NKGEstimateBetaGamma(beta, gamma, cosTheta, s1000);
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)
void EstimateBetaGamma(double &beta, double &gamma, const LDFFunctionType type, const double cosTheta, const double s1000=0)
double SigmaForFixedBeta(const double s1000)
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)