Project
Loading...
Searching...
No Matches
testSampaHeader.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
14
15
#define BOOST_TEST_MODULE Test MCHRaw SampaHeader
16
#define BOOST_TEST_MAIN
17
#define BOOST_TEST_DYN_LINK
18
19
#include <boost/test/unit_test.hpp>
20
#include "
MCHRawCommon/SampaHeader.h
"
21
22
using namespace
o2::mch::raw
;
23
24
uint64_t
allones
= 0x3FFFFFFFFFFFF;
25
uint64_t
allbutbx
= 0x200001FFFFFFF;
26
uint64_t
allbut10bits
= 0x3FFFFFFF003FF;
27
28
BOOST_AUTO_TEST_SUITE(o2_mch_raw)
29
30
BOOST_AUTO_TEST_SUITE(sampaheader)
31
32
BOOST_AUTO_TEST_CASE
(SampaHeaderCtorBunchCrossingCounter)
33
{
34
SampaHeader
expected
(
static_cast<
uint8_t
>
(0x3F),
35
true
,
36
SampaPacketType::DataTriggerTooEarlyNumWords,
37
static_cast<
uint16_t
>
(0x3FF),
38
static_cast<
uint16_t
>
(0xF),
39
static_cast<
uint16_t
>
(0x1F),
40
static_cast<
uint32_t
>
(0),
41
true
);
42
BOOST_CHECK_EQUAL
(
expected
.uint64(),
allbutbx
);
43
}
44
45
BOOST_AUTO_TEST_CASE
(SampaHeaderCtorNof10BitsWords)
46
{
47
SampaHeader
expected
(
static_cast<
uint8_t
>
(0x3F),
48
true
,
49
SampaPacketType::DataTriggerTooEarlyNumWords,
50
static_cast<
uint16_t
>
(0),
51
static_cast<
uint16_t
>
(0xF),
52
static_cast<
uint16_t
>
(0x1F),
53
static_cast<
uint32_t
>
(0xFFFFF),
54
true
);
55
BOOST_CHECK_EQUAL
(
expected
.uint64(),
allbut10bits
);
56
}
57
58
BOOST_AUTO_TEST_CASE
(SampaHeaderEqualityOperators)
59
{
60
// comparison is full comparison (i.e. equality of 50bits)
61
62
SampaHeader
h
(
sampaSync
());
63
64
BOOST_CHECK
(
h
==
sampaSync
());
65
66
SampaHeader
h2(UINT64_C(0x1fffff5f0007f));
67
68
BOOST_CHECK
(h2 !=
sampaSync
());
69
}
70
71
BOOST_AUTO_TEST_CASE
(SampaHeaderSetHamming)
72
{
73
SampaHeader
sh;
74
75
sh.
hammingCode
(0x3F);
76
BOOST_CHECK_EQUAL
(sh.
hammingCode
(), 0X3F);
77
}
78
79
BOOST_AUTO_TEST_CASE
(SampaHeaderSetHeaderParity)
80
{
81
SampaHeader
sh;
82
83
sh.
headerParity
(
true
);
84
BOOST_CHECK_EQUAL
(sh.
headerParity
(),
true
);
85
}
86
87
BOOST_AUTO_TEST_CASE
(SampaHeaderSetPacketType)
88
{
89
SampaHeader
sh;
90
91
sh.
packetType
(SampaPacketType::DataTriggerTooEarlyNumWords);
92
BOOST_CHECK
(sh.
packetType
() == SampaPacketType::DataTriggerTooEarlyNumWords);
93
}
94
95
BOOST_AUTO_TEST_CASE
(SampaHeaderSetNumberOf10BitsWords)
96
{
97
SampaHeader
sh;
98
99
sh.
nof10BitWords
(0x3FF);
100
BOOST_CHECK_EQUAL
(sh.
nof10BitWords
(), 0x3FF);
101
sh.
nof10BitWords
(0);
102
BOOST_CHECK_EQUAL
(sh.
nof10BitWords
(), 0);
103
}
104
105
BOOST_AUTO_TEST_CASE
(SampaHeaderSetChipAddress)
106
{
107
SampaHeader
sh;
108
109
sh.
chipAddress
(0xF);
110
BOOST_CHECK_EQUAL
(sh.
chipAddress
(), 0xF);
111
sh.
chipAddress
(0);
112
BOOST_CHECK_EQUAL
(sh.
chipAddress
(), 0);
113
sh.
chipAddress
(1);
114
BOOST_CHECK_EQUAL
(sh.
chipAddress
(), 1);
115
}
116
117
BOOST_AUTO_TEST_CASE
(SampaHeaderSetChannelAddress)
118
{
119
SampaHeader
sh;
120
121
sh.
channelAddress
(0x1F);
122
BOOST_CHECK_EQUAL
(sh.
channelAddress
(), 0x1F);
123
}
124
125
BOOST_AUTO_TEST_CASE
(SampaHeaderSetBunchCrossingCounter)
126
{
127
SampaHeader
sh;
128
129
sh.
bunchCrossingCounter
(0xFFFFF);
130
BOOST_CHECK_EQUAL
(sh.
bunchCrossingCounter
(), 0xFFFFF);
131
}
132
133
BOOST_AUTO_TEST_CASE
(SampaHeaderSetPayloadParity)
134
{
135
SampaHeader
sh;
136
137
sh.
payloadParity
(
true
);
138
BOOST_CHECK_EQUAL
(sh.
payloadParity
(),
true
);
139
}
140
141
BOOST_AUTO_TEST_CASE
(SampaHeaderLessThanOperatorComparesBx)
142
{
143
SampaHeader
h1;
144
SampaHeader
h2;
145
146
h1.
bunchCrossingCounter
(1);
147
h2.
bunchCrossingCounter
(2);
148
149
SampaHeader
h10{h1};
150
151
BOOST_CHECK
(h1 == h10);
152
153
BOOST_CHECK_EQUAL
(h1 > h2,
false
);
154
BOOST_CHECK_EQUAL
(h1 < h2,
true
);
155
BOOST_CHECK_EQUAL
(h1 <= h10,
true
);
156
BOOST_CHECK_EQUAL
(h1 >= h10,
true
);
157
}
158
159
BOOST_AUTO_TEST_CASE
(SampaHeaderCtorWithMoreThan50BitsShouldThrow)
160
{
161
BOOST_CHECK_THROW(
SampaHeader
(
static_cast<
uint64_t
>
(1) << 50), std::invalid_argument);
162
}
163
164
BOOST_AUTO_TEST_CASE
(SampaHeaderCtorWithInvalidBitsIsNotAHeartbeat)
165
{
166
uint64_t
h
= 0x3FFFFEAFFFFFF;
// completely invalid value to start with
167
uint64_t
one
= 1;
168
169
// - bits 7-9 must be zero
170
// - bits 10-19 must be zero
171
// - bits 24,26,28 must be one
172
// - bits 25,27 must be zero
173
// - bit 49 must be zero
174
175
std::vector<int> zeros = {7, 8, 9, 24, 26, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 25, 27, 49};
176
std::vector<int> ones = {24, 26, 28};
177
178
BOOST_CHECK_EQUAL
(
SampaHeader
(
h
).isHeartbeat(),
false
);
179
for
(
auto
ix : zeros) {
180
h
&= ~(
one
<< ix);
181
BOOST_CHECK_EQUAL
(
SampaHeader
(
h
).isHeartbeat(),
false
);
182
}
183
for
(
auto
ix : ones) {
184
h
|= (
one
<< ix);
185
}
186
BOOST_CHECK_EQUAL
(
SampaHeader
(
h
).isHeartbeat(),
true
);
187
}
188
189
BOOST_AUTO_TEST_CASE
(CheckSampaSyncIsExpectedValue)
190
{
191
SampaHeader
h
(0x1555540f00113);
192
BOOST_CHECK
(
sampaSync
() ==
h
);
193
}
194
195
BOOST_AUTO_TEST_CASE
(SetChannelAddressTwice)
196
{
197
SampaHeader
h
;
198
199
h
.packetType(SampaPacketType::Data);
200
h
.channelAddress(1);
201
BOOST_CHECK_EQUAL
(
h
.channelAddress(), 1);
202
h
.channelAddress(31);
203
BOOST_CHECK_EQUAL
(
h
.channelAddress(), 31);
204
h
.channelAddress(5);
205
BOOST_CHECK_EQUAL
(
h
.channelAddress(), 5);
206
}
207
208
BOOST_AUTO_TEST_CASE
(ComputeHammingCode)
209
{
210
BOOST_CHECK_EQUAL
(
computeHammingCode
(0x3722e80103208), 0x8);
// 000100 P0
211
BOOST_CHECK_EQUAL
(
computeHammingCode
(0x1722e9f00327d), 0x3D);
// 101101 P1
212
BOOST_CHECK_EQUAL
(
computeHammingCode
(0x1722e8090322f), 0x2F);
// 111101 P0
213
}
214
215
BOOST_AUTO_TEST_CASE
(ComputeHammingCode2)
216
{
217
BOOST_CHECK_EQUAL
(
computeHammingCode2
(0x3722e80103208), 0x8);
// 000100 P0
218
BOOST_CHECK_EQUAL
(
computeHammingCode2
(0x1722e9f00327d), 0x3D);
// 101101 P1
219
BOOST_CHECK_EQUAL
(
computeHammingCode2
(0x1722e8090322f), 0x2F);
// 111101 P0
220
}
221
222
BOOST_AUTO_TEST_CASE
(ComputeHammingCode3)
223
{
224
BOOST_CHECK_EQUAL
(
computeHammingCode3
(0x3722e80103208), 0x8);
// 000100 P0
225
BOOST_CHECK_EQUAL
(
computeHammingCode3
(0x1722e9f00327d), 0x3D);
// 101101 P1
226
BOOST_CHECK_EQUAL
(
computeHammingCode3
(0x1722e8090322f), 0x2F);
// 111101 P0
227
}
228
229
BOOST_AUTO_TEST_CASE
(ComputeHammingCode4)
230
{
231
BOOST_CHECK_EQUAL
(
computeHammingCode4
(0x3722e80103208), 0x8);
// 000100 P0
232
BOOST_CHECK_EQUAL
(
computeHammingCode4
(0x1722e9f00327d), 0x3D);
// 101101 P1
233
BOOST_CHECK_EQUAL
(
computeHammingCode4
(0x1722e8090322f), 0x2F);
// 111101 P0
234
}
235
236
BOOST_AUTO_TEST_CASE
(CheckHammingCodeError)
237
{
238
uint64_t
v
= 0x1722e9f00327d;
239
int
expected
= 0x3D;
240
241
auto
ref
=
computeHammingCode
(
v
);
242
BOOST_CHECK_EQUAL
(
ref
,
expected
);
243
244
const
uint64_t
one
{1};
245
// flip a data bit
246
v
^= (
one
<< 34);
247
auto
h
=
computeHammingCode
(
v
);
248
BOOST_CHECK_NE(
ref
,
h
);
249
}
250
251
BOOST_AUTO_TEST_CASE
(CheckHeaderParity)
252
{
253
BOOST_CHECK_EQUAL
(
computeHeaderParity
(0x3722e80103208), 0);
// 000100 P0
254
BOOST_CHECK_EQUAL
(
computeHeaderParity
(0x1722e8090322f), 0);
// 111101 P0
255
BOOST_CHECK_EQUAL
(
computeHeaderParity
(0x1722e9f00327d), 1);
// 101101 P1
256
}
257
258
BOOST_AUTO_TEST_CASE
(CheckHeaderParity2)
259
{
260
BOOST_CHECK_EQUAL
(
computeHeaderParity2
(0x3722e80103208), 0);
// 000100 P0
261
BOOST_CHECK_EQUAL
(
computeHeaderParity2
(0x1722e8090322f), 0);
// 111101 P0
262
BOOST_CHECK_EQUAL
(
computeHeaderParity2
(0x1722e9f00327d), 1);
// 101101 P1
263
}
264
265
BOOST_AUTO_TEST_CASE
(CheckHeaderParity3)
266
{
267
BOOST_CHECK_EQUAL
(
computeHeaderParity3
(0x3722e80103208), 0);
// 000100 P0
268
BOOST_CHECK_EQUAL
(
computeHeaderParity3
(0x1722e8090322f), 0);
// 111101 P0
269
BOOST_CHECK_EQUAL
(
computeHeaderParity3
(0x1722e9f00327d), 1);
// 101101 P1
270
}
271
272
BOOST_AUTO_TEST_CASE
(CheckHeaderParity4)
273
{
274
BOOST_CHECK_EQUAL
(
computeHeaderParity4
(0x3722e80103208), 0);
// 000100 P0
275
BOOST_CHECK_EQUAL
(
computeHeaderParity4
(0x1722e8090322f), 0);
// 111101 P0
276
BOOST_CHECK_EQUAL
(
computeHeaderParity4
(0x1722e9f00327d), 1);
// 101101 P1
277
}
278
279
BOOST_AUTO_TEST_CASE
(CreateHearbeat)
280
{
281
SampaHeader
h
=
sampaHeartbeat
(0, 0);
282
BOOST_CHECK_EQUAL
(
h
.isHeartbeat(),
true
);
283
h
=
sampaHeartbeat
(39, 12345);
284
BOOST_CHECK_EQUAL
(
h
.isHeartbeat(),
true
);
285
}
286
BOOST_AUTO_TEST_SUITE_END()
287
BOOST_AUTO_TEST_SUITE_END()
one
uint32_t one
Definition
RawData.h:4
SampaHeader.h
h
Class for time synchronization of RawReader instances.
int
o2::mch::raw::SampaHeader
SampaHeader is the 50-bits header word used in Sampa data transmission protocol.
Definition
SampaHeader.h:51
o2::mch::raw::SampaHeader::channelAddress
SampaChannelAddress channelAddress() const
Definition
SampaHeader.cxx:346
o2::mch::raw::SampaHeader::nof10BitWords
uint16_t nof10BitWords() const
Definition
SampaHeader.cxx:334
o2::mch::raw::SampaHeader::chipAddress
uint8_t chipAddress() const
Definition
SampaHeader.cxx:340
o2::mch::raw::SampaHeader::payloadParity
bool payloadParity() const
Definition
SampaHeader.cxx:358
o2::mch::raw::SampaHeader::bunchCrossingCounter
uint32_t bunchCrossingCounter() const
Definition
SampaHeader.cxx:352
o2::mch::raw::SampaHeader::headerParity
bool headerParity() const
Definition
SampaHeader.cxx:323
o2::mch::raw::SampaHeader::packetType
SampaPacketType packetType() const
Definition
SampaHeader.cxx:328
o2::mch::raw::SampaHeader::hammingCode
uint8_t hammingCode() const
Definition
SampaHeader.cxx:317
v
const GLdouble * v
Definition
glcorearb.h:832
o2::mch::raw
Definition
pedestal-decoding-workflow.cxx:58
o2::mch::raw::computeHeaderParity
int computeHeaderParity(uint64_t value)
Definition
SampaHeader.cxx:567
o2::mch::raw::computeHammingCode3
int computeHammingCode3(uint64_t value)
Definition
SampaHeader.cxx:457
o2::mch::raw::sampaHeartbeat
SampaHeader sampaHeartbeat(uint8_t elinkId, uint20_t bunchCrossing)
Heartbeat packet.
Definition
SampaHeader.cxx:376
o2::mch::raw::sampaSync
SampaHeader sampaSync()
The 50-bits Sampa SYNC word.
Definition
SampaHeader.cxx:363
o2::mch::raw::computeHammingCode2
int computeHammingCode2(uint64_t value)
Definition
SampaHeader.cxx:498
o2::mch::raw::computeHeaderParity4
int computeHeaderParity4(uint64_t value)
Definition
SampaHeader.cxx:629
o2::mch::raw::computeHeaderParity2
int computeHeaderParity2(uint64_t value)
Definition
SampaHeader.cxx:594
o2::mch::raw::computeHeaderParity3
int computeHeaderParity3(uint64_t value)
Definition
SampaHeader.cxx:606
o2::mch::raw::computeHammingCode4
int computeHammingCode4(uint64_t value)
Definition
SampaHeader.cxx:549
o2::mch::raw::computeHammingCode
int computeHammingCode(uint64_t value)
Definition
SampaHeader.cxx:519
o2::BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(FlatHisto)
Definition
testFlatHisto.cxx:28
expected
std::map< std::string, ID > expected
Definition
testDCSAliases.cxx:166
allbutbx
uint64_t allbutbx
Definition
testSampaHeader.cxx:25
allbut10bits
uint64_t allbut10bits
Definition
testSampaHeader.cxx:26
allones
uint64_t allones
Definition
testSampaHeader.cxx:24
BOOST_CHECK
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())
Detectors
MUON
MCH
Raw
Common
test
testSampaHeader.cxx
Generated on Tue Feb 25 2025 23:16:23 for Project by
1.9.8