Deprecated/RdLDFFitter/LikelihoodFunction.cc
Go to the documentation of this file.
1 #include "LikelihoodFunction.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 namespace RdLDFFitter {
25 
27  const EventFitData eventData, const std::vector<StationFitData>& stationData,
28  const std::vector<ScintillatorFitData>& scintillatorData,
29  const utl::Vector magneticFieldVector) :
30  fFitConfig(fitconfig),
31  fEventData(eventData),
32  fStationData(stationData),
33  fScintillatorData(scintillatorData),
34  fTheErrorDef(1.0)
35  {
36  fMagneticFieldVector = magneticFieldVector;
37  }
38 
39  /*
40  A different LDF model can be implemented easily by defining a new Likelihood of Chi2 function.
41  This contribution to the combined neg. log. Likelihood needs to be added in the station loop to
42  the variable "negLogLikelihood". Just follow the example for LDFModel==1.
43  The parameters of the LDF function needs to be added to the minimizer in RdLDFFitter.cc
44  Parameters are:
45  0, 1, 2 = (coreX, coreY, coreZ) in local coordinate system
46  3 = a (charge excess strength)
47  4, 5, 6 = Scintillator LDF parameters
48  7, 8,... = optional LDF parameters
49  */
50 
51  double LDFLikelihoodFunction::operator()(const std::vector<double>& pars) const
52  {
53 
54  utl::Point core(pars[0], pars[1], pars[2], fEventData.fLocalCS);
55  const double chargeExcessStrength = pars[3];
56 
57  double negLogLikelihood = 0;
58 
59  // std::cout << "station loop " << std::endl;
60 
61  // loop over all stations
62  for(std::vector<StationFitData>::const_iterator sIt = fStationData.begin(), end =
63  fStationData.end(); sIt != end; ++sIt) {
64 
65  double signal = sIt->signal;
66  double signalError = sIt->signalError;
67  // correct signal amplitude for charge excess and geo-magnetic emission
68  if(fFitConfig.useChargeExcessCorrectionInLDFFit and fFitConfig.LDFModel) { // calculate correction only if LDF fit should be performed
69  double correctionFactor = utl::RadioGeometryUtilities::GetSignalCorrectionFactor(core,
70  fEventData.fShowerAxis, sIt->antennaPosition, fMagneticFieldVector,
71  chargeExcessStrength);
72  signal *= correctionFactor;
73  signalError *= correctionFactor;
74  }
75 
76  // chi2 LDF fit for LDF model 1
77  if(fFitConfig.LDFModel == 1) {
78  negLogLikelihood += GetChi2LDFModel1(pars[7], pars[8], core, sIt->antennaPosition,
79  fEventData.fShowerAxis, signal, signalError);
80  }
81 
82  // polarization estimator
84  negLogLikelihood += -2
85  * log(
86  GetLikelihoodPolarisation(core, fEventData.fShowerAxis, sIt->antennaPosition,
87  sIt->efield, sIt->lorentzAngleError, chargeExcessStrength));
88  }
89 
90  } // loop over stations
91 
92  // add SD core Likelihood to combined Likelihood
94  negLogLikelihood += -2
95  * log(
100  }
101 
102  // loop over scnintillators
104  for(std::vector<ScintillatorFitData>::const_iterator sIt = fScintillatorData.begin(), end =
105  fScintillatorData.end(); sIt != end; ++sIt) {
106  negLogLikelihood += GetScintillatorLDFLikelihood(core, fEventData.fShowerAxis, sIt->scintillatorPosition,
107  pars[4], pars[5], pars[6], sIt->signal, sIt->silent);
108  }
109  }
110 
111  return std::isnan(negLogLikelihood) ? std::numeric_limits<double>::max() : negLogLikelihood;
112  }
113 
114 // double Up() const { return 0.5; }
115 
116  double LDFLikelihoodFunction::GetChi2LDFModel1(const double A, const double R0,
117  const utl::Point& core, const utl::Point& stationPosition, const utl::Vector& showeraxis,
118  const double signal, const double signalError) const
119  {
120  double distanceToShowerAxis = utl::RadioGeometryUtilities::GetDistanceToAxis(showeraxis,
121  core, stationPosition);
122  TF1 fLDF = TF1("fLDF", "[0]*exp(-x/[1])");
123  fLDF.SetParameters(A, R0);
124  double LDFSignal = fLDF.Eval(distanceToShowerAxis);
125  return pow((signal - LDFSignal) / signalError, 2);
126  }
127 
129  const utl::Vector& showeraxis, const utl::Point& stationPosition, const utl::Vector& EField,
130  const double& lorentzAngleError, const double& chargeExcessStrength) const
131  {
132 // utl::Vector chargeExcessVector = utl::RadioGeometryUtilities::GetChargeExcessVector(core,
133 // showeraxis, stationPosition);
134 // utl::Vector lorentzVector = utl::RadioGeometryUtilities::GetLorentzVector(showeraxis,
135 // fMagneticFieldVector);
136 // utl::Vector vEexpected = lorentzVector + chargeExcessStrength * chargeExcessVector;
138  showeraxis,
139  stationPosition,
141  chargeExcessStrength,
143 // double x = TMath::RadToDeg() * showeraxis.GetTheta(fEventData.fLocalCS);
144 // double mean = 12.6091 + x * -0.323591;
145 // if(x < 40) {
146 // mean = 0.;
147 // }
148 // double sigma = pow(x, 0) * 4.33775 + pow(x, 1) * -0.0465731 + pow(x, 2) * 0.00752399 + pow(x, 3) * -0.000265992 + pow(x, 4) * -3.97691e-06 + pow(x, 5) * 2.19571e-07 + pow(x, 6) * -1.86878e-09 ;
149 // mean *= TMath::DegToRad();
150 // sigma *= TMath::DegToRad();
151 
152 // double delta = utl::Angle(vEexpected, EField);
153  //double tmp = utl::Probability::GetNormalPDF(delta, 0, 1 * utl::deg);
154 // double tmp = utl::Probability::GetNormalPDF(delta, 0, lorentzAngleError);
155 
156 // double tmp = utl::Probability::GetVonMisesPDF(delta, 0, 1 / (1 * utl::deg * 1 * utl::deg));
157  double tmp = utl::Probability::GetVonMisesPDF(delta, 0.,
158  1 / (lorentzAngleError * lorentzAngleError));
159 
160  //double tmp = utl::Probability::GetNormalPDF(delta, mean, sigma);
161  // std::cout << "Likelihood Pol: p("
162  // << delta / utl::deg << ", 0, " << lorentzAngleError / utl::deg << ")=" << tmp << std::endl;
163  // double tmp = utl::Probability::GetFisherPDF(delta, 1 / (sigmaDelta * sigmaDelta));
164  return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
165 
166 
167 // TF1 fRayleigh = TF1("fRayleigh", "x/[0]*exp(-x*x/(2*[0]*[0]))");
168 // fRayleigh.SetParameter(0, sigmaDelta);
169 // double tmp = fRayleigh.Eval(delta);
170 // return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
171  }
172 
173  double LDFLikelihoodFunction::GetSDCoreLikelihood(const double coreX, const double coreY,
174  const double SDCoreX, const double SDCoreY, const double SDCoreXError,
175  const double SDCoreYError, const double SDCoreXYCorrelation) const
176  {
177  TF2 fLikelihood = TF2("2DimLikelihood",
178  "2.*( ((x-[0])/[1])**2 + ((y-[2])/[3])**2 - 2.*[4]*((x-[0])/[1])*((y-[2])/[3]) )");
179  fLikelihood.SetParameters(SDCoreX, SDCoreXError, SDCoreY, SDCoreYError, SDCoreXYCorrelation);
180 
181  return fLikelihood.Eval(coreX, coreY);
182  }
183 
185  const utl::Vector& showeraxis,
186  const utl::Point& stationPosition,
187  const double N_charged_particles,
188  const double showerAge,
189  const double moliereRadius,
190  const double signal,
191  const bool silent) const
192  {
193 
194  double distanceToShowerAxis = utl::RadioGeometryUtilities::GetDistanceToAxis(
195  showeraxis, core, stationPosition);
196 
197  double scint_likelihood_value = 0.;
198  double sum_log_signal = 0.;
199 
200  TF1 NKG = TF1("NKG","[0]*TMath::Gamma(4.5-[1])/(2.*TMath::Pi()*[2]*[2]*TMath::Gamma([1])*TMath::Gamma(4.5-(2.*[1])))*TMath::Power((x/[2]),([1]-2.))*TMath::Power((1+(x/[2])),[1]-4.5)");
201 
202  NKG.SetParameter(0, N_charged_particles);
203  NKG.SetParameter(1, showerAge);
204  NKG.SetParameter(2, moliereRadius);
205 
206  if(silent){
207  scint_likelihood_value = -NKG.Eval(distanceToShowerAxis)+log(1+NKG.Eval(distanceToShowerAxis));
208  }
209  else{
210  for(int i=1; i<=static_cast<int>(round(signal)); i++){
211  sum_log_signal+=log(i);
212  }
213  scint_likelihood_value = signal*log(NKG.Eval(distanceToShowerAxis))
214  - NKG.Eval(distanceToShowerAxis) - sum_log_signal;
215  }
216 
217  return -2. * scint_likelihood_value; // factor two to be -2*ln(L)
218  }
219 
220 }
Point object.
Definition: Point.h:32
double GetChi2LDFModel1(const double A, const double R0, const utl::Point &core, const utl::Point &stationPosition, const utl::Vector &showeraxis, const double signal, const double signalError) const
static double GetDistanceToAxis(const utl::Vector &ShowerAxis, const utl::Point &CorePosition, const utl::Point &AntennaPosition)
computes the distance from the antenna position to the shower &quot;line&quot; defined by the core position and...
static double GetAngleToEFieldExpectation2D(const utl::Vector &measuredEField, const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength, const utl::CoordinateSystemPtr localCS)
const std::vector< ScintillatorFitData > & fScintillatorData
double operator()(const std::vector< double > &pars) const
double pow(const double x, const unsigned int i)
double GetSDCoreLikelihood(const double coreX, const double coreY, const double SDCoreX, const double SDCoreY, const double SDCoreXError, const double SDCoreYError, const double SDCoreXYCorrelation) const
#define max(a, b)
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
double GetLikelihoodPolarisation(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &EField, const double &lorentzAngleError, const double &chargeExcessStrength) const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
LDFLikelihoodFunction(const FitConfig ldfconfig, const EventFitData eventData, const std::vector< StationFitData > &stationData, const std::vector< ScintillatorFitData > &scintillatorData, const utl::Vector magneticFieldVector)
double GetScintillatorLDFLikelihood(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const double N_charged_particles, const double showerAge, const double moliereRadius, const double signal, const bool silent) const
Vector object.
Definition: Vector.h:30
static long double GetVonMisesPDF(const double x, const double mu, const double kappa)
Definition: Probability.cc:58
double NKG(const double r, const double n, const double rG, const double s)
Definition: Functions.cc:68
static double GetSignalCorrectionFactor(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength)

, generated on Tue Sep 26 2023.