12 #include <top/modules/TOPWaveformFeatureExtractor/TOPWaveformFeatureExtractorModule.h>
15 #include <framework/datastore/StoreArray.h>
18 #include <framework/logging/Logger.h>
21 #include <top/dataobjects/TOPRawDigit.h>
22 #include <top/dataobjects/TOPRawWaveform.h>
24 #include <top/geometry/TOPGeometryPar.h>
50 setDescription(
"Module adds raw digits that are found in waveforms "
51 "but not already present in TOPRawDigits. "
52 "Only waveforms related to TOPRawDigits are used.");
53 setPropertyFlags(c_ParallelProcessingCertified);
55 addParam(
"inputRawDigitsName", m_inputRawDigitsName,
56 "name of TOPRawDigit store array",
string(
""));
57 addParam(
"threshold", m_threshold,
58 "pulse height threshold [ADC counts]", 40);
59 addParam(
"hysteresis", m_hysteresis,
60 "threshold hysteresis [ADC counts]", 10);
61 addParam(
"thresholdCount", m_thresholdCount,
62 "minimal number of samples above threshold", 3);
63 addParam(
"setIntegral", m_setIntegral,
64 "calculate and set integral for online-extracted hits",
true);
68 TOPWaveformFeatureExtractorModule::~TOPWaveformFeatureExtractorModule()
72 void TOPWaveformFeatureExtractorModule::initialize()
76 rawDigits.isRequired();
80 void TOPWaveformFeatureExtractorModule::beginRun()
84 void TOPWaveformFeatureExtractorModule::event()
87 const auto* geo = TOPGeometryPar::Instance()->getGeometry();
88 const auto& tdc = geo->getNominalTDC();
89 int sampleDivisions = 0x1 << tdc.getSubBits();
94 for (
int i = 0; i < initSize; i++) {
95 auto& rawDigit = *rawDigits[i];
97 if (!waveform)
continue;
99 auto integral = waveform->
getIntegral(rawDigit.getSampleRise(),
100 rawDigit.getSamplePeak(),
101 rawDigit.getSampleFall());
102 rawDigit.setIntegral(integral);
104 waveform->featureExtraction(m_threshold, m_hysteresis, m_thresholdCount);
105 const auto& features = waveform->getFeatureExtractionData();
106 int sampleRise = rawDigit.getSampleRise();
107 int sampleFall = rawDigit.getSampleFall() + 1;
108 for (
const auto& feature : features) {
111 int sRise = feature.sampleRise;
112 if (sRise >= sampleRise and sRise <= sampleFall)
continue;
113 int sFall = feature.sampleFall + 1;
114 if (sFall >= sampleRise and sFall <= sampleFall)
continue;
117 auto* newDigit = rawDigits.
appendNew(rawDigit);
118 newDigit->setOfflineFlag();
119 newDigit->setSampleRise(feature.sampleRise);
120 newDigit->setDeltaSamplePeak(feature.samplePeak - feature.sampleRise);
121 newDigit->setDeltaSampleFall(feature.sampleFall - feature.sampleRise);
122 newDigit->setValueRise0(feature.vRise0);
123 newDigit->setValueRise1(feature.vRise1);
124 newDigit->setValueFall0(feature.vFall0);
125 newDigit->setValueFall1(feature.vFall1);
126 newDigit->setValuePeak(feature.vPeak);
127 newDigit->setIntegral(feature.integral);
128 double rawTime = newDigit->getCFDLeadingTime();
129 unsigned tfine = int(rawTime * sampleDivisions) % sampleDivisions;
130 newDigit->setTFine(tfine);
131 newDigit->addRelationTo(waveform);
136 B2DEBUG(100,
"TOPWaveformFeatureExtractor: appended " << finalSize - initSize
137 <<
" raw digits to initial " << initSize);
142 void TOPWaveformFeatureExtractorModule::endRun()
146 void TOPWaveformFeatureExtractorModule::terminate()