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 = 6; // NOLINT(build/unsigned)
39
43 static constexpr uint32_t s_default_status_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
88 uint32_t status_bits{ s_default_status_bits }; // NOLINT(build/unsigned)
89
94
99
104 uint16_t detector_id; // NOLINT(build/unsigned)
105
110
111 // uint32_t unused2{ // NOLINT(build/unsigned)
112 // 0xFFFFFFFF
113 // }; ///< Padding to ensure 64-bit alignment of FragmentHeader basic fields
114};
115
117 "This is intentionally designed to tell the developer to update the static_assert checks (including this "
118 "one) when the version is bumped");
119
120static_assert(sizeof(FragmentHeader) == 72, "FragmentHeader struct size different than expected!");
121static_assert(offsetof(FragmentHeader, fragment_header_marker) == 0,
122 "FragmentHeader fragment_header_marker field not at expected offset!");
123static_assert(offsetof(FragmentHeader, version) == 4, "FragmentHeader version field not at expected offset!");
124static_assert(offsetof(FragmentHeader, size) == 8, "FragmentHeader size field not at expected offset!");
125static_assert(offsetof(FragmentHeader, trigger_number) == 16,
126 "FragmentHeader trigger_number field not at expected offset!");
127static_assert(offsetof(FragmentHeader, trigger_timestamp) == 24,
128 "FragmentHeader trigger_timestamp field not at expected offset!");
129static_assert(offsetof(FragmentHeader, window_begin) == 32,
130 "FragmentHeader window_begin field not at expected offset!");
131static_assert(offsetof(FragmentHeader, window_end) == 40, "FragmentHeader window_end field not at expected offset!");
132static_assert(offsetof(FragmentHeader, run_number) == 48, "FragmentHeader run_number field not at expected offset!");
133static_assert(offsetof(FragmentHeader, status_bits) == 52, "FragmentHeader status_bits field not at expected offset!");
134static_assert(offsetof(FragmentHeader, fragment_type) == 56,
135 "FragmentHeader fragment_type field not at expected offset!");
136static_assert(offsetof(FragmentHeader, sequence_number) == 60,
137 "FragmentHeader sequence_number field not at expected offset!");
138static_assert(offsetof(FragmentHeader, detector_id) == 62, "FragmentHeader detector_id field not at expected offset!");
139static_assert(offsetof(FragmentHeader, element_id) == 64, "FragmentHeader element_id field not at expected offset!");
140
144enum class FragmentStatusBits : size_t
145{
147 kIncomplete = 1,
149 kRequestTimeout = 3,
152 kEmptyFragment = 6,
153 kUnassigned7 = 7,
154 kUnassigned8 = 8,
155 kUnassigned9 = 9,
156 kUnassigned10 = 10,
157 kUnassigned11 = 11,
158 kUnassigned12 = 12,
159 kUnassigned13 = 13,
160 kUnassigned14 = 14,
161 kUnassigned15 = 15,
162 kUnassigned16 = 16,
163 kUnassigned17 = 17,
164 kUnassigned18 = 18,
165 kUnassigned19 = 19,
166 kUnassigned20 = 20,
167 kUnassigned21 = 21,
168 kUnassigned22 = 22,
169 kUnassigned23 = 23,
170 kUnassigned24 = 24,
171 kUnassigned25 = 25,
172 kUnassigned26 = 26,
173 kUnassigned27 = 27,
174 kUnassigned28 = 28,
175 kUnassigned29 = 29,
176 kUnassigned30 = 30,
177 kUnassigned31 = 31,
178 kInvalid = 32
179};
180
185{
186 kUnknown = 0,
187 kProtoWIB = 1,
188 kWIB = 2,
189 kDAPHNE = 3,
190 kTDE_AMC = 4,
191 // This fragment type is for the "raw" data from the firmware
192 // trigger primitive generation. We store this in fragments for the
193 // purposes of inspecting/debugging the firmware TPG
195 // This fragment type is for TPs saved via the trigger subsystem's
196 // TP buffer, which are in the format defined by
197 // dunedaq::trgdataformats::TriggerPrimitive. It is also
198 // used for the stream of TPs that are sent directly from the readout
199 // subsystem to the dataflow subsystem for storage on disk.
200 // TPs stored in this format may have been _originally_ produced
201 // by either software _or_ firmware.
205 kHardwareSignal = 9,
206 kPACMAN = 10,
207 kMPD = 11,
208 kWIBEth = 12,
209 kDAPHNEStream = 13,
210 kCRT = 14,
211 kTDEEth = 15,
212 kCRTBern = 16,
213 kCRTGrenoble = 17,
214 kDAPHNEEth = 18,
216};
217
223inline std::map<FragmentType, std::string>
225{
226 return {
227 { FragmentType::kUnknown, "Unknown" },
228 { FragmentType::kProtoWIB, "ProtoWIB" },
229 { FragmentType::kWIB, "WIB" },
230 { FragmentType::kDAPHNE, "DAPHNE" },
231 { FragmentType::kDAPHNEStream, "DAPHNEStream" },
232 { FragmentType::kTDE_AMC, "TDE_AMC" },
233 { FragmentType::kFW_TriggerPrimitive, "FW_Trigger_Primitive" },
234 { FragmentType::kTriggerPrimitive, "Trigger_Primitive" },
235 { FragmentType::kTriggerActivity, "Trigger_Activity" },
236 { FragmentType::kTriggerCandidate, "Trigger_Candidate" },
237 { FragmentType::kHardwareSignal, "Hardware_Signal" },
238 { FragmentType::kPACMAN, "PACMAN" },
239 { FragmentType::kMPD, "MPD" },
240 { FragmentType::kWIBEth, "WIBEth" },
241 { FragmentType::kCRT, "CRT" },
242 { FragmentType::kTDEEth, "TDEEth" },
243 { FragmentType::kCRTBern, "CRTBern" },
244 { FragmentType::kCRTGrenoble, "CRTGrenoble" },
245 { FragmentType::kDAPHNEEth, "DAPHNEEth" },
246 { FragmentType::kDAPHNEEthStream, "DAPHNEEthStream" },
247 };
248}
249
255inline std::string
257{
258 try {
259 return get_fragment_type_names().at(type);
260 } catch (std::exception& e) {
261 }
262 return "Unknown";
263}
264
270inline FragmentType
271string_to_fragment_type(const std::string& name)
272{
273 for (auto& it : get_fragment_type_names()) {
274 if (it.second == name)
275 return it.first;
276 }
278}
279
286inline std::ostream&
287operator<<(std::ostream& o, FragmentHeader const& hdr)
288{
289 return o << "check_word: " << std::hex << hdr.fragment_header_marker << std::dec << ", " << "version: " << hdr.version
290 << ", " << "size: " << hdr.size << ", " << "trigger_number: " << hdr.trigger_number << ", "
291 << "run_number: " << hdr.run_number << ", " << "trigger_timestamp: " << hdr.trigger_timestamp << ", "
292 << "window_begin: " << hdr.window_begin << ", " << "window_end: " << hdr.window_end << ", "
293 << "status_bits: " << hdr.status_bits << ", " << "fragment_type: " << hdr.fragment_type << ", "
294 << "sequence_number: " << hdr.sequence_number << ", " << "detector_id: " << hdr.detector_id << ", "
295 << "element_id: " << hdr.element_id;
296}
297
304inline std::istream&
305operator>>(std::istream& o, FragmentHeader& hdr)
306{
307 std::string tmp;
308 return o >> tmp >> std::hex >> hdr.fragment_header_marker >> std::dec >> tmp >> tmp >> hdr.version >> tmp >> tmp >>
309 hdr.size >> tmp >> tmp >> hdr.trigger_number >> tmp >> tmp >> hdr.run_number >> tmp >> tmp >>
310 hdr.trigger_timestamp >> tmp >> tmp >> hdr.window_begin >> tmp >> tmp >> hdr.window_end >> tmp >> tmp >>
311 hdr.status_bits >> tmp >> tmp >> hdr.fragment_type >> tmp >> tmp >> hdr.sequence_number >> tmp >> tmp >>
312 hdr.detector_id >> tmp >> tmp >> hdr.element_id;
313}
314} // namespace dunedaq::daqdataformats
315
316#endif // DAQDATAFORMATS_INCLUDE_DAQDATAFORMATS_FRAGMENTHEADER_HPP_
static constexpr sequence_number_t s_invalid_sequence_number
Definition Types.hpp:74
static constexpr trigger_number_t s_invalid_trigger_number
An invalid trigger number.
Definition Types.hpp:62
static constexpr fragment_type_t s_invalid_fragment_type
An invalid fragment type.
Definition Types.hpp:64
static constexpr fragment_size_t s_invalid_fragment_size
Invalid size for a Fragment (as FragmentHeader is counted as well)
Definition Types.hpp:66
static constexpr timestamp_t s_invalid_timestamp
An invalid timestamp.
Definition Types.hpp:68
static constexpr run_number_t s_invalid_run_number
An invalid run number.
Definition Types.hpp:60
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:48
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
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.
FragmentStatusBits
This enumeration should list all defined status bits, as well as a short documentation of their meani...
@ kUnassigned20
Status bit 20 is not assigned.
@ kUnassigned13
Status bit 13 is not assigned.
@ kUnassigned26
Status bit 26 is not assigned.
@ kUnassigned14
Status bit 14 is not assigned.
@ kRequestWindowBeforeBuffer
The request window extends before the latency buffer start.
@ kUnassigned16
Status bit 16 is not assigned.
@ kUnassigned27
Status bit 27 is not assigned.
@ kUnassigned10
Status bit 10 is not assigned.
@ kIncomplete
Only part of the requested data is present in the fragment.
@ kUnassigned9
Status bit 9 is not assigned.
@ kUnassigned24
Status bit 24 is not assigned.
@ kInvalidRequestWindow
The requested data window was too large.
@ kLatencyBufferEmpty
The latency buffer had zero occupancy when the data request was made.
@ kUnassigned7
Status bit 7 is not assigned.
@ kUnassigned28
Status bit 28 is not assigned.
@ kUnassigned21
Status bit 21 is not assigned.
@ kUnassigned31
Status bit 31 is not assigned.
@ kRequestWindowAfterBuffer
The request window extends after the latency buffer end.
@ kInvalid
Status bit 32 and higher are not valid (status_bits is only 32 bits)
@ kUnassigned18
Status bit 18 is not assigned.
@ kUnassigned25
Status bit 25 is not assigned.
@ kUnassigned19
Status bit 19 is not assigned.
@ kEmptyFragment
This Fragment contains no data.
@ kRequestTimeout
A timeout occurred while processing the data request.
@ kUnassigned29
Status bit 29 is not assigned.
@ kUnassigned23
Status bit 23 is not assigned.
@ kUnassigned11
Status bit 11 is not assigned.
@ kUnassigned15
Status bit 15 is not assigned.
@ kUnassigned17
Status bit 17 is not assigned.
@ kUnassigned22
Status bit 22 is not assigned.
@ kUnassigned12
Status bit 12 is not assigned.
@ kUnassigned30
Status bit 30 is not assigned.
@ kUnassigned8
Status bit 8 is not assigned.
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 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.
static constexpr uint32_t s_default_status_bits
By default, all status bits are unset.
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.
uint32_t status_bits
Status bits set by the Upstream DAQ.
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)
SourceID is a generalized representation of the source of a piece of data in the DAQ....
Definition SourceID.hpp:32