15#ifndef ALICEO2_RDHUTILS_H
16#define ALICEO2_RDHUTILS_H
22#ifndef GPUCA_GPUCODE_DEVICE
25#if !defined(GPUCA_GPUCODE)
28#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
41#define NOTPTR(T) typename std::enable_if<!std::is_pointer<GPUgeneric() T>::value>::type* = 0
43#define TOREF(DST, SRC) *reinterpret_cast<DST*>(SRC)
45#define TOCREF(DST, SRC) *reinterpret_cast<const DST*>(SRC)
62#ifndef GPUCA_GPUCODE_DEVICE
63 RDHAny::sanityCheckStrict<H>();
64 if (std::is_same<H, RDHv7>::value) {
67 if (std::is_same<H, RDHv6>::value) {
70 if (std::is_same<H, RDHv5>::value) {
73 if (std::is_same<H, RDHv4>::value) {
92 rdh.word0 = (
v < 5 ? 0x0000ffff00004000 : 0x00000000ffff4000) +
v;
101 return rdh.headerSize;
103 GPUhdi() static
int getHeaderSize(const
RDHAny& rdh) {
return getHeaderSize(rdh.voidify()); }
107 GPUhdi() static uint16_t getBlockLength(const
RDHv4& rdh) {
return rdh.blockLength; }
108 GPUhdi() static uint16_t getBlockLength(const
RDHAny& rdh) {
return getBlockLength(rdh.voidify()); }
109 GPUhdi() static uint16_t getBlockLength(const
void* rdhP)
115 processError(
getVersion(rdhP),
"blockLength");
127 processError(
getVersion(rdhP),
"blockLength");
132 GPUhdi() static uint16_t getFEEID(const
RDHv4& rdh) {
return rdh.feeId; }
133 template <
typename H>
138 GPUhdi() static uint16_t getFEEID(const
RDHAny& rdh) {
return getFEEID(rdh.voidify()); }
139 GPUhdi() static uint16_t getFEEID(const
void* rdhP)
152 template <
typename H>
169 template <
typename H>
174 GPUhdi() static
bool getPriorityBit(const
RDHAny& rdh) {
return getPriorityBit(rdh.voidify()); }
175 GPUhdi() static
bool getPriorityBit(const
void* rdhP) {
return getPriorityBit(
TOCREF(
RDHDef, rdhP)); }
176 template <
typename H>
185 template <
typename H>
191 GPUhdi() static uint8_t getSourceID(const
RDHv7& rdh) {
return rdh.sourceID; }
192 GPUhdi() static uint8_t getSourceID(const
RDHv6& rdh) {
return rdh.sourceID; }
193 GPUhdi() static uint8_t getSourceID(const
RDHAny& rdh) {
return getSourceID(rdh.voidify()); }
194 GPUhdi() static uint8_t getSourceID(const
void* rdhP)
200 processError(
version,
"sourceID");
213 processError(
version,
"sourceID");
218 template <
typename H>
221 return rdh.offsetToNext;
223 GPUhdi() static uint16_t getOffsetToNext(const
RDHAny& rdh) {
return getOffsetToNext(rdh.voidify()); }
224 GPUhdi() static uint16_t getOffsetToNext(const
void* rdhP) {
return getOffsetToNext(
TOCREF(
RDHDef, rdhP)); }
225 template <
typename H>
228 rdh.offsetToNext =
v;
234 template <
typename H>
237 return rdh.memorySize;
239 GPUhdi() static uint16_t getMemorySize(const
RDHAny& rdh) {
return getMemorySize(rdh.voidify()); }
240 GPUhdi() static uint16_t getMemorySize(const
void* rdhP) {
return getMemorySize(
TOCREF(
RDHDef, rdhP)); }
241 template <
typename H>
250 template <
typename H>
255 GPUhdi() static uint8_t getLinkID(const
RDHAny& rdh) {
return getLinkID(rdh.voidify()); }
257 template <
typename H>
266 template <
typename H>
269 return rdh.packetCounter;
271 GPUhdi() static uint8_t getPacketCounter(const
RDHAny& rdh) {
return getPacketCounter(rdh.voidify()); }
272 GPUhdi() static uint8_t getPacketCounter(const
void* rdhP) {
return getPacketCounter(
TOCREF(
RDHDef, rdhP)); }
273 template <
typename H>
276 rdh.packetCounter =
v;
282 template <
typename H>
287 GPUhdi() static uint16_t getCRUID(const
RDHAny& rdh) {
return getCRUID(rdh.voidify()); }
289 template <
typename H>
298 template <
typename H>
301 return rdh.endPointID;
303 GPUhdi() static uint8_t getEndPointID(const
RDHAny& rdh) {
return getEndPointID(rdh.voidify()); }
304 GPUhdi() static uint8_t getEndPointID(const
void* rdhP) {
return getEndPointID(
TOCREF(
RDHDef, rdhP)); }
305 template <
typename H>
314 GPUhdi() static uint16_t getHeartBeatBC(const
RDHv4& rdh) {
return rdh.heartbeatBC; }
315 template <
typename H>
318 return rdh.bunchCrossing;
320 GPUhdi() static uint16_t getHeartBeatBC(const
RDHAny& rdh) {
return getHeartBeatBC(rdh.voidify()); }
321 GPUhdi() static uint16_t getHeartBeatBC(const
void* rdhP)
330 GPUhdi() static
void setHeartBeatBC(
RDHv4& rdh, uint16_t
v) { rdh.heartbeatBC =
v; }
331 template <
typename H>
334 rdh.bunchCrossing =
v;
336 GPUhdi() static
void setHeartBeatBC(
RDHAny& rdh, uint16_t
v) { setHeartBeatBC(rdh.voidify(),
v); }
337 GPUhdi() static
void setHeartBeatBC(
void* rdhP, uint16_t
v)
348 GPUhdi() static uint32_t getHeartBeatOrbit(const
RDHv4& rdh) {
return rdh.heartbeatOrbit; }
349 template <
typename H>
354 GPUhdi() static uint32_t getHeartBeatOrbit(const
RDHAny& rdh) {
return getHeartBeatOrbit(rdh.voidify()); }
355 GPUhdi() static uint32_t getHeartBeatOrbit(const
void* rdhP)
365 template <
typename H>
384 template <
typename H>
387 return {getHeartBeatBC(rdh), getHeartBeatOrbit(rdh)};
389 GPUhdi() static
IR getHeartBeatIR(const
RDHAny& rdh) {
return getHeartBeatIR(rdh.voidify()); }
390 GPUhdi() static
IR getHeartBeatIR(const
void* rdhP)
401 template <
typename H>
404 return {getTriggerBC(rdh), getTriggerOrbit(rdh)};
406 GPUhdi() static
IR getTriggerIR(const
RDHAny& rdh) {
return getTriggerIR(rdh.voidify()); }
419 GPUhdi() static uint16_t getTriggerBC(const
RDHv4& rdh) {
return rdh.triggerBC; }
420 template <
typename H>
423 return rdh.bunchCrossing;
425 GPUhdi() static uint16_t getTriggerBC(const
RDHAny& rdh) {
return getTriggerBC(rdh.voidify()); }
426 GPUhdi() static uint16_t getTriggerBC(const
void* rdhP)
436 template <
typename H>
439 rdh.bunchCrossing =
v;
453 GPUhdi() static uint32_t getTriggerOrbit(const
RDHv4& rdh) {
return rdh.triggerOrbit; }
454 template <
typename H>
459 GPUhdi() static uint32_t getTriggerOrbit(const
RDHAny& rdh) {
return getTriggerOrbit(rdh.voidify()); }
460 GPUhdi() static uint32_t getTriggerOrbit(const
void* rdhP)
470 template <
typename H>
487 template <
typename H>
492 GPUhdi() static uint8_t getDataFormat(const
RDHv7& rdh) {
return rdh.dataFormat; }
493 GPUhdi() static uint8_t getDataFormat(const
RDHAny& rdh) {
return getDataFormat(rdh.voidify()); }
503 processError(
version,
"dataFormat");
508 template <
typename H>
511 return rdh.triggerType;
513 GPUhdi() static uint32_t getTriggerType(const
RDHv5& rdh) {
return rdh.triggerType; }
514 GPUhdi() static uint32_t getTriggerType(const
RDHAny& rdh) {
return getTriggerType(rdh.voidify()); }
515 GPUhdi() static uint32_t getTriggerType(const
void* rdhP)
524 template <
typename H>
542 template <
typename H>
547 GPUhdi() static uint16_t getPageCounter(const
RDHv5& rdh) {
return rdh.pageCnt; }
548 GPUhdi() static uint16_t getPageCounter(const
RDHAny& rdh) {
return getPageCounter(rdh.voidify()); }
549 GPUhdi() static uint16_t getPageCounter(const
void* rdhP)
558 template <
typename H>
576 template <
typename H>
579 return rdh.detectorField;
581 GPUhdi() static uint32_t getDetectorField(const
RDHAny& rdh) {
return getDetectorField(rdh.voidify()); }
582 GPUhdi() static uint32_t getDetectorField(const
void* rdhP) {
return getDetectorField(
TOCREF(
RDHDef, rdhP)); }
583 template <
typename H>
586 rdh.detectorField =
v;
592 GPUhdi() static uint16_t getDetectorPAR(const
RDHv4& rdh) {
return rdh.par; }
593 template <
typename H>
596 return rdh.detectorPAR;
598 GPUhdi() static uint16_t getDetectorPAR(const
RDHAny& rdh) {
return getDetectorPAR(rdh.voidify()); }
599 GPUhdi() static uint16_t getDetectorPAR(const
void* rdhP)
609 template <
typename H>
626 template <
typename H>
635 GPUhdi() static uint8_t getStop(const
RDHAny& rdh) {
return getStop(rdh.voidify()); }
636 GPUhdi() static uint8_t getStop(const
void* rdhP)
645 template <
typename H>
667 static void printRDH(
const void* rdhP);
670 template <
typename H>
673 dumpRDH(
reinterpret_cast<const void*
>(&rdh));
675 static void dumpRDH(
const void* rdhP);
678 static bool checkRDH(
const RDHv4& rdh,
bool verbose =
true,
bool checkZeros =
false);
679 static bool checkRDH(
const RDHv5& rdh,
bool verbose =
true,
bool checkZeros =
false);
680 static bool checkRDH(
const RDHv6& rdh,
bool verbose =
true,
bool checkZeros =
false);
681 static bool checkRDH(
const RDHv7& rdh,
bool verbose =
true,
bool checkZeros =
false);
682 static bool checkRDH(
const RDHAny rdh,
bool verbose =
true,
bool checkZeros =
false) {
return checkRDH(rdh.voidify(), verbose, checkZeros); }
683 static bool checkRDH(
const void* rdhP,
bool verbose =
true,
bool checkZeros =
false);
686#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
700 uint16_t seq[3] = {cru, uint16_t((uint16_t(link) << 8) |
endpoint), feeId};
701 return fletcher32(seq, 3);
703 template <
typename H>
724 static uint32_t fletcher32(
const uint16_t*
data,
int len);
725#if defined(GPUCA_GPUCODE_DEVICE) || defined(GPUCA_STANDALONE)
726 template <
typename T>
727 GPUhdi() static
void processError(
int v, const T* field)
731 GPUhdni() static
void processError(
int v, const
char* field);
GLenum GLenum GLsizei len
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
GPUhdi() static uint16_t getMemorySize(const void *rdhP)
GPUhdi() static int getHeaderSize(const void *rdhP)
static void setSourceID(void *rdhP, uint8_t s)
GPUhdi() static uint16_t getPageCounter(const RDHv5 &rdh)
GPUhdi() static uint16_t getTriggerBC(const H &rdh
GPUhdi() static uint16_t getHeartBeatBC(const void *rdhP)
static void setEndPointID(RDHAny &rdh, uint8_t v)
GPUhdi() static uint32_t getHeartBeatOrbit(const void *rdhP)
GPUhdi() static uint16_t getTriggerBC(const RDHv4 &rdh)
static void setHeartBeatOrbit(RDHAny &rdh, uint32_t v)
GPUhdi() static uint8_t getSourceID(const void *rdhP)
GPUhdi() static uint16_t getOffsetToNext(const RDHAny &rdh)
static void setEndPointID(void *rdhP, uint8_t v)
GPUhdi() static LinkSubSpec_t getSubSpec(const RDHAny &rdh)
GPUhdi() static uint32_t getDetectorField(const void *rdhP)
GPUhdi() static uint16_t getPageCounter(const RDHAny &rdh)
GPUhdi() static uint32_t getHeartBeatOrbit(const RDHv4 &rdh)
static void setTriggerBC(void *rdhP, uint16_t v)
GPUhdi() static uint8_t getSourceID(const RDHv6 &rdh)
static void setTriggerType(RDHAny &rdh, uint32_t v)
GPUhdi() static uint32_t getTriggerType(const RDHAny &rdh)
GPUhdi() static uint8_t getSourceID(const RDHAny &rdh)
GPUhdi() static LinkSubSpec_t getSubSpec(const void *rdhP)
GPUhdi() static LinkSubSpec_t getSubSpec(const RDHv6 &rdh)
GPUhdi() static uint16_t getPageCounter(const void *rdhP)
static void setPacketCounter(void *rdhP, uint8_t v)
static void setDetectorPAR(RDHAny &rdh, uint16_t v)
GPUhdi() static uint32_t getTriggerType(const H &rdh
static void setTriggerOrbit(void *rdhP, uint32_t v)
GPUhdi() static uint8_t getVersion(const RDHAny &rdh)
GPUhdi() static uint8_t getSourceID(const RDHv7 &rdh)
GPUhdi() static IR getHeartBeatIR(const RDHAny &rdh)
GPUhdi() static uint32_t getHeartBeatOrbit(const RDHAny &rdh)
GPUhdi() static uint32_t getTriggerType(const void *rdhP)
GPUhdi() static uint8_t getEndPointID(const H &rdh
GPUhdi() static uint16_t getDetectorPAR(const H &rdh
static bool checkRDH(const RDHAny rdh, bool verbose=true, bool checkZeros=false)
static void setMemorySize(RDHAny &rdh, uint16_t v)
GPUhdi() static uint8_t getEndPointID(const RDHAny &rdh)
GPUhdi() static uint32_t getTriggerType(const RDHv5 &rdh)
static void setSourceID(RDHv6 &rdh, uint8_t s)
GPUhdi() static IR getTriggerIR(const H &rdh
static void setTriggerOrbit(RDHAny &rdh, uint32_t v)
GPUhdi() static uint16_t getDetectorPAR(const RDHAny &rdh)
static void setVersion(RDHAny &rdh, uint8_t v)
GPUhdi() static uint8_t getEndPointID(const void *rdhP)
static constexpr int MAXCRUPage
GPUhdi() static uint16_t getCRUID(const void *rdhP)
GPUhdi() static uint16_t getTriggerBC(const void *rdhP)
GPUhdi() static uint16_t getDetectorPAR(const RDHv4 &rdh)
static void setLinkID(void *rdhP, uint8_t v)
GPUhdi() static uint8_t getDataFormat(const RDHAny &rdh)
GPUhdi() static uint32_t getTriggerOrbit(const void *rdhP)
GPUhdi() static uint16_t getFEEID(const RDHAny &rdh)
GPUhdi() static uint8_t getPacketCounter(const H &rdh
GPUhdi() static uint8_t getLinkID(const void *rdhP)
static void setBlockLength(void *rdhP, uint16_t s)
static LinkSubSpec_t getSubSpec(uint16_t cru, uint8_t link, uint8_t endpoint, uint16_t feeId, o2::header::DAQID::ID srcid=o2::header::DAQID::INVALID)
GPUhdi() static uint16_t getBlockLength(const RDHAny &rdh)
static void setDetectorField(RDHAny &rdh, uint32_t v)
static void setPacketCounter(RDHAny &rdh, uint8_t v)
static void setTriggerOrbit(H &rdh, uint32_t v, NOTPTR(H))
static void setLinkID(H &rdh, uint8_t v, NOTPTR(H))
static void setMemorySize(void *rdhP, uint16_t v)
o2::header::RAWDataHeaderV5 RDHv5
GPUhdi() static uint8_t getLinkID(const H &rdh
GPUhdi() static uint8_t getLinkID(const RDHAny &rdh)
static void setDataFormat(RDHAny &rdh, uint8_t s)
static void setSourceID(RDHAny &rdh, uint8_t s)
GPUhdi() static uint16_t getFEEID(const RDHv4 &rdh)
static void setFEEID(RDHAny &rdh, uint16_t v)
GPUhdi() static void setHeartBeatBC(RDHAny &rdh
static void setBlockLength(RDHAny &rdh, uint16_t s)
static void setStop(void *rdhP, uint8_t v)
static void setFEEID(void *rdhP, uint16_t v)
GPUhdi() static uint8_t getVersion(const void *rdhP)
static void setVersion(void *rdhP, uint8_t v)
GPUhdi() static uint16_t getDetectorPAR(const void *rdhP)
GPUhdi() static uint16_t getFEEID(const void *rdhP)
static void setDataFormat(RDHv7 &rdh, uint8_t s)
GPUhdi() static IR getTriggerIR(const RDHAny &rdh)
GPUhdi() static int getHeaderSize(const RDHAny &rdh)
GPUhdi() static uint16_t getOffsetToNext(const H &rdh
static void setOffsetToNext(RDHAny &rdh, uint16_t v)
GPUhdi() static uint8_t getStop(const H &rdh
o2::header::RAWDataHeaderV7 RDHv7
GPUhdi() static uint16_t getHeartBeatBC(const RDHAny &rdh)
static void setTriggerType(RDHv5 &rdh, uint32_t v)
GPUhdi() static uint16_t getHeartBeatBC(const RDHv4 &rdh)
GPUhdi() static uint8_t getDataFormat(const void *rdhP)
GPUhdi() static IR getHeartBeatIR(const void *rdhP)
GPUhdi() static LinkSubSpec_t getSubSpec(const RDHv7 &rdh)
static void setDetectorField(H &rdh, uint32_t v, NOTPTR(H))
GPUhdi() static uint32_t getTriggerOrbit(const RDHAny &rdh)
GPUhdi() static bool getPriorityBit(const H &rdh
static void setTriggerType(H &rdh, uint32_t v, NOTPTR(H))
GPUhdi() static uint32_t getHeartBeatOrbit(const H &rdh
static constexpr int GBTWord128
GPUhdi() static uint8_t getStop(const void *rdhP)
static void setPageCounter(H &rdh, uint16_t v, NOTPTR(H))
GPUhdi() static uint16_t getBlockLength(const RDHv4 &rdh)
static void setDataFormat(void *rdhP, uint8_t s)
GPUhdi() static uint32_t getTriggerOrbit(const H &rdh
GPUhdi() static uint32_t getDetectorField(const H &rdh
static void setPriorityBit(void *rdhP, bool v)
GPUhdi() static uint8_t getVersion(const H &rdh
GPUhdi() static uint8_t getSourceID(const H &rdh
static void setPriorityBit(H &rdh, bool v, NOTPTR(H))
static void setDetectorPAR(H &rdh, uint16_t v, NOTPTR(H))
GPUhdi() static void setHeartBeatBC(void *rdhP
static void setMemorySize(H &rdh, uint16_t v, NOTPTR(H))
static void setDetectorPAR(RDHv4 &rdh, uint16_t v)
static void setTriggerBC(RDHAny &rdh, uint16_t v)
GPUhdi() static bool getPriorityBit(const void *rdhP)
GPUhdi() static uint16_t getFEEID(const H &rdh
static void setTriggerType(void *rdhP, uint32_t v)
GPUhdi() static uint8_t getPacketCounter(const RDHAny &rdh)
static void setPriorityBit(RDHAny &rdh, bool v)
static void setPageCounter(RDHv5 &rdh, uint16_t v)
GPUhdi() static uint8_t getDataFormat(const RDHv7 &rdh)
static void printRDH(const RDHv4 &rdh)
static bool checkRDH(const RDHv4 &rdh, bool verbose=true, bool checkZeros=false)
static void setDetectorField(void *rdhP, uint32_t v)
GPUhdi() static uint16_t getMemorySize(const RDHAny &rdh)
static void setPageCounter(RDHAny &rdh, uint16_t v)
GPUhdi() static uint16_t getTriggerBC(const RDHAny &rdh)
GPUhdi() static void setHeartBeatBC(H &rdh
static void setVersion(H &rdh, uint8_t v, NOTPTR(H))
static void setDetectorPAR(void *rdhP, uint16_t v)
GPUhdi() static uint16_t getHeartBeatBC(const H &rdh
static LinkSubSpec_t getSubSpec(const H &rdh, NOTPTR(H))
static void setPacketCounter(H &rdh, uint8_t v, NOTPTR(H))
static void setSourceID(RDHv7 &rdh, uint8_t s)
static void setTriggerBC(RDHv4 &rdh, uint16_t v)
static void setHeartBeatOrbit(H &rdh, uint32_t v, NOTPTR(H))
o2::header::RAWDataHeaderV6 RDHv6
static void setHeartBeatOrbit(void *rdhP, uint32_t v)
static void setEndPointID(H &rdh, uint8_t v, NOTPTR(H))
GPUhdi() static int getHeaderSize(const H &rdh
static void printRDH(const RDHAny &rdh)
GPUhdi() static uint16_t getOffsetToNext(const void *rdhP)
static void setStop(RDHAny &rdh, uint8_t v)
GPUhdi() static bool getPriorityBit(const RDHAny &rdh)
static void setBlockLength(RDHv4 &rdh, uint16_t s)
static void setOffsetToNext(void *rdhP, uint16_t v)
GPUhdi() static uint8_t getPacketCounter(const void *rdhP)
static void setTriggerOrbit(RDHv4 &rdh, uint32_t v)
GPUhdi() static void setHeartBeatBC(RDHv4 &rdh
static void setHeartBeatOrbit(RDHv4 &rdh, uint32_t v)
GPUhdi() static uint8_t getStop(const RDHAny &rdh)
static void setFEEID(RDHv4 &rdh, uint16_t v)
static void setTriggerBC(H &rdh, uint16_t v, NOTPTR(H))
GPUhdi() static uint32_t getTriggerOrbit(const RDHv4 &rdh)
static void setLinkID(RDHAny &rdh, uint8_t v)
GPUhdi() static uint16_t getPageCounter(const H &rdh
static void setOffsetToNext(H &rdh, uint16_t v, NOTPTR(H))
GPUhdi() static uint16_t getBlockLength(const void *rdhP)
static void setStop(H &rdh, uint8_t v, NOTPTR(H))
static void setPageCounter(void *rdhP, uint16_t v)
static void dumpRDH(const H &rdh, NOTPTR(H))
static constexpr int getVersion()
get numeric version of the RDH
GPUhdi() static uint16_t getMemorySize(const H &rdh
static void setCRUID(void *rdhP, uint16_t v)
GPUhdi() static uint32_t getDetectorField(const RDHAny &rdh)
GPUhdi() static uint8_t getStop(const RDHv5 &rdh)
static void setCRUID(RDHAny &rdh, uint16_t v)
GPUhdi() static IR getHeartBeatIR(const H &rdh
GPUhdi() static IR getTriggerIR(const void *rdhP)
GPUhdi() static uint16_t getCRUID(const RDHAny &rdh)
static void setCRUID(H &rdh, uint16_t v, NOTPTR(H))
static void setFEEID(H &rdh, uint16_t v, NOTPTR(H))
GPUhdi() static uint8_t getDataFormat(const H &rdh
GPUhdi() static uint16_t getCRUID(const H &rdh