1 #ifndef _RdHASLDFFitter_LDFFitFunction_h_
2 #define _RdHASLDFFitter_LDFFitFunction_h_
6 #include <det/Detector.h>
9 #include <utl/AugerUnits.h>
10 #include <utl/Point.h>
11 #include <utl/Vector.h>
12 #include <utl/RadioGeometryUtilities.h>
14 #include <fwk/LocalCoordinateSystem.h>
17 #include <atm/ProfileResult.h>
18 #include <atm/InclinedAtmosphericProfile.h>
27 namespace RdHASLDFFitter {
30 bool fUseStationsWithoutSignal =
false;
32 bool fUseParam =
true;
33 bool fUseSoftExponent =
true;
40 double fEnergyFluenceVxB = 0;
41 double fEnergyFluenceVxBErr = 0;
42 double fEnergyFluenceVxVxB = 0;
43 double fEnergyFluenceVxVxBErr = 0;
44 mutable double fEnergyFluenceVxBPredict = 0;
45 mutable double fEnergyFluenceGeomagnetic = 0;
46 mutable double fEnergyFluenceGeomagneticErr = 0;
47 mutable double fCEarlyLate = 0;
48 mutable double fCeFraction = 0;
49 mutable bool fRejected =
false;
54 double fSineAlpha = 0;
56 double fDistanceTo750 = 0;
71 const std::vector<Minou::ParameterDef>& pars,
73 const double egeoCorr = 1) :
74 fStationData(stationData),
75 fShowerData(showerData),
76 fFitConfig(fitconfig),
77 fTransformationRefCore(
79 fShowerData.fRefShowerAxis,
81 fShowerData.fMagneticField)),
84 GetParameterDefs() = pars;
87 double operator()(
const std::vector<double>& pars)
const;
93 double GetChi2(
const std::vector<double>& pars);
96 double FVxBPrediction(
const double xvBvvB,
const double yvBvvB,
const double cEarlyLate)
const;
99 double FGeomagneticParam(
const double xvBvvB,
const double yvBvvB,
100 const double efvxB,
const double cEarlyLate)
const;
103 double FGeomagneticPos(
const double xvBvvB,
const double yvBvvB,
const double cEarlyLate,
107 double FGeomagneticPosErr(
const double xvBvvB,
const double yvBvvB,
const double efGeoPos,
112 double GetChargeExcessFraction(
const double axisDistance)
const;
115 void GetPrediction(
const std::vector<double>& pars);
118 virtual double FEgeo(
const double r)
const = 0;
121 virtual double GetNormalization()
const = 0;
124 virtual void UpdateParameterParam(
const std::vector<double>& pars)
const = 0;
127 static double ChargeExcessFractionParamICRC19(
const double axisDistance,
128 const double distanceToXmax,
129 const double densityXmax);
132 static double ChargeExcessFractionParamICRC21(
const double axisDistance,
133 const double distanceToXmax,
134 const double densityXmax);
137 static double GeomagneticEmissionFactor(
const double ceFraction,
138 const double sineAlpha,
139 const double cosAzimuth);
142 static double GeomagneticEmissionFactor(
const double ceFraction,
143 const double sineAlpha,
151 double GetLoss(
const double model,
const double data,
const double uncertainty)
const;
154 double GetLossLog(
const double model,
const double data,
const double uncertainty)
const;
167 const double fEgeoCorr = 1;
170 mutable double fEgeo = 0;
171 mutable double fRnorm = 0;
172 mutable double fNorm = 1;
174 mutable double fCoreX = 0;
175 mutable double fCoreY = 0;
177 mutable double fDistanceToXmax = 0;
178 mutable double fDensityAtXmax = 0;
179 mutable double fHeight = 0;
187 using LDFFitFunction::LDFFitFunction;
190 double GetNormalization()
const override;
193 static double FABCD(
const double r,
const double r0,
const double a,
194 const double b,
const double c,
const double d);
198 double FEgeo(
const double r)
const override;
205 const double dx = dxmax / 1000;
206 return dx * (6.283649656834273e-05 * dx - 0.02574916964033989) + 20.865090319962185 / dx + 1.6373732045578846;
214 const double dx = dxmax / 1000;
215 return dx * (9.113744732999866e-05 * dx - 0.037475161541008134) + 33.83363364863988 / dx + 1.9430065360834818;
223 const double cherenkovAngleInDeg = 0.24905864 * std::log(densitymax) + 0.92165234;
224 return std::tan(cherenkovAngleInDeg *
utl::deg) * dxmax;
231 mutable double fC = 0;
232 mutable double fD = 0;
233 const double fr0 = 800;
236 UpdateParameterParam(
const std::vector<double>& pars)
241 fDistanceToXmax = pars[1];
246 fC = GetC(fDistanceToXmax);
247 fD = GetD(fDistanceToXmax);
251 const double height = fShowerData.fHeightFromDistance.Y(-fDistanceToXmax);
252 fDensityAtXmax = fShowerData.fDensityFromHeight.Y(height) / (
kg /
m3);
254 fRnorm = 5 * CherenkovRadius(fDensityAtXmax, fDistanceToXmax);
255 fNorm = GetNormalization();
264 using LDFFitFunction::LDFFitFunction;
267 double GetNormalization()
const override;
270 static double FGaussSigmoidSoft(
const double r,
const double r0,
const double sig,
271 const double p,
const double arel,
const double slope,
const double r02);
274 static double FGaussSigmoidHard(
const double r,
const double r0,
const double sig,
275 const double p,
const double arel,
const double slope,
const double r02);
279 const double p,
const double arel,
const double slope,
const double r02)
const
280 {
return (fFitConfig.fUseSoftExponent) ? FGaussSigmoidSoft(r, r0, sig, p, arel, slope, r02)
281 : FGaussSigmoidHard(r, r0, sig, p, arel, slope, r02); }
285 double FEgeo(
const double r)
const override;
289 double CalculateR0()
const;
293 return 0.16460107 *
std::pow(dmax - 5000, 0.69675388) + 39.46602294;
297 return -4.91997573e-01 * exp(-3.88166824e-05 * dmax) + 1.85788594e+00;
301 return 5.48029929e-01 + 7.06584317e-07 * dmax + 5.06592690e+07 / dmax / dmax;
305 return 7.57300343e-01 + 7.76904953e-07 * dmax + 1.63545932e+07 / dmax / dmax;
329 {
return 0.13176183 *
std::pow(dmax - 5000, 0.71437054) + 56.30941015; }
332 {
return 1.54942405e+02 * exp(-2.50177591e-05 * dmax) + 6.49133050e+01; }
335 {
return 5.51709206e-01 + 6.87661913e-07 * dmax + 6.61581738e+07 / dmax / dmax; }
338 {
return 7.57449757e-01 + 7.68399447e-07 * dmax + 1.98026585e+07 / dmax / dmax; }
341 {
return (fFitConfig.fUseSoftExponent) ? GetSigSoft(dmax) : GetSigHard(dmax); }
343 double GetP(
const double dmax)
const
344 {
return (fFitConfig.fUseSoftExponent) ? GetPSoft(dmax) : GetPHard(dmax); }
347 {
return (fFitConfig.fUseSoftExponent) ? GetR02Soft(dmax) : GetR02Hard(dmax); }
350 {
return (fFitConfig.fUseSoftExponent) ? GetArelSoft(dmax) : GetArelHard(dmax); }
355 mutable double fR0 = 0;
356 mutable double fSig = 0;
357 mutable double fP = 0;
358 mutable double fR02 = 0;
359 mutable double fArel = 0;
360 const double fSlope = 5;
363 UpdateParameterParam(
const std::vector<double>& pars)
368 fDistanceToXmax = pars[1];
374 fHeight = fShowerData.fHeightFromDistance.Y(-fDistanceToXmax);
375 fDensityAtXmax = fShowerData.fDensityFromHeight.Y(fHeight) / (
kg /
m3);
378 fSig = GetSig(fDistanceToXmax);
379 fP = GetP(fDistanceToXmax);
380 fR02 = GetR02(fDistanceToXmax);
381 fArel = GetArel(fDistanceToXmax);
385 fNorm = GetNormalization();
static double GetArelHard(const double dmax)
static double GetSigHard(const double dmax)
static double CherenkovRadius(const double densitymax, const double dxmax)
static double GetC(const double dxmax)
static double GetPSoft(const double dmax)
atm::ProfileResult fDensityFromHeight
Provide an easy way to create a local coordinate system.
static double GetArelSoft(const double dmax)
RadioGeometryUtilities fTransformationRefCore
double pow(const double x, const unsigned int i)
const FitConfig fFitConfig
double GetArel(const double dmax) const
atm::ProfileResult fHeightFromDistance
static double GetR02Soft(const double dmax)
Class describing the Atmospheric profile.
double GetSig(const double dmax) const
double GetR02(const double dmax) const
static double GetD(const double dxmax)
static double GetPHard(const double dmax)
const std::vector< StationFitData > & fStationData
LDFFitFunction(const std::vector< StationFitData > &stationData, ShowerFitData showerData, const std::vector< Minou::ParameterDef > &pars, const FitConfig fitconfig=FitConfig(), const double egeoCorr=1)
double FGaussSigmoid(const double r, const double r0, const double sig, const double p, const double arel, const double slope, const double r02) const
static double GetSigSoft(const double dmax)
ShowerFitData fShowerData
static double GetR02Hard(const double dmax)
atm::ProfileResult fRefracFromHeight
double GetP(const double dmax) const