FitModels.cc
Go to the documentation of this file.
1 #include "FitModels.h"
2 
3 #include <iostream>
4 #include <cmath>
5 #include <vector>
6 #include <limits>
7 
8 #include <Minuit2/FCNBase.h>
9 
10 #include <utl/CoordinateSystemPtr.h>
11 #include <utl/Vector.h>
12 #include <utl/BasicVector.h>
13 #include <utl/Point.h>
14 #include <utl/Math.h>
15 #include <utl/PhysicalFunctions.h>
16 #include <utl/RadioGeometryUtilities.h>
17 #include <utl/Probability.h>
18 #include <utl/AugerUnits.h>
19 
20 #include "TF1.h"
21 #include "TF2.h"
22 #include "TMath.h"
23 
24 #include "adst/UtilityFunctions.h"
25 
26 namespace RdGlobalFit {
27 
29  FitConfig& fitconfig, const EventFitData eventData, std::vector<StationFitData>& stationData,
30  const utl::Vector magneticFieldVector, const LDFConstsTable ldfConstsTable,
32  fFitConfig(fitconfig),
33  fEventData(eventData),
34  fStationData(stationData),
35  fTheErrorDef(1.0),
36  fVerbose(false),
37  fLDFConstsTable(ldfConstsTable),
38  fcalcLDFConsts(calcLDFConsts)
39 {
40  fMagneticFieldVector = magneticFieldVector;
41 }
42 
43 void RdGlobalFitMinimizationCriterion::calcShowerCoordinates(const double arrivalDirection_phi,
44  const double arrivalDirection_theta,
45  const double core_x,
46  const double core_y,
47  const double core_z,
48  utl::Vector magneticFieldVector) const
49 {
50  //Create CS with core as origin
51  utl::Point dynamic_core(core_x, core_y, core_z, fEventData.fLocalCS);
53  //Calculate arrivaldirection vector in LocalSystem (needs proper calculation)
54  utl::Vector dynamic_Showeraxis(sin(arrivalDirection_theta) * cos(arrivalDirection_phi),
55  sin(arrivalDirection_theta) * sin(arrivalDirection_phi),
56  cos(arrivalDirection_theta), fEventData.fLocalCS);
57  //calculate positions in shower frame
58  utl::RadioGeometryUtilities transformation = utl::RadioGeometryUtilities(dynamic_Showeraxis,
59  dynamicCS,
60  magneticFieldVector);
61  //Calculating station-positions in shower-plane
62  for (std::vector<StationFitData>::iterator sIt = fStationData.begin(), end = fStationData.end();
63  sIt != end; ++sIt) {
64  const utl::Point sPos(sIt->stationPosition);
65  double X_VxB = 0.;
66  double Y_VxB = 0.;
67  double Z_VxB = 0.;
68  transformation.GetVectorInShowerPlaneVxB(X_VxB, Y_VxB, Z_VxB, sPos);
69  //Filling FitEventData with the calculated stationepositions in the dynamic userparameter dependend coordinatesystem
70  sIt->x_vxB = X_VxB;
71  sIt->y_vxB = Y_VxB;
72  sIt->z_vxB = Z_VxB;
73  }
74 }
75 
76 double RdGlobalFitMinimizationCriterion::operator()(const std::vector<double>& pars) const
77 {
78  //creating dynamic showerCS depending on Fit Parameters of direction and core and saving stationPositions in this frame in fStationData.
79  calcShowerCoordinates(pars[14], pars[15], pars[1], pars[2], pars[3], fMagneticFieldVector);
80  calc2dLDFConstants(pars[15]);
81 
82  double Rmax = 0;
83  double DXmax = 0;
84 
85  // The following is only important if fFitConfig.fitGammaAndSigmaPlusIndependently is false.
86  // Its functioning is not validated and it may be removed in future.
87  // Momentarily, its only commented out.
88 
89  // if(fFitConfig.fitShowerMaxAsRMax){
90  // DXmax = RdGlobalFitMinimizationCriterion::DXmaxFromRmax(pars[11], pars[15], 1560.);
91  // Rmax = pars[11];
92  // }
93  //
94  // if(fFitConfig.fitShowerMaxAsDXMax){
95  // DXmax = pars[11];
96  // }
97 
98  double negLogLikelihood = 0;
99  double twoDLDFLikelyhood = 0.;
100  double arrivalTimeLikelihood = 0.;
101 
102  for (std::vector<StationFitData>::iterator sIt = fStationData.begin(), end = fStationData.end();
103  sIt != end; ++sIt) {
104 
105  if (fFitConfig.fitTwoDLDF == true) {
106  double stationLikelihood = calc2dLDFMinCrit(pars[0], pars[4], DXmax, pars[5], pars[6],
107  pars[7], pars[8], pars[9], sIt->x_vxB, sIt->y_vxB,
108  sIt->energyFluence, sIt->energyFluenceError, sIt);
109  negLogLikelihood += stationLikelihood;
110  twoDLDFLikelyhood += stationLikelihood;
111  }
112 
113  if (fFitConfig.fitArrivalTime == true) {
114  double stationLikelihood = calcTimeMinCrit(pars[10], Rmax, pars[12], pars[13], sIt->x_vxB,
115  sIt->y_vxB, sIt->z_vxB, sIt->signalTime,
116  sIt->signalTimeError, sIt);
117  negLogLikelihood += stationLikelihood;
118  arrivalTimeLikelihood += stationLikelihood;
119  }
120  }
121  fArrivalTimeLikelihood = arrivalTimeLikelihood;
122  fTwoDLDFLikelyhood = twoDLDFLikelyhood;
123  return negLogLikelihood;
124 }
125 
126 double RdGlobalFitMinimizationCriterion::sigmaPlusFromDXmax(double DXmax, double a1, double a2,
127  double a3, double a4) const
128 {
129  double sigma_result;
130  sigma_result = (1.0L / 6.0L)
131  * (-pow(2, 2.0L / 3.0L) * pow(a1, 2)
132  * pow(
133  (pow(a1, 3)
134  * sqrt(
135  (4 * pow(3 * a1 * a3 - pow(a2, 2), 3)
136  + pow(27 * pow(a1, 2) * (DXmax - a4) + 9 * a1 * a2 * a3 - 2 * pow(a2, 3),
137  2)) / pow(a1, 6)) + 27 * pow(a1, 2) * (-DXmax + a4)
138  - 9 * a1 * a2 * a3 + 2 * pow(a2, 3)) / pow(a1, 3),
139  2.0L / 3.0L)
140  - 2 * a1 * a2
141  * pow(
142  (pow(a1, 3)
143  * sqrt(
144  (4 * pow(3 * a1 * a3 - pow(a2, 2), 3)
145  + pow(
146  27 * pow(a1, 2) * (DXmax - a4) + 9 * a1 * a2 * a3
147  - 2 * pow(a2, 3),
148  2)) / pow(a1, 6)) + 27 * pow(a1, 2) * (-DXmax + a4)
149  - 9 * a1 * a2 * a3 + 2 * pow(a2, 3)) / pow(a1, 3),
150  1.0L / 3.0L) + 2 * pow(2, 1.0L / 3.0L) * (3 * a1 * a3 - pow(a2, 2)))
151  / (pow(a1, 2)
152  * pow(
153  (pow(a1, 3)
154  * sqrt(
155  (4 * pow(3 * a1 * a3 - pow(a2, 2), 3)
156  + pow(27 * pow(a1, 2) * (DXmax - a4) + 9 * a1 * a2 * a3 - 2 * pow(a2, 3),
157  2)) / pow(a1, 6)) + 27 * pow(a1, 2) * (-DXmax + a4)
158  - 9 * a1 * a2 * a3 + 2 * pow(a2, 3)) / pow(a1, 3),
159  1.0L / 3.0L));
160  return sigma_result;
161 }
162 
163 double RdGlobalFitMinimizationCriterion::gammaFromRmax(double DXmax, double alpha_1, double alpha_2,
164  double alpha_3, double c) const
165 {
166  double gamma_result;
167  gamma_result = (1.0L / 2.0L)
168  * (-alpha_2 * c
169  + sqrt(c * (4 * DXmax * alpha_1 - 4 * alpha_1 * alpha_3 * c + pow(alpha_2, 2) * c)))
170  / (alpha_1 * c);
171  return gamma_result;
172 }
173 
175  const double Aplus, const double sigmaPlus, const double DXmax, const double C2Theta,
176  const double C1Theta, const double CTheta, const double C1, const double C2, const double x_vxB,
177  const double y_vxB, const double signal, const double signalError,
178  std::vector<StationFitData>::iterator sIt) const
179 {
180  //Calculates for given Parameters the EnergieDensity for a given Station, compares it in some defined way to the measured Data and returns a minimization criterion.
181  // (The parameters are given by the class. The class itself is called with the definition of the fit (which parameters are set fixed, which range, etc..))
182 
183  //Parameters for correlation between DXmax and sigma from J. Schulz.
184  //ToDo Parameter should be set with xml.
185  double a1 = 2.1 * pow(10, -4);
186  double a2 = -0.081;
187  double a3 = 13.5;
188  double a4 = -352.;
189 
190  double sigmaPl;
191  double d_xmax = DXmax;
193  sigmaPl = sigmaPlusFromDXmax(d_xmax, a1, a2, a3, a4);
194  } else {
195  sigmaPl = sigmaPlus;
196  }
197  double c1Theta = C1Theta;
198  double c2Theta = C2Theta;
199  double c1 = C1;
200  double c2 = C2;
201  double cTheta = CTheta;
202  c1Theta = fcalcLDFConsts.C1theta;
203  c2Theta = fcalcLDFConsts.C2theta;
204  c1 = fcalcLDFConsts.C3;
205  c2 = fcalcLDFConsts.C4;
206  cTheta = fcalcLDFConsts.A_scale;
207 
208  TF2 LDF2DFit =
209  TF2("LDF2DFit",
210  "[0]*TMath::Exp(-((x-([1]+[5]))**2+(y-[2])**2)/[3]**2)-[6]*[0]*TMath::Exp(-((x-([1]+[4]))**2+(y-[2])**2)/TMath::Exp([7]+[8]*[3])**2)");
211  LDF2DFit.SetParameter(0, Aplus);
212  LDF2DFit.SetParameter(1, 0.);
213  LDF2DFit.SetParameter(2, 0.);
214  LDF2DFit.SetParameter(3, sigmaPl);
215  LDF2DFit.SetParameter(4, c2Theta);
216  LDF2DFit.SetParameter(5, c1Theta);
217  LDF2DFit.SetParameter(6, cTheta);
218  LDF2DFit.SetParameter(7, c1);
219  LDF2DFit.SetParameter(8, c2);
220 
221  double weight = signalError;
222  double calculatedEnergieDensity = LDF2DFit.Eval(x_vxB, y_vxB);
223  double minimizationCriterium = pow((signal - calculatedEnergieDensity) / weight, 2);
224  sIt->fittedEnergyFluence = calculatedEnergieDensity;
225  if (fVerbose) {
226  std::cout << x_vxB << "\t" << y_vxB << "\t" << signal << "\t" << calculatedEnergieDensity
227  << "\t" << minimizationCriterium << std::endl;
228  }
229 
230  return minimizationCriterium;
231 }
232 
234  const double gamma, const double DXmax, const double b, const double t0, const double x_vxB,
235  const double y_vxB, const double z_vxB, const double signalTime, const double signalTimeError,
236  std::vector<StationFitData>::iterator sIt) const
237 {
238  TF1 arrivalTimeFit = TF1("ArrivalTimeFit",
239  "TMath::Sqrt(1 + x * x / ([0] * [0])) * [1] - [1] + [2]");
240  double gammaTilde;
241 
242  double c = 10000.;
243  double alpha_3 = -1.49048;
244  double alpha_2 = -0.0371733;
245  double alpha_1 = 0.00086932;
247  gammaTilde = gammaFromRmax(DXmax, alpha_1, alpha_2, alpha_3, c);
248  } else {
249  gammaTilde = gamma;
250  }
251  arrivalTimeFit.SetParameter(0, gammaTilde);
252  arrivalTimeFit.SetParameter(1, b);
253  arrivalTimeFit.SetParameter(2, t0);
254 
255  double weight = signalTimeError;
256  double r = sqrt(x_vxB * x_vxB + y_vxB * y_vxB);
257  double calculatedArrivalTime = arrivalTimeFit.Eval(r);
258  double measuredArrivalTime = signalTime;
259  double timeDrift = 0; // difference between core-time and eventtime
260  double relativePulseTime = z_vxB / (utl::kSpeedOfLight / utl::nanosecond);
261  double planeTime = timeDrift + relativePulseTime;
262  double measuredProjTime = measuredArrivalTime - planeTime;
263  double minimizationCriterium = pow((measuredProjTime - calculatedArrivalTime) / weight, 2);
264  sIt->fittedProjTime = calculatedArrivalTime;
265  sIt->measuredProjTime = measuredProjTime;
266  if (fVerbose) {
267  std::cout << x_vxB << "\t" << y_vxB << "\t" << measuredProjTime << "\t" << calculatedArrivalTime
268  << "\t" << minimizationCriterium << std::endl;
269  }
270  return minimizationCriterium;
271 }
272 
274 {
275 
276  fcalcLDFConsts.C0 = 0.41;
277 
278  if ((zenith) < 10. * utl::degree) {
281  } else if ((zenith) < 20. * utl::degree) {
284  } else if ((zenith) < 30. * utl::degree) {
287  } else if ((zenith) < 40. * utl::degree) {
290  } else if ((zenith) < 50. * utl::degree) {
293  } else if ((zenith) < 55. * utl::degree) {
297  fcalcLDFConsts.C0 = 0.46;
298  } else {
302  fcalcLDFConsts.C0 = 0.71;
303  }
304 }
305 }
Point object.
Definition: Point.h:32
double calc2dLDFMinCrit(const double Aplus, const double sigma_max, const double DXmax, const double C2Theta, const double C1Theta, const double CTheta, const double C1, const double C2, const double x_vxB, const double y_vxvxB, const double signal, const double signalError, std::vector< StationFitData >::iterator sIt) const
Definition: FitModels.cc:174
void calc2dLDFConstants(double zenith) const
Definition: FitModels.cc:273
double pow(const double x, const unsigned int i)
RdGlobalFitMinimizationCriterion(FitConfig &fitconfig, const EventFitData eventData, std::vector< StationFitData > &stationData, const utl::Vector magneticFieldVector, const LDFConstsTable ldfConstsTable, calcLDFConsts &calcLDFConsts)
Definition: FitModels.cc:28
double gammaFromRmax(double DXmax, double alpha_1, double alpha_2, double alpha_3, double c) const
Definition: FitModels.cc:163
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
double sigmaPlusFromDXmax(double DXmax, double a1, double a2, double a3, double a4) const
Definition: FitModels.cc:126
utl::CoordinateSystemPtr fLocalCS
Definition: FitModels.h:214
constexpr double nanosecond
Definition: AugerUnits.h:143
double operator()(const std::vector< double > &pars) const
Definition: FitModels.cc:76
constexpr double degree
double calcTimeMinCrit(const double gamma, const double DXmax, const double b, const double t0, const double x_vxB, const double y_vxvxB, const double z_vxvxB, const double signalTime, const double signalTimeError, std::vector< StationFitData >::iterator sIt) const
Definition: FitModels.cc:233
void calcShowerCoordinates(const double arrivalDirection_phi, const double arrivalDirection_theta, const double core_x, const double core_y, const double core_z, utl::Vector magneticFieldVector) const
Definition: FitModels.cc:43
void GetVectorInShowerPlaneVxB(double &x, double &y, double &z, const utl::Point &point) const
in case of positions, the positions has to be relative to the core positions!!!
constexpr double kSpeedOfLight
Vector object.
Definition: Vector.h:30
bool fitGammaAndSigmaPlusIndependently
Definition: FitModels.h:25
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
std::vector< StationFitData > & fStationData
Definition: FitModels.h:293

, generated on Tue Sep 26 2023.