Project
Loading...
Searching...
No Matches
testDigitsTimeComputation.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 DigitsTimeComputation
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(digitstimecomputation)
24
25static const int32_t BCINORBIT = 3564;
26static const int32_t BCROLLOVER = (1 << 20);
28
29BOOST_AUTO_TEST_CASE(TimeDiffSameOrbitNoRollover)
30{
31 uint32_t orbit1 = 1;
32 uint32_t orbit2 = 1;
33 uint32_t bc1 = 0;
34 uint32_t bc2 = BCINORBIT - 10;
35 auto diff = DataDecoder::getDigitTimeHBPackets(orbit1, bc1, orbit2, bc2);
36 BOOST_CHECK_EQUAL(diff, bc2);
37}
38
39BOOST_AUTO_TEST_CASE(TimeDiffSameOrbitWithRollover)
40{
41 uint32_t orbit1 = 1;
42 uint32_t orbit2 = 1;
43 uint32_t bc1 = BCROLLOVER - 10;
44 uint32_t bc2 = 10;
45 auto diff = DataDecoder::getDigitTimeHBPackets(orbit1, bc1, orbit2, bc2);
46 BOOST_CHECK_EQUAL(diff, 20);
47}
48
49BOOST_AUTO_TEST_CASE(TimeDiffSameOrbitWithRollover2)
50{
51 uint32_t orbit1 = 1;
52 uint32_t orbit2 = 1;
53 uint32_t bc1 = 10;
54 uint32_t bc2 = BCROLLOVER - 10;
55 auto diff = DataDecoder::getDigitTimeHBPackets(orbit1, bc1, orbit2, bc2);
56 BOOST_CHECK_EQUAL(diff, -20);
57}
58
59static std::vector<RawDigit> makeDigitsVector(uint32_t sampaTime, uint32_t bunchCrossing, uint32_t orbit)
60{
61 RawDigit digit;
62 digit.digit = o2::mch::Digit(100, 10, 1000, 0x7FFFFFFF, 10);
63 digit.info.chip = 1;
64 digit.info.ds = 2;
65 digit.info.solar = 80;
66 digit.info.sampaTime = sampaTime;
67 digit.info.bunchCrossing = bunchCrossing;
68 digit.info.orbit = orbit;
69
70 std::vector<RawDigit> digits;
71 digits.push_back(digit);
72 return digits;
73}
74
75static std::vector<RawDigit> processDigits(const std::vector<RawDigit>& digits, uint32_t tfOrbit, uint32_t tfBunchCrossing)
76{
77 SampaChannelHandler channelHandler;
78 RdhHandler rdhHandler;
79
80 bool ds2manu = false;
81 bool mDebug = true;
82 bool mCheckROFs = false;
83 bool mDummyROFs = true;
84 bool useDummyElecMap = false;
85 DataDecoder decoder{channelHandler, rdhHandler, "", "", ds2manu, mDebug, useDummyElecMap};
86
87 decoder.setFirstOrbitInTF(tfOrbit);
88 decoder.setDigits(digits);
89
90 for (auto& digit : digits) {
91 auto& info = digit.info;
92 auto chipId = DataDecoder::getChipId(info.solar, info.ds, info.chip);
93 decoder.updateTimeFrameStartRecord(chipId, tfOrbit, tfBunchCrossing);
94 }
95 decoder.computeDigitsTime();
96
97 auto& digitsOut = decoder.getDigits();
98 return digitsOut;
99}
100
101BOOST_AUTO_TEST_CASE(ComputeDigitsTime)
102{
103 uint32_t sampaTime = 10;
104 uint32_t bunchCrossing = BCINORBIT - 100;
105 uint32_t orbit = 1;
106
107 std::vector<RawDigit> digits = makeDigitsVector(sampaTime, bunchCrossing, orbit);
108
109 uint32_t tfOrbit = 1;
110 uint32_t tfBunchCrossing = 0;
111
112 auto digitsOut = processDigits(digits, tfOrbit, tfBunchCrossing);
113
114 int32_t digitTime = static_cast<int32_t>(bunchCrossing) + static_cast<int32_t>(sampaTime * 4) -
115 static_cast<int32_t>(tfBunchCrossing);
116
117 BOOST_CHECK_EQUAL(digitsOut[0].getTime(), digitTime);
118}
119
120BOOST_AUTO_TEST_CASE(ComputeDigitsTimeWithRollover)
121{
122 uint32_t sampaTime = 10;
123 uint32_t bunchCrossing = 100;
124 uint32_t orbit = 1;
125
126 std::vector<RawDigit> digits = makeDigitsVector(sampaTime, bunchCrossing, orbit);
127
128 uint32_t tfOrbit = 1;
129 uint32_t tfBunchCrossing = BCROLLOVER - 100;
130
131 auto digitsOut = processDigits(digits, tfOrbit, tfBunchCrossing);
132
133 int32_t digitTime = static_cast<int32_t>(bunchCrossing) + static_cast<int32_t>(sampaTime * 4) -
134 static_cast<int32_t>(tfBunchCrossing) + BCROLLOVER;
135
136 BOOST_CHECK_EQUAL(digitsOut[0].getTime(), digitTime);
137}
138
139BOOST_AUTO_TEST_CASE(ComputeDigitsTimeWithRollover2)
140{
141 uint32_t sampaTime = 10;
142 uint32_t bunchCrossing = BCROLLOVER - 100;
143 uint32_t orbit = 1;
144
145 std::vector<RawDigit> digits = makeDigitsVector(sampaTime, bunchCrossing, orbit);
146
147 uint32_t tfOrbit = 1;
148 uint32_t tfBunchCrossing = 100;
149
150 auto digitsOut = processDigits(digits, tfOrbit, tfBunchCrossing);
151
152 int32_t digitTime = static_cast<int32_t>(bunchCrossing) + static_cast<int32_t>(sampaTime * 4) -
153 static_cast<int32_t>(tfBunchCrossing) - BCROLLOVER;
154
155 BOOST_CHECK_EQUAL(digitsOut[0].getTime(), digitTime);
156}
157
158BOOST_AUTO_TEST_SUITE_END()
159BOOST_AUTO_TEST_SUITE_END()
Definition of the decoder for the MCH data.
uint64_t orbit
Definition RawEventData.h:6
int ds2manu(int deId, int ch)
MCH digit implementation.
Definition Digit.h:31
static int32_t getDigitTimeHBPackets(uint32_t orbitTF, uint32_t bcTF, uint32_t orbitDigit, uint32_t bcDigit)
Helper function for computing the digit time relative to the beginning of the TimeFrame.
static uint64_t getChipId(uint32_t solar, uint32_t ds, uint32_t chip)
Convert a Solar/Ds/Chip triplet into an unique chip index.
std::function< void(o2::header::RDHAny *)> RdhHandler
Definition DataDecoder.h:41
std::function< void(DsElecId dsId, DualSampaChannelId channel, SampaCluster)> SampaChannelHandler
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
const bool useDummyElecMap
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())
std::vector< Digit > digits