15#ifndef _ALICEO2_ITSMFT_GBTLINK_H_
16#define _ALICEO2_ITSMFT_GBTLINK_H_
18#define _RAW_READER_ERROR_CHECKS_
34#define GBTLINK_DECODE_ERRORCHECK(errRes, errEval) \
36 if ((errRes)&uint8_t(ErrorPrinted)) { \
37 ruPtr->linkHBFToDump[(uint64_t(subSpec) << 32) + hbfEntry] = irHBF.orbit; \
38 errRes &= ~uint8_t(ErrorPrinted); \
40 if ((errRes)&uint8_t(Abort)) { \
42 return (status = AbortedOnError); \
136 GBTLink(uint16_t _cru, uint16_t _fee, uint8_t _ep, uint8_t _idInCru = 0, uint16_t _chan = 0);
138 void clear(
bool resetStat =
true,
bool resetTFRaw =
false);
140 template <
class Mapping>
148 LOGP(info,
"Caching new RDH block for {}",
describe());
149 const auto* rdh =
reinterpret_cast<const RDH*
>(
ptr);
154 long szd = RDHUtils::getMemorySize(*rdh);
155 long offs =
sizeof(
RDH);
156 char* ptrR = ((
char*)
ptr) +
sizeof(
RDH);
159 std::string com = fmt::format(
" | FeeID:{:#06x} offs: {:6} ",
feeID, offs);
162 }
else if (
w->isDataHeader()) {
163 com +=
"data header";
164 }
else if (
w->isDataTrailer()) {
165 com +=
"data trailer";
166 }
else if (
w->isTriggerWord()) {
169 }
else if (
w->isDiagnosticWord()) {
171 }
else if (
w->isCalibrationWord()) {
173 }
else if (
w->isCableDiagnostic()) {
174 com +=
"cable diag word";
175 }
else if (
w->isStatus()) {
176 com +=
"status word";
190 void printTrigger(
const GBTTrigger* gbtTrg,
int offs);
196 void printCalibrationWord(
const GBTCalibration* gbtCal,
int offs);
200 bool isAlignmentPadding()
210#ifndef _RAW_READER_ERROR_CHECKS_
211 bool checkErrorsRDH(
const RDH& rdh)
const
218 uint8_t checkErrorsTriggerWord(
const GBTTrigger* gbtTrg)
const {
return NoError; }
219 uint8_t checkErrorsHeaderWord(
const GBTDataHeader* gbtH)
const {
return NoError; }
220 uint8_t checkErrorsHeaderWord(
const GBTDataHeaderL* gbtH)
const {
return NoError; }
221 uint8_t checkErrorsActiveLanes(
int cables)
const {
return NoError; }
222 uint8_t checkErrorsGBTData(
int cablePos)
const {
return NoError; }
223 uint8_t checkErrorsTrailerWord(
const GBTDataTrailer* gbtT)
const {
return NoError; }
224 uint8_t checkErrorsPacketDoneMissing(
const GBTDataTrailer* gbtT,
bool notEnd)
const {
return NoError; }
226 uint8_t checkErrorsDiagnosticWord(
const GBTDiagnostic* gbtD)
const {
return NoError; }
227 uint8_t checkErrorsCalibrationWord(
const GBTCalibration* gbtCal)
const {
return NoError; }
228 uint8_t checkErrorsCableID(
const GBTData* gbtD, uint8_t cableSW)
const {
return NoError; }
232 uint8_t checkErrorsAlignmentPadding();
235 uint8_t checkErrorsRDHStopPageEmpty(
const RDH& rdh);
236 uint8_t checkErrorsTriggerWord(
const GBTTrigger* gbtTrg);
237 uint8_t checkErrorsHeaderWord(
const GBTDataHeader* gbtH);
238 uint8_t checkErrorsHeaderWord(
const GBTDataHeaderL* gbtH);
239 uint8_t checkErrorsActiveLanes(
int cables);
240 uint8_t checkErrorsGBTData(
int cablePos);
241 uint8_t checkErrorsTrailerWord(
const GBTDataTrailer* gbtT);
242 uint8_t checkErrorsPacketDoneMissing(
const GBTDataTrailer* gbtT,
bool notEnd);
243 uint8_t checkErrorsLanesStops();
244 uint8_t checkErrorsDiagnosticWord(
const GBTDiagnostic* gbtD);
245 uint8_t checkErrorsCalibrationWord(
const GBTCalibration* gbtCal);
246 uint8_t checkErrorsCableID(
const GBTData* gbtD, uint8_t cableSW);
247 uint8_t checkErrorsIRNotExtracted();
250 uint8_t checkErrorsGBTDataID(
const GBTData* dbtD);
258template <
class Mapping>
268 bool expectPacketDone =
false;
289 if (RDHUtils::getPageCounter(*rdh) == 0 ||
irHBF.
isDummy()) {
290 irHBF = RDHUtils::getHeartBeatIR(*rdh);
300 if (RDHUtils::getStop(*rdh)) {
323 bool cruPageAlignmentPaddingSeen =
false;
329 while (dataOffset < currRawPiece->
size) {
349 if (gbtC->isCalibrationWord()) {
354 LOGP(
debug,
"SetCalibData for RU:{} at bc:{}/orb:{} : [{}/{}]",
ruPtr->
ruSWID, gbtTrg ? gbtTrg->
bc : -1, gbtTrg ? gbtTrg->
orbit : -1, gbtC->calibCounter, gbtC->calibUserField);
377 if (cruPageAlignmentPaddingSeen) {
382 LOGP(info,
"Offs {} End of the CRU page reached while scanning triggers, continue to next page, {}",
dataOffset,
int(
status),
describe());
391 expectPacketDone =
true;
393 while (!gbtD->isDataTrailer() && !(cruPageAlignmentPaddingSeen = isAlignmentPadding())) {
394 if (verboseRawData) {
399 int cableHW = gbtD->getCableID(), cableSW = chmap.cableHW2SW(
ruPtr->
ruInfo->
ruType, cableHW);
412 if (cruPageAlignmentPaddingSeen) {
424 if ((cruPageAlignmentPaddingSeen = isAlignmentPadding())) {
428 if (!gbtT->packetDone) {
435 LOGP(info,
"Offs {} Leaving collectROFCableData for {} with DataSeen",
dataOffset,
describe());
441 if (expectPacketDone) {
Alpide Chip and GBT link decoding statistics.
#define GBTLINK_DECODE_ERRORCHECK(errRes, errEval)
Declaration of class for continuos buffer of ALPIDE data.
Declaration of class for scatter-gather buffer.
Definition Physics trigger record extracted from the ITS/MFT stream.
Declaration of the Readout Unite decoder class.
Checks validity of hardware address (HW) and transform it to digit AbsId index.
const SGPiece * currentPiece() const
const SGPiece * nextPiece()
size_t & currentPieceID()
void add(const DataType *ptr, size_t n)
read current character value from buffer w/o stepping forward
GLubyte GLubyte GLubyte GLubyte w
uint8_t itsSharedClusterMap uint8_t
constexpr int GBTPaddedWordLength
constexpr int GBTWordLength
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
uint16_t bc
bunch crossing ID of interaction
Statistics for per-link decoding.
std::array< uint32_t, GBTDataTrailer::MaxStateCombinations > packetStates
support for the GBT single link data
CollectedDataStatus status
bool needToPrintError(uint32_t count)
void cacheData(const void *ptr, size_t sz)
static constexpr int CRUPageAlignment
std::string describe() const
void accountLinkRecovery(o2::InteractionRecord ir)
const PayLoadSG::SGPiece * currRawPiece
GBTLinkDecodingStat statistics
CollectedDataStatus collectROFCableData(const Mapping &chmap)
CollectedDataStatus statusInTF
std::vector< PhysTrigger > * extTrigVec
o2::InteractionRecord irHBF
uint64_t continuation
13 No data expected (too close to previous trigger or error)
uint64_t noData
12 Used in Continuous Mode for internally generated trigger
uint64_t internal
0:11 12 lowest bits of trigger type received from CTP
uint64_t orbit
28:31 reserved
bool isTriggerWord() const
check if the GBT Header corresponds to GBT trigger word
void printX(bool padded=true, std::string com="") const
std::array< PayLoadCont, MaxCablesPerRU > cableData
std::array< uint8_t, MaxCablesPerRU > cableHWID
std::array< GBTLink *, MaxCablesPerRU > cableLinkPtr
std::array< uint8_t, MaxCablesPerRU > cableLinkID
static void printRDH(const RDHv4 &rdh)