Project
Loading...
Searching...
No Matches
testROFFinder.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#define BOOST_TEST_MODULE Test MCHRaw ROFFinder
13#define BOOST_TEST_MAIN
14#define BOOST_TEST_DYN_LINK
15
16#include <boost/test/unit_test.hpp>
18
19using namespace o2::mch::raw;
20
21BOOST_AUTO_TEST_SUITE(o2_mch_raw)
22
23BOOST_AUTO_TEST_SUITE(roffinder)
24
25static const int32_t BCINORBIT = 3564;
26static const int32_t BCROLLOVER = (1 << 20);
29
30static RawDigit makeDigit(int ds, uint32_t tfTime, uint32_t orbit)
31{
32 RawDigit digit;
33 digit.digit = o2::mch::Digit(100, 10, 1000, 0x7FFFFFFF, 10);
34 digit.info.chip = 1;
35 digit.info.ds = ds;
36 digit.info.solar = 80;
37 digit.info.tfTime = tfTime;
38 digit.info.orbit = orbit;
39 digit.info.sampaTime = 0;
40 digit.info.bunchCrossing = 0;
41
42 return digit;
43}
44
45static RawDigitVector makeDigitsVector(uint32_t tfTime1, uint32_t orbit1, uint32_t tfTime2, uint32_t orbit2)
46{
47 RawDigit digit1 = makeDigit(1, tfTime1, orbit1);
48 RawDigit digit2 = makeDigit(2, tfTime2, orbit2);
49
51 digits.push_back(digit1);
52 digits.push_back(digit2);
53 return digits;
54}
55
56//----------------------------------------------------------------------------
57BOOST_AUTO_TEST_CASE(TwoDigitsInOneROF)
58{
59 uint32_t tfTime1 = 100;
60 uint32_t orbit1 = 1;
61 uint32_t tfTime2 = tfTime1;
62 uint32_t orbit2 = orbit1;
63
64 auto digits = makeDigitsVector(tfTime1, orbit1, tfTime2, orbit2);
65
66 ROFFinder rofFinder(digits, orbit1);
67 rofFinder.process();
68
69 const auto& rofDigits = rofFinder.getOrderedDigits();
70 const auto& rofRecords = rofFinder.getROFRecords();
71
72 BOOST_CHECK_EQUAL(rofDigits.size(), 2);
73 BOOST_CHECK_EQUAL(rofRecords.size(), 1);
74
75 BOOST_CHECK_EQUAL(rofRecords[0].getFirstIdx(), 0);
76 BOOST_CHECK_EQUAL(rofRecords[0].getNEntries(), 2);
77
78 BOOST_CHECK_EQUAL(rofRecords[0].getBCData(), rofFinder.digitTime2IR(digits[0]));
79 BOOST_CHECK_EQUAL(rofRecords[0].getBCWidth(), 4);
80
81 BOOST_CHECK_EQUAL(rofFinder.isDigitsTimeAligned(), true);
82}
83
84//----------------------------------------------------------------------------
85BOOST_AUTO_TEST_CASE(TwoDigitsInOneROFUnaligned)
86{
87 uint32_t tfTime1 = 100;
88 uint32_t orbit1 = 1;
89 uint32_t tfTime2 = tfTime1 + 1;
90 uint32_t orbit2 = orbit1;
91
92 auto digits = makeDigitsVector(tfTime1, orbit1, tfTime2, orbit2);
93
94 ROFFinder rofFinder(digits, orbit1);
95 rofFinder.process();
96
97 const auto& rofDigits = rofFinder.getOrderedDigits();
98 const auto& rofRecords = rofFinder.getROFRecords();
99
100 BOOST_CHECK_EQUAL(rofDigits.size(), 2);
101 BOOST_CHECK_EQUAL(rofRecords.size(), 1);
102
103 BOOST_CHECK_EQUAL(rofRecords[0].getFirstIdx(), 0);
104 BOOST_CHECK_EQUAL(rofRecords[0].getNEntries(), 2);
105
106 BOOST_CHECK_EQUAL(rofRecords[0].getBCData(), rofFinder.digitTime2IR(digits[0]));
107 BOOST_CHECK_EQUAL(rofRecords[0].getBCWidth(), 4);
108
109 BOOST_CHECK_EQUAL(rofFinder.isDigitsTimeAligned(), false);
110}
111
112//----------------------------------------------------------------------------
113BOOST_AUTO_TEST_CASE(TwoDigitsInOneROFsConsecutiveOrbits)
114{
115 uint32_t tfTime1 = 100;
116 uint32_t orbit1 = 1;
117 uint32_t tfTime2 = tfTime1;
118 uint32_t orbit2 = orbit1 + 1;
119
120 auto digits = makeDigitsVector(tfTime1, orbit1, tfTime2, orbit2);
121
122 ROFFinder rofFinder(digits, orbit1);
123 rofFinder.process();
124
125 const auto& rofDigits = rofFinder.getOrderedDigits();
126 const auto& rofRecords = rofFinder.getROFRecords();
127
128 BOOST_CHECK_EQUAL(rofDigits.size(), 2);
129 BOOST_CHECK_EQUAL(rofRecords.size(), 1);
130
131 BOOST_CHECK_EQUAL(rofRecords[0].getFirstIdx(), 0);
132 BOOST_CHECK_EQUAL(rofRecords[0].getNEntries(), 2);
133
134 BOOST_CHECK_EQUAL(rofRecords[0].getBCData(), rofFinder.digitTime2IR(digits[0]));
135 BOOST_CHECK_EQUAL(rofRecords[0].getBCWidth(), 4);
136}
137
138//----------------------------------------------------------------------------
139BOOST_AUTO_TEST_CASE(TwoDigitsInTwoROFs)
140{
141 uint32_t tfTime1 = 100;
142 uint32_t orbit1 = 1;
143 uint32_t tfTime2 = tfTime1 + 4;
144 uint32_t orbit2 = orbit1;
145
146 auto digits = makeDigitsVector(tfTime1, orbit1, tfTime2, orbit2);
147
148 ROFFinder rofFinder(digits, orbit1);
149 rofFinder.process();
150
151 const auto& rofDigits = rofFinder.getOrderedDigits();
152 const auto& rofRecords = rofFinder.getROFRecords();
153
154 BOOST_CHECK_EQUAL(rofDigits.size(), 2);
155 BOOST_CHECK_EQUAL(rofRecords.size(), 2);
156
157 BOOST_CHECK_EQUAL(rofRecords[0].getFirstIdx(), 0);
158 BOOST_CHECK_EQUAL(rofRecords[0].getNEntries(), 1);
159 BOOST_CHECK_EQUAL(rofRecords[0].getBCData(), rofFinder.digitTime2IR(digits[0]));
160 BOOST_CHECK_EQUAL(rofRecords[0].getBCWidth(), 4);
161
162 BOOST_CHECK_EQUAL(rofRecords[1].getFirstIdx(), 1);
163 BOOST_CHECK_EQUAL(rofRecords[1].getNEntries(), 1);
164 BOOST_CHECK_EQUAL(rofRecords[1].getBCData(), rofFinder.digitTime2IR(digits[1]));
165 BOOST_CHECK_EQUAL(rofRecords[1].getBCWidth(), 4);
166
167 const auto rofDigit1 = rofFinder.getOrderedDigit(rofRecords[0].getFirstIdx());
168 const auto rofDigit2 = rofFinder.getOrderedDigit(rofRecords[1].getFirstIdx());
169
170 BOOST_CHECK_EQUAL(rofDigit1.has_value(), true);
171 BOOST_CHECK_EQUAL(rofDigit2.has_value(), true);
172
173 BOOST_CHECK_EQUAL(digits[0], rofDigit1.value());
174 BOOST_CHECK_EQUAL(digits[1], rofDigit2.value());
175
176 BOOST_CHECK_EQUAL(rofFinder.isRofTimeMonotonic(), true);
177 BOOST_CHECK_EQUAL(rofFinder.isDigitsTimeAligned(), true);
178}
179
180//----------------------------------------------------------------------------
181BOOST_AUTO_TEST_CASE(TwoDigitsInTwoROFsConsecutiveOrbits)
182{
183 uint32_t tfTime1 = 100;
184 uint32_t orbit1 = 1;
185 uint32_t tfTime2 = tfTime1 - 4;
186 uint32_t orbit2 = orbit1 + 1;
187
188 auto digits = makeDigitsVector(tfTime1, orbit1, tfTime2, orbit2);
189
190 ROFFinder rofFinder(digits, orbit1);
191 rofFinder.process();
192
193 const auto& rofDigits = rofFinder.getOrderedDigits();
194 const auto& rofRecords = rofFinder.getROFRecords();
195
196 BOOST_CHECK_EQUAL(rofDigits.size(), 2);
197 BOOST_CHECK_EQUAL(rofRecords.size(), 2);
198
199 BOOST_CHECK_EQUAL(rofRecords[0].getFirstIdx(), 0);
200 BOOST_CHECK_EQUAL(rofRecords[0].getNEntries(), 1);
201 BOOST_CHECK_EQUAL(rofRecords[0].getBCData(), rofFinder.digitTime2IR(digits[1]));
202 BOOST_CHECK_EQUAL(rofRecords[0].getBCWidth(), 4);
203
204 BOOST_CHECK_EQUAL(rofRecords[1].getFirstIdx(), 1);
205 BOOST_CHECK_EQUAL(rofRecords[1].getNEntries(), 1);
206 BOOST_CHECK_EQUAL(rofRecords[1].getBCData(), rofFinder.digitTime2IR(digits[0]));
207 BOOST_CHECK_EQUAL(rofRecords[1].getBCWidth(), 4);
208
209 const auto rofDigit1 = rofFinder.getOrderedDigit(rofRecords[0].getFirstIdx());
210 const auto rofDigit2 = rofFinder.getOrderedDigit(rofRecords[1].getFirstIdx());
211
212 BOOST_CHECK_EQUAL(rofDigit1.has_value(), true);
213 BOOST_CHECK_EQUAL(rofDigit2.has_value(), true);
214
215 BOOST_CHECK_EQUAL(digits[1], rofDigit1.value());
216 BOOST_CHECK_EQUAL(digits[0], rofDigit2.value());
217
218 BOOST_CHECK_EQUAL(rofFinder.isRofTimeMonotonic(), true);
219 BOOST_CHECK_EQUAL(rofFinder.isDigitsTimeAligned(), true);
220}
221
222BOOST_AUTO_TEST_SUITE_END()
223BOOST_AUTO_TEST_SUITE_END()
uint64_t orbit
Definition RawEventData.h:6
Class to group the fired pads according to their time stamp.
MCH digit implementation.
Definition Digit.h:31
std::vector< RawDigit > RawDigitVector
std::vector< o2::mch::ROFRecord > getROFRecords()
Definition ROFFinder.h:54
std::optional< DataDecoder::RawDigit > getOrderedDigit(int i)
void process(bool dummyROFs=false)
Definition ROFFinder.cxx:51
o2::InteractionRecord digitTime2IR(const RawDigit &digit)
RawDigitIdVector getOrderedDigits()
Definition ROFFinder.h:53
BOOST_AUTO_TEST_CASE(FlatHisto)
uint32_t bunchCrossing
bit 0 to 9: sampa time
Definition DataDecoder.h:85
uint32_t orbit
bit 30 to 31: reserved
Definition DataDecoder.h:87
DataDecoder::RawDigitVector RawDigitVector
o2::mch::DsIndex ds
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())
std::vector< Digit > digits