4 #include <fwk/CentralConfig.h>
5 #include <fwk/RunController.h>
7 #include <sdet/SDetector.h>
8 #include <sdet/StationTriggerAlgorithm.h>
10 #include <evt/Event.h>
12 #include <sevt/SEvent.h>
13 #include <sevt/EventTrigger.h>
14 #include <sevt/Station.h>
18 #include <utl/String.h>
20 #define USE_SPMT_SIGNAL_AS_TOTAL 0
29 namespace SdTraceCalibratorOG {
32 template<
typename T1,
typename T2>
35 operator<<(ostream& os, const pair<T1, T2>&
p)
37 return os <<
'[' <<
p.first <<
", " <<
p.second <<
']';
43 IsInRange(
const pair<double, double>& r,
const double a,
const double b)
45 return r.first <= r.second && a <= r.first && r.second <=
b;
55 topB.GetChild(
"binsBeforeStartForSPMT").GetData(fBinsBeforeStartForSPMT);
57 topB.GetChild(
"riseTimeFractions").GetData(fRiseTimeFractions);
58 topB.GetChild(
"fallTimeFractions").GetData(fFallTimeFractions);
60 ERROR(
"Rise/fall time fractions must be ascending and within [0, 1]");
64 const auto testStations = topB.GetChild(
"testStations").Get<vector<int>>();
65 fTestStations = set<int>(testStations.begin(), testStations.end());
67 fTreatHGLGEqualInSignalSearch = bool(topB.GetChild(
"treatHGLGEqualInSignalSearch"));
69 fIncludeWaterCherenkovDetectorInScintillatorStartStopDetermination =
70 topB.GetChild(
"includeWaterCherenkovDetectorInScintillatorStartStopDetermination").Get<
bool>();
72 auto fsB = topB.GetChild(
"findSignal");
73 fsB.GetChild(
"threshold").GetData(fFindSignalThreshold);
74 fsB.GetChild(
"binsAboveThreshold").GetData(fFindSignalBinsAboveThreshold);
77 info <<
"Parameters:\n"
78 "pmtSummationCutoff: " << fPMTSummationCutoff <<
"\n"
79 "binsBeforeStartForSPMT: " << fBinsBeforeStartForSPMT <<
"\n"
80 "riseTimeFractions: " << fRiseTimeFractions <<
"\n"
81 "fallTimeFractions: " << fFallTimeFractions <<
"\n"
82 "testStations: " <<
Join(
" ", fTestStations) <<
"\n"
83 "treatHGLGEqualInSignalSearch: " << fTreatHGLGEqualInSignalSearch <<
"\n"
84 "includeWaterCherenkovDetectorInScintillatorStartStopDetermination: " << fIncludeWaterCherenkovDetectorInScintillatorStartStopDetermination <<
"\n"
86 " threshold: " << fFindSignalThreshold <<
"\n"
87 " binsAboveThreshold: " << fFindSignalBinsAboveThreshold;
99 auto& sEvent =
event.GetSEvent();
101 if (sEvent.StationsBegin() != sEvent.StationsEnd())
102 ++RunController::GetInstance().GetRunData().GetNamedCounters()[
"SdTraceCalibrator/CalibratedEvents"];
106 for (
auto& station : sEvent.StationsRange()) {
108 if (!station.HasTriggerData() ||
109 !station.HasCalibData() ||
110 !station.HasGPSData())
113 const auto& trig = station.GetTriggerData();
114 if (trig.IsRandom() ||
115 (trig.GetErrorCode() & 0xff) ||
116 station.GetCalibData().GetVersion() > 32000)
120 if (sEvent.HasTrigger()) {
121 const int trigSecond = sEvent.GetTrigger().GetTime().GetGPSSecond();
122 const int timeDiff = int(station.GetGPSData().GetSecond()) - trigSecond;
123 if (
abs(timeDiff) > 1)
127 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
128 fIsUUB = dStation.IsUUB();
131 if (!BuildSignals(station) ||
132 !MergeSignals(station) ||
133 !SelectSignal(station)) {
142 sEvent.SetNErrorZeroStations(nErrorZero);
149 SdTraceCalibrator::BuildSignals(
Station& station)
152 vector<const PMT*> validPMTs;
154 bool didComponents =
false;
156 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
157 const auto traceLength = dStation.GetFADCTraceLength();
158 const auto saturationValue = dStation.GetSaturationValue();
162 if (!pmt.HasCalibData() || !pmt.GetCalibData().IsTubeOk() || !pmt.HasFADCTrace())
165 if (BuildSignals(pmt, traceLength, saturationValue) && pmt.HasRecData()) {
168 validPMTs.push_back(&pmt);
171 if (!scintillator.HasMIPTrace())
174 scintillator.GetMIPTrace().ResetAll();
175 auto& mipTrace = scintillator.GetMIPTrace();
176 const int traceLength = mipTrace.GetSize();
177 const auto& pmtTrace = pmt.GetRecData().GetVEMTrace();
178 for (
int i = 0; i < traceLength; ++i)
179 mipTrace[i] = pmtTrace[i];
184 if (pmt.HasSimData() && MakeComponentVEMTraces(pmt))
185 didComponents =
true;
189 if (!validPMTs.empty()) {
190 const int nPMTs = validPMTs.size();
198 const int traceLength = vemTrace.
GetSize();
199 for (
const auto& pmt : validPMTs) {
200 const auto& pmtTrace = pmt->GetRecData().GetVEMTrace();
201 for (
int i = 0; i < traceLength; ++i)
202 vemTrace[i] += pmtTrace[i] / nPMTs;
207 SumPMTComponents(station);
209 return validPMTs.size();
214 SdTraceCalibrator::BuildSignals(
PMT& pmt,
const unsigned int traceLength,
const int saturationValue)
220 int highGainSaturatedBins = 0;
221 for (
unsigned int i = 0; i < traceLength; ++i)
222 if (highGainTrace[i] >= saturationValue)
223 ++highGainSaturatedBins;
234 int lowGainSaturatedBins = 0;
235 for (
unsigned int i = 0; i < traceLength; ++i)
236 if (lowGainTrace[i] >= saturationValue)
237 ++lowGainSaturatedBins;
243 if (lowGainSaturatedBins > maxBins) {
244 pmtCalib.SetIsTubeOk(
false);
248 if (highGainSaturatedBins > maxBins || lowGainSaturatedBins > maxBins ||
249 (lowGainSaturatedBins && !highGainSaturatedBins)) {
253 pmtCalib.SetIsTubeOk(
false);
259 if (highGainSaturatedBins || isSPMT) {
260 pmtCalib.SetIsTubeOk(
false);
265 const auto gainUsed =
267 pmtRec.SetGainUsed(gainUsed);
269 if (!pmtRec.HasVEMTrace())
270 pmtRec.MakeVEMTrace();
271 auto& vemTrace = pmtRec.GetVEMTrace();
274 auto& rawSignals = pmtRec.GetRawSignals();
277 const double vemChargeFactor = pmtRec.GetVEMPeak() / pmtRec.GetVEMCharge();
279 bool isTubeOK =
true;
282 const double gainFactor = isLowGain ? pmtRec.GetGainRatio() : 1;
283 const double gainPeakFactor = gainFactor / pmtRec.GetVEMPeak();
285 if (gainPeakFactor <= 0) {
287 err <<
"PMT" << pmt.
GetId() <<
" calibration factor nullifies the VEM trace! "
288 "Did you forget to include SdGainRatioCorrector in your module sequence?";
293 const auto& trace = isLowGain ? lowGainTrace : highGainTrace;
294 const auto& baseline = pmtRec.GetFADCBaseline(gainUsed);
300 int binsWithLargeSignal = 0;
301 int binsWithSignal = 0;
302 int binsOverThresh = 0;
306 for (
int i = 0; i < int(traceLength); ++i) {
307 const int fadc = trace[i];
308 if (fadc > largeFADCThreshold)
309 ++binsWithLargeSignal;
310 const double fadcSignal = fadc - baseline[i];
314 if (fadcSignal > minFADCValue)
316 const double signal = fadcSignal * gainPeakFactor;
317 vemTrace[i] = signal;
320 const double testSignal =
321 fTreatHGLGEqualInSignalSearch ? fadcSignal : highGainTrace[i] - highGainBaseline[i];
322 if (testSignal > findSignalThresholdMultiplier * fFindSignalThreshold) {
332 if (binsOverThresh >= findSignalThresholdMultiplier * fFindSignalBinsAboveThreshold)
333 rawSignals.push_back(
SignalSegment(start, i, binsOverThresh, charge * vemChargeFactor, max));
340 if (binsOverThresh >= findSignalThresholdMultiplier * fFindSignalBinsAboveThreshold) {
341 rawSignals.push_back(
SignalSegment(start, traceLength, binsOverThresh, charge * vemChargeFactor, max));
347 if (!isTubeOK && !fIsUUB) {
348 pmtCalib.SetIsTubeOk(
false);
353 auto rawIt = rawSignals.begin();
354 if (rawIt != rawSignals.end()) {
356 auto& signals = pmtRec.GetSignals();
359 signals.push_back(*rawIt);
361 for (++rawIt; rawIt != rawSignals.end(); ++rawIt) {
362 auto& current = signals.back();
363 const int dist = rawIt->fStart - current.fStop;
364 const int maxDist = signalMaxDist + current.fBinsOverThresh;
366 if (dist >= maxDist ||
367 (0.3*rawIt->fCharge >= current.fCharge && rawIt->fMaxValue >= 5) ||
369 signals.push_back(*rawIt);
372 const double addCharge = accumulate(&vemTrace[current.fStop], &vemTrace[rawIt->fStart], rawIt->fCharge);
373 current.fCharge += addCharge * vemChargeFactor;
374 current.fStop = rawIt->fStop;
375 current.fBinsOverThresh += rawIt->fBinsOverThresh;
376 if (current.fMaxValue < rawIt->fMaxValue)
377 current.fMaxValue = rawIt->fMaxValue;
387 SdTraceCalibrator::MakeComponentVEMTraces(
PMT& pmt)
392 const double vemFactor =
395 if (multiFADCTrace.GetNLabels() < 2)
398 bool didComponents =
false;
399 for (
const auto& component : multiFADCTrace) {
406 if (!pmtRec.HasVEMTrace(comp))
407 pmtRec.MakeVEMTrace(comp);
408 auto& vemTrace = pmtRec.GetVEMTrace(comp);
412 const int n = fadcTrace.
GetSize();
413 const auto& baseline = pmtRec.GetFADCBaseline(gainUsed);
418 const auto& fadcTrace = pmt.
GetFADCTrace(gainUsed, comp);
419 const int n2 = fadcTrace.
GetSize();
421 for (
int i = 0; i < n2; ++i)
422 vemTrace[i] = (fadcTrace[i] - baseline[i]) * vemFactor;
426 for (
int i = 0; i < n; ++i)
427 vemTrace[i] = fadcTrace[i] * vemFactor;
431 didComponents =
true;
434 return didComponents;
439 SdTraceCalibrator::SumPMTComponents(
Station& station)
445 vector<const TraceD*> compTrace;
447 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
456 for (
const auto& pmt : station.PMTsRange())
457 if (pmt.HasRecData()) {
458 const auto& pmtRec = pmt.GetRecData();
459 if (pmtRec.HasVEMTrace(component))
460 compTrace.push_back(&pmtRec.GetVEMTrace(component));
463 const unsigned int nPMTs = compTrace.size();
467 const unsigned int fadcTraceLength = dStation.GetFADCTraceLength();
469 TraceD sumTrace(fadcTraceLength, dStation.GetFADCBinSize());
471 for (
unsigned int pos = 0; pos < fadcTraceLength; ++pos) {
473 double& sum = sumTrace[pos];
477 for (
unsigned int pmtIndex = 0; pmtIndex < nPMTs; ++pmtIndex) {
478 const double value = (*compTrace[pmtIndex])[pos];
479 if (value > fPMTSummationCutoff) {
499 template<
typename T1,
typename T2>
505 {
return this->
second < interval.first; }
508 {
return interval.second > this->first && interval.first < this->
second; }
513 if (interval.first < this->first)
514 this->first = interval.first;
515 if (interval.second > this->second)
516 this->
second = interval.second;
522 SdTraceCalibrator::MergeSignals(
Station& station)
525 vector<PMT*> validPMTs;
526 typedef set<Interval<int, int>> Sections;
529 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
531 for (
auto& pmt : station.PMTsRange()) {
533 if (pmt.HasCalibData() &&
534 pmt.GetCalibData().IsTubeOk() &&
537 validPMTs.push_back(&pmt);
539 auto& signals = pmt.GetRecData().GetSignals();
541 for (
const auto& sig : signals) {
545 for (pair<Sections::iterator, bool> where; ; ) {
546 where = sections.insert(newSection);
549 newSection.
Merge(*where.first);
550 sections.erase(where.first);
561 const int nPMTs = validPMTs.size();
565 const int traceLength = dStation.GetFADCTraceLength();
567 auto nextSectionIt = sections.begin();
568 auto currentSectionIt = nextSectionIt;
569 while (currentSectionIt != sections.end()) {
571 int newStop = currentSectionIt->second + 10;
572 if (newStop > traceLength)
573 newStop = traceLength;
575 if (nextSectionIt != sections.end() && newStop > nextSectionIt->first)
576 newStop = nextSectionIt->first;
577 const int start = currentSectionIt->first;
581 int binsOverThresh = 0;
583 for (
const auto& pmtp : validPMTs) {
584 const auto& pmt = *pmtp;
585 const auto& pmtRec = pmt.GetRecData();
586 const auto gainUsed = pmtRec.GetGainUsed();
590 const auto& baseline =
591 pmtRec.GetFADCBaseline(fTreatHGLGEqualInSignalSearch ? gainUsed : sdet::PMTConstants::eHighGain);
594 for (
int i = start; i < newStop; ++i) {
595 if (trace[i] - baseline[i] >= findSignalThresholdMultiplier * fFindSignalThreshold)
597 vemSum += vemTrace[i];
599 const double factor = pmtRec.GetVEMPeak() / pmtRec.GetVEMCharge();
600 charge += vemSum * factor;
602 stationSignals.emplace_back(start, newStop,
double(binsOverThresh)/nPMTs, charge/nPMTs);
610 if (station.HasScintillator()) {
611 const auto& pmt = station.GetScintillatorPMT();
612 if (pmt.HasRecData()) {
613 const auto& pmtSignals = station.GetScintillatorPMT().GetRecData().GetSignals();
614 auto& scintillatorSignals = station.GetScintillator().GetSignals();
615 scintillatorSignals.clear();
616 for (
auto const signal : pmtSignals)
617 scintillatorSignals.push_back(signal);
626 SdTraceCalibrator::SelectSignal(
Station& station)
629 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
632 const unsigned int nSignals = signals.size();
637 for (
auto& pmt : station.PMTsRange()) {
638 if (pmt.HasRecData() &&
639 pmt.HasCalibData() && pmt.GetCalibData().IsTubeOk()) {
640 const auto& pmtRec = pmt.GetRecData();
651 int maxSignalIndex = 0;
652 double maxSignal = signals[0].fCharge;
653 for (
unsigned int i = 1; i < nSignals; ++i) {
654 if (maxSignal < signals[i].fCharge) {
656 maxSignal = signals[i].fCharge;
660 const int start = signals[maxSignalIndex].fStart;
661 const int stop = signals[maxSignalIndex].fStop;
669 stRec.SetSignalEndSlot(stop - 1);
673 int scintillatorStart = 0;
674 int scintillatorStop = 0;
677 const auto& scintillatorSignals = scintillator.
GetSignals();
679 const int length = dStation.GetFADCTraceLength();
681 if (scintillatorSignals.empty() ||
682 fIncludeWaterCherenkovDetectorInScintillatorStartStopDetermination) {
683 const double timeOffset = dStation.GetScintillatorPMT().GetTimeOffset();
684 const int traceBinOffset = floor(timeOffset / dStation.GetFADCBinSize());
685 scintillatorStart =
max(0, min(start + traceBinOffset, length));
686 scintillatorStop = min(stop + traceBinOffset, length);
689 if (!scintillatorSignals.empty()) {
694 double maxCharge = scintillatorSignals[0].fCharge;
695 for (
unsigned int i = 1, n = scintillatorSignals.size(); i < n; ++i) {
696 if (maxCharge < scintillatorSignals[i].fCharge) {
698 maxCharge = scintillatorSignals[i].fCharge;
702 const auto& maxSignal = scintillatorSignals[maxIndex];
703 if (scintillatorStart && scintillatorStop) {
704 scintillatorStart =
max(0, min(scintillatorStart, maxSignal.fStart));
705 scintillatorStop = min(length,
max(scintillatorStop, maxSignal.fStop));
707 scintillatorStart =
max(0, maxSignal.fStart);
708 scintillatorStop = min(length, maxSignal.fStop);
712 if (!scintillator.HasRecData())
713 scintillator.MakeRecData();
714 auto& scintillatorRecData = scintillator.GetRecData();
716 scintillatorRecData.SetSignalStartSlot(scintillatorStart);
718 scintillatorRecData.SetSignalEndSlot(scintillatorStop - 1);
724 const auto peak = for_each(&vemTrace[start+1], &vemTrace[stop], Accumulator::Max<double>(vemTrace[start]));
725 stRec.SetPeakAmplitude(peak.GetMax());
728 bool highGainSaturation =
false;
729 bool lowGainSaturation =
false;
731 double totalCharge = 0;
732 double spmtCharge = 0;
733 double spmtChargeErr = 0;
735 Accumulator::SampleStandardDeviationN shapeStat;
736 Accumulator::SampleStandardDeviationN riseStat;
737 Accumulator::SampleStandardDeviationN fallStat;
738 Accumulator::SampleStandardDeviationN t50Stat;
741 if (pmt.HasCalibData() && pmt.GetCalibData().IsTubeOk()) {
742 auto& pmtRec = pmt.GetRecData();
747 highGainSaturation =
true;
749 lowGainSaturation =
true;
751 const auto& vemTrace = pmtRec.GetVEMTrace();
753 double charge = accumulate(&vemTrace[start], &vemTrace[stop], 0.);
755 ComputeShapeRiseFallPeak(pmtRec, dStation.GetFADCBinSize(), start, start, stop, charge);
756 charge *= pmtRec.GetVEMPeak() / pmtRec.GetVEMCharge();
757 pmtRec.SetTotalCharge(charge);
758 totalCharge += charge;
759 shapeStat(pmtRec.GetShapeParameter());
760 riseStat(pmtRec.GetRiseTime());
761 fallStat(pmtRec.GetFallTime());
762 t50Stat(pmtRec.GetT50());
763 const double peak = pmtRec.GetPeakAmplitude();
765 pmtRec.SetAreaOverPeak(charge / peak);
772 if (!scintillator.HasMIPTrace())
775 if (!scintillator.HasRecData())
776 scintillator.MakeRecData();
777 auto& scinRec = scintillator.GetRecData();
779 const unsigned int scintillatorStart = scinRec.GetSignalStartSlot();
780 const unsigned int scintillatorStop = scinRec.GetSignalEndSlot() + 1;
782 const auto& mipTrace = scintillator.GetMIPTrace();
785 scintillator.SetHighGainSaturation();
787 scintillator.SetLowGainSaturation();
789 double charge = accumulate(&mipTrace[scintillatorStart], &mipTrace[scintillatorStop], 0.);
790 ComputeShapeRiseFallPeak(pmtRec, dStation.GetFADCBinSize(), scintillatorStart, scintillatorStart, scintillatorStop, charge);
791 charge *= pmtRec.GetVEMPeak() / pmtRec.GetVEMCharge();
792 pmtRec.SetTotalCharge(charge);
795 scinRec.SetTotalSignal(charge, 0);
796 scinRec.SetRiseTime(pmtRec.GetRiseTime(), 0);
806 const int spmtStart =
max(0, start - fBinsBeforeStartForSPMT);
808 if (pmtRec.HasVEMTrace()) {
809 const auto& vemTrace = pmtRec.GetVEMTrace();
810 charge = accumulate(&vemTrace[spmtStart], &vemTrace[stop], 0.);
811 ComputeShapeRiseFallPeak(pmtRec, dStation.GetFADCBinSize(), spmtStart, spmtStart, stop, charge);
812 charge *= pmtRec.GetVEMPeak() / pmtRec.GetVEMCharge();
813 peak = pmtRec.GetPeakAmplitude();
816 spmtChargeErr = charge * pmtRec.GetVEMChargeError() / pmtRec.GetVEMCharge();
818 pmtRec.SetTotalCharge(spmtCharge, spmtChargeErr);
820 pmtRec.SetAreaOverPeak(charge / peak);
826 totalCharge /= nPMTs;
827 stRec.SetTotalSignal(totalCharge);
829 if (highGainSaturation)
831 if (lowGainSaturation) {
833 #if USE_SPMT_SIGNAL_AS_TOTAL
835 if (fIsUUB && station.HasSmallPMT() &&
836 station.IsSmallPMTOk()) {
837 if (spmtCharge>0 && spmtChargeErr>0)
838 stRec.SetTotalSignal(spmtCharge, spmtChargeErr);
841 warn <<
"Station " << station.
GetId() <<
": zero SmallPMT signal after successful calibration!";
843 station.SetIsSmallPMTOk(
false);
849 if (totalCharge <= 0)
853 stRec.SetShapeParameter(shapeStat.GetAverage(nPMTs), 0);
854 stRec.SetRiseTime(riseStat.GetAverage(nPMTs), 0);
855 stRec.SetFallTime(fallStat.GetAverage(nPMTs), 0);
856 stRec.SetT50(t50Stat.GetAverage(nPMTs), 0);
858 stRec.SetShapeParameter(shapeStat.GetAverage(nPMTs),
859 shapeStat.GetStandardDeviation(nPMTs));
860 stRec.SetRiseTime(riseStat.GetAverage(nPMTs),
861 riseStat.GetStandardDeviation(nPMTs));
862 stRec.SetFallTime(fallStat.GetAverage(nPMTs),
863 fallStat.GetStandardDeviation(nPMTs));
864 stRec.SetT50(t50Stat.GetAverage(nPMTs),
865 t50Stat.GetStandardDeviation(nPMTs));
871 const TimeStamp gpsTime(gpsData.GetSecond(), gpsData.GetCorrectedNanosecond());
873 const double fadcBinSize = dStation.GetFADCBinSize();
878 const TimeStamp traceTime = gpsTime + pldTimeOffset -
879 TimeInterval(dStation.GetFADCTraceLength() * fadcBinSize);
884 stRec.SetSignalStartTime(signalTime);
889 if (scintillator.HasRecData()) {
891 const TimeStamp scinSignalTime = traceTime + TimeInterval((scinRec.GetSignalStartSlot() - 0.5) * fadcBinSize);
892 scinRec.SetSignalStartTime(scinSignalTime);
902 SdTraceCalibrator::ComputeShapeRiseFallPeak(
PMTRecData& pmtRec,
903 const double binTiming,
904 const unsigned int startBin,
905 const unsigned int startIntegration,
906 const unsigned int endIntegration,
907 const double traceIntegral)
913 if (traceIntegral <= 0)
916 const double riseStartSentry = fRiseTimeFractions.first * traceIntegral;
917 const double riseEndSentry = fRiseTimeFractions.second * traceIntegral;
918 const double fallStartSentry = fFallTimeFractions.first * traceIntegral;
919 const double fallEndSentry = fFallTimeFractions.second * traceIntegral;
920 const unsigned int shapeSentry =
921 startIntegration + (
unsigned int)(600*
nanosecond / binTiming);
922 const double t50Sentry = 0.5 * traceIntegral;
923 double riseStartBin = 0;
924 double riseEndBin = 0;
925 double fallStartBin = 0;
926 double fallEndBin = 0;
930 double peakAmplitude = 0;
931 double runningSum = 0;
936 for (
unsigned int i = startIntegration; i < endIntegration; ++i) {
938 const double binValue = trace[i];
939 runningSum += binValue;
941 if (peakAmplitude < binValue)
942 peakAmplitude = binValue;
944 if (!sumEarly && i >= shapeSentry)
947 if (!riseStartBin && runningSum > riseStartSentry)
948 riseStartBin = i - (runningSum - riseStartSentry) / (runningSum - oldSum);
950 if (!riseEndBin && runningSum > riseEndSentry)
951 riseEndBin = i - (runningSum - riseEndSentry) / (runningSum - oldSum);
953 if (!fallStartBin && runningSum > fallStartSentry)
954 fallStartBin = i - (runningSum - fallStartSentry) / (runningSum - oldSum);
956 if (!fallEndBin && runningSum > fallEndSentry)
957 fallEndBin = i - (runningSum - fallEndSentry) / (runningSum - oldSum);
959 if (!t50Bin && runningSum > t50Sentry)
960 t50Bin = i - (runningSum - t50Sentry) / (runningSum - oldSum);
967 pmtRec.
SetRiseTime(binTiming * (riseEndBin-riseStartBin), 0);
968 pmtRec.
SetFallTime(binTiming * (fallEndBin-fallStartBin), 0);
969 pmtRec.
SetT50(binTiming * (t50Bin-startBin));
970 if (shapeSentry < endIntegration) {
971 const double sumLate = runningSum - sumEarly;
utl::TraceD & GetVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal)
Traces calibrated in VEM Peak.
int GetId() const
Get the station Id.
class to hold data at PMT level
total (shower and background)
constexpr int GetBinsWithSignalThreshold(const bool isUub)
void SetSignalStartSlot(const unsigned int slot)
Start time of the signal in time slots from beginning of trace.
constexpr int GetSaturatedBinsMaximum(const bool isUub)
constexpr int GetLargeFADCThreshold(const bool isUub)
PMTCalibData & GetCalibData()
Get object containing PMT calibration data.
constexpr int GetBinsWithLargeSignalThreshold(const bool isUub)
sdet::PMTConstants::PMTType GetType() const
void SetShapeParameter(const double shape)
PMTRecData & GetRecData()
Get object containing PMT reconstructed data.
SignalSegmentCollection & GetSignals()
void SetFallTime(const double fallTime, const double rms)
sevt::StationRecData & GetRecData()
Get station level reconstructed data.
ScintillatorRecData & GetRecData()
Get object containing scintillator reconstructed data.
#define INFO(message)
Macro for logging informational messages.
void SetTraceStartTime(const utl::TimeStamp &Time)
Set absolute start time of the VEM trace.
void Init()
Initialise the registry.
constexpr int GetFindSignalThresholdMultiplier(const bool isUub)
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
void Merge(const Interval &interval)
unsigned int GetId() const
Return Id of the PMT.
A TimeStamp holds GPS second and nanosecond for some event.
utl::TraceD & GetVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal)
signal trace calibrated in [VEM charge]
void SetPeakAmplitude(const double peak)
oss<< "0b";oss<< ((x >> i)&1);return oss.str();}template< class S, class V > std::string Join(const S &sep, const V &v)
void SetFADCSaturatedBins(const int num, const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain)
class to hold data at Station level
void SetLowGainSaturation(const bool sat=true)
total FADC trace, with no saturation applied by FADC/baseline simulator
bool operator==(const Interval &interval) const
class to hold reconstructed data at PMT level
bool operator<(const Interval &interval) const
constexpr double nanosecond
double abs(const SVector< n, T > &v)
constexpr int GetSignalMaxDist(const bool isUub)
void MakeVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal)
Make a VEM trace object.
sevt::StationGPSData & GetGPSData()
Get GPS data for the station.
bool HasVEMTrace(const StationConstants::SignalComponent source=StationConstants::eTotal) const
Check whether VEM trace exists.
utl::TraceD & GetFADCTraceD(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain, const StationConstants::SignalComponent source=StationConstants::eTotal)
Scintillator & GetScintillator()
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
Holds information characterizing portions of traces with signals.
Base class for inconsistency/illogicality exceptions.
utl::TraceI & GetFADCTrace(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain, const StationConstants::SignalComponent source=StationConstants::eTotal)
const utl::MultiTraceI & GetMultiFADCTrace(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
constexpr int GetMinFADCValue(const bool isUub)
void MakeRecData()
Make station reconstructed data object.
void ResetAll(const T &value=T())
int GetPLDTimeOffset() const
void MakeMIPTrace(const StationConstants::SignalComponent source=StationConstants::eTotal)
Make a VEM trace object.
Interval(const pair< T1, T2 > &p)
A TimeInterval is used to represent time elapsed between two events.
ResultFlag
Flag returned by module methods to the RunController.
sdet::PMTConstants::PMTGain GetGainUsed() const
bool HasRecData() const
Check whether station reconstructed data exists.
static CentralConfig * GetInstance()
Use this the first time you get an instance of central configuration.
bool HasScintillator() const
void SetT50(const double t50)
void SetSmallPMTSaturation(const bool sat=true)
bool IsInRange(const double x, const vector< double > &r)
sevt::StationTriggerData & GetTriggerData()
Get Trigger data for the station.
void SetRiseTime(const double riseTime, const double rms)
SignalSegmentCollection & GetSignals()
void SetHighGainSaturation(const bool sat=true)
#define ERROR(message)
Macro for logging error messages.
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)