11 #include <top/dataobjects/TOPRawWaveform.h>
21 int TOPRawWaveform::getIntegral(
int sampleRise,
int samplePeak,
int sampleFall)
const
23 sampleRise -= m_startSample;
24 samplePeak -= m_startSample;
25 sampleFall -= m_startSample;
27 return Integral(sampleRise, samplePeak, sampleFall);
30 int TOPRawWaveform::Integral(
int sampleRise,
int samplePeak,
int sampleFall)
const
32 int min = samplePeak - 3 * (samplePeak - sampleRise);
34 int max = samplePeak + 4 * (sampleFall + 1 - samplePeak);
35 int size = m_data.size();
36 if (max > size) max = size;
39 integral += m_data[min];
46 int TOPRawWaveform::featureExtraction(
int threshold,
int hysteresis,
47 int thresholdCount)
const
52 int currentThr = threshold;
53 bool lastState =
false;
55 int size = m_data.size();
57 for (
int i = 0; i < size; i++) {
58 const auto& adc = m_data[i];
59 if (adc > currentThr and i < size - 1) {
60 currentThr = threshold - hysteresis;
61 if (!lastState or adc > m_data[samplePeak]) samplePeak = i;
65 currentThr = threshold;
66 if (lastState and aboveThr >= thresholdCount) {
67 auto halfValue = m_data[samplePeak] / 2;
68 auto sampleRise = samplePeak;
69 while (sampleRise > 0 and m_data[sampleRise] > halfValue) sampleRise--;
70 if (sampleRise == 0 and m_data[sampleRise] > halfValue)
continue;
71 auto sampleFall = samplePeak;
72 while (sampleFall < size - 1 and m_data[sampleFall] > halfValue) sampleFall++;
73 if (sampleFall == size - 1 and m_data[sampleFall] > halfValue)
continue;
76 feature.
sampleRise = sampleRise + m_startSample;
77 feature.
samplePeak = samplePeak + m_startSample;
78 feature.
sampleFall = sampleFall + m_startSample;
79 feature.
vRise0 = m_data[sampleRise];
80 feature.
vRise1 = m_data[sampleRise + 1];
81 feature.
vPeak = m_data[samplePeak];
82 feature.
vFall0 = m_data[sampleFall];
83 feature.
vFall1 = m_data[sampleFall + 1];
84 feature.
integral = Integral(sampleRise, samplePeak, sampleFall);
85 m_features.push_back(feature);
92 return m_features.size();