3 #include "../FdProfileReconstructorKG/UncorrelatedUncertainties.h"
5 #include <fwk/CentralConfig.h>
6 #include <fwk/LocalCoordinateSystem.h>
8 #include <utl/ErrorLogger.h>
9 #include <utl/AugerUnits.h>
10 #include <utl/Reader.h>
11 #include <utl/Transformation.h>
13 #include <evt/Event.h>
14 #include <evt/GaisserHillas4Parameter.h>
16 #include <fevt/FEvent.h>
18 #include <fevt/EyeHeader.h>
19 #include <fevt/Telescope.h>
20 #include <fevt/TelescopeRecData.h>
21 #include <evt/ShowerFRecData.h>
22 #include <fevt/EyeRecData.h>
24 #include <det/Detector.h>
25 #include <fdet/FDetector.h>
28 #include <atm/Atmosphere.h>
30 #include <boost/io/ios_state.hpp>
44 namespace FdEnergyDepositFinderKG {
46 const string gHRule =
" --------------------------------------------------------------";
52 auto& cc = *CentralConfig::GetInstance();
54 auto topB = cc.GetTopBranch(
"FdEnergyDepositFinder");
57 auto eCalcB = topB.GetChild(
"invisibleEnergy");
58 const string compositionOption = eCalcB.GetChild(
"composition").Get<
string>();
61 (compositionOption ==
"eData") ?
63 (compositionOption ==
"eMixed") ?
65 (compositionOption ==
"eProton") ?
68 const auto interactionOption = eCalcB.GetChild(
"interactionModel").Get<
string>();
69 if (interactionOption ==
"eSIBYLL21")
71 else if (interactionOption ==
"eQGSJET01")
73 else if (interactionOption ==
"eDATA")
77 err <<
"Unknown hadronic interaction model used: " << interactionOption;
83 ERROR(
"inconsistent invisible energy options (data options cannot "
84 "be mixed with other options)");
90 auto errPropB = topB.GetChild(
"errorPropagation");
91 errPropB.GetChild(
"verbosity").GetData(fErrPropVerbosity);
92 errPropB.GetChild(
"rescaleErrors").GetData(fRescaleErrors);
93 errPropB.GetChild(
"maxErrPropPoints").GetData(fMaxErrPropPoints);
95 auto evSelB = topB.GetChild(
"eventSelection");
96 evSelB.GetChild(
"requireNonMono").GetData(fOnlyNonMono);
97 evSelB.GetChild(
"maxZenith").GetData(fMaxZenith);
98 topB.GetChild(
"denseMatrixDim").GetData(fDenseMatrixDim);
99 topB.GetChild(
"antiAliasingFilterCorrection").GetData(fAafCorrection);
100 topB.GetChild(
"useNoiseBins").GetData(fUseNoiseBins);
103 info <<
"Parameters:\n"
104 "\tinvisible energy model: "
105 << interactionOption <<
'/'
106 << compositionOption <<
"\n"
107 "\t" << (fOnlyNonMono ?
"" :
"not ") <<
"skipping mono events\n"
108 "\tskipping upward showers with theta > " << fMaxZenith/
deg;
111 fCFMatrixCalculator.Init();
112 fCFMatrixCalculatorDense.Init();
113 fProfileFitter.Init();
125 auto& fdEvent =
event.GetFEvent();
127 for (
auto eyeIt = fdEvent.EyesBegin(ComponentSelector::eHasData),
128 end = fdEvent.EyesEnd(ComponentSelector::eHasData);
129 eyeIt != end; ++eyeIt) {
133 if (IsEventCandidate(eye)) {
136 info <<
" calculating profile for eye " << eye.GetId();
139 fRecResultsPlus.clear();
140 fRecResultsMinus.clear();
142 for (
unsigned int i = 0; i < eNErrorPropagation; ++i) {
145 bool fullCalculation =
false;
147 for (
unsigned int j = 0; j < 2; ++j) {
150 fullCalculation =
false;
154 if (fErrPropStage != eDefaultReco) {
155 const auto id = eye.GetId();
161 fCFMatrixCalculator.SetMethod(CFMatrixCalculator::eFast);
162 fCFMatrixCalculator.SetVerbosity(-1);
163 fCFMatrixCalculatorDense.SetMethod(CFMatrixCalculator::eFast);
164 fCFMatrixCalculatorDense.SetVerbosity(-1);
165 fProfileFitter.SetAafCorrection(
false,
false);
166 fProfileFitter.SetVerbosity(-1);
168 fCFMatrixCalculator.SetMethod(CFMatrixCalculator::ePrecise);
169 fCFMatrixCalculator.SetVerbosity(0);
170 fCFMatrixCalculatorDense.SetMethod(CFMatrixCalculator::ePrecise);
171 fCFMatrixCalculatorDense.SetVerbosity(0);
172 fProfileFitter.SetAafCorrection(fAafCorrection, fUseNoiseBins);
173 fProfileFitter.SetVerbosity(0);
177 (fErrPropStage == eDefaultReco) ? eye : eventCopy.
GetFEvent().
GetEye(eye.GetId());
183 fCFMatrixCalculator.BuildMatrix(eyeEvt);
184 fCFMatrixCalculator.SetVerbosity(-1);
185 fCFMatrixCalculatorDense.BuildMatrix(
188 (fErrPropStage == eDefaultReco &&
189 fCFMatrixCalculator.GetFOVSize() > 0 &&
190 fDenseMatrixDim/fCFMatrixCalculator.GetFOVSize() > 0) ?
191 fDenseMatrixDim/fCFMatrixCalculator.GetFOVSize() : 1
193 fCFMatrixCalculatorDense.SetVerbosity(-1);
195 if (fCFMatrixCalculator.HasMatrix() && fCFMatrixCalculatorDense.HasMatrix()) {
198 if (!fProfileCalculator.CalculateProfile(eyeEvt, fCFMatrixCalculator))
204 fullCalculation =
true;
208 if (fErrPropStage == eDefaultReco && !fullCalculation) {
210 shower.SetTotalEnergy(0, 1e20*
eV);
211 shower.SetEmEnergy(0, 1e20*eV);
212 if (shower.HasGHParameters()) {
213 shower.GetGHParameters().SetXMax(0, 1000*
g/
cm2);
214 shower.GetGHParameters().SetNMax(0, 0);
217 }
else if (fErrPropStage != eDefaultReco) {
221 (errPropType == ePlus) ? fRecResultsPlus : fRecResultsMinus;
222 recoResult[fErrPropStage] = gh4Pars;
226 const Atmosphere& atmo = det::Detector::GetInstance().GetAtmosphere();
229 if (!fullCalculation || fErrPropStage == eDefaultReco)
234 if (!fullCalculation)
241 PropagateUncertainties(eye);
256 fProfileFitter.ResetStartParameters();
258 if (!shower.HasGHParameters()) {
260 if (!GuessGHParameters(shower))
262 DumpCurrentParameters(shower,
false,
eUndefined);
265 fProfileFitter.SetFitMode(ProfileFitter::eNMax);
269 fProfileFitter.SetStartParameters(gh4Pars);
271 fProfileFitter.SetLightFluxData(fCFMatrixCalculator, fCFMatrixCalculatorDense);
273 fProfileFitter.SetProfileData(shower.GetEnergyDeposit());
274 fProfileFitter.SetFunctionType(type);
276 if (fProfileFitter.Fit()) {
279 fProfileFitter.FillGHParameters(gh4Pars);
286 fProfileFitter.SetFitMode(ProfileFitter::eIntegral);
287 fProfileFitter.SetStartParameters(gh4Pars);
288 if (fProfileFitter.Fit())
289 fProfileFitter.GetEnergy(calorEnergy, calorEnergyErr);
297 const double currXmax = gh4Pars.
GetXMax();
298 const double maxDeltaXmax = 10*
g/
cm2;
299 const bool updateCFM =
300 (fabs(currXmax-fCFMatrixCalculatorDense.GetXmax()) > maxDeltaXmax &&
304 fCFMatrixCalculator.BuildMatrix(eye);
305 fCFMatrixCalculatorDense.BuildMatrix(
308 (fErrPropStage == eDefaultReco &&
309 fCFMatrixCalculator.GetFOVSize() > 0 &&
310 fDenseMatrixDim/fCFMatrixCalculator.GetFOVSize() > 0) ?
311 fDenseMatrixDim/fCFMatrixCalculator.GetFOVSize() : 1
315 if (fCFMatrixCalculator.HasMatrix() && fCFMatrixCalculatorDense.HasMatrix()) {
317 if (!fProfileCalculator.CalculateProfile(eye, fCFMatrixCalculator))
319 DumpCurrentParameters(shower, updateCFM, type);
331 FdEnergyDepositFinder::PropagateUncertainties(
fevt::Eye& eye)
337 if (!recShower.HasGHParameters())
342 const double dEdXmax = gh4.
GetNMax();
343 const double xmax = gh4.
GetXMax();
346 const double calorEnergy = recShower.GetEmEnergy();
349 const auto& axis = recShower.GetAxis();
350 const auto& core = recShower.GetCorePosition();
353 const double cosZenithAngle = axis.GetCosTheta(coreCS);
356 const double invEnergyFac =
358 fInvisibleEnergyModel,
359 fComposition, cosZenithAngle);
360 const double totalEnergy = invEnergyFac * calorEnergy;
363 if (fRecResultsPlus.size() != eNErrorPropagation - 1 ||
364 fRecResultsMinus.size() != eNErrorPropagation - 1) {
366 if (fErrPropVerbosity > -1) {
368 for (
int j = eFirstErrProp; j < eNErrorPropagation; ++j) {
370 if (fRecResultsPlus.find(tmp) == fRecResultsPlus.end() ||
371 fRecResultsMinus.find(tmp) == fRecResultsMinus.end()) {
376 cout <<
" ==[ErrProp]==> numerical error propagation failed at stage "
378 " setting uncertainties to 100%!" << endl;
382 gh4.
SetNMax(dEdXmax, dEdXmax,
true);
396 enum EShowerParameter {
402 eLastFitParameter = eCalorEnergy
405 double geomVariance[eLastFitParameter+1];
406 double atmVariance[eLastFitParameter+1];
408 for (
int i = 0; i <= eLastFitParameter; ++i) {
410 EShowerParameter currentParameter = EShowerParameter(i);
412 double uncertainty[eNErrorPropagation];
413 for (
int j = eFirstErrProp; j < eNErrorPropagation; ++j) {
418 switch (currentParameter) {
439 const double rhoRT = eyeRecData.GetRpTZeroCorrelation();
440 const double rhoRC = eyeRecData.GetRpChi0Correlation();
441 const double rhoCT = eyeRecData.GetChi0TZeroCorrelation();
443 const double timeFitVariance =
444 Sqr(uncertainty[eRp]) +
445 Sqr(uncertainty[eT0]) +
446 Sqr(uncertainty[eChi0]) +
447 2 * uncertainty[eRp] * uncertainty[eT0] * rhoRT +
448 2 * uncertainty[eRp] * uncertainty[eChi0] * rhoRC +
449 2 * uncertainty[eChi0] * uncertainty[eT0] * rhoCT;
451 const double rhoPT = eyeRecData.GetSDPCorrThetaPhi();
453 const double sdpFitVariance =
454 Sqr(uncertainty[eSDPTheta]) +
455 Sqr(uncertainty[eSDPPhi]) +
456 2 * uncertainty[eSDPPhi] * uncertainty[eSDPTheta] * rhoPT;
458 geomVariance[i] = timeFitVariance + sdpFitVariance;
459 atmVariance[i] =
Sqr(uncertainty[eMie]);
472 const double logE = log10(calorEnergy);
477 const double le = logE - 18;
478 const double fE =
max(fp0 + le*(fp1 + fp2*le), 0.);
479 const double les = logEs - 18;
480 const double fEs = fp0 + les*(fp1 + fp2*les);
481 const double atmVar1 =
Sqr(dEr*fE/fEs * calorEnergy);
489 const double scaleFac = fRescaleErrors ?
490 sqrt(recShower.GetGHParameters().GetChiSquare() /
491 recShower.GetGHParameters().GetNdof()) :
493 const double calorEnergyStatVar =
495 const double calorEnergyGeomVar = geomVariance[eCalorEnergy];
504 const double calorEnergyAtmVar =
505 atmVariance[eCalorEnergy] + atmVar1 + atmVar2 + atmVar3 + atmVar4 + atmVar5;
511 recShower.SetEmEnergy(
513 sqrt(calorEnergyGeomVar + calorEnergyStatVar + calorEnergyConexMissingVar),
520 const double invEnergyFacDeriv =
522 fInvisibleEnergyModel,
523 fComposition, cosZenithAngle);
529 const double deriv = invEnergyFacDeriv * calorEnergy + invEnergyFac;
537 const double deriv2 =
Sqr(deriv);
538 const double statVar = deriv2 * calorEnergyStatVar;
539 const double geomVar = deriv2 * calorEnergyGeomVar;
541 const double ConexMissingVar = deriv2 * calorEnergyConexMissingVar;
543 const double totalEnergyAtmErr =
sqrt(deriv2 * calorEnergyAtmVar);
548 const double totalEnergyStatErr =
sqrt(invEVar + geomVar + statVar + ConexMissingVar);
558 const double shapePar1TotErr =
sqrt(
Sqr(shapePar1Err) + geomVariance[eShapePar1]);
559 const double xmaxTotErr =
sqrt(
Sqr(xmaxErr) + geomVariance[eXmax]);
560 const double nmaxTotErr =
sqrt(
Sqr(nmaxErr) + geomVariance[edEdXmax]);
561 const double shapePar2TotErr =
sqrt(
Sqr(shapePar2Err) + geomVariance[eShapePar2]);
566 gh4.
SetNMax(dEdXmax, nmaxTotErr,
true);
572 if (fErrPropVerbosity >- 1) {
573 boost::io::ios_all_saver save(cout);
574 cout.flags(std::ios::scientific);
575 cout <<
"\n E/EeV = " << totalEnergy/
EeV;
577 cout <<
" +/- " <<
sqrt(statVar)/
EeV <<
" (stat.)"
578 " +/- " <<
sqrt(geomVar)/
EeV <<
" (geom.)"
579 " +/- " <<
sqrt(invEVar)/
EeV <<
" (inv.)"
580 " +/- " << totalEnergyAtmErr/
EeV <<
" (atm.)\n"
583 cout << xmax/(
g/
cm2);
585 cout <<
" +/- " << xmaxErr/(
g/
cm2) <<
" (stat.)"
586 " +/- " <<
sqrt(geomVariance[eXmax])/(
g/
cm2) <<
" (geom.)"
587 " +/- " <<
sqrt(atmVariance[eXmax])/(
g/
cm2) <<
" (atm.)"
601 telIt != end; ++telIt) {
603 if (!telIt->HasRecData())
606 auto& telRecData = telIt->GetRecData();
620 unsigned int nInRange = 0;
621 for (
unsigned int i = 0; i < photonTrace.GetNPoints(); ++i) {
622 x.push_back(photonTrace.GetX(i));
623 y.push_back(photonTrace.GetY(i));
624 ex.push_back(photonTrace.GetXErr(i));
625 ey.push_back(photonTrace.GetYErr(i));
626 vBkg.push_back(
Sqr(bgTrace.GetYErr(i)));
627 if (telRecData.IsSpotFarFromBorder(photonTrace.GetX(i)))
631 if (
int(nInRange) > fMaxErrPropPoints) {
636 const double nCombi =
max(1,
int(
double(nInRange) / fMaxErrPropPoints + 0.5));
639 double t1 = x[0] - ex[0];
642 double bgVarianceSum = 0;
644 for (
unsigned int i = 0; i < x.size(); ++i) {
648 bgVarianceSum += vBkg[i];
653 if (combined >= nCombi || i == x.size()-1) {
654 const double dt = x[i] + ex[i] - t1;
655 photonTrace.PushBack(t1 + 0.5*dt, 0.5*dt, sum,
sqrt(sum2));
656 bgTrace.PushBack(t1 + 0.5*dt, 0.5*dt, 0,
sqrt(bgVarianceSum));
674 if (fErrPropStage >= eFirstGeometryProp &&
675 fErrPropStage <= eLastGeometryProp) {
677 const auto& detEye = det::Detector::GetInstance().GetFDetector().GetEye(eye);
678 const auto eyeCS = detEye.GetEyeCoordinateSystem();
679 const auto& eyepos = detEye.GetPosition();
681 const double timeFitFactor = fRescaleErrors ?
682 (eyeRecData.GetTimeFitNDof() ?
683 sqrt(eyeRecData.GetTimeFitChiSquare()/eyeRecData.GetTimeFitNDof()) : 1) :
685 const double sdpFitFactor = fRescaleErrors ?
686 (eyeRecData.GetSDPFitNDof() ?
687 sqrt(eyeRecData.GetSDPFitChiSquare()/eyeRecData.GetSDPFitNDof()) : 1) :
690 double t0 = eyeRecData.GetTZero();
691 double chi0 = eyeRecData.GetChiZero();
692 double rp = eyeRecData.GetRp();
693 double sdpTheta = eyeRecData.GetSDP().GetTheta(eyeCS);
694 double sdpPhi = eyeRecData.GetSDP().GetPhi(eyeCS);
695 if (fErrPropStage == eRp)
696 rp += eyeRecData.GetRpError()*errPropType*timeFitFactor;
697 else if (fErrPropStage == eChi0)
698 chi0 += eyeRecData.GetChiZeroError()*errPropType*timeFitFactor;
699 else if (fErrPropStage == eT0)
700 t0 += eyeRecData.GetTZeroError()*errPropType*timeFitFactor;
701 else if (fErrPropStage == eSDPTheta)
702 sdpTheta += eyeRecData.GetSDPThetaError()*errPropType*sdpFitFactor;
703 else if (fErrPropStage == eSDPPhi)
704 sdpPhi += eyeRecData.GetSDPPhiError()*errPropType*sdpFitFactor;
706 const Vector sdp(1, sdpTheta, sdpPhi, eyeCS, Vector::kSpherical);
707 const Vector vertical(0,0,1, eyeCS);
710 const auto rot = Transformation::Rotation(-chi0, sdp, eyeCS);
711 const auto axis =
Normalized(rot*horizontalInSDP);
712 const double coreDistance = rp / sin(chi0);
713 const auto coreEyeVec = coreDistance * horizontalInSDP;
714 const auto core = eyepos + coreEyeVec;
715 recShower.SetAxis(axis);
716 recShower.SetCorePosition(core);
725 }
else if (fErrPropStage == eMie) {
726 const Atmosphere& atmo = det::Detector::GetInstance().GetAtmosphere();
746 const unsigned int nPoints = energyDeposit.GetNPoints();
747 const double depthBin = 50*
g/
cm2;
749 bool firstTime =
true;
752 for (
unsigned int i = 0; i < nPoints; ++i) {
753 const double firstDepth = energyDeposit.GetX(i);
754 unsigned int nAverage = 0;
758 for (
unsigned int j = i; j < nPoints; ++j) {
759 const double thisDepth = energyDeposit.GetX(j);
762 const double w = 1 /
Sqr(energyDeposit.GetYErr(j));
764 ywSum += energyDeposit.GetY(j)*w;
766 if (thisDepth - firstDepth > depthBin) {
767 const double yAverage = ywSum / wSum;
768 if (firstTime || yAverage > dEdXmax) {
770 xMax = xSum / nAverage;
779 fGHShapePars.Type(
eOne),
780 fGHShapePars.Mean(
eOne, 1e18*
eV),
781 fGHShapePars.Sigma(
eOne, 1e18*eV)
784 fGHShapePars.Type(
eTwo),
785 fGHShapePars.Mean(
eTwo, 1e18*eV),
786 fGHShapePars.Sigma(
eTwo, 1e18*eV)
789 WARNING(
"can not estimate start parameters");
791 gh4Pars.
SetNMax(energyDeposit.GetY(0), 0,
true);
795 gh4Pars.
SetNMax(dEdXmax, 0,
true);
803 const bool cfmUpdate,
807 if (fErrPropVerbosity < 1 && fErrPropStage != eDefaultReco)
810 cout <<
" ==[ErrProp]==> stage " << fErrPropStage << endl;
816 << setw(13) <<
"dEdXmax"
817 << setw(12) << fGHShapePars.Name(
eOne)
818 << setw(12) << fGHShapePars.Name(
eTwo)
821 << setw(9) <<
"[g/cm^2]"
822 << setw(13) <<
"[PeV cm^2/g]"
823 << setw(12-2-fGHShapePars.UnitName(
eOne).length()) <<
" " <<
"[" << fGHShapePars.UnitName(
eOne) <<
"]"
824 << setw(12-2-fGHShapePars.UnitName(
eTwo).length()) <<
" " <<
"[" << fGHShapePars.UnitName(
eTwo) <<
"]\n"
829 cout <<
" ==> prefit1:";
832 cout <<
" ==> prefit2:";
835 cout <<
" ==> logLike:";
842 cout <<
" --- " << endl;
849 boost::io::ios_all_saver save(cout);
850 cout.flags(std::ios::scientific);
853 cout << setw(9) << fixed << gh4Pars.
GetXMax()/
g*
cm2
860 << std::left << gh4Pars.
GetNdof() << std::right
861 << (cfmUpdate ?
" *" :
"") << endl;
866 FdEnergyDepositFinder::IsEventCandidate(
const fevt::Eye& eye)
872 info <<
" skipping eye " << eye.
GetId() <<
" without RecData";
878 info <<
" skipping eye " << eye.
GetId() <<
" without FRecShower";
884 info <<
" skipping eye " << eye.
GetId() <<
" with time-fit Ndf="
895 if (shower.GetStationIds().empty() &&
898 info <<
" skipping eye " << eye.
GetId()
899 <<
" with mono geometry";
905 if (fMaxZenith < 180*
degree) {
906 const auto& core = shower.GetCorePosition();
907 const auto& axis = shower.GetAxis();
909 if (axis.GetTheta(coreLocalCS) > fMaxZenith) {
910 info <<
" skipping upward event in eye " << eye.
GetId()
911 <<
" theta=" << axis.GetTheta(coreLocalCS)/
degree <<
" deg.";
AxialVector Cross(const Vector &l, const Vector &r)
double GetShapeParameter(const gh::EShapeParameter par) const
access to all variants of shape parameters (see GaisserHillasTypes.h)
unsigned int GetId() const
double Factor(const double energyEM, const EInteractionModel intMod, const ECompositionModel compMod, const double cosTheta)
invisible energy factor, finv=Etot/Eem, given Eem. CosTheta only needed when using data driven estima...
Top of the interface to Atmosphere information.
constexpr T Sqr(const T &x)
double GetRpError() const
double GetIntegralError() const
return relative error of integral
fevt::EyeHeader & GetHeader()
Header for this Eye Event.
Fluorescence Detector Eye Event.
double FactorDerivative(const double energyEM, const EInteractionModel intMod, const ECompositionModel compMod, const double cosTheta)
derivative of invisible energy factor dfinv/dEem given Eem. CosTheta only needed when using data driv...
unsigned int GetTimeFitNDof() const
unsigned int GetNdof() const
void SetXMax(const double xMax, const double error)
#define INFO(message)
Macro for logging informational messages.
void MakeEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
void SetShapeParameter(const gh::EShapeParameter par, const double value, const double error)
Setters.
void Init()
Initialise the registry.
double GetXMaxError() const
Exception for reporting variable out of valid range.
const std::vector< PCGFData > & GetPCGF() const
TelescopeIterator TelescopesEnd()
first available tel of status eHasData (DEPRECATED)
bool HasFRecShower() const
Check if reconstructed shower info has been allocated.
evt::ShowerFRecData & GetFRecShower()
Reconstructed shower info for this eye.
#define WARNING(message)
Macro for logging warning messages.
double GetNMaxError() const
AxialVector Normalized(const AxialVector &v)
Eye & GetEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
return Eye by id
TelescopeIterator TelescopesBegin()
first available tel of status eHasData (DEPRECATED)
void SetNMax(const double nMax, const double error, const bool isEnergyDeposit=false)
double GetTimeFitChiSquare() const
fevt::FEvent & GetFEvent()
bool HasGHParameters() const
A TimeInterval is used to represent time elapsed between two events.
ResultFlag
Flag returned by module methods to the RunController.
void SetEnergyCutoff(const double energy)
Interface class to access to Fluorescence reconstruction of a Shower.
utl::TabulatedFunctionErrors & GetLightFlux(const FdConstants::LightSource source=fevt::FdConstants::eTotal)
Light flux at diaphragm, photons/m^2 versus time in ns.
double GetShapeParameterError(const gh::EShapeParameter par) const
double GetIntegral() const
calculate integral
Gaisser Hillas with 4 parameters.
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
void MakeGHParameters(const VGaisserHillasParameter &gh)
#define ERROR(message)
Macro for logging error messages.
double FactorVariance(const double eCal, const double eTot)
void SetUncertaintyBound(const ModelWithUncertainty model, const double nSigma) const
alter Model "model" by "nSigma" standard deviations
const std::string & GetMessage() const
Retrieve the message from the exception.
double GetChiSquare() const
utl::TabulatedFunctionErrors & GetEnergyDeposit()
retrieve dE/dX
fevt::EyeRecData & GetRecData()
Reconstructed data for this eye.