SdReconstruction/LDFFinderKG/EnergyConversion.h
Go to the documentation of this file.
1 #ifndef _LDFFinderKG_EnergyConversion_h_
2 #define _LDFFinderKG_EnergyConversion_h_
3 
4 #include <utl/Math.h>
5 #include <vector>
6 #include <cmath>
7 
8 
9 namespace LDFFinderKG {
10 
12 
13  static const unsigned int fgOrderInTheta = 3; // cubic: up to and including x^3
14  static const unsigned int fgOrderInS38 = 2; // quadratic: up to and including log10(s38)^2
15 
16  double fCicReferenceAngle = 0;
17  double fCicReferenceS38 = 0;
18  std::pair<double, double> fCicS38Range = { 0, 0 };
19  // [ (a0, a1, a2), (b0, b1, b2), (c0, c1, c2) ]
20  std::vector<double> fCicParameters[fgOrderInTheta];
21 
22  double fEnergyConstant = 0;
23  double fEnergySlope = 0;
24 
25  //
26 
27  void SetCICParameters(const std::vector<double>& par0,
28  const std::vector<double>& par1,
29  const std::vector<double>& par2);
30 
31  double GetS38(const double s1000, const double cosTheta) const;
32 
33  void GetEnergy(const double cosTheta, const double s1000,
34  const double s1000Err, const double s1000Sys,
35  double& energy, double& energyErr, double& energySys) const;
36 
37  private:
39  double GetX(const double cosTheta) const
40  { return utl::Sqr(cosTheta) - utl::Sqr(cos(fCicReferenceAngle)); }
41 
43  double
44  AttenuationFunction(const double x, const double s38)
45  const
46  {
47  // limit S38 to valid range
48  const double& s1 = fCicS38Range.first;
49  const double& s2 = fCicS38Range.second;
50  const double s = (s38 < s1) ? s1 : ((s38 > s2) ? s2 : s38);
51  const auto& c = fCicParameters;
52  const double y = std::log10(s / fCicReferenceS38);
53  using utl::EvalPoly;
54  return EvalPoly({1., EvalPoly(c[0], y), EvalPoly(c[1], y), EvalPoly(c[2], y)}, x);
55  }
56 
57 
58  };
59 
60 }
61 
62 
63 #endif
void GetEnergy(const double cosTheta, const double s1000, const double s1000Err, const double s1000Sys, double &energy, double &energyErr, double &energySys) const
constexpr T Sqr(const T &x)
std::vector< double > fCicParameters[fgOrderInTheta]
return EvalPoly({1., EvalPoly(c[0], y), EvalPoly(c[1], y), EvalPoly(c[2], y)}, x)
double EvalPoly(const T &a, const double x)
Simple polynomial evaluator.
double GetS38(const double s1000, const double cosTheta) const
double GetX(const double cosTheta) const
x = cos^2(theta) - cos^2(theta_ref)
void SetCICParameters(const std::vector< double > &par0, const std::vector< double > &par1, const std::vector< double > &par2)

, generated on Tue Sep 26 2023.