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"
18 struct RawFragmentHeader;
23 typedef unsigned long long RawDataType;
26 typedef uint16_t version_t;
27 typedef uint64_t sequence_id_t;
28 typedef uint8_t type_t;
29 typedef uint16_t fragment_id_t;
30 typedef uint8_t metadata_word_count_t;
31 typedef uint32_t timestamp_t;
34 static constexpr type_t INVALID_TYPE = 0;
35 static constexpr type_t FIRST_USER_TYPE = 1;
36 static constexpr type_t LAST_USER_TYPE = 224;
37 static constexpr type_t FIRST_SYSTEM_TYPE = 225;
38 static constexpr type_t LAST_SYSTEM_TYPE = 255;
39 static constexpr type_t InvalidFragmentType = INVALID_TYPE;
40 static constexpr type_t EndOfDataFragmentType = FIRST_SYSTEM_TYPE;
41 static constexpr type_t DataFragmentType = FIRST_SYSTEM_TYPE+1;
42 static constexpr type_t InitFragmentType = FIRST_SYSTEM_TYPE+2;
43 static constexpr type_t EndOfRunFragmentType = FIRST_SYSTEM_TYPE+3;
44 static constexpr type_t EndOfSubrunFragmentType = FIRST_SYSTEM_TYPE+4;
45 static constexpr type_t ShutdownFragmentType = FIRST_SYSTEM_TYPE+5;
46 static constexpr type_t EmptyFragmentType = FIRST_SYSTEM_TYPE+6;
47 static constexpr type_t ContainerFragmentType = FIRST_SYSTEM_TYPE+7;
50 static std::map<type_t, std::string> MakeSystemTypeMap()
52 return std::map<type_t, std::string> {
59 static std::map<type_t, std::string> MakeVerboseSystemTypeMap()
61 return std::map<type_t, std::string> {
66 { 229,
"EndOfSubrun" },
77 static const version_t InvalidVersion = 0xFFFF;
78 static const sequence_id_t InvalidSequenceID = 0xFFFFFFFFFFFF;
79 static const fragment_id_t InvalidFragmentID = 0xFFFF;
80 static const timestamp_t InvalidTimestamp = 0xFFFFFFFF;
82 RawDataType word_count : 32;
83 RawDataType version : 16;
85 RawDataType metadata_word_count : 8;
87 RawDataType sequence_id : 48;
88 RawDataType fragment_id : 16;
89 RawDataType timestamp : 32;
91 RawDataType unused1 : 16;
92 RawDataType unused2 : 16;
94 constexpr
static std::size_t num_words();
96 void setUserType(uint8_t utype);
97 void setSystemType(uint8_t stype);
107 artdaq::detail::RawFragmentHeader::num_words()
114 static_assert((artdaq::detail::RawFragmentHeader::num_words() *
115 sizeof(artdaq::detail::RawFragmentHeader::RawDataType)) ==
117 "sizeof(RawFragmentHeader) is not an integer "
118 "multiple of sizeof(RawDataType)!");
122 artdaq::detail::RawFragmentHeader::setUserType(uint8_t utype)
124 if (utype < FIRST_USER_TYPE || utype > LAST_USER_TYPE) {
125 throw cet::exception(
"InvalidValue")
126 <<
"RawFragmentHeader user types must be in the range of "
127 << ((int)FIRST_USER_TYPE) <<
" to " << ((int)LAST_USER_TYPE)
128 <<
" (bad type is " << ((int)utype) <<
").";
135 artdaq::detail::RawFragmentHeader::setSystemType(uint8_t stype)
137 if (stype < FIRST_SYSTEM_TYPE /*|| stype > LAST_SYSTEM_TYPE*/) {
138 throw cet::exception(
"InvalidValue")
139 <<
"RawFragmentHeader system types must be in the range of "
140 << ((int)FIRST_SYSTEM_TYPE) <<
" to " << ((int)LAST_SYSTEM_TYPE);