13 #include <boost/tokenizer.hpp>
24 #include <TGraphErrors.h>
25 #include <TGraphBentErrors.h>
26 #include <TMultiGraph.h>
27 #include <TPaveText.h>
28 #include <TPolyLine.h>
30 #include <fwk/CentralConfig.h>
32 #include <det/Detector.h>
34 #include <sdet/SDetector.h>
35 #include <sdet/STimeVariance.h>
37 #include <evt/ShowerSimData.h>
38 #include <evt/Event.h>
39 #include <evt/ShowerRecData.h>
40 #include <evt/ShowerSRecData.h>
42 #include <sevt/SEvent.h>
43 #include <sevt/Header.h>
44 #include <sevt/Station.h>
45 #include <sevt/StationRecData.h>
46 #include <sevt/StationTriggerData.h>
48 #include <utl/PhysicalConstants.h>
49 #include <utl/TimeStamp.h>
50 #include <utl/UTCDateTime.h>
51 #include <utl/TraceAlgorithm.h>
52 #include <utl/AxialVector.h>
53 #include <utl/UTMPoint.h>
54 #include <utl/TabulatedFunctionErrors.h>
55 #include <utl/ErrorLogger.h>
56 #include <utl/Reader.h>
57 #include <utl/SaveCurrentTDirectory.h>
61 using namespace SdRecPlotterOG;
70 namespace SdRecPlotterOG {
77 const double scal = axis*station;
78 return sqrt(station*station - scal*scal);
88 if (t4 & ShowerSRecData::eT4_FD)
90 if (t4 & ShowerSRecData::eT4_3TOT)
91 trig << (trig.str().length() ?
"+" :
"") <<
"3TOT";
92 if (t4 & ShowerSRecData::eT4_4C1)
93 trig << (trig.str().length() ?
"+" :
"") <<
"4C1";
106 if (t5 & ShowerSRecData::eT5_Prior)
108 if (t5 & ShowerSRecData::eT5_Posterior)
109 trig << (trig.str().length() ?
"+" :
"") <<
"Posterior";
118 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
119 boost::char_separator<char> separator(
"\n");
120 tokenizer tokens(str, separator);
121 for (tokenizer::iterator it = tokens.begin();
122 it != tokens.end(); ++it)
123 pt.AddText(it->c_str());
137 fGenerateROOTFile = bool(topBranch.
GetChild(
"GenerateROOTFile"));
139 fGeneratePDFFile = bool(topBranch.
GetChild(
"GeneratePDFFile"));
141 fAppendOutput = bool(topBranch.
GetChild(
"AppendOutput"));
143 if (!fGenerateROOTFile && !fGeneratePDFFile)
144 WARNING(
"Both ROOT and PS options switched off, no output will be generated.");
146 if (fGenerateROOTFile) {
147 const string fileName = fFileNamePrefix +
".root";
148 fROOTFile =
new TFile(fileName.c_str(),
"recreate",
"SdRecPlotter", 9);
149 INFO(fileName +
" file created.");
152 gROOT->SetStyle(
"Plain");
153 gStyle->SetPalette(1, 0);
155 if (fGeneratePDFFile) {
156 gStyle->SetPaperSize(TStyle::kA4);
157 gStyle->SetTitlePS(fFileNamePrefix.c_str());
159 fPDFFileName = fFileNamePrefix +
".pdf";
169 if (!fGenerateROOTFile && !fGeneratePDFFile)
172 WARNING(
"No reconstructed shower data found.");
176 WARNING(
"No SD reconstructed shower data found.");
180 if (fGeneratePDFFile && !fAppendOutput) {
182 os << fFileNamePrefix <<
'_' <<
event.GetSEvent().GetHeader().GetId() <<
".pdf";
183 fPDFFileName = os.str();
199 if (fGeneratePDFFile && fAppendOutput) {
201 c.Print((fPDFFileName +
")").c_str(),
"pdf");
209 namespace SdRecPlotterOG {
215 void PushStation(
const int id,
const double x,
const double y,
216 const double r,
const double sig,
const double tCurv,
217 const double t0,
const double sigma_t,
218 const double t10,
const double t50,
const double t90,
219 const int groupSize,
const int saturation,
const bool tot);
221 void CalculateLimits(
const double zoom = 1);
232 TGraph* GetLDFGraph();
233 TGraphBentErrors* GetSaturatedLDFGraph();
234 TGraph* GetStartTimeGraph();
235 TGraphBentErrors* GetRiseFallTimeGraph();
236 TGraph* GetCurvatureFitGraph();
259 double fMaxSignal = 0;
264 double fMinStartTime = 0;
265 double fMaxStartTime = 0;
276 TGraph* fLDFGraph =
nullptr;
277 TGraphBentErrors* fSaturatedLDFGraph =
nullptr;
278 TGraphErrors* fLDFNonsaturatedGraph =
nullptr;
279 TGraph* fStartTimeGraph =
nullptr;
280 TGraphBentErrors* fRiseFallTimeGraph =
nullptr;
281 TGraph* fCurvatureFitGraph =
nullptr;
299 for (
const auto c : fCircles)
302 delete fSaturatedLDFGraph;
303 delete fLDFNonsaturatedGraph;
304 delete fStartTimeGraph;
305 delete fRiseFallTimeGraph;
306 delete fCurvatureFitGraph;
312 const double r,
const double sig,
const double tCurv,
313 const double t0,
const double sigma_t,
314 const double t10,
const double t50,
const double t90,
315 const int groupSize,
const int sat,
const bool tot)
318 fPositionX.push_back(x);
319 fPositionY.push_back(y);
325 fSignal.push_back(sig);
326 if (sig > fMaxSignal)
328 fCurvTime.push_back(tCurv);
329 fStartTime.push_back(t0);
330 fStartTimeErr.push_back(sigma_t);
331 fTime10.push_back(t10);
332 fTime50.push_back(t50);
333 fTime90.push_back(t90);
334 fTwin.push_back(groupSize);
335 fSaturation.push_back(sat);
344 const unsigned int nStations = fPositionX.size();
347 fMinX = fMaxX = fPositionX[0];
348 fMinY = fMaxY = fPositionY[0];
350 fMinStartTime = fMaxStartTime = fMaxTime = fStartTime[0];
351 const double sqrtMaxSignal =
sqrt(fMaxSignal);
352 for (
unsigned int i = 0; i < nStations; ++i) {
353 const double sqrtS =
sqrt(fSignal[i]);
354 const double r = kStationMinRadius +
355 (kStationMaxRadius - kStationMinRadius)*sqrtS/sqrtMaxSignal;
356 fPlotRadius.push_back(r);
357 const double x = fPositionX[i];
358 const double xdown = x - r;
361 const double xup = x + r;
364 const double y = fPositionY[i];
365 const double ydown = y - r;
368 const double yup = y + r;
371 const double tCurv = fCurvTime[i];
372 if (fMinTime > tCurv)
374 if (fMaxTime < tCurv)
376 const double t0 = fStartTime[i];
377 if (fMinStartTime > t0)
379 if (fMaxStartTime < t0)
385 const double t10 = fTime10[i];
390 const double t50 = fTime50[i];
402 if (fMinR < kLDFMinR)
409 double dx = zoom * (fMaxX - fMinX);
412 double dy = zoom * (fMaxY - fMinY);
413 if (dx/kAspect > dy) {
420 const double meanX = (fMinX + fMaxX)/2;
421 const double meanY = (fMinY + fMaxY)/2;
427 double dt = zoom * (fMaxTime - fMinTime) / 2;
430 const double meanTime = (fMinTime + fMaxTime) / 2;
431 fMinTime = meanTime - dt;
432 fMaxTime = meanTime + dt;
433 if (fMinStartTime == fMaxStartTime)
441 const unsigned int nStations = fPositionX.size();
442 for (
unsigned int i = 0; i < nStations; ++i) {
443 const double r = fPlotRadius[i];
444 const int sat = fSaturation[i];
445 TEllipse*
s =
nullptr;
446 TEllipse* s2 =
nullptr;
447 TEllipse* thresh =
nullptr;
450 s =
new TEllipse(fPositionX[i], fPositionY[i], (sat == 2 ? kLowGainSatFactor : 1)*r);
452 s2 =
new TEllipse(fPositionX[i], fPositionY[i], r);
454 thresh =
new TEllipse(fPositionX[i], fPositionY[i], r/4);
457 s =
new TEllipse(fPositionX[i], fPositionY[i] - kTwinSplit,
458 (sat == 2 ? kLowGainSatFactor : 1)*r);
460 s2 =
new TEllipse(fPositionX[i], fPositionY[i] - kTwinSplit, r);
462 thresh =
new TEllipse(fPositionX[i], fPositionY[i] - kTwinSplit, r/4,
466 s =
new TEllipse(fPositionX[i], fPositionY[i] + kTwinSplit,
467 (sat == 2 ? kLowGainSatFactor : 1)*r);
469 s2 =
new TEllipse(fPositionX[i], fPositionY[i] + kTwinSplit, r);
471 thresh =
new TEllipse(fPositionX[i], fPositionY[i] + kTwinSplit,
476 int(51 + (fStartTime[i] - fMinStartTime)/(fMaxStartTime - fMinStartTime)*49.);
479 s->SetLineColor(color);
481 thresh->SetLineColor(10);
486 s->SetLineColor(color);
488 s2->SetLineColor(kBlack);
490 thresh->SetLineColor(kBlack);
493 s->SetFillColor(color);
494 s->SetFillStyle(1001);
496 fCircles.push_back(s);
499 fCircles.push_back(s2);
502 thresh->SetFillColor(10);
503 thresh->SetFillStyle(1001);
505 fCircles.push_back(thresh);
509 label.SetTextSize(0.03);
510 for (
unsigned int i = 0; i < nStations; ++i) {
514 const double textSplit = kTwinIdSplit * (fTwin[i] ? (fTwin[i] >= 1 ? -1 : 1) : 0);
515 label.DrawLatex(fPositionX[i], fPositionY[i] + textSplit,
id.str().c_str());
526 vector<double> signal;
527 vector<double> signalErr;
528 const unsigned int nR = fR.size();
530 for (
unsigned int i = 0; i < nR; ++i)
531 if (fSaturation[i] != 2) {
533 signal.push_back(fSignal[i]);
534 signalErr.push_back(
sqrt(fSignal[i]));
537 fLDFGraph =
new TGraphErrors(r.size(), &r[0], &signal[0], 0, &signalErr[0]);
538 fLDFGraph->SetMarkerSize(0.5);
539 fLDFGraph->SetMarkerStyle(8);
548 delete fSaturatedLDFGraph;
549 fSaturatedLDFGraph =
nullptr;
551 vector<double> signal;
552 vector<double> signalErr;
553 const unsigned int nR = fR.size();
554 for (
unsigned int i = 0; i < nR; ++i)
555 if (fSaturation[i] == 2) {
557 signal.push_back(fSignal[i]);
558 signalErr.push_back(
sqrt(fSignal[i]));
561 fSaturatedLDFGraph =
new TGraphBentErrors(r.size(), &r[0], &signal[0], 0, 0, &signalErr[0]);
562 fSaturatedLDFGraph->SetMarkerSize(0.5);
563 fSaturatedLDFGraph->SetMarkerStyle(22);
564 fSaturatedLDFGraph->SetMarkerColor(kBlue);
566 return fSaturatedLDFGraph;
573 delete fStartTimeGraph;
574 fStartTimeGraph =
new TGraphErrors(fR.size(), &fR[0], &fStartTime[0], 0, &fStartTimeErr[0]);
575 fStartTimeGraph->SetMarkerStyle(22);
576 fStartTimeGraph->SetMarkerSize(0.5);
577 return fStartTimeGraph;
586 const unsigned int nR = fR.size();
587 for (
unsigned int i = 0; i < nR; ++i) {
588 const double t50 = fTime50[i];
589 low.push_back(t50 - fTime10[i]);
590 high.push_back(fTime90[i] - t50);
592 delete fRiseFallTimeGraph;
593 fRiseFallTimeGraph =
new TGraphBentErrors(fR.size(), &fR[0], &fTime50[0], 0, 0, &low[0], &high[0]);
594 fRiseFallTimeGraph->SetMarkerStyle(21);
595 fRiseFallTimeGraph->SetMarkerSize(0.3);
596 fRiseFallTimeGraph->SetMarkerColor(38);
597 fRiseFallTimeGraph->SetLineColor(38);
598 return fRiseFallTimeGraph;
605 delete fCurvatureFitGraph;
606 fCurvatureFitGraph =
new TGraph(fR.size(), &fR[0], &fCurvTime[0]);
607 fCurvatureFitGraph->SetMarkerStyle(4);
608 fCurvatureFitGraph->SetMarkerSize(0.9);
609 fCurvatureFitGraph->SetMarkerColor(kGreen);
610 return fCurvatureFitGraph;
616 namespace SdRecPlotterOG {
622 void SetLimits(
const double minX,
const double maxX,
623 const double minY,
const double maxY,
624 const double maxR,
const double maxSignal);
625 void PushStation(
const int id,
const double x,
const double y,
const double r,
626 const double sig,
const double t,
const int groupSize);
628 TGraphErrors* GetSignalGraph();
629 TGraph* GetTimeGraph();
642 double fMaxSignal = 0;
648 TGraphErrors* fSignalGraph =
nullptr;
649 TGraph* fTimeGraph =
nullptr;
657 for (
const auto line : fLines)
659 for (
const auto circ : fCircles)
668 const double minY,
const double maxY,
669 const double maxR,
const double maxSignal)
671 const double d = 0.1;
677 fMaxSignal = maxSignal;
683 const double r,
const double sig,
const double t,
687 fPositionX.push_back(x);
688 fPositionY.push_back(y);
690 fSignal.push_back(sig);
692 fTwin.push_back(groupSize);
699 const double sqrtMaxSignal =
sqrt(fMaxSignal);
700 const unsigned int nStations = fId.size();
701 vector<bool> isDrawn(nStations,
false);
702 for (
unsigned int i = 0; i < nStations; ++i) {
703 const double x = fPositionX[i];
704 const double y = fPositionY[i];
705 const double sqrtS =
sqrt(fSignal[i]);
708 const double size = r/
sqrt(2.);
709 if (fMinX + size < x && x < fMaxX - size &&
710 fMinY + size < y && y < fMaxY - size) {
711 TLine* line1 =
nullptr;
712 TLine* line2 =
nullptr;
713 TEllipse*
c =
nullptr;
716 line1 =
new TLine(x - size, y - size, x + size, y + size);
717 line2 =
new TLine(x - size, y + size, x + size, y - size);
718 c =
new TEllipse(x, y, r);
723 line1 =
new TLine(x - size, yy - size, x, yy);
724 line2 =
new TLine(x, yy, x + size, yy - size);
725 c =
new TEllipse(x, yy, r, 0, 180, 360, 0);
731 line1 =
new TLine(x - size, yy + size, x, yy);
732 line2 =
new TLine(x, yy, x + size, yy + size);
733 c =
new TEllipse(x, yy, r, 0, 0, 180, 0);
737 line1->SetLineColor(kRed);
738 line2->SetLineColor(kRed);
739 c->SetLineColor(kRed);
743 fLines.push_back(line1);
744 fLines.push_back(line2);
745 fCircles.push_back(c);
750 label.SetTextSize(0.03);
751 for (
unsigned int i = 0; i < nStations; ++i)
756 const double textSplit =
758 label.DrawLatex(fPositionX[i], fPositionY[i] + textSplit,
id.str().c_str());
767 fSignalGraph =
nullptr;
769 vector<double> signal;
770 vector<double> signalErr;
771 const unsigned int nR = fR.size();
772 for (
unsigned int i = 0; i < nR; ++i)
775 signal.push_back(fSignal[i]);
776 signalErr.push_back(
sqrt(fSignal[i]));
779 fSignalGraph =
new TGraphErrors(r.size(), &r[0], &signal[0], 0, &signalErr[0]);
780 fSignalGraph->SetLineColor(kRed);
781 fSignalGraph->SetMarkerColor(kRed);
782 fSignalGraph->SetMarkerStyle(8);
783 fSignalGraph->SetMarkerSize(0.5);
793 fTimeGraph =
nullptr;
794 const unsigned int nR = fR.size();
796 fTimeGraph =
new TGraph(nR, &fR[0], &fTime[0]);
797 fTimeGraph->SetMarkerStyle(22);
798 fTimeGraph->SetMarkerSize(0.5);
799 fTimeGraph->SetMarkerColor(kRed);
807 namespace SdRecPlotterOG {
813 void SetLimits(
const double minX,
const double maxX,
814 const double minY,
const double maxY,
816 void PushStation(
const double x,
const double y,
817 const double r,
const int groupSize);
819 TGraph* GetLimitsGraph();
835 TGraph* fLimitsGraph =
nullptr;
846 for (
const auto circ : fCircles)
854 const double minY,
const double maxY,
857 const double d = 0.1;
869 fPositionX.push_back(x);
870 fPositionY.push_back(y);
872 fTwin.push_back(groupSize);
879 const double size = 0.05;
880 const double twinSplit = 0.03;
881 const unsigned int nStations = fPositionX.size();
882 for (
unsigned int i = 0; i < nStations; ++i) {
883 const double x = fPositionX[i];
884 const double y = fPositionY[i];
885 if (fMinX < x && x < fMaxX && fMinY < y && y < fMaxY) {
886 TEllipse*
c =
nullptr;
889 c =
new TEllipse(x, y, size);
892 c =
new TEllipse(x, y - twinSplit, size, 0, 180, 360, 0);
895 c =
new TEllipse(x, y + twinSplit, size, 0, 0, 180, 0);
899 fCircles.push_back(c);
909 fLimitsGraph =
nullptr;
911 const unsigned int nR = fR.size();
912 for (
unsigned int i = 0; i < nR; ++i)
915 const unsigned nLimits = r.size();
917 vector<double> trigger(nLimits, kSilentThreshold);
918 fLimitsGraph =
new TGraph(nLimits, &r[0], &trigger[0]);
919 fLimitsGraph->SetMarkerStyle(23);
920 fLimitsGraph->SetMarkerColor(kBlue);
921 fLimitsGraph->SetMarkerSize(0.5);
932 const SEvent& sEvent =
event.GetSEvent();
935 const string globalId =
event.GetHeader().
GetId();
936 const det::Detector& detector = det::Detector::GetInstance();
938 const STimeVariance& timeVariance = STimeVariance::GetInstance();
940 const ShowerSRecData& shRec =
event.GetRecShower().GetSRecShower();
945 const double curvR = curvature ? 1/curvature : 1000*
kilometer;
946 const Vector showerCenter(curvR*axis);
954 double minHeight = 0;
955 double maxHeight = 0;
960 const int sId = sIt->GetId();
965 const Vector sRelPos(sPosition - core);
969 if (sIt->IsCandidate()) {
971 const double radius = (showerCenter - sRelPos).GetMag();
972 const double height = axis*sRelPos;
973 if (minHeight > height)
975 if (maxHeight < height)
979 const TimeStamp planeFrontTime(coreTime -
983 const double traceTime = (sIt->GetTraceStartTime() - planeFrontTime).GetInterval();
986 const TraceD& trace = sIt->GetVEMTrace();
987 const double t10 = traceTime + TraceAlgorithm::TimeAtRelativeSignalX(trace, start, end, 10);
988 const double t50 = traceTime + TraceAlgorithm::TimeAtRelativeSignalX(trace, start, end, 50);
989 const double t90 = traceTime + TraceAlgorithm::TimeAtRelativeSignalX(trace, start, end, 90);
990 const double sigma_t =
sqrt(timeVariance.
GetTimeSigma2(signal, t50 - t0, axis.GetCosTheta(siteCS), r));
991 const int sat = sIt->IsLowGainSaturation() ? 2 : sIt->IsHighGainSaturation();
992 const bool tot = sIt->GetTriggerData().GetAlgorithm() == StationTriggerData::eTimeOverThreshold;
995 groupSize, sat, tot);
997 }
else if (sIt->IsRejected() && sIt->HasRecData()) {
1000 const TimeStamp planeFrontTime(coreTime -
1003 accidentals.
PushStation(sId, x, y, r, sIt->GetRecData().GetTotalSignal(), t0/
nanosecond, groupSize);
1012 const double minX = candidates.
GetMinX();
1013 const double maxX = candidates.
GetMaxX();
1014 const double minY = candidates.
GetMinY();
1015 const double maxY = candidates.
GetMaxY();
1016 const double minR = candidates.
GetMinR();
1017 const double maxR = candidates.
GetMaxR();
1019 ostringstream cName;
1021 cName <<
"Event_" << globalId;
1022 TCanvas canvas(cName.str().c_str(), cName.str().c_str(), 1);
1023 canvas.Divide(2, 2);
1027 TH2F
array(
"array",
"Array layout", 10, minX, maxX, 10, minY, maxY);
1028 array.GetXaxis()->SetTitle(
"x [km]");
1029 array.GetYaxis()->SetTitle(
"y [km]");
1030 array.SetStats(kFALSE);
1036 silents.
SetLimits(minX, maxX, minY, maxY, maxR);
1042 if (seedStation.size()) {
1045 for (
unsigned int i = 0; i < seedStation.size(); ++i) {
1053 TPolyLine*
const grSeed =
new TPolyLine(sx.size(), &sx[0], &sy[0]);
1054 grSeed->SetBit(kCanDelete);
1055 grSeed->SetLineColor(kGreen);
1059 const bool hasSimShower =
event.HasSimShower();
1064 const double phiMC = axisMC.
GetPhi(siteCS);
1067 TEllipse*
const coreMCMark =
new TEllipse(coreMCX, coreMCY, 0.25, 0, 31, 329, phiMC/
degree);
1068 coreMCMark->SetBit(kCanDelete);
1069 coreMCMark->SetLineColor(kBlue);
1070 coreMCMark->SetLineWidth(2);
1071 coreMCMark->SetFillStyle(1001);
1072 coreMCMark->SetFillColor(10);
1074 const double coreLength = 2;
1075 TLine*
const coreMCLine =
1076 new TLine(coreMCX, coreMCY, coreMCX + coreLength*cos(phiMC), coreMCY + coreLength*sin(phiMC));
1077 coreMCLine->SetBit(kCanDelete);
1078 coreMCLine->SetLineColor(kBlue);
1079 coreMCLine->SetLineWidth(2);
1083 const double phi = axis.GetPhi(siteCS);
1086 TEllipse coreMark(coreX, coreY, 0.25, 0, 31, 329, phi/
degree);
1087 coreMark.SetLineColor(kRed);
1088 coreMark.SetLineWidth(2);
1089 coreMark.SetFillStyle(1001);
1090 coreMark.SetFillColor(10);
1092 const double coreLength = 2;
1093 TLine coreLine(coreX, coreY, coreX + coreLength*cos(phi), coreY + coreLength*sin(phi));
1094 coreLine.SetLineColor(kRed);
1095 coreLine.SetLineWidth(2);
1100 double timeZeroX[] = { 0, maxR };
1101 double timeZeroY[] = { 0, 0 };
1102 TGraph*
const grTimeZero =
new TGraph(2, timeZeroX, timeZeroY);
1103 grTimeZero->SetBit(kCanDelete);
1104 grTimeZero->SetLineStyle(3);
1105 grTimeZero->SetTitle(
"Timing");
1106 grTimeZero->GetXaxis()->SetTitle(
"r [km]");
1107 grTimeZero->GetYaxis()->SetTitle(
"time to plane front [ns]");
1108 grTimeZero->GetXaxis()->SetLimits(0, maxR);
1109 grTimeZero->SetMinimum(candidates.
GetMinTime());
1110 grTimeZero->SetMaximum(candidates.
GetMaxTime());
1111 grTimeZero->Draw(
"al");
1114 vector<double> timingR;
1115 vector<double> timingCurve;
1116 const double rc = 1/curvature;
1117 const int nPoints = 100;
1118 const double dr = maxR*
kilometer/(nPoints - 1);
1119 const double rc1 = rc - maxHeight;
1120 for (
int i = nPoints - 1; i >= 0; --i) {
1121 const double r = i*dr;
1125 const double rc2 = rc - minHeight;
1126 for (
int i = 0; i < nPoints; ++i) {
1127 const double r = i*dr;
1131 TGraph*
const grCurvature =
new TGraph(timingR.size(), &timingR[0], &timingCurve[0]);
1132 grCurvature->SetBit(kCanDelete);
1133 grCurvature->SetLineColor(7);
1134 grCurvature->SetLineStyle(2);
1135 grCurvature->Draw(
"samel");
1137 grCurvatureFit->Draw(
"samep");
1140 grStartTime->Draw(
"samep");
1142 if (grAccidentalTime)
1143 grAccidentalTime->Draw(
"samep");
1155 vector<double> signalR;
1156 vector<double> signal;
1157 vector<double> signalErr;
1158 const unsigned int nLDFPoints = ldf.
GetNPoints();
1159 for (
unsigned int i = 0; i < nLDFPoints; ++i) {
1161 const double sig = ldf.
GetY(i);
1162 signal.push_back(sig);
1163 signalErr.push_back(sig + ldf.
GetYErr(i));
1165 for (
int i = nLDFPoints - 1; i >= 0; --i) {
1168 signalErr.push_back(low > 0.01 ? low : 0.01);
1171 TGraph*
const grLDFError =
new TGraph(signalR.size(), &signalR[0], &signalErr[0]);
1172 grLDFError->SetBit(kCanDelete);
1173 grLDFError->SetTitle(
"LDF fit");
1174 grLDFError->GetYaxis()->SetTitle(
"Signal [VEM]");
1175 grLDFError->GetXaxis()->SetTitle(
"r [km]");
1176 grLDFError->SetFillStyle(1001);
1177 grLDFError->SetFillColor(18);
1178 grLDFError->GetXaxis()->SetLimits(minR, maxR);
1180 grSatSignal ? min(grSignal->GetYaxis()->GetXmin(), grSatSignal->GetYaxis()->GetXmin()) :
1181 grSignal->GetYaxis()->GetXmin()));
1182 grLDFError->SetMaximum(1.2 * (grSatSignal ?
max(grSignal->GetYaxis()->GetXmax(), grSatSignal->GetYaxis()->GetXmax()) :
1183 grSignal->GetYaxis()->GetXmax()));
1184 grLDFError->Draw(
"af");
1186 TGraph* grLDFFit =
new TGraph(signal.size(), &signalR[0], &signal[0]);
1187 grLDFFit->SetBit(kCanDelete);
1188 grLDFFit->SetLineColor(kGreen);
1189 grLDFFit->SetLineWidth(2);
1190 grLDFFit->Draw(
"samel");
1193 const double sROpt = ldf.
Y(rOpt);
1195 TGraph*
const grLDFROpt =
new TGraph(1, &rOpt, &sROpt);
1196 grLDFROpt->SetBit(kCanDelete);
1197 grLDFROpt->SetMarkerColor(kGreen);
1198 grLDFROpt->SetMarkerStyle(kStar);
1199 grLDFROpt->SetMarkerSize(1.3);
1200 grLDFROpt->Draw(
"samep");
1203 WARNING(
"No LDF tabulated function object found.");
1204 grSignal->SetTitle(
"LDF fit");
1205 grSignal->GetYaxis()->SetTitle(
"Signal [VEM]");
1206 grSignal->GetXaxis()->SetTitle(
"r [km]");
1207 grSignal->GetXaxis()->SetLimits(minR, maxR);
1209 grSatSignal ? min(grSignal->GetYaxis()->GetXmin(), grSatSignal->GetYaxis()->GetXmin()) :
1210 grSignal->GetYaxis()->GetXmin()));
1211 grSignal->SetMaximum(1.2 * (grSatSignal ?
max(grSignal->GetYaxis()->GetXmax(), grSatSignal->GetYaxis()->GetXmax()) :
1212 grSignal->GetYaxis()->GetXmax()));
1213 grSignal->Draw(
"ap");
1218 grSilentLimits->Draw(
"samep");
1221 if (grAccidentalSignal)
1222 grAccidentalSignal->Draw(
"samep");
1225 grSignal->Draw(
"samep");
1227 grSatSignal->Draw(
"samep");
1232 gPad->Range(0,0,1,1);
1233 TPaveText pt(0.1,0.1,0.9,0.9,
"br");
1234 pt.SetFillColor(kWhite);
1235 pt.SetTextAlign(11);
1239 "Event: " << globalId <<
'\n';
1241 double eastingMC = 0;
1242 double northingMC = 0;
1245 double energyMC = 0;
1250 const UTMPoint utmMCCore(coreMC, ReferenceEllipsoid::GetWGS84());
1251 phiMC = axisMC.
GetPhi(siteCS);
1259 info <<
"Time: " <<
UTCDateTime(eventTime) <<
"\n"
1266 info <<
" BadPeriod: " << badId;
1267 info <<
"\nReconstruction stage: " << shRec.
GetLDFRecStage() <<
'\n';
1268 const UTMPoint utmCore(core, ReferenceEllipsoid::GetWGS84());
1270 info <<
"Easting: " << setprecision(8) << utmCore.
GetEasting()/
meter <<
" #pm "
1271 << setprecision(3) << coreError.
GetX(siteCS)/
meter;
1273 info <<
" (MC: " << setprecision(8) << eastingMC/
meter <<
')';
1276 << setprecision(3) << coreError.
GetY(siteCS)/
meter;
1278 info <<
" (MC: " << setprecision(8) << northingMC/
meter <<
')';
1281 info <<
"Distance to MC core: " << setprecision(5) << (core - coreMC).GetMag()/
meter
1284 info <<
"#theta: " << setprecision(4) << axis.GetTheta(siteCS)/
degree <<
" #pm "
1287 info <<
" (MC: " << setprecision(4) << thetaMC/
degree <<
')';
1289 "#phi: " << setprecision(5) << axis.GetPhi(siteCS)/
degree <<
" #pm "
1292 info <<
" (MC: " << setprecision(5) << phiMC/
degree <<
')';
1293 info <<
" [#circ]\n";
1295 const double rc = 1/curvature;
1296 info <<
"R_{c}: " << setprecision(4) << rc/
kilometer <<
" #pm "
1304 info <<
" r_{opt}: " << setprecision(5) << rOpt <<
" [m]";
1305 info <<
"\n#beta: " << setprecision(4) << shRec.
GetBeta()
1308 info <<
"Energy: " << setprecision(4) << shRec.
GetEnergy()/
EeV <<
" #pm "
1311 info <<
" (MC: " << setprecision(4) << energyMC/
EeV <<
')';
1312 info <<
" [EeV]\n ";
1317 if (fGeneratePDFFile) {
1318 static string multipage =
"(";
1319 canvas.Print((fPDFFileName + multipage).c_str(),
"pdf");
static const double kAspect
Class to access station level reconstructed data.
fwk::VModule::ResultFlag Finish() override
Finish: invoked at end of the run (NOT end of the event)
unsigned int GetNPoints() const
double GetCurvatureError() const
StationIterator StationsEnd()
End of all stations.
static const double kTwinIdSplit
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
double GetCurvature() const
gaussian curvature = 1 / Rc
Detector description interface for Station-related data.
void CalculateLimits(const double zoom=1)
vector< TEllipse * > fCircles
Interface class to access to the SD Reconstruction of a Shower.
void PushStation(const double x, const double y, const double r, const int groupSize)
bool HasRecShower() const
const utl::TabulatedFunctionErrors & GetLDF() const
fwk::VModule::ResultFlag Run(evt::Event &event) override
Run: invoked once per event.
Interface class to access to the SD part of an event.
double GetBetaError() const
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
Class to hold and convert a point in geodetic coordinates.
ShowerRecData & GetRecShower()
void SetLimits(const double minX, const double maxX, const double minY, const double maxY, const double maxR)
double GetMaxTime() const
const utl::Vector & GetCoreError() const
#define INFO(message)
Macro for logging informational messages.
vector< double > fPositionY
double GetShowerSize() const
static const double kStationMinRadius
TGraphBentErrors * GetSaturatedLDFGraph()
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
utl::CoordinateSystemPtr GetSiteCoordinateSystem() const
Get the coordinate system for the site.
double GetNorthing() const
Get the northing.
void PushStation(const int id, const double x, const double y, const double r, const double sig, const double t, const int groupSize)
double GetEnergyError() const
const std::vector< int > & GetReconstructionSeed() const
double GetBetaSystematics() const
A TimeStamp holds GPS second and nanosecond for some event.
string GetT5TriggerName(const int t5)
static const double kTwinSplit
utl::Point GetPosition() const
Tank position.
void DrawEvent(const evt::Event &event)
Interface class to access Shower Simulated parameters.
vector< double > fPositionY
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
static const double kMinDX
vector< double > fPlotRadius
Class representing a document branch.
vector< double > fPositionX
const double & GetYErr(const unsigned int idx) const
void AddText(TPaveText &pt, const string &str)
const utl::Vector & GetDirection() const
Get the direction of the shower axis. This is the true direction of shower movement.
utl::TimeStamp GetSignalStartTime() const
Start time of the signal.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
constexpr double nanosecond
const utl::TimeStamp & GetCoreTime() const
time when shower front passes through the core point
double GetTotalSignal() const
Total integrated signal in VEM unit, averaged over pmts.
void PushStation(const int id, const double x, const double y, const double r, const double sig, const double tCurv, const double t0, const double sigma_t, const double t10, const double t50, const double t90, const int groupSize, const int saturation, const bool tot)
const utl::Point & GetPosition() const
Get the position of the shower core.
Top of the hierarchy of the detector description interface.
const sdet::SDetector & GetSDetector() const
double GetMaxSignal() const
unsigned int GetSignalStartSlot() const
Start time of the signal in time slots from beginning of trace.
double GetEasting() const
Get the easting.
double GetLDFRecStage() const
static const double kLDFMinR
double GetThetaError() const
double GetMinTime() const
double GetEnergy() const
Get the energy of the shower primary particle.
const utl::Vector & GetAxis() const
double GetPhiError() const
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
unsigned int GetSignalEndSlot() const
End time of the signal in time slots from beginning of trace.
void SetLimits(const double minX, const double maxX, const double minY, const double maxY, const double maxR, const double maxSignal)
vector< TEllipse * > fCircles
vector< int > fSaturation
vector< TEllipse * > fCircles
const double & GetY(const unsigned int idx) const
static const double kLowGainSatFactor
double GetY(const CoordinateSystemPtr &coordinateSystem) const
vector< double > fPositionY
constexpr double kSpeedOfLight
vector< double > fStartTime
A TimeInterval is used to represent time elapsed between two events.
ResultFlag
Flag returned by module methods to the RunController.
double GetLDFOptimumDistance() const
unsigned long GetGPSSecond() const
GPS second.
const char * GetShowerSizeLabel() const
double GetGPSNanoSecond() const
GPS nanosecond.
vector< double > fPositionX
StationIterator StationsBegin()
Beginning of all stations.
constexpr double kilometer
TGraphErrors * GetSignalGraph()
const double & GetX(const unsigned int idx) const
Detector description interface for SDetector-related data.
double GetShowerSizeError() const
const utl::Point & GetCorePosition() const
sevt::Header & GetHeader()
Main configuration utility.
TGraph * GetCurvatureFitGraph()
TGraph * GetLimitsGraph()
vector< double > fPositionX
string GetT4TriggerName(const int t4)
TGraph * GetStartTimeGraph()
vector< double > fCurvTime
double RPerp(const Vector &axis, const Vector &station)
TGraphBentErrors * GetRiseFallTimeGraph()
const Station & GetStation(const int stationId) const
Get station by Station Id.
double Y(const double x) const
Get or interpolate the Y value that corresponds to parameter x.
boost::indirect_iterator< InternalConstStationIterator, const Station & > ConstStationIterator
int GetNumberOfPartners() const
Number of partners the station has.
bool HasSRecShower() const
double GetShowerSizeSystematics() const
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)
static const double kStationMaxRadius
vector< double > fStartTimeErr
fwk::VModule::ResultFlag Init() override
Initialize: invoked at beginning of run (NOT beginning of event)
static double kSilentThreshold
int GetBadPeriodId() const
double GetTimeSigma2(const double signal, const double t50, const double cosTheta, const double distance=0) const