Belle II Software development
TOPRawDigit.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <top/dataobjects/TOPRawDigit.h>
10
11#include <framework/logging/Logger.h>
12
13#include <math.h>
14
15using namespace std;
16
17namespace Belle2 {
22
24 {
25 if (m_sampleRise == 0) {
26 if ((m_dSampleFall + 1) % 64 == 0) return true;
27 } else if ((m_sampleRise + 1) % 64 == 0) {
28 if (m_dSampleFall % 64 == 0) return true;
29 }
30 return false;
31 }
32
33
34 bool TOPRawDigit::isAtWindowDiscontinuity(unsigned short storageDepth) const
35 {
36 if (m_windows.empty()) return false;
37
38 unsigned size = m_windows.size();
39 unsigned i0 = getSampleRise() / c_WindowSize;
40 if (i0 >= size) i0 = size - 1;
41 unsigned i1 = (getSampleFall() + 1) / c_WindowSize;
42 if (i1 >= size) i1 = size - 1;
43 if (i0 == i1) return false;
44
45 int diff = m_windows[i1] - m_windows[i0];
46 if (diff < 0) diff += storageDepth;
47 if (diff != 1) return true;
48 return false;
49 }
50
51
52 bool TOPRawDigit::areWindowsInOrder(unsigned short storageDepth) const
53 {
54 unsigned lastSample = getSampleFall() + 1;
55 unsigned last = lastSample / c_WindowSize + 1;
56 unsigned size = m_windows.size();
57 for (unsigned i = 1; i < std::min(last, size); i++) {
58 int diff = m_windows[i] - m_windows[i - 1];
59 if (diff < 0) diff += storageDepth;
60 if (diff != 1) return false;
61 }
62 return true;
63 }
64
65
66 double TOPRawDigit::correctTime(double time, unsigned short storageDepth) const
67 {
68 if (m_windows.empty()) return time;
69
70 unsigned last = int(time) / c_WindowSize + 1;
71 unsigned size = m_windows.size();
72 int missing = 0;
73 for (unsigned i = 1; i < std::min(last, size); i++) {
74 int diff = m_windows[i] - m_windows[i - 1];
75 if (diff < 0) diff += storageDepth;
76 if (diff != 1) missing += diff - 1;
77 if (diff == 0) B2ERROR("TOPRawDigit: two consecutive windows with the same number");
78 }
79
80 return time + missing * c_WindowSize;
81 }
82
83
84 double TOPRawDigit::timeErrorCoefficient(double y1, double y2) const
85 {
86 double dy = y2 - y1;
87 double ym = m_VPeak / 2.0;
88 double a = 1.0 / (2.0 * dy);
89 double b = (ym - y2) / (dy * dy);
90 double c = (ym - y1) / (dy * dy);
91
92 return sqrt(a * a + b * b + c * c);
93 }
94
96} // end Belle2 namespace
97
98
std::vector< unsigned short > m_windows
storage windows of waveform segments
unsigned getSampleFall() const
Returns sample number at falling edge just before 50% CFD crossing.
unsigned short m_dSampleFall
same for falling edge, rel.
unsigned getSampleRise() const
Returns sample number at leading edge just before 50% CFD crossing.
short m_VPeak
ADC value at m_sampleRise + m_dSamplePeak.
@ c_WindowSize
number of samples per window
Definition TOPRawDigit.h:54
unsigned short m_sampleRise
sample number just before 50% CFD crossing
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
double correctTime(double time, unsigned short storageDepth=508) const
Corrects time after window discontinuity by adding missing samples.
bool isAtWindowDiscontinuity(unsigned short storageDepth=508) const
Checks if feature extraction points are at window discontinuity (e.g.
double timeErrorCoefficient(double y1, double y2) const
Calculate the coefficient of time error.
bool isPedestalJump() const
Checks if feature extraction finds a pedestal jump.
bool areWindowsInOrder(unsigned short storageDepth=508) const
Checks if storage windows come in the consecutive order before the last sample (no gaps before the la...
Abstract base class for different kinds of events.
STL namespace.