1#include "Packing/MultiSampleECONDEventPacket.h"
5#include "Packing/Utility/Hex.h"
12 : n_links_{n_links} {}
20 [](
bool c) { return c; });
25 std::size_t i_sample)
const {
27 for (std::size_t i{start}; i < frame.size(); i++) {
28 header.
from(frame[i]);
51 bool found_soi{
false};
52 std::size_t offset{0};
54 while (offset < frame.size()) {
55 header.
from(frame[offset]);
59 ldmx_log(trace) <<
"Last sample packet found at offset = " << offset
60 <<
" (frame.size() = " << frame.size() <<
")";
73 ldmx_log(debug) <<
Hex(frame[offset])
74 <<
" is not a capture header, skipping "
75 << (next - offset) <<
" words";
78 if (next == frame.size()) {
86 ldmx_log(trace) <<
Hex(frame[offset]) <<
" -> " << header;
91 std::size_t i_sample{
samples_.size()};
92 if (i_sample != header.
i_l1a_) {
93 ldmx_log(debug) <<
"mismatch between transmitted index " << header.
i_l1a_
94 <<
" and unpacking index for sample " << i_sample;
98 if (header.
is_soi_ and not found_soi) {
104 if (offset + len > frame.size()) {
105 ldmx_log(debug) <<
"capture header length " << len <<
" goes past the "
106 <<
"end of the frame by " << (offset + len - frame.size())
109 len = frame.size() - offset;
122 <<
" samples but found " <<
samples_.size();
127 if (std::any_of(frame.begin() + offset, frame.end(),
128 [](uint32_t w) { return w != 0; })) {
129 ldmx_log(debug) <<
"non-zero words after the ending trailer";
133 if (not
samples_.empty() and not found_soi) {
Single ECON-D event packet.
const ECONDEventPacket & soi() const
get the sample of interest
int n_links_
number of links connected to the ECOND
int trailer_n_samples_
number of samples written in the trailer (-1 if no trailer)
std::size_t resync(std::span< const uint32_t > frame, std::size_t start, std::size_t i_sample) const
find the next capture header for sample i_sample or the trailer
std::size_t i_soi_
index of the sample of interest (SOI)
bool isCorrupt() const
any of the frame-level corruption flags are set
MultiSampleECONDEventPacket(int n_links)
constructor defining how many links are connected to this ECOND
int econd_id_
ID for this econ from the first capture header (-1 if none)
void from(std::span< const uint32_t > frame)
unpack the given frame into this structure
std::vector< ECONDEventPacket > samples_
samples from ECOND stored in order of transmission
@ NO_TRAILER
the frame ended without the ending trailer
@ RESYNC
a capture header was missing, words were skipped to find the next
@ NO_SOI
no sample flagged as the sample of interest
@ TRUNCATED_FRAME
capture header length goes past the end of the frame
@ LOST_SYNC
no further capture header or trailer found, rest of frame dropped
@ SAMPLE_INDEX_MISMATCH
sample index in capture header does not match its position
@ TRAILER_COUNT_MISMATCH
number of samples in the trailer does not match the number found
@ EXTRA_WORDS
non-zero words after the ending trailer
@ ECON_ID_MISMATCH
ECON ID changed within the frame.
std::vector< DAQSampleHeader > headers_
capture headers stored in order of transmission
std::size_t n_skipped_words_
number of words skipped while searching for capture headers
std::array< bool, N_CORRUPTION > corruption_
corruption flags indexed by Corruption