70 #include <fwk/CentralConfig.h>
72 #include <evt/Event.h>
73 #include <evt/ShowerRecData.h>
74 #include <evt/ShowerSRecData.h>
76 #include <sevt/SEvent.h>
77 #include <sevt/Header.h>
78 #include <sevt/Station.h>
79 #include <sevt/StationRecData.h>
80 #include <sevt/StationConstants.h>
82 #include <sevt/PMTRecData.h>
84 #include <det/Detector.h>
86 #include <utl/Reader.h>
87 #include <utl/AugerUnits.h>
88 #include <utl/ErrorLogger.h>
89 #include <utl/StringCompare.h>
90 #include <utl/Trace.h>
91 #include <utl/TraceAlgorithm.h>
93 #include <fwk/VModule.h>
98 #include <TVirtualFitter.h>
102 #include <evt/ShowerSRecDataQuantities.h>
107 using namespace sevt;
108 using namespace SdCompParam;
109 using std::ostringstream;
114 double SdCompositionParameters::fgRisetime = -1;
115 double SdCompositionParameters::fgRisetimeError = -1;
116 double SdCompositionParameters::fgRisetimeReducedChi2 = -1;
118 DeltaResults* SdCompositionParameters::fgDeltaResults = NULL;
124 SdCompositionParameterResults::SdCompositionParameterResults() :
128 fRisetime1000Error(-1),
129 fRisetime1000Chi2(-1),
130 fRisetime1000NDF(-1),
139 for (std::vector<StationSdParameterData*>::iterator sIt =
fStationData.begin();
153 for (std::vector<StationSdParameterData*>::iterator sIt =
fStationData.begin();
197 std::ostringstream info;
199 info <<
"Configuring the FADC Parameters module.\n"
200 "***************************************\n";
211 info <<
"Going to recalculate risetimes for stations.\n"
212 "Pulse RiseTime defined as:\n"
214 <<
"% of total signal.\n";
217 info <<
"Using existing station risetimes (from SdCalibrator).\n";
223 info <<
"\nConfiguring the risetime fit routines.\n";
231 info <<
"Fitting the risetime for the event is enabled.\n";
245 info <<
"\tIncluding saturated stations.\n";
247 info <<
"\tNot including saturated stations.\n";
249 std::string weightingFunction;
250 risetimeFitBranch.
GetChild(
"WeightAsFunctionDistance").
GetData(weightingFunction);
255 info <<
"Fitting the risetime for the event is disabled.\n";
260 error <<
"Weight formula defined in SdCompositionParameters.xml contains an error!\n"
262 "This formula does not conform to the ROOT formula class guidelines.";
278 Branch CalculateLeedsDeltaBranch;
279 if ((CalculateLeedsDeltaBranch = topBranch.
GetChild(
"LeedsDelta"))) {
284 std::string currentFunction;
285 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeBenchmarkFunction").
GetData(currentFunction);
289 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeBenchmarkParameterA").
GetData(currentFunction);
296 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeBenchmarkParameterB").
GetData(currentFunction);
303 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeAzimuthCorrectionFunction").
GetData(currentFunction);
307 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeDistanceCorrectionFunction").
GetData(currentFunction);
311 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeZenithCorrectionFunction1").
GetData(currentFunction);
318 CalculateLeedsDeltaBranch.
GetChild(
"RisetimeZenithCorrectionFunction2").
GetData(currentFunction);
328 Branch CalculateLDFParametersBranch;
329 if ((CalculateLDFParametersBranch = topBranch.
GetChild(
"LDFParameters"))) {
340 Branch GeneralParametersBranch;
341 if ((GeneralParametersBranch = topBranch.
GetChild(
"GeneralParameters"))) {
342 std::string errorFunction;
343 GeneralParametersBranch.
GetChild(
"StationRisetimeErrorFunction").
GetData(errorFunction);
352 info <<
"\n***************************************\n"
353 "FADC Parameters module initialized.\n";
363 std::ostringstream info;
374 info <<
"There is no SEvent";
393 const double EventThetaRec = std::asin(
sqrt(this_u*this_u + this_v*this_v));
401 unsigned short rejectcode = 0;
402 bool usestation =
true;
403 int saturationflag = -1;
412 if (stationrisetime <= 0) {
414 info <<
"Station " << currentStation.
GetId()
415 <<
" has no rise time information, calculating...";
418 if (stationrisetime <= 0)
422 const double stationdistance = theStationRecData.
GetSPDistance();
456 const double signal =
463 const double stationrisetimeerror =
465 const double photonbenchmark_A =
467 const double photonbenchmark_B =
469 const double photonbenchmark =
470 fRTBenchmark->Eval(photonbenchmark_A, photonbenchmark_B, stationdistance);
480 bool stflag =
RTCandidateFlag(theEvent, rejectcode, stationdistance, usestation, stationrisetime, signal);
493 if (start_bin >= stop_bin || start_bin < 0 || start_bin > 5000)
496 const double risetime_start =
498 const double risetime_stop =
499 TraceAlgorithm::TimeAtRelativeSignalX(aVEMTrace, start_bin, stop_bin, 100*
fRiseTimeStopPercent);
501 const double diff = risetime_stop - risetime_start;
502 if ((stationrisetime - diff) / stationrisetime >= 0.0001)
507 usestation = num_pmts >= 1;
513 if (!rejectcode&&!stflag)
520 currentStationSdParameterData->
fCorrRisetime = stationrisetime;
522 currentStationSdParameterData->
fDistance = stationdistance;
523 currentStationSdParameterData->
fDistanceError = stationdistanceerror;
526 currentStationSdParameterData->
fSignal = signal;
527 currentStationSdParameterData->
fRejectCode = rejectcode;
528 currentStationSdParameterData->
fUseStation = usestation;
533 #ifdef DEBUG_Risetime1000LLL
535 info <<
"Station Id: " << currentStationSdParameterData->
fStationId <<
"\n"
536 "Risetime: " << currentStationSdParameterData->
fCorrRisetime <<
"\n"
538 "Distance: " << currentStationSdParameterData->
fDistance <<
"\n"
539 "DistanceError: " << currentStationSdParameterData->
fDistanceError <<
"\n"
540 "RejectCode: " << currentStationSdParameterData->
fRejectCode;
553 info <<
"There is no surface reconstruction!\n"
554 "Need a core position and zenith angle before this module.";
604 INFO(
"SdCompositionParameters::Finish()");
625 const unsigned int pointsInGraph =
630 if (pointsInGraph <= 2) {
631 INFO(
"Event risetime uncalculated due to an insuffiecent number of acceptable stations.");
635 vector<double> distances(pointsInGraph);
636 vector<double> distanceserror(pointsInGraph);
637 vector<double> risetimes(pointsInGraph);
638 vector<double> risetimeserror(pointsInGraph);
639 vector<bool> stflag(pointsInGraph);
640 unsigned int point = 0;
657 info <<
"Passed Cut: station " << currentStation.
fStationId <<
", "
658 "distance " << distances[point] <<
" km, "
659 "risetime " << risetimes[point] <<
" ns";
669 info << pointsInGraph <<
" stations passed the cuts.";
672 TGraphErrors riseTimeGraph(pointsInGraph, &distances.front(), &risetimes.front(), 0, &risetimeserror.front());
673 riseTimeGraph.SetMarkerStyle(20);
674 riseTimeGraph.SetMarkerColor(2);
675 riseTimeGraph.SetLineColor(2);
676 riseTimeGraph.SetLineWidth(2);
677 TF1 risetimeFit(
"RisetimeFit",
"40+[0]*x+[1]*x*x",
679 risetimeFit.SetParLimits(0, 0, 10000);
680 risetimeFit.SetParLimits(1, 0, 10000);
684 double risetime = -1;
685 double risetimeerr = -1;
686 double risetimechi2 = -1;
687 double risetimeNDF = -1;
688 bool risetime1000Flag =
false;
689 bool risetime1000FlagAlt =
false;
694 TVirtualFitter*
const fitter = TVirtualFitter::GetFitter();
695 const int nPar = fitter->GetNumberTotalParameters();
696 const TMatrixD covar(nPar, nPar, fitter->GetCovarianceMatrix());
698 const double rtcov = covar[0][1];
699 const double rtcov2 = covar[1][1];
700 const double rtcov1 = covar[0][0];
704 risetimeerr =
sqrt(rtcov2 + rtcov1 + 2*rtcov);
706 risetimechi2 = risetimeFit.GetChisquare();
707 risetimeNDF = risetimeFit.GetNDF();
731 theSRecData.
SetParameter(eRiseTime1000Chi2, risetimechi2);
732 theSRecData.
SetParameter(eRiseTime1000NDF, risetimeNDF);
733 theSRecData.
SetParameter(eRiseTime1000NSt, pointsInGraph);
734 theSRecData.
SetParameter(eRiseTime1000NStClose, nstClose);
735 theSRecData.
SetParameter(eRiseTime1000Flag, risetime1000Flag);
736 theSRecData.
SetParameter(eRiseTime1000FlagAlt, risetime1000FlagAlt);
745 double total_risetime = 0;
746 std::vector<double> risetime;
757 if (start_bin >= stop_bin || start_bin < 0 || start_bin > 5000)
760 const double risetime_start =
762 const double risetime_stop =
763 TraceAlgorithm::TimeAtRelativeSignalX(aVEMTrace, start_bin, stop_bin, 100*
fRiseTimeStopPercent);
765 const double diff = risetime_stop - risetime_start;
766 risetime.push_back(diff);
767 total_risetime += diff;
772 ERROR(
"Valid station, but no PMTRecData. Risetime recalculation failed!");
775 const double meanRiseTime = total_risetime / num_pmts;
789 const unsigned int pointsInGraph =
792 vector<double> distances(pointsInGraph);
793 vector<double> risetimes(pointsInGraph);
794 vector<double> risetimeserror(pointsInGraph);
795 vector<double> benchmarks(pointsInGraph);
796 vector<double> signals(pointsInGraph);
797 vector<int> saturationflags(pointsInGraph);
798 vector<bool> usestations(pointsInGraph);
799 unsigned int point = 0;
800 double deltaRiseTime = 0;
809 distances[point] = currentStation.
fDistance;
813 signals[point] = currentStation.
fSignal;
817 deltaRiseTime += (risetimes[point]-benchmarks[point])/risetimeserror[point];
820 deltaRiseTime = deltaRiseTime/double(point);
824 theSRecData.
SetParameter(eDeltaRiseTimeFlag, deltaRiseTimeFlag);
825 theSRecData.
SetParameter(eDeltaRiseTimeFlagAlt, deltaRiseTimeFlagAlt);
827 return deltaRiseTime;
841 double beta = theSRecData.
GetBeta();
842 double gamma = theSRecData.
GetGamma();
843 const unsigned int pointsInGraph =
845 unsigned int point = 0;
847 vector<double> signals(pointsInGraph);
848 vector<double> distances(pointsInGraph);
849 vector<double> saturationflags(pointsInGraph);
856 signals[point] = currentStation.
fSignal;
862 R_NKG += signals[point] / signalexp;
864 S_4 += signals[point] / signalexp_2;
869 R_NKG = R_NKG/double(point);
870 S_4 = S_4/double(point);
889 const double kElongRatePar1WGNew = 872.;
890 const double kElongRatePar2WGNew = 64.;
891 const double kElongRatePar3WGNew = 37.;
892 const double kUniversalityPar1WGCorrGH = 3.03;
893 const double kUniversalityPar2WGCorrGH = 592.;
894 const double kUniversalityPar3WGCorrGH = 152.;
895 const double kUniversalityPar4WGCorrGH = 100.;
897 TF1 fElongRate(
"fElongRate",
"[0] + [1]*log10(x) + [2]*log10(x)*log10(x)", 0.5, 2.5);
898 TF1 fUn(
"fUn",
"[0] * (1.+(x-[3])/[1]) / (1. + pow((x-[3])/[2],2.))", -100., 2000.);
899 TF1 fUnGH(
"fUnGH",
"[0] * pow(1.+(x-[2])/[1], [1]/[3]) * exp(-(x-[2])/[3])", -100., 2000.);
903 const double ElongRatePars[3] = {kElongRatePar1WGNew, kElongRatePar2WGNew, kElongRatePar3WGNew};
904 const double UnPars[4] = {kUniversalityPar1WGCorrGH, kUniversalityPar2WGCorrGH, kUniversalityPar3WGCorrGH, kUniversalityPar4WGCorrGH};
909 for (
int i = 0; i < fElongRate.GetNumberFreeParameters(); ++i)
910 fElongRate.SetParameter(i,ElongRatePars[i]);
912 for (
int i = 0; i < fUnGH.GetNumberFreeParameters(); ++i)
913 fUnGH.SetParameter(i, UnPars[i]);
916 static const double xground = 880.0;
918 static const double kF0 = 2;
919 static const double kERecTolerance = 1e-5;
920 static const double kERecMinDeltaX = -50;
927 double Eold_EeV = kF0 * E_hadron / 1e18;
928 double epsilon = 1000;
930 double DxTolerance = kERecMinDeltaX * 2;
933 while ((X-XM) > DxTolerance && epsilon > kERecTolerance) {
937 XM = fElongRate.Eval(Eold_EeV);
941 _scale = (0.83 + 2.3e-4 * (X - XM));
942 E_EeV =
pow(s1000/fUnGH.Eval(X-XM), 1./_scale);
944 epsilon =
std::abs(E_EeV - Eold_EeV);
953 }
else if ((X - fElongRate.Eval(Eold_EeV)) <= kERecMinDeltaX) {
992 double beta = theSRecData.
GetBeta();
993 double gamma = theSRecData.
GetGamma();
998 double signalexp = s1000 *
pow(distance/1000., beta) *
pow((distance + 700.) / 1700., beta + gamma);
1000 double kMinDistBenchNicole = 600;
1001 double kMaxDistBenchNicole = 2000;
1005 saturationflag >= 0 &&
1006 ehadr * 1e-18 > 1 &&
1010 kMinDistBenchNicole < distance && distance < kMaxDistBenchNicole;
1021 bool flag = (saturationflag >= 0);
1024 flag = (flag && distance > 1);
1033 bool cut = (hadrenergy >= 1e18);
1035 cut = (cut && nst >= 4);
1037 cut = (cut && nst >= 3);
1050 cut = (theSRecData.
HasLDF() && nst >= 1);
1060 bool cut = hadrenergy * 1e-18 >= 1;
1062 cut = (cut && nst >= 3 && nstClose > 0);
1064 cut = (cut && nst >= 4);
double GetAzimuthShowerPlane() const
Azimuth in shower plane coordinates.
bool SelectionRiseTime1000(int nst, int nstClose, double hadrenergy, bool doAltSel)
char * fRisetimeZenithCorrectionFunction1
char * fRisetimeZenithCorrectionFunction2
char * fRisetimeBenchmarkParameterB
Class to access station level reconstructed data.
float fRiseTimeStartPercent
void SetCorrectedRiseTime(const double crt, const double crte)
double GetSPDistanceError() const
Error in core distance in shower plane coordinates.
StationIterator StationsEnd()
End of all stations.
utl::TraceD & GetVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal)
Traces calibrated in VEM Peak.
double GetRiseTime() const
Rise time averaged over PMTs.
double FitEventRiseTime(evt::Event &event)
int GetId() const
Get the station Id.
bool HasRecData() const
Check for existenc of PMT reconstructed data object.
std::vector< StationSdParameterData * > fStationData
double fRisetimeBenchmarkParameterB_2
class to hold data at PMT level
bool HasStation(const int stationId) const
Check whether station exists.
void SetRiseTimeRejectionCode(const int code)
TFormula * fRTBenchmarkParameterA
Report success to RunController.
total (shower and background)
double fRisetimeZenithCorrectionFunction2Parameterm2
double GetRiseTimeCleaned() const
Interface class to access to the SD Reconstruction of a Shower.
double fLDFParametersOptimumDistance
double LDFParametersCalculation(evt::Event &event)
TFormula * fRTZenithCorrections1
bool HasRecShower() const
Interface class to access to the SD part of an event.
void SetChi2Ndof(const double chi2, const double ndof)
double fRTErrorFunctionParameterJb0
PMTIterator PMTsBegin(const sdet::PMTConstants::PMTType type=sdet::PMTConstants::eWaterCherenkovLarge)
begin PMT iterator for read/write
void SetParameterCovariance(const Parameter q1, const Parameter q2, const double corr, const bool lock=true)
PMTRecData & GetRecData()
Get object containing PMT reconstructed data.
float fMinimumSignalForRiseTimeFit
ShowerRecData & GetRecShower()
TFormula * fRTAzimuthCorrections
std::map< std::string, std::string > AttributeMap
sevt::StationRecData & GetRecData()
Get station level reconstructed data.
#define INFO(message)
Macro for logging informational messages.
char * fRTWeightingFunction
double fRisetimeZenithCorrectionFunction2Parameterm1
void SetXmax(const double xmax, const double xmaxErrUp, const double xmaxErrDown)
double GetShowerSize() const
char * fRisetimeAzimuthCorrectionFunction
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
TFormula * fRTBenchmarkParameterB
boost::filter_iterator< PMTFilter, InternalPMTIterator > PMTIterator
Iterator over station for read/write.
double pow(const double x, const unsigned int i)
double fRisetimeBenchmarkParameterA_0
bool fDoCalculateLDFParameters
double fCorrRisetimeError
bool IsHighGainSaturation() const
static const RiseTimeRejectionCode eNotCandidate
bool StringEquivalent(const std::string &a, const std::string &b, Predicate p)
Utility to compare strings for equivalence. It takes a predicate to determine the equivalence of indi...
ShowerSRecData & GetSRecShower()
static double fgRisetimeError
int SaturationFlag(sevt::Station &station)
TFormula * fRTZenithCorrections2
bool IsCandidate() const
Check if the station is a candidate.
double fRisetimeZenithCorrectionFunction1Parameterl0
fwk::VModule::ResultFlag Run(evt::Event &theEvent)
Run: invoked once per event.
double fRTErrorFunctionParameterJa0
SdCompositionParameters()
AttributeMap GetAttributes() const
Get a map<string, string> containing all the attributes of this Branch.
Branch GetNextSibling() const
Get next sibling of this branch.
static const RiseTimeRejectionCode eLowSignal
bool HasRiseTime1000() const
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
double fRisetimeBenchmarkParameterB_1
void SetAlphaBeta(const double alpha, const double beta=0)
Class representing a document branch.
class to hold data at Station level
double LeedsDeltaCalculation(evt::Event &event)
void SetRiseTime1000(const double rt, const double rte)
unsigned short fRejectCode
float fRiseTimeStopPercent
class to hold reconstructed data at PMT level
void SetParameter(const Parameter q, const double param, const bool lock=true)
std::vector< StationSdParameterData * > fStationData
static const RiseTimeRejectionCode eLowGainSaturated
double GetX(const CoordinateSystemPtr &coordinateSystem) const
double fRisetimeBenchmarkParameterA_1
char * fRisetimeBenchmarkFunction
double abs(const SVector< n, T > &v)
double GetTotalSignal() const
Total integrated signal in VEM unit, averaged over pmts.
double PhotonEnergyCalculation(evt::Event &event, double E_hadron, double secZenith)
double fRisetimeZenithCorrectionFunction1Parameterl2
unsigned int fLDFRejectedStations
fwk::VModule::ResultFlag Init()
Initialize: invoked at beginning of run (NOT beginning of event)
double fRisetime1000Error
char * fRisetimeDistanceCorrectionFunction
unsigned int GetSignalStartSlot() const
Start time of the signal in time slots from beginning of trace.
bool SelectionDeltaRiseTime(int nst, double hadrenergy, bool doAltSel)
PMTIterator PMTsEnd(const sdet::PMTConstants::PMTType type=sdet::PMTConstants::eWaterCherenkovLarge)
end PMT iterator for read/write
signal after subtracting direct light (includes all particle sources).
float fMinimumDistanceForRiseTimeFit
const utl::Vector & GetAxis() const
float fDistanceToInterpolateFitResult
void GetData(bool &b) const
Overloads of the GetData member template function.
unsigned int fRejectedStations
bool fForceRiseTimeRecalculation
unsigned int GetSignalEndSlot() const
End time of the signal in time slots from beginning of trace.
static double fgRisetimeReducedChi2
sevt::StationConstants::SignalComponent fComponent
bool fIncludeSaturatedForRiseTimeFit
double RecalculateRiseTime(sevt::Station &station)
bool IsLowGainSaturation() const
Check which gains are saturated.
double fRisetimeBenchmarkParameterB_0
double GetY(const CoordinateSystemPtr &coordinateSystem) const
ResultFlag
Flag returned by module methods to the RunController.
double fRTErrorFunctionParameterJa1
bool HasRecData() const
Check whether station reconstructed data exists.
unsigned int fRTRejectedStations
bool RTCandidateFlag(evt::Event &event, int saturationflag, double distance, bool usest, double rtcorr, double signal)
double fRTErrorFunctionParameterJb1
StationIterator StationsBegin()
Beginning of all stations.
bool SelectionLDFPar(int nst, evt::Event &event)
double GetSPDistance() const
Distance from core in shower plane coordinates.
char * fRisetimeBenchmarkParameterA
bool fUseDLECorrectedTrace
double fRisetimeZenithCorrectionFunction1Parameterl1
static const RiseTimeRejectionCode eNotInRing
Report failure to RunController, causing RunController to terminate execution.
Main configuration utility.
boost::indirect_iterator< InternalStationIterator, Station & > StationIterator
Iterator over all stations.
void SetShowerSizeType(const ShowerSizeType type)
Branch GetFirstChild() const
Get first child of this Branch.
virtual ~SdCompositionParameters()
evt::RiseTime1000 & GetRiseTime1000()
double fRisetimeBenchmarkParameterA_2
static SdCompositionParameterResults * fgCompositionParameterResults
fwk::VModule::ResultFlag Finish()
Finish: invoked at end of the run (NOT end of the event)
bool HasVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal) const
#define ERROR(message)
Macro for logging error messages.
TFormula * fRTDistanceCorrections
bool fDoCalculateLeedsDelta
bool HasSRecShower() const
sevt::SEvent & GetSEvent()
float fMaximumDistanceForRiseTimeFit
~SdCompositionParameterResults()
double fRisetimeZenithCorrectionFunction2Parameterm0
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)
bool SbCandidateFlag(int saturationflag, double distance, bool sat1000)
double fLDFParametersScaleDistance
double GetTotalSignalCleaned() const