Skip to content

Commit 287bc53

Browse files
committed
Major change in ITS/MFT raw data encoding/decoding acc. DataFormat 6.09
* Fix cables mapping and lane patterns * Account for modidied header and trailed words * Add diagnostic word after RDH with stop (its absence tolerated by decoding)
1 parent a3816d0 commit 287bc53

File tree

14 files changed

+306
-88
lines changed

14 files changed

+306
-88
lines changed

Detectors/ITSMFT/ITS/simulation/src/digi2raw.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,10 @@ void setupLinks(o2::itsmft::MC2RawEncoder<MAP>& m2r, std::string_view outDir, st
250250
if (acceptRU && lnkAs[il]) {
251251
nLinks++;
252252
auto& ru = *m2r.getRUDecode(ruID);
253-
uint32_t lanes = mp.getCablesOnRUType(ru.ruInfo->ruType); // lanes patter of this RU
253+
uint32_t lanes = mp.getCablesOnRUType(ru.ruInfo->ruType); // lanes pattern of this RU
254254
ru.links[il] = m2r.addGBTLink();
255255
auto link = m2r.getGBTLink(ru.links[il]);
256-
link->lanes = lanes & ((0x1 << lnkAs[il]) - 1) << (accL);
256+
link->lanes = lanes & (((0x1 << lnkAs[il]) - 1) << (accL)); // RS FIXME
257257
link->idInCRU = linkID;
258258
link->cruID = cruID;
259259
link->feeID = mp.RUSW2FEEId(ruID, il);

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/ChipMappingITS.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class ChipMappingITS
166166
int getNCablesOnRUType(int ruType) const { return NCablesPerStaveSB[ruType]; }
167167

168168
///< get pattern of lanes on the RU served by a given RU type
169-
int getCablesOnRUType(int ruType) const { return CablesOnStaveSB[ruType]; }
169+
int getCablesOnRUType(int ruType) const { return mCablesOnStaveSB[ruType]; }
170170

171171
///< get number of chips served by RU of given type (i.e. RU type for ITS)
172172
int getNChipsOnRUType(int ruType) const { return NChipsPerStaveSB[ruType]; }
@@ -252,11 +252,6 @@ class ChipMappingITS
252252
NCablesPerModule[MB] * NModulesPerStaveSB[MB],
253253
NCablesPerModule[OB] * NModulesPerStaveSB[OB]};
254254

255-
///< pattern of cables per stave of sub-barrel
256-
static constexpr std::array<int, NSubB> CablesOnStaveSB = {(0x1 << NCablesPerModule[IB] * NModulesPerStaveSB[IB]) - 1,
257-
(0x1 << NCablesPerModule[MB] * NModulesPerStaveSB[MB]) - 1,
258-
(0x1 << NCablesPerModule[OB] * NModulesPerStaveSB[OB]) - 1};
259-
260255
///< number of chips per sub-barrel
261256
static constexpr std::array<int, NSubB> NChipsSB = {NChipsPerStaveSB[IB] * NStavesSB[IB],
262257
NChipsPerStaveSB[MB] * NStavesSB[MB],
@@ -288,6 +283,8 @@ class ChipMappingITS
288283
std::vector<uint8_t> mCableHW2Pos[NSubB]; ///< table of cables positions in the ActiveLanes mask for each RU type
289284
std::vector<uint8_t> mCableHWFirstChip[NSubB]; ///< 1st chip of module (relative to the 1st chip of the stave) served by each cable
290285

286+
std::array<int, NSubB> mCablesOnStaveSB = {0}; ///< pattern of cables per stave of sub-barrel
287+
291288
ClassDefNV(ChipMappingITS, 1);
292289
};
293290
} // namespace itsmft

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/DecodingStat.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,13 @@ struct GBTLinkDecodingStat {
109109
ErrInvalidActiveLanes, // active lanes pattern conflicts with expected for given RU type
110110
ErrPacketCounterJump, // jump in RDH.packetCounter
111111
ErrPacketDoneMissing, // packet done is missing in the trailer while CRU page is not over
112+
ErrMissingDiagnosticWord, // missing diagnostic word after RDH with stop
112113
NErrorsDefined
113114
};
114115
static constexpr std::array<std::string_view, NErrorsDefined> ErrNames = {
115116
"Page data not start with expected RDH", // ErrNoRDHAtStart
116117
"New HB/trigger page started w/o stopping previous one", // ErrPageNotStopped
117-
"Page with RDH.stop is not empty", // ErrStopPageNotEmpty
118+
"Page with RDH.stop does not contain diagnostic word only", // ErrStopPageNotEmpty
118119
"RDH page counters for the same RU/trigger are not continuous", // ErrPageCounterDiscontinuity
119120
"RDH and GBT header page counters are not consistent", // ErrRDHvsGBTHPageCnt
120121
"GBT trigger word was expected but not found", // ErrMissingGBTTrigger
@@ -128,7 +129,8 @@ struct GBTLinkDecodingStat {
128129
"Cable data does not start with chip header or empty chip", // ErrCableDataHeadWrong
129130
"Active lanes pattern conflicts with expected for given RU type", // ErrInvalidActiveLanes
130131
"Jump in RDH_packetCounter", // ErrPacketCounterJump
131-
"Packet done is missing in the trailer while CRU page is not over" // ErrPacketDoneMissing
132+
"Packet done is missing in the trailer while CRU page is not over", // ErrPacketDoneMissing
133+
"Missing diagnostic GBT word after RDH with stop" // ErrMissingDiagnosticWord
132134
};
133135

134136
uint32_t ruLinkID = 0; // Link ID within RU

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/GBTLink.h

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ struct GBTLink {
123123
void discardData() { rawData.setDone(); }
124124
void printTrigger(const GBTTrigger* gbtTrg);
125125
void printHeader(const GBTDataHeader* gbtH);
126+
void printHeader(const GBTDataHeaderL* gbtH);
126127
void printTrailer(const GBTDataTrailer* gbtT);
128+
void printDiagnostic(const GBTDiagnostic* gbtD);
127129
bool nextCRUPage();
128130

129131
#ifndef _RAW_READER_ERROR_CHECKS_ // define dummy inline check methods, will be compiled out
@@ -135,22 +137,26 @@ struct GBTLink {
135137
ErrorType checkErrorsRDHStopPageEmpty(const RDH& rdh) const { return NoError; }
136138
ErrorType checkErrorsTriggerWord(const GBTTrigger* gbtTrg) const { return NoError; }
137139
ErrorType checkErrorsHeaderWord(const GBTDataHeader* gbtH) const { return NoError; }
140+
ErrorType checkErrorsHeaderWord(const GBTDataHeaderL* gbtH) const { return NoError; }
138141
ErrorType checkErrorsActiveLanes(int cables) const { return NoError; }
139142
ErrorType checkErrorsGBTData(int cablePos) const { return NoError; }
140143
ErrorType checkErrorsTrailerWord(const GBTDataTrailer* gbtT) const { return NoError; }
141144
ErrorType checkErrorsPacketDoneMissing(const GBTDataTrailer* gbtT, bool notEnd) const { return NoError; }
142145
ErrorType checkErrorsLanesStops() const { return NoError; }
146+
ErrorType checkErrorsDiagnosticWord(const GBTDiagnostic* gbtD) const { return NoError; }
143147
#else
144148
ErrorType checkErrorsRDH(const RDH& rdh);
145149
ErrorType checkErrorsRDHStop(const RDH& rdh);
146150
ErrorType checkErrorsRDHStopPageEmpty(const RDH& rdh);
147151
ErrorType checkErrorsTriggerWord(const GBTTrigger* gbtTrg);
148152
ErrorType checkErrorsHeaderWord(const GBTDataHeader* gbtH);
153+
ErrorType checkErrorsHeaderWord(const GBTDataHeaderL* gbtH);
149154
ErrorType checkErrorsActiveLanes(int cables);
150155
ErrorType checkErrorsGBTData(int cablePos);
151156
ErrorType checkErrorsTrailerWord(const GBTDataTrailer* gbtT);
152157
ErrorType checkErrorsPacketDoneMissing(const GBTDataTrailer* gbtT, bool notEnd);
153158
ErrorType checkErrorsLanesStops();
159+
ErrorType checkErrorsDiagnosticWord(const GBTDiagnostic* gbtD);
154160
#endif
155161

156162
ClassDefNV(GBTLink, 1);
@@ -179,16 +185,51 @@ GBTLink::CollectedDataStatus GBTLink::collectROFCableData(const Mapping& chmap)
179185
}
180186
GBTLINK_DECODE_ERRORCHECK(checkErrorsRDH(*rdh)); // make sure we are dealing with RDH
181187
GBTLINK_DECODE_ERRORCHECK(checkErrorsRDHStop(*rdh)); // if new HB starts, the lastRDH must have stop
182-
GBTLINK_DECODE_ERRORCHECK(checkErrorsRDHStopPageEmpty(*rdh)); // end of HBF should be an empty page with stop
188+
// GBTLINK_DECODE_ERRORCHECK(checkErrorsRDHStopPageEmpty(*rdh)); // end of HBF should be an empty page with stop
183189
lastRDH = rdh;
184190
statistics.nPackets++;
191+
185192
dataOffset += sizeof(RDH);
193+
auto psz = RDHUtils::getMemorySize(*rdh);
194+
if (psz == sizeof(RDH)) {
195+
continue; // filter out empty page
196+
}
197+
if (format == NewFormat && RDHUtils::getStop(*rdh)) { // only diagnostic word can be present after the stop
198+
auto gbtDiag = reinterpret_cast<const GBTDiagnostic*>(&currRawPiece->data[dataOffset]);
199+
if (verbosity >= VerboseHeaders) {
200+
printDiagnostic(gbtDiag);
201+
}
202+
GBTLINK_DECODE_ERRORCHECK(checkErrorsDiagnosticWord(gbtDiag));
203+
dataOffset += RDHUtils::getOffsetToNext(*rdh) - sizeof(RDH);
204+
continue;
205+
}
206+
207+
// data must start with the GBTHeader
208+
auto gbtH = reinterpret_cast<const GBTDataHeader*>(&currRawPiece->data[dataOffset]); // process GBT header
209+
dataOffset += GBTPaddedWordLength;
210+
if (verbosity >= VerboseHeaders) {
211+
printHeader(gbtH);
212+
}
213+
if (format == OldFormat) {
214+
GBTLINK_DECODE_ERRORCHECK(checkErrorsHeaderWord(reinterpret_cast<const GBTDataHeaderL*>(gbtH)));
215+
lanesActive = reinterpret_cast<const GBTDataHeaderL*>(gbtH)->activeLanesL; // TODO do we need to update this for every page?
216+
} else {
217+
GBTLINK_DECODE_ERRORCHECK(checkErrorsHeaderWord(gbtH));
218+
lanesActive = gbtH->activeLanes; // TODO do we need to update this for every page?
219+
}
220+
221+
GBTLINK_DECODE_ERRORCHECK(checkErrorsActiveLanes(chmap.getCablesOnRUType(ruPtr->ruInfo->ruType)));
222+
if (format == OldFormat && reinterpret_cast<const GBTDataHeaderL*>(gbtH)->packetIdx == 0) { // reset flags in case of 1st page of new ROF (old format: judge by RDH)
223+
lanesStop = 0;
224+
lanesWithData = 0;
225+
}
226+
186227
continue;
187228
}
188229

189230
ruPtr->nCables = ruPtr->ruInfo->nCables; // RSTODO is this needed? TOREMOVE
190231

191-
// data must start with GBT trigger word (unless we work with old format)
232+
// then we expect GBT trigger word (unless we work with old format)
192233
const GBTTrigger* gbtTrg = nullptr;
193234
if (format == NewFormat) {
194235
gbtTrg = reinterpret_cast<const GBTTrigger*>(&currRawPiece->data[dataOffset]); // process GBT trigger
@@ -197,24 +238,13 @@ GBTLink::CollectedDataStatus GBTLink::collectROFCableData(const Mapping& chmap)
197238
printTrigger(gbtTrg);
198239
}
199240
GBTLINK_DECODE_ERRORCHECK(checkErrorsTriggerWord(gbtTrg));
200-
}
201-
202-
// next the GBTHeader must come
203-
auto gbtH = reinterpret_cast<const GBTDataHeader*>(&currRawPiece->data[dataOffset]); // process GBT header
204-
dataOffset += GBTPaddedWordLength;
205-
if (verbosity >= VerboseHeaders) {
206-
printHeader(gbtH);
207-
}
208-
GBTLINK_DECODE_ERRORCHECK(checkErrorsHeaderWord(gbtH));
209-
lanesActive = gbtH->activeLanes; // TODO do we need to update this for every page?
210-
GBTLINK_DECODE_ERRORCHECK(checkErrorsActiveLanes(chmap.getCablesOnRUType(ruPtr->ruInfo->ruType)));
211-
if (format == OldFormat && RDHUtils::getPageCounter(*lastRDH)) { // RSTODO reset flags in case of 1st page of new ROF (old format: judge by RDH)
212-
lanesStop = 0;
213-
lanesWithData = 0;
214-
} else if (gbtH->packetIdx == 0) { // reset flags in case of 1st page of new ROF (new format: judge by header)
241+
if (gbtTrg->noData) { // emtpy trigger
242+
return status;
243+
}
215244
lanesStop = 0;
216245
lanesWithData = 0;
217246
}
247+
218248
auto gbtD = reinterpret_cast<const o2::itsmft::GBTData*>(&currRawPiece->data[dataOffset]);
219249
while (!gbtD->isDataTrailer()) { // start reading real payload
220250
nw++;
@@ -242,7 +272,9 @@ GBTLink::CollectedDataStatus GBTLink::collectROFCableData(const Mapping& chmap)
242272
GBTLINK_DECODE_ERRORCHECK(checkErrorsPacketDoneMissing(gbtT, dataOffset < currRawPiece->size));
243273
continue; // keep reading next CRU page
244274
}
245-
GBTLINK_DECODE_ERRORCHECK(checkErrorsLanesStops());
275+
if (format == OldFormat) {
276+
GBTLINK_DECODE_ERRORCHECK(checkErrorsLanesStops());
277+
}
246278
// accumulate packet states
247279
statistics.packetStates[gbtT->getPacketState()]++;
248280
// before quitting, store the trigger and IR
@@ -251,8 +283,8 @@ GBTLink::CollectedDataStatus GBTLink::collectROFCableData(const Mapping& chmap)
251283
ir.orbit = gbtTrg->orbit;
252284
trigger = gbtTrg->triggerType;
253285
} else {
254-
ir = RDHUtils::getTriggerIR(lastRDH);
255-
trigger = RDHUtils::getTriggerType(lastRDH);
286+
ir = RDHUtils::getTriggerIR(*lastRDH);
287+
trigger = RDHUtils::getTriggerType(*lastRDH);
256288
}
257289
return (status = DataSeen);
258290
}

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/GBTWord.h

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ constexpr uint8_t GBTFlagDataHeader = 0xe0;
2929
/// GBT payload trailer flag
3030
constexpr uint8_t GBTFlagDataTrailer = 0xf0;
3131
/// GBT trigger status word flag
32-
constexpr uint8_t GBTFlagTrigger = 0xc0;
32+
constexpr uint8_t GBTFlagTrigger = 0xe8;
33+
/// GBT diagnostic status word flag
34+
constexpr uint8_t GBTFlagDiagnostic = 0xe4;
3335

3436
// GBT header flag in the RDH
3537
constexpr uint8_t GBTFlagRDH = 0x00;
@@ -44,18 +46,24 @@ constexpr int GBTPaddedWordLength = 16; // lentgh in bytes with padding
4446
struct GBTWord {
4547
/// GBT word of 80 bits, bits 72:79 are reserver for GBT Header flag, the rest depends on specifications
4648
union {
47-
struct {
48-
uint64_t packetIdx : 16; /// 0:15 Index of Data Packet within trigger
49-
uint64_t activeLanes : 28; /// 16:43 Bit map of lanes active and eligible for readout
50-
uint64_t na0h : 20; /// 44:71 reserved
51-
uint64_t na1h : 8; /// 44:71 reserved
49+
// RS: packing will be needed only if some of the members cross 64 bit boundary
50+
struct /*__attribute__((packed))*/ {
51+
uint64_t activeLanes : 28; /// 0:27 Bit map of lanes active and eligible for readout
52+
uint64_t na0hn : 36; /// 28:71 reserved
53+
uint64_t na1hn : 8; /// 28:71 reserved
5254
uint64_t id : 8; /// 72:79 0xe0; Header Status Word (HSW) identifier
53-
}; // HEADER
54-
struct {
55-
uint64_t lanesStops : 28; /// 0:27 Bit map of “Valid Lane stops received”, 1 bit per lane
56-
uint64_t na0t : 4; /// 28:32 reserved
57-
uint64_t lanesTimeout : 28; /// 32:59 Bit map of “Lane timeouts received”, 1 bit per lane
58-
uint64_t na1t : 4; /// 60:63 reserved
55+
}; // HEADER NEW
56+
struct /*__attribute__((packed))*/ {
57+
uint64_t packetIdx : 16; /// 0:15 Index of Data Packet within trigger
58+
uint64_t activeLanesL : 28; /// 16:43 Bit map of lanes active and eligible for readout
59+
uint64_t na0h : 20; /// 44:64 reserved
60+
uint64_t na1h : 8; /// 64:71 reserved
61+
// uint64_t id : 8; /// 72:79 0xe0; Header Status Word (HSW) identifier
62+
}; // HEADER Legacy
63+
struct /*__attribute__((packed))*/ {
64+
uint64_t lanesStops : 28; /// 0:27 Bit map of “Valid Lane stops received”, 1 bit per lane, NOT USED
65+
uint64_t lanesTimeout : 28; /// 28:55 Bit map of “Lane timeouts received”, 1 bit per lane, NOT USED
66+
uint64_t na1t : 8; /// 56:63 reserved
5967
uint64_t packetDone : 1; /// 64 = 1 when current trigger packets transmission done
6068
uint64_t transmissionTimeout : 1; /// 65 = 1 if timeout while waiting for data on lanes
6169
uint64_t packetOverflow : 1; /// 66 = 1 if max number of packets reached
@@ -64,7 +72,7 @@ struct GBTWord {
6472
uint64_t na2t : 3; /// 69:71 reserved
6573
// uint8_t id : 8; /// = 0xf0; Trailer Status Word (TSW) identifier
6674
}; // TRAILER
67-
struct {
75+
struct /*__attribute__((packed))*/ {
6876
uint64_t triggerType : 12; /// 0:11 12 lowest bits of trigger type received from CTP
6977
uint64_t internal : 1; /// 12 Used in Continuous Mode for internally generated trigger
7078
uint64_t noData : 1; /// 13 No data expected (too close to previous trigger or error)
@@ -76,6 +84,10 @@ struct GBTWord {
7684
uint64_t na3tr : 6; /// 64:71 reserved
7785
// uint8_t id : 8; /// = 0xc0; Trigger Status Word (TSW) identifier
7886
}; // TRIGGER
87+
struct /*__attribute__((packed))*/ {
88+
uint64_t na0diag : 64; ///
89+
// uint64_t id : 8; /// 72:79 0xe4; diagnostic word identifier
90+
}; // HEADER Legacy
7991

8092
uint8_t data8[16]; // 80 bits GBT word + optional padding to 128 bits
8193
uint64_t data64[2] = {0};
@@ -92,6 +104,9 @@ struct GBTWord {
92104
/// check if the GBT Header corresponds to GBT trigger word
93105
bool isTriggerWord() const { return id == GBTFlagTrigger; }
94106

107+
/// check if the GBT Header corresponds to Diagnostic data
108+
bool isDiagnosticWord() const { return id == GBTFlagDiagnostic; }
109+
95110
/// check if the GBT Header corresponds to ITS IB data (header is combined with lanes info)
96111
bool isDataIB() const { return (id & 0xe0) == GBTFlagDataIB; }
97112

@@ -110,6 +125,23 @@ struct GBTWord {
110125
};
111126

112127
struct GBTDataHeader : public GBTWord {
128+
/// Definition of ITS/MFT GBT Header: 80 bits long word
129+
/// In CRU data it must be the 1st word of the payload
130+
///
131+
/// bits 0 : 27, Active lanes pattern
132+
/// bits 28 : 71, not used
133+
/// bits 72 : 79, header/trailer indicator
134+
135+
GBTDataHeader() { id = GBTFlagDataHeader; }
136+
GBTDataHeader(uint32_t lanes)
137+
{
138+
id = GBTFlagDataHeader;
139+
activeLanes = lanes;
140+
}
141+
ClassDefNV(GBTDataHeader, 1);
142+
};
143+
144+
struct GBTDataHeaderL : public GBTWord { // legacy version
113145
/// Definition of ITS/MFT GBT Header: 80 bits long word
114146
/// In CRU data it must be the 1st word of the payload
115147
///
@@ -118,24 +150,23 @@ struct GBTDataHeader : public GBTWord {
118150
/// bits 44 : 71, not used
119151
/// bits 72 : 79, header/trailer indicator
120152

121-
GBTDataHeader() { id = GBTFlagDataHeader; }
122-
GBTDataHeader(int packetID, uint32_t lanes)
153+
GBTDataHeaderL() { id = GBTFlagDataHeader; }
154+
GBTDataHeaderL(int packetID, uint32_t lanes)
123155
{
124156
id = GBTFlagDataHeader;
125-
activeLanes = lanes;
157+
activeLanesL = lanes;
126158
packetIdx = packetID;
127159
}
128-
ClassDefNV(GBTDataHeader, 1);
160+
ClassDefNV(GBTDataHeaderL, 1);
129161
};
130162

131163
struct GBTDataTrailer : public GBTWord {
132164
/// Definition of ITS/MFT GBT trailer: 80 bits long word
133165
/// In CRU data it must be the last word of the payload
134166
///
135-
/// bits 0 : 27, Lanes stops received
136-
/// bits 28 : 31, not used
137-
/// bits 32 : 59, Lane timeouts received
138-
/// bits 60 : 63, not used
167+
/// bits 0 : 27, Lanes stops received // not used at the moment
168+
/// bits 28 : 55, Lane timeouts received // not used at the moment
169+
/// bits 56 : 63, not used
139170
/// bits 64 : 71, State of GBT_Packet:
140171
/// 4: lane_timeouts, if at least 1 lane timed out
141172
/// 3: lane_starts_violation, if at least 1 lane had a start violation
@@ -219,6 +250,18 @@ struct GBTData : public GBTWord {
219250

220251
ClassDefNV(GBTData, 1);
221252
};
253+
254+
struct GBTDiagnostic : public GBTWord {
255+
/// Definition of GBT diagnostic word
256+
/// In CRU data it must be the only word after the RDH with stop
257+
///
258+
/// bits 0 : 71, reserved
259+
/// bits 72 : 79, diagnostic flag
260+
261+
GBTDiagnostic() { id = GBTFlagDiagnostic; }
262+
ClassDefNV(GBTDiagnostic, 1);
263+
};
264+
222265
} // namespace itsmft
223266
} // namespace o2
224267

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/RawPixelReader.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ class RawPixelReader : public PixelReader
371371
link->data.ensureFreeCapacity(MaxGBTPacketBytes);
372372
link->data.addFast(reinterpret_cast<uint8_t*>(&rdh), RDHUtils::getHeaderSize(rdh)); // write RDH for current packet
373373
link->nTriggers++; // acknowledge the page, note: here we count pages, not triggers
374-
o2::itsmft::GBTDataHeader gbtHeader(0, link->lanes);
374+
o2::itsmft::GBTDataHeaderL gbtHeader(0, link->lanes);
375375
o2::itsmft::GBTDataTrailer gbtTrailer; // lanes will be set on closing the last page
376376

377377
gbtHeader.packetIdx = RDHUtils::getPageCounter(rdh);
@@ -780,7 +780,7 @@ class RawPixelReader : public PixelReader
780780
mDecodingStat.nPagesProcessed++;
781781
raw += RDHUtils::getHeaderSize(rdh);
782782
int nGBTWords = (RDHUtils::getMemorySize(rdh) - RDHUtils::getHeaderSize(rdh)) / mGBTWordSize - 2; // number of GBT words excluding header/trailer
783-
auto gbtH = reinterpret_cast<const o2::itsmft::GBTDataHeader*>(raw); // process GBT header
783+
auto gbtH = reinterpret_cast<const o2::itsmft::GBTDataHeaderL*>(raw); // process GBT header
784784

785785
#ifdef _RAW_READER_ERROR_CHECKS_
786786
if (mVerbose) {
@@ -1049,7 +1049,7 @@ class RawPixelReader : public PixelReader
10491049
raw += RDHUtils::getHeaderSize(rdh);
10501050
// number of 128 b GBT words excluding header/trailer
10511051
int nGBTWords = (RDHUtils::getMemorySize(rdh) - RDHUtils::getHeaderSize(rdh)) / o2::itsmft::GBTPaddedWordLength - 2;
1052-
auto gbtH = reinterpret_cast<const o2::itsmft::GBTDataHeader*>(raw); // process GBT header
1052+
auto gbtH = reinterpret_cast<const o2::itsmft::GBTDataHeaderL*>(raw); // process GBT header
10531053

10541054
#ifdef _RAW_READER_ERROR_CHECKS_
10551055
if (mVerbose) {

0 commit comments

Comments
 (0)