15#ifndef ALICEO2_RDHUTILS_H
16#define ALICEO2_RDHUTILS_H
23#if !defined(GPUCA_GPUCODE)
26#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
39#define NOTPTR(T) typename std::enable_if<!std::is_pointer<GPUgeneric() T>::value>::type* = 0
41#define TOREF(DST, SRC) *reinterpret_cast<DST*>(SRC)
43#define TOCREF(DST, SRC) *reinterpret_cast<const DST*>(SRC)
60#ifndef GPUCA_GPUCODE_DEVICE
61 RDHAny::sanityCheckStrict<H>();
62 if (std::is_same<H, RDHv7>::value) {
65 if (std::is_same<H, RDHv6>::value) {
68 if (std::is_same<H, RDHv5>::value) {
71 if (std::is_same<H, RDHv4>::value) {
90 rdh.word0 = (
v < 5 ? 0x0000ffff00004000 : 0x00000000ffff4000) +
v;
99 return rdh.headerSize;
101 GPUhdi() static
int getHeaderSize(const
RDHAny& rdh) {
return getHeaderSize(rdh.voidify()); }
105 GPUhdi() static uint16_t getBlockLength(const
RDHv4& rdh) {
return rdh.blockLength; }
106 GPUhdi() static uint16_t getBlockLength(const
RDHAny& rdh) {
return getBlockLength(rdh.voidify()); }
107 GPUhdi() static uint16_t getBlockLength(const
void* rdhP)
113 processError(
getVersion(rdhP),
"blockLength");
125 processError(
getVersion(rdhP),
"blockLength");
130 GPUhdi() static uint16_t getFEEID(const
RDHv4& rdh) {
return rdh.feeId; }
131 template <
typename H>
136 GPUhdi() static uint16_t getFEEID(const
RDHAny& rdh) {
return getFEEID(rdh.voidify()); }
137 GPUhdi() static uint16_t getFEEID(const
void* rdhP)
150 template <
typename H>
167 template <
typename H>
172 GPUhdi() static
bool getPriorityBit(const
RDHAny& rdh) {
return getPriorityBit(rdh.voidify()); }
173 GPUhdi() static
bool getPriorityBit(const
void* rdhP) {
return getPriorityBit(
TOCREF(
RDHDef, rdhP)); }
174 template <
typename H>
183 template <
typename H>
189 GPUhdi() static uint8_t getSourceID(const
RDHv7& rdh) {
return rdh.sourceID; }
190 GPUhdi() static uint8_t getSourceID(const
RDHv6& rdh) {
return rdh.sourceID; }
191 GPUhdi() static uint8_t getSourceID(const
RDHAny& rdh) {
return getSourceID(rdh.voidify()); }
192 GPUhdi() static uint8_t getSourceID(const
void* rdhP)
198 processError(
version,
"sourceID");
211 processError(
version,
"sourceID");
216 template <
typename H>
219 return rdh.offsetToNext;
221 GPUhdi() static uint16_t getOffsetToNext(const
RDHAny& rdh) {
return getOffsetToNext(rdh.voidify()); }
222 GPUhdi() static uint16_t getOffsetToNext(const
void* rdhP) {
return getOffsetToNext(
TOCREF(
RDHDef, rdhP)); }
223 template <
typename H>
226 rdh.offsetToNext =
v;
232 template <
typename H>
235 return rdh.memorySize;
237 GPUhdi() static uint16_t getMemorySize(const
RDHAny& rdh) {
return getMemorySize(rdh.voidify()); }
238 GPUhdi() static uint16_t getMemorySize(const
void* rdhP) {
return getMemorySize(
TOCREF(
RDHDef, rdhP)); }
239 template <
typename H>
248 template <
typename H>
253 GPUhdi() static uint8_t getLinkID(const
RDHAny& rdh) {
return getLinkID(rdh.voidify()); }
255 template <
typename H>
264 template <
typename H>
267 return rdh.packetCounter;
269 GPUhdi() static uint8_t getPacketCounter(const
RDHAny& rdh) {
return getPacketCounter(rdh.voidify()); }
270 GPUhdi() static uint8_t getPacketCounter(const
void* rdhP) {
return getPacketCounter(
TOCREF(
RDHDef, rdhP)); }
271 template <
typename H>
274 rdh.packetCounter =
v;
280 template <
typename H>
285 GPUhdi() static uint16_t getCRUID(const
RDHAny& rdh) {
return getCRUID(rdh.voidify()); }
287 template <
typename H>
296 template <
typename H>
299 return rdh.endPointID;
301 GPUhdi() static uint8_t getEndPointID(const
RDHAny& rdh) {
return getEndPointID(rdh.voidify()); }
302 GPUhdi() static uint8_t getEndPointID(const
void* rdhP) {
return getEndPointID(
TOCREF(
RDHDef, rdhP)); }
303 template <
typename H>
312 GPUhdi() static uint16_t getHeartBeatBC(const
RDHv4& rdh) {
return rdh.heartbeatBC; }
313 template <
typename H>
316 return rdh.bunchCrossing;
318 GPUhdi() static uint16_t getHeartBeatBC(const
RDHAny& rdh) {
return getHeartBeatBC(rdh.voidify()); }
319 GPUhdi() static uint16_t getHeartBeatBC(const
void* rdhP)
328 GPUhdi() static
void setHeartBeatBC(
RDHv4& rdh, uint16_t
v) { rdh.heartbeatBC =
v; }
329 template <
typename H>
332 rdh.bunchCrossing =
v;
334 GPUhdi() static
void setHeartBeatBC(
RDHAny& rdh, uint16_t
v) { setHeartBeatBC(rdh.voidify(),
v); }
335 GPUhdi() static
void setHeartBeatBC(
void* rdhP, uint16_t
v)
346 GPUhdi() static uint32_t getHeartBeatOrbit(const
RDHv4& rdh) {
return rdh.heartbeatOrbit; }
347 template <
typename H>
352 GPUhdi() static uint32_t getHeartBeatOrbit(const
RDHAny& rdh) {
return getHeartBeatOrbit(rdh.voidify()); }
353 GPUhdi() static uint32_t getHeartBeatOrbit(const
void* rdhP)
363 template <
typename H>
382 template <
typename H>
385 return {getHeartBeatBC(rdh), getHeartBeatOrbit(rdh)};
387 GPUhdi() static
IR getHeartBeatIR(const
RDHAny& rdh) {
return getHeartBeatIR(rdh.voidify()); }
388 GPUhdi() static
IR getHeartBeatIR(const
void* rdhP)
399 template <
typename H>
402 return {getTriggerBC(rdh), getTriggerOrbit(rdh)};
404 GPUhdi() static
IR getTriggerIR(const
RDHAny& rdh) {
return getTriggerIR(rdh.voidify()); }
417 GPUhdi() static uint16_t getTriggerBC(const
RDHv4& rdh) {
return rdh.triggerBC; }
418 template <
typename H>
421 return rdh.bunchCrossing;
423 GPUhdi() static uint16_t getTriggerBC(const
RDHAny& rdh) {
return getTriggerBC(rdh.voidify()); }
424 GPUhdi() static uint16_t getTriggerBC(const
void* rdhP)
434 template <
typename H>
437 rdh.bunchCrossing =
v;
451 GPUhdi() static uint32_t getTriggerOrbit(const
RDHv4& rdh) {
return rdh.triggerOrbit; }
452 template <
typename H>
457 GPUhdi() static uint32_t getTriggerOrbit(const
RDHAny& rdh) {
return getTriggerOrbit(rdh.voidify()); }
458 GPUhdi() static uint32_t getTriggerOrbit(const
void* rdhP)
468 template <
typename H>
485 template <
typename H>
490 GPUhdi() static uint8_t getDataFormat(const
RDHv7& rdh) {
return rdh.dataFormat; }
491 GPUhdi() static uint8_t getDataFormat(const
RDHAny& rdh) {
return getDataFormat(rdh.voidify()); }
501 processError(
version,
"dataFormat");
506 template <
typename H>
509 return rdh.triggerType;
511 GPUhdi() static uint32_t getTriggerType(const
RDHv5& rdh) {
return rdh.triggerType; }
512 GPUhdi() static uint32_t getTriggerType(const
RDHAny& rdh) {
return getTriggerType(rdh.voidify()); }
513 GPUhdi() static uint32_t getTriggerType(const
void* rdhP)
522 template <
typename H>
540 template <
typename H>
545 GPUhdi() static uint16_t getPageCounter(const
RDHv5& rdh) {
return rdh.pageCnt; }
546 GPUhdi() static uint16_t getPageCounter(const
RDHAny& rdh) {
return getPageCounter(rdh.voidify()); }
547 GPUhdi() static uint16_t getPageCounter(const
void* rdhP)
556 template <
typename H>
574 template <
typename H>
577 return rdh.detectorField;
579 GPUhdi() static uint32_t getDetectorField(const
RDHAny& rdh) {
return getDetectorField(rdh.voidify()); }
580 GPUhdi() static uint32_t getDetectorField(const
void* rdhP) {
return getDetectorField(
TOCREF(
RDHDef, rdhP)); }
581 template <
typename H>
584 rdh.detectorField =
v;
590 GPUhdi() static uint16_t getDetectorPAR(const
RDHv4& rdh) {
return rdh.par; }
591 template <
typename H>
594 return rdh.detectorPAR;
596 GPUhdi() static uint16_t getDetectorPAR(const
RDHAny& rdh) {
return getDetectorPAR(rdh.voidify()); }
597 GPUhdi() static uint16_t getDetectorPAR(const
void* rdhP)
607 template <
typename H>
624 template <
typename H>
633 GPUhdi() static uint8_t getStop(const
RDHAny& rdh) {
return getStop(rdh.voidify()); }
634 GPUhdi() static uint8_t getStop(const
void* rdhP)
643 template <
typename H>
665 static void printRDH(
const void* rdhP);
668 template <
typename H>
671 dumpRDH(
reinterpret_cast<const void*
>(&rdh));
673 static void dumpRDH(
const void* rdhP);
676 static bool checkRDH(
const RDHv4& rdh,
bool verbose =
true,
bool checkZeros =
false);
677 static bool checkRDH(
const RDHv5& rdh,
bool verbose =
true,
bool checkZeros =
false);
678 static bool checkRDH(
const RDHv6& rdh,
bool verbose =
true,
bool checkZeros =
false);
679 static bool checkRDH(
const RDHv7& rdh,
bool verbose =
true,
bool checkZeros =
false);
680 static bool checkRDH(
const RDHAny rdh,
bool verbose =
true,
bool checkZeros =
false) {
return checkRDH(rdh.voidify(), verbose, checkZeros); }
681 static bool checkRDH(
const void* rdhP,
bool verbose =
true,
bool checkZeros =
false);
684#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
698 uint16_t seq[3] = {cru, uint16_t((uint16_t(link) << 8) |
endpoint), feeId};
699 return fletcher32(seq, 3);
701 template <
typename H>
722 static uint32_t fletcher32(
const uint16_t*
data,
int len);
723#if defined(GPUCA_GPUCODE_DEVICE) || defined(GPUCA_STANDALONE)
724 template <
typename T>
725 GPUhdi() static
void processError(
int v, const T* field)
729 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