11 #include <top/dataobjects/TOPRawDigit.h>
13 #include <framework/logging/Logger.h>
25 bool TOPRawDigit::isPedestalJump()
const
27 if (m_sampleRise == 0) {
28 if ((m_dSampleFall + 1) % 64 == 0)
return true;
29 }
else if ((m_sampleRise + 1) % 64 == 0) {
30 if (m_dSampleFall % 64 == 0)
return true;
36 bool TOPRawDigit::isAtWindowDiscontinuity(
unsigned short storageDepth)
const
38 if (m_windows.empty())
return false;
40 unsigned size = m_windows.size();
41 unsigned i0 = getSampleRise() / c_WindowSize;
42 if (i0 >= size) i0 = size - 1;
43 unsigned i1 = (getSampleFall() + 1) / c_WindowSize;
44 if (i1 >= size) i1 = size - 1;
45 if (i0 == i1)
return false;
47 int diff = m_windows[i1] - m_windows[i0];
48 if (diff < 0) diff += storageDepth;
49 if (diff != 1)
return true;
54 bool TOPRawDigit::areWindowsInOrder(
unsigned short storageDepth)
const
56 unsigned lastSample = getSampleFall() + 1;
57 unsigned last = lastSample / c_WindowSize + 1;
58 unsigned size = m_windows.size();
59 for (
unsigned i = 1; i < std::min(last, size); i++) {
60 int diff = m_windows[i] - m_windows[i - 1];
61 if (diff < 0) diff += storageDepth;
62 if (diff != 1)
return false;
68 double TOPRawDigit::correctTime(
double time,
unsigned short storageDepth)
const
70 if (m_windows.empty())
return time;
72 unsigned last = int(time) / c_WindowSize + 1;
73 unsigned size = m_windows.size();
75 for (
unsigned i = 1; i < std::min(last, size); i++) {
76 int diff = m_windows[i] - m_windows[i - 1];
77 if (diff < 0) diff += storageDepth;
78 if (diff != 1) missing += diff - 1;
79 if (diff == 0) B2ERROR(
"TOPRawDigit: two consecutive windows with the same number");
82 return time + missing * c_WindowSize;
86 double TOPRawDigit::timeErrorCoefficient(
double y1,
double y2)
const
89 double ym = m_VPeak / 2.0;
90 double a = 1.0 / (2.0 * dy);
91 double b = (ym - y2) / (dy * dy);
92 double c = (ym - y1) / (dy * dy);
94 return sqrt(a * a + b * b + c * c);