DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
FragmentHeader.hpp
Go to the documentation of this file.
1
9#ifndef DAQDATAFORMATS_INCLUDE_DAQDATAFORMATS_FRAGMENTHEADER_HPP_
10#define DAQDATAFORMATS_INCLUDE_DAQDATAFORMATS_FRAGMENTHEADER_HPP_
11
14
15#include <bitset>
16#include <cstddef>
17#include <cstdlib>
18#include <map>
19#include <numeric>
20#include <string>
21#include <vector>
22
24
29{
33 static constexpr uint32_t s_fragment_header_marker = 0x11112222; // NOLINT(build/unsigned)
34
38 static constexpr uint32_t s_fragment_header_version = 5; // NOLINT(build/unsigned)
39
43 static constexpr uint32_t s_default_error_bits = 0; // NOLINT(build/unsigned)
44
48 uint32_t fragment_header_marker = s_fragment_header_marker; // NOLINT(build/unsigned)
49
53 uint32_t version = s_fragment_header_version; // NOLINT(build/unsigned)
54
59
64
69
74
79
84
90 uint32_t error_bits{ s_default_error_bits }; // NOLINT(build/unsigned)
91
96
101
106 uint16_t detector_id;
107
112
113
114// uint32_t unused2{ // NOLINT(build/unsigned)
115// 0xFFFFFFFF
116// }; ///< Padding to ensure 64-bit alignment of FragmentHeader basic fields
117
118};
119
121 "This is intentionally designed to tell the developer to update the static_assert checks (including this "
122 "one) when the version is bumped");
123
124static_assert(sizeof(FragmentHeader) == 72, "FragmentHeader struct size different than expected!");
125static_assert(offsetof(FragmentHeader, fragment_header_marker) == 0,
126 "FragmentHeader fragment_header_marker field not at expected offset!");
127static_assert(offsetof(FragmentHeader, version) == 4, "FragmentHeader version field not at expected offset!");
128static_assert(offsetof(FragmentHeader, size) == 8, "FragmentHeader size field not at expected offset!");
129static_assert(offsetof(FragmentHeader, trigger_number) == 16,
130 "FragmentHeader trigger_number field not at expected offset!");
131static_assert(offsetof(FragmentHeader, trigger_timestamp) == 24,
132 "FragmentHeader trigger_timestamp field not at expected offset!");
133static_assert(offsetof(FragmentHeader, window_begin) == 32,
134 "FragmentHeader window_begin field not at expected offset!");
135static_assert(offsetof(FragmentHeader, window_end) == 40, "FragmentHeader window_end field not at expected offset!");
136static_assert(offsetof(FragmentHeader, run_number) == 48, "FragmentHeader run_number field not at expected offset!");
137static_assert(offsetof(FragmentHeader, error_bits) == 52, "FragmentHeader error_bits field not at expected offset!");
138static_assert(offsetof(FragmentHeader, fragment_type) == 56,
139 "FragmentHeader fragment_type field not at expected offset!");
140static_assert(offsetof(FragmentHeader, sequence_number) == 60,
141 "FragmentHeader sequence_number field not at expected offset!");
142static_assert(offsetof(FragmentHeader, detector_id) == 62, "FragmentHeader detector_id field not at expected offset!");
143static_assert(offsetof(FragmentHeader, element_id) == 64, "FragmentHeader element_id field not at expected offset!");
144
148enum class FragmentErrorBits : size_t
149{
150 kDataNotFound = 0,
151 kIncomplete = 1,
152 kInvalidWindow = 2,
153 kUnassigned3 = 3,
154 kUnassigned4 = 4,
155 kUnassigned5 = 5,
156 kUnassigned6 = 6,
157 kUnassigned7 = 7,
158 kUnassigned8 = 8,
159 kUnassigned9 = 9,
160 kUnassigned10 = 10,
161 kUnassigned11 = 11,
162 kUnassigned12 = 12,
163 kUnassigned13 = 13,
164 kUnassigned14 = 14,
165 kUnassigned15 = 15,
166 kUnassigned16 = 16,
167 kUnassigned17 = 17,
168 kUnassigned18 = 18,
169 kUnassigned19 = 19,
170 kUnassigned20 = 20,
171 kUnassigned21 = 21,
172 kUnassigned22 = 22,
173 kUnassigned23 = 23,
174 kUnassigned24 = 24,
175 kUnassigned25 = 25,
176 kUnassigned26 = 26,
177 kUnassigned27 = 27,
178 kUnassigned28 = 28,
179 kUnassigned29 = 29,
180 kUnassigned30 = 30,
181 kUnassigned31 = 31,
182 kInvalid = 32
183};
184
189{
190 kUnknown = 0,
191 kProtoWIB = 1,
192 kWIB = 2,
193 kDAPHNE = 3,
194 kTDE_AMC = 4,
195 // This fragment type is for the "raw" data from the firmware
196 // trigger primitive generation. We store this in fragments for the
197 // purposes of inspecting/debugging the firmware TPG
199 // This fragment type is for TPs saved via the trigger subsystem's
200 // TP buffer, which are in the format defined by
201 // dunedaq::trgdataformats::TriggerPrimitive. It is also
202 // used for the stream of TPs that are sent directly from the readout
203 // subsystem to the dataflow subsystem for storage on disk.
204 // TPs stored in this format may have been _originally_ produced
205 // by either software _or_ firmware.
209 kHardwareSignal = 9,
210 kPACMAN = 10,
211 kMPD = 11,
212 kWIBEth = 12,
213 kDAPHNEStream = 13,
214 kCRT = 14,
215 kTDEEth = 15,
216 kCRTBern = 16,
217 kCRTGrenoble = 17,
218};
219
225inline std::map<FragmentType, std::string>
227{
228 return {
229 { FragmentType::kUnknown, "Unknown" },
230 { FragmentType::kProtoWIB, "ProtoWIB" },
231 { FragmentType::kWIB, "WIB" },
232 { FragmentType::kDAPHNE, "DAPHNE" },
233 { FragmentType::kDAPHNEStream, "DAPHNEStream" },
234 { FragmentType::kTDE_AMC, "TDE_AMC" },
235 { FragmentType::kFW_TriggerPrimitive, "FW_Trigger_Primitive" },
236 { FragmentType::kTriggerPrimitive, "Trigger_Primitive" },
237 { FragmentType::kTriggerActivity, "Trigger_Activity" },
238 { FragmentType::kTriggerCandidate, "Trigger_Candidate" },
239 { FragmentType::kHardwareSignal, "Hardware_Signal" },
240 { FragmentType::kPACMAN, "PACMAN"},
241 { FragmentType::kMPD, "MPD"},
242 { FragmentType::kWIBEth, "WIBEth"},
243 { FragmentType::kCRT, "CRT"},
244 { FragmentType::kTDEEth, "TDEEth"},
245 };
246}
247
253inline std::string
255{
256 try {
257 return get_fragment_type_names().at(type);
258 }
259 catch(std::exception &e) {
260 }
261 return "Unknown";
262}
263
269inline FragmentType
270string_to_fragment_type(const std::string& name)
271{
272 for (auto& it : get_fragment_type_names()) {
273 if (it.second == name)
274 return it.first;
275 }
277}
278
285inline std::ostream&
286operator<<(std::ostream& o, FragmentHeader const& hdr)
287{
288 return o << "check_word: " << std::hex << hdr.fragment_header_marker << std::dec << ", "
289 << "version: " << hdr.version << ", "
290 << "size: " << hdr.size << ", "
291 << "trigger_number: " << hdr.trigger_number << ", "
292 << "run_number: " << hdr.run_number << ", "
293 << "trigger_timestamp: " << hdr.trigger_timestamp << ", "
294 << "window_begin: " << hdr.window_begin << ", "
295 << "window_end: " << hdr.window_end << ", "
296 << "error_bits: " << hdr.error_bits << ", "
297 << "fragment_type: " << hdr.fragment_type << ", "
298 << "sequence_number: " << hdr.sequence_number << ", "
299 << "detector_id: " << hdr.detector_id << ", "
300 << "element_id: " << hdr.element_id ;
301}
302
309inline std::istream&
310operator>>(std::istream& o, FragmentHeader& hdr)
311{
312 std::string tmp;
313 return o >> tmp >> std::hex >> hdr.fragment_header_marker >> std::dec >> tmp >> tmp >> hdr.version >> tmp >> tmp >>
314 hdr.size >> tmp >> tmp >> hdr.trigger_number >> tmp >> tmp >> hdr.run_number >> tmp >> tmp >>
315 hdr.trigger_timestamp >> tmp >> tmp >> hdr.window_begin >> tmp >> tmp >> hdr.window_end >> tmp >> tmp >>
316 hdr.error_bits >> tmp >> tmp >> hdr.fragment_type >> tmp >> tmp >>
317 hdr.sequence_number >> tmp >> tmp >> hdr.detector_id >> tmp >> tmp >> hdr.element_id;
318
319}
320} // namespace dunedaq::daqdataformats
321
322#endif // DAQDATAFORMATS_INCLUDE_DAQDATAFORMATS_FRAGMENTHEADER_HPP_
static constexpr sequence_number_t s_invalid_sequence_number
Definition Types.hpp:71
static constexpr trigger_number_t s_invalid_trigger_number
An invalid trigger number.
Definition Types.hpp:59
static constexpr fragment_type_t s_invalid_fragment_type
An invalid fragment type.
Definition Types.hpp:61
static constexpr fragment_size_t s_invalid_fragment_size
Invalid size for a Fragment (as FragmentHeader is counted as well)
Definition Types.hpp:63
static constexpr timestamp_t s_invalid_timestamp
An invalid timestamp.
Definition Types.hpp:65
static constexpr run_number_t s_invalid_run_number
An invalid run number.
Definition Types.hpp:57
uint32_t run_number_t
Type used to represent run number.
Definition Types.hpp:20
FragmentType
This enumeration should list all defined Fragment types.
@ kTriggerPrimitive
Trigger format TPs produced by trigger code.
@ kFW_TriggerPrimitive
FW TP frame format.
uint64_t trigger_number_t
Type used to represent trigger number.
Definition Types.hpp:24
FragmentType string_to_fragment_type(const std::string &name)
Convert a string to a FragmentType value.
uint16_t sequence_number_t
Type used to represent sequence within a trigger record.
Definition Types.hpp:45
std::string fragment_type_to_string(const FragmentType &type)
Convert a FragmentType enum value to string.
uint64_t timestamp_t
Type used to represent DUNE timing system timestamps.
Definition Types.hpp:36
uint32_t fragment_type_t
Type used to represent Fragment type ID.
Definition Types.hpp:28
uint64_t fragment_size_t
Type used to represent Fragment size.
Definition Types.hpp:32
FragmentErrorBits
This enumeration should list all defined error bits, as well as a short documentation of their meanin...
@ kUnassigned20
Error bit 20 is not assigned.
@ kUnassigned13
Error bit 13 is not assigned.
@ kUnassigned26
Error bit 26 is not assigned.
@ kUnassigned6
Error bit 6 is not assigned.
@ kUnassigned14
Error bit 14 is not assigned.
@ kUnassigned4
Error bit 4 is not assigned.
@ kUnassigned16
Error bit 16 is not assigned.
@ kUnassigned27
Error bit 27 is not assigned.
@ kUnassigned10
Error bit 10 is not assigned.
@ kIncomplete
Only part of the requested data is present in the fragment.
@ kUnassigned9
Error bit 9 is not assigned.
@ kUnassigned24
Error bit 24 is not assigned.
@ kUnassigned7
Error bit 7 is not assigned.
@ kUnassigned28
Error bit 28 is not assigned.
@ kUnassigned21
Error bit 21 is not assigned.
@ kUnassigned3
Error bit 3 is not assigned.
@ kInvalidWindow
The requested data window was too large.
@ kUnassigned31
Error bit 31 is not assigned.
@ kInvalid
Error bit 32 and higher are not valid (error_bits is only 32 bits)
@ kUnassigned18
Error bit 18 is not assigned.
@ kUnassigned25
Error bit 25 is not assigned.
@ kUnassigned19
Error bit 19 is not assigned.
@ kUnassigned5
Error bit 5 is not assigned.
@ kUnassigned29
Error bit 29 is not assigned.
@ kUnassigned23
Error bit 23 is not assigned.
@ kUnassigned11
Error bit 11 is not assigned.
@ kDataNotFound
The requested data was not found at all, so the fragment is empty.
@ kUnassigned15
Error bit 15 is not assigned.
@ kUnassigned17
Error bit 17 is not assigned.
@ kUnassigned22
Error bit 22 is not assigned.
@ kUnassigned12
Error bit 12 is not assigned.
@ kUnassigned30
Error bit 30 is not assigned.
@ kUnassigned8
Error bit 8 is not assigned.
std::ostream & operator<<(std::ostream &o, ComponentRequest const &cr)
Write out a ComponentRequest in human-readable form.
std::istream & operator>>(std::istream &is, ComponentRequest &cr)
Read a ComponentRequest from a string stream.
std::map< FragmentType, std::string > get_fragment_type_names()
This map relates FragmentType values to string names.
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
The header for a DUNE Fragment.
timestamp_t trigger_timestamp
Timestamp of the TriggerDecision.
fragment_type_t fragment_type
Type of the Fragment, indicating the format of the contained payload.
SourceID element_id
Component that generated the data in this Fragment.
uint16_t detector_id
Identifier for the subdetector that produced the raw data in the Fragment payload.
uint32_t error_bits
Error bits set by the Upstream DAQ.
uint32_t fragment_header_marker
Marker Bytes used to identify FragmentHeaders in a raw data stream.
uint32_t version
Version of the FragmentHeader.
run_number_t run_number
Run number this Fragment is associated with.
static constexpr uint32_t s_fragment_header_marker
Marker bytes to identify a FragmentHeader entry in a raw data stream.
sequence_number_t sequence_number
Sequence number of this Fragment within a trigger record.
static constexpr uint32_t s_fragment_header_version
The current version of the Fragment.
trigger_number_t trigger_number
Trigger Number this Fragment is associated with.
timestamp_t window_end
Window end of data in the Fragment.
timestamp_t window_begin
Window begin of data in the Fragment.
fragment_size_t size
Size of the Fragment (including header and payload)
static constexpr uint32_t s_default_error_bits
By default, all error bits are unset.
SourceID is a generalized representation of the source of a piece of data in the DAQ....
Definition SourceID.hpp:32