PowerLawLDF.h
Go to the documentation of this file.
1 #ifndef _LDFFinderKG_PowerLawLDF_h_
2 #define _LDFFinderKG_PowerLawLDF_h_
3 
4 
5 #include "VLDF.h"
6 #include <cmath>
7 #include <vector>
8 #include <utl/Math.h>
9 #include <utl/AugerUnits.h>
10 
11 
12 namespace LDFFinderKG {
13 
14  class PowerLawLDF: public VLDF {
15 
16  public:
17  PowerLawLDF(const double refDistance) : VLDF(refDistance, 6, 2) { }
18 
19  double
20  Value(const double r, const std::vector<double>& shape)
21  const
22  {
23  const double kNearRadius = 300*utl::meter;
24  const double rRef = fReferenceDistance;
25  const double beta = shape[0];
26  const double gamma = shape[1];
27 
28  const double nearCore = kNearRadius / rRef;
29  const double relR = r / rRef;
30  if (relR > nearCore)
31  return std::pow(relR, beta + gamma*std::log(relR));
32 
33  const double gf = gamma*std::log(nearCore);
34  return std::pow(relR, beta + 2*gf) * std::pow(nearCore, -gf);
35  }
36 
37  double
38  SecondDerivative(const double r, const std::vector<double>& shape)
39  const
40  {
41  const double kNearRadius = 300*utl::meter;
42  const double rRef = fReferenceDistance;
43  const double beta = shape[0];
44  const double gamma = shape[1];
45 
46  const double nearCore = kNearRadius / rRef;
47  const double relR = r / rRef;
48  if (relR > nearCore) {
49  const double tgl = 2 * gamma * std::log(relR);
50  return Value(r, shape) * (
51  (beta-1)*beta + 2*gamma + tgl*(tgl + 2*beta - 1)
52  ) / utl::Sqr(r);
53  }
54 
55  const double bgl = beta + gamma * std::log(nearCore);
56  return (bgl - 1)*bgl * std::pow(relR, bgl) / utl::Sqr(r);
57  }
58 
59  std::vector<double>
60  ShapeModel(const double cosTheta, const double showerSize)
61  const
62  {
63  const double lgSize = std::log10(showerSize);
64  const double secTheta = 1 / cosTheta;
65  const double a0 = fShapeModelVector[0];
66  const double a1 = fShapeModelVector[1];
67  const double b0 = fShapeModelVector[2];
68  const double b1 = fShapeModelVector[3];
69  const double c0 = fShapeModelVector[4];
70  const double c1 = fShapeModelVector[5];
71 
72  std::vector<double> shape(2);
73  double& beta = shape[0];
74  double& gamma = shape[1];
75 
76  beta = a0 + a1*lgSize + secTheta*(b0 + b1*lgSize + secTheta*(c0 + c1*lgSize));
77 
78  gamma = 0.05*std::sin(8*(cosTheta - 0.6)) - 0.5;
79 
80  return shape;
81  }
82 
83  double
84  BetaUncertainty(const double showerSize)
85  const
86  {
87  const double lgS = std::log10(showerSize);
89  }
90 
91  unsigned int GetNShapeParameters() const { return 2; }
92 
93  };
94 
95 }
96 
97 
98 #endif
return fBetaUncertaintyModelVector *[0] exp(fBetaUncertaintyModelVector[1]*lgS)
constexpr T Sqr(const T &x)
const double fReferenceDistance
std::vector< double > fShapeModelVector
unsigned int GetNShapeParameters() const
Definition: PowerLawLDF.h:91
double pow(const double x, const unsigned int i)
virtual double Value(const double r, const std::vector< double > &shape) const =0
virtual double SecondDerivative(const double r, const std::vector< double > &shape) const =0
constexpr double meter
Definition: AugerUnits.h:81
std::vector< double > fBetaUncertaintyModelVector
PowerLawLDF(const double refDistance)
Definition: PowerLawLDF.h:17
virtual std::vector< double > ShapeModel(const double cosTheta, double showerSize) const =0
virtual double BetaUncertainty(const double showerSize) const =0

, generated on Tue Sep 26 2023.