1 #ifndef artdaq_core_Data_detail_RawFragmentHeader_hh
2 #define artdaq_core_Data_detail_RawFragmentHeader_hh
9 #include "artdaq-core/Data/dictionarycontrol.hh"
10 #include "cetlib/exception.h"
19 struct RawFragmentHeader;
24 typedef unsigned long long RawDataType;
27 typedef uint16_t version_t;
28 typedef uint64_t sequence_id_t;
29 typedef uint8_t type_t;
30 typedef uint16_t fragment_id_t;
31 typedef uint8_t metadata_word_count_t;
32 typedef uint32_t timestamp_t;
35 static constexpr type_t INVALID_TYPE = 0;
36 static constexpr type_t FIRST_USER_TYPE = 1;
37 static constexpr type_t LAST_USER_TYPE = 224;
38 static constexpr type_t FIRST_SYSTEM_TYPE = 225;
39 static constexpr type_t LAST_SYSTEM_TYPE = 255;
40 static constexpr type_t InvalidFragmentType = INVALID_TYPE;
41 static constexpr type_t EndOfDataFragmentType = FIRST_SYSTEM_TYPE;
42 static constexpr type_t DataFragmentType = FIRST_SYSTEM_TYPE + 1;
43 static constexpr type_t InitFragmentType = FIRST_SYSTEM_TYPE + 2;
44 static constexpr type_t EndOfRunFragmentType = FIRST_SYSTEM_TYPE + 3;
45 static constexpr type_t EndOfSubrunFragmentType = FIRST_SYSTEM_TYPE + 4;
46 static constexpr type_t ShutdownFragmentType = FIRST_SYSTEM_TYPE + 5;
47 static constexpr type_t EmptyFragmentType = FIRST_SYSTEM_TYPE + 6;
48 static constexpr type_t ContainerFragmentType = FIRST_SYSTEM_TYPE + 7;
51 static std::map<type_t, std::string> MakeSystemTypeMap()
53 return std::map<type_t, std::string> {
60 static std::map<type_t, std::string> MakeVerboseSystemTypeMap()
62 return std::map<type_t, std::string> {
67 { 229,
"EndOfSubrun" },
78 static const version_t InvalidVersion = 0xFFFF;
79 static const sequence_id_t InvalidSequenceID = 0xFFFFFFFFFFFF;
80 static const fragment_id_t InvalidFragmentID = 0xFFFF;
81 static const timestamp_t InvalidTimestamp = 0xFFFFFFFF;
83 RawDataType word_count : 32;
84 RawDataType version : 16;
86 RawDataType metadata_word_count : 8;
88 RawDataType sequence_id : 48;
89 RawDataType fragment_id : 16;
90 RawDataType timestamp : 32;
92 RawDataType unused1 : 16;
93 RawDataType unused2 : 16;
95 constexpr
static std::size_t num_words();
97 void setUserType(uint8_t utype);
98 void setSystemType(uint8_t stype);
108 artdaq::detail::RawFragmentHeader::num_words()
115 static_assert((artdaq::detail::RawFragmentHeader::num_words() *
116 sizeof(artdaq::detail::RawFragmentHeader::RawDataType)) ==
118 "sizeof(RawFragmentHeader) is not an integer "
119 "multiple of sizeof(RawDataType)!");
123 artdaq::detail::RawFragmentHeader::setUserType(uint8_t utype)
125 if (utype < FIRST_USER_TYPE || utype > LAST_USER_TYPE) {
126 throw cet::exception(
"InvalidValue")
127 <<
"RawFragmentHeader user types must be in the range of "
128 << ((int)FIRST_USER_TYPE) <<
" to " << ((int)LAST_USER_TYPE)
129 <<
" (bad type is " << ((int)utype) <<
").";
136 artdaq::detail::RawFragmentHeader::setSystemType(uint8_t stype)
138 if (stype < FIRST_SYSTEM_TYPE /*|| stype > LAST_SYSTEM_TYPE*/) {
139 throw cet::exception(
"InvalidValue")
140 <<
"RawFragmentHeader system types must be in the range of "
141 << ((int)FIRST_SYSTEM_TYPE) <<
" to " << ((int)LAST_SYSTEM_TYPE);