SdReconstruction/LDFFinderKG/EnergyConversion.cc
Go to the documentation of this file.
1 #include "EnergyConversion.h"
2 #include <utl/Math.h>
3 #include <utl/ErrorLogger.h>
4 #include <utl/AugerUnits.h>
5 #include <cmath>
6 
7 using namespace std;
8 using namespace utl;
9 
10 
11 namespace LDFFinderKG {
12 
13  void
14  EnergyConversion::SetCICParameters(const vector<double>& par0,
15  const vector<double>& par1,
16  const vector<double>& par2)
17  {
18  fCicParameters[0] = par0;
19  fCicParameters[1] = par1;
20  fCicParameters[2] = par2;
21 
22  const unsigned int n = fgOrderInS38 + 1;
23  for (unsigned int i = 0; i < fgOrderInTheta; ++i)
24  if (fCicParameters[i].size() != n)
25  throw InvalidConfigurationException("Number of CIC parameters is out of bounds!");
26  }
27 
28 
29  double
30  EnergyConversion::GetS38(const double s1000, const double cosTheta)
31  const
32  {
33  const double eps = 1e-4;
34  const double x = GetX(cosTheta);
35 
36  double s38 = fCicReferenceS38;
37  unsigned int i = 100;
38  for (; i; --i) {
39  const double s38new = s1000 / AttenuationFunction(x, s38);
40  const double diff = std::abs(s38 - s38new);
41  s38 = s38new;
42  if (s38 <= 0 || diff / s38 < eps)
43  break;
44  }
45 
46  if (!i) {
47  ostringstream err;
48  err << "S38 assigment did not converge, last value S38 = " << s38;
49  ERROR(err);
50  return 0;
51  }
52 
53  if (s38 <= 0) {
54  ostringstream warn;
55  warn << "Got negative approximation for S38 = " << s38 << " with input values "
56  "S1000 = " << s1000 << ", "
57  "x = " << x << " (theta = " << acos(cosTheta)/utl::degree << " deg)";
58  WARNING(warn);
59  return 0;
60  }
61 
62  return s38;
63  }
64 
65 
66  void
67  EnergyConversion::GetEnergy(const double cosTheta, const double s1000,
68  const double s1000Err, const double s1000Sys,
69  double& energy, double& energyErr, double& energySys)
70  const
71  {
72  const double s38 = GetS38(s1000, cosTheta);
73  if (!s38) {
74  energy = energyErr = energySys = 0;
75  return;
76  }
77  energy = fEnergyConstant * std::pow(s38, fEnergySlope);
78  const double err = fEnergySlope * energy / s1000;
79  energyErr = err * s1000Err;
80  energySys = err * s1000Sys;
81  }
82 
83 }
Base class for exceptions arising because configuration data are not valid.
double pow(const double x, const unsigned int i)
double abs(const SVector< n, T > &v)
constexpr double degree
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
double eps
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165

, generated on Tue Sep 26 2023.