8 #include <Minuit2/FCNBase.h>
10 #include <utl/CoordinateSystemPtr.h>
11 #include <utl/Vector.h>
12 #include <utl/BasicVector.h>
13 #include <utl/Point.h>
15 #include <utl/PhysicalFunctions.h>
16 #include <utl/RadioGeometryUtilities.h>
17 #include <utl/Probability.h>
18 #include <utl/AugerUnits.h>
27 const EventFitData eventData,
const std::vector<StationFitData>& stationData,
28 const std::vector<ScintillatorFitData>& scintillatorData,
30 fFitConfig(fitconfig),
31 fEventData(eventData),
32 fStationData(stationData),
33 fScintillatorData(scintillatorData),
55 const double chargeExcessStrength = pars[3];
57 double negLogLikelihood = 0;
62 for(std::vector<StationFitData>::const_iterator sIt =
fStationData.begin(), end =
65 double signal = sIt->signal;
66 double signalError = sIt->signalError;
71 chargeExcessStrength);
72 signal *= correctionFactor;
73 signalError *= correctionFactor;
78 negLogLikelihood +=
GetChi2LDFModel1(pars[7], pars[8], core, sIt->antennaPosition,
84 negLogLikelihood += -2
87 sIt->efield, sIt->lorentzAngleError, chargeExcessStrength));
94 negLogLikelihood += -2
104 for(std::vector<ScintillatorFitData>::const_iterator sIt =
fScintillatorData.begin(), end =
107 pars[4], pars[5], pars[6], sIt->signal, sIt->silent);
118 const double signal,
const double signalError)
const
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);
130 const double& lorentzAngleError,
const double& chargeExcessStrength)
const
141 chargeExcessStrength,
158 1 / (lorentzAngleError * lorentzAngleError));
164 return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
174 const double SDCoreX,
const double SDCoreY,
const double SDCoreXError,
175 const double SDCoreYError,
const double SDCoreXYCorrelation)
const
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);
181 return fLikelihood.Eval(coreX, coreY);
187 const double N_charged_particles,
188 const double showerAge,
189 const double moliereRadius,
191 const bool silent)
const
195 showeraxis, core, stationPosition);
197 double scint_likelihood_value = 0.;
198 double sum_log_signal = 0.;
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)");
202 NKG.SetParameter(0, N_charged_particles);
203 NKG.SetParameter(1, showerAge);
204 NKG.SetParameter(2, moliereRadius);
207 scint_likelihood_value = -NKG.Eval(distanceToShowerAxis)+log(1+NKG.Eval(distanceToShowerAxis));
210 for(
int i=1; i<=static_cast<int>(round(signal)); i++){
211 sum_log_signal+=log(i);
213 scint_likelihood_value = signal*log(NKG.Eval(distanceToShowerAxis))
214 - NKG.Eval(distanceToShowerAxis) - sum_log_signal;
217 return -2. * scint_likelihood_value;
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 "line" defined by the core position and...
utl::Vector fMagneticFieldVector
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
double SDCoreXYCorrelation
utl::CoordinateSystemPtr fLocalCS
double GetX(const CoordinateSystemPtr &coordinateSystem) const
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
const FitConfig fFitConfig
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
bool useSDCoreToImproveRadioCore
bool useChargeExcessCorrectionInLDFFit
static long double GetVonMisesPDF(const double x, const double mu, const double kappa)
double NKG(const double r, const double n, const double rG, const double s)
const EventFitData fEventData
const std::vector< StationFitData > & fStationData
static double GetSignalCorrectionFactor(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength)