Belle II Software  release-05-02-19
TOPSampleTimes.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2016 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Marko Staric *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <top/dbobjects/TOPSampleTimes.h>
12 
13 #include <framework/logging/Logger.h>
14 
15 #include <iostream>
16 
17 using namespace std;
18 
19 namespace Belle2 {
25  void TOPSampleTimes::setTimeAxis(double syncTimeBase)
26  {
27  double DTime = 2 * syncTimeBase;
28  double timeBin = DTime / c_TimeAxisSize;
29  for (unsigned i = 0; i < c_TimeAxisSize; i++) m_timeAxis[i] = timeBin * i;
30  m_timeAxis[c_TimeAxisSize] = DTime;
31  m_calibrated = c_Default;
32  }
33 
34 
35  void TOPSampleTimes::setTimeAxis(const std::vector<double>& sampleTimes,
36  double syncTimeBase)
37  {
38  if (sampleTimes.size() < c_TimeAxisSize) {
39  B2FATAL("TOPSampleTimes::setTimeAxis: vector too short");
40  return;
41  }
42 
43  for (unsigned i = 0; i < c_TimeAxisSize; i++) m_timeAxis[i] = sampleTimes[i];
44  double DTime = 2 * syncTimeBase;
45  m_timeAxis[c_TimeAxisSize] = DTime;
46  m_calibrated = c_Calibrated;
47  }
48 
49 
50  std::vector<double> TOPSampleTimes::getTimeAxis() const
51  {
52  std::vector<double> timeAxis;
53  for (unsigned i = 0; i < c_TimeAxisSize + 1; i++) {
54  timeAxis.push_back(m_timeAxis[i]);
55  }
56  return timeAxis;
57  }
58 
59 
60  double TOPSampleTimes::getFullTime(int window, double sample) const
61  {
62 
63  int sampleNum = int(sample);
64  if (sample < 0) sampleNum--;
65  double frac = sample - sampleNum;
66 
67  sampleNum += window * c_WindowSize; // counted from window 0
68  int n = sampleNum / c_TimeAxisSize;
69  int k = sampleNum % c_TimeAxisSize;
70  if (k < 0) {
71  n--;
72  k += c_TimeAxisSize;
73  }
74 
75  double time = n * getTimeRange() + m_timeAxis[k]; // from sample 0 window 0
76  time += (m_timeAxis[k + 1] - m_timeAxis[k]) * frac; // add fraction
77 
78  return time;
79  }
80 
81 
82  double TOPSampleTimes::getSample(int window, double time) const
83  {
84  time += window * getTimeRange() / 4.0;
85  int n = int(time / getTimeRange());
86  if (time < 0) n--;
87 
88  double t = time - getTimeRange() * n;
89  int i1 = 0;
90  int i2 = c_TimeAxisSize;
91  while (i2 - i1 > 1) {
92  int i = (i1 + i2) / 2;
93  if (t > m_timeAxis[i]) {
94  i1 = i;
95  } else {
96  i2 = i;
97  }
98  }
99 
100  return (n * c_TimeAxisSize - window * c_WindowSize + i1 +
101  (t - m_timeAxis[i1]) / (m_timeAxis[i2] - m_timeAxis[i1]));
102 
103  }
104 
105 
106  double TOPSampleTimes::getTimeBin(int window, int sampleNumber) const
107  {
108  int i = (window * c_WindowSize + sampleNumber) % c_TimeAxisSize;
109  if (i < 0) i += c_TimeAxisSize;
110  return m_timeAxis[i + 1] - m_timeAxis[i];
111  }
112 
114 } // end Belle2 namespace
115 
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19