23 std::vector<ldmx::RawSiStripHit> hits;
26 if (raw.size() < 10) {
31 uint32_t event_count{0};
32 std::memcpy(&event_count, raw.data(),
sizeof(event_count));
34 const std::size_t payload_start = 10;
35 const std::size_t n_multisamples = (raw.size() - payload_start) / 10;
37 if (n_multisamples == 0) {
42 const auto& hdr =
event.getEventHeader();
44 if (hdr.hasIntParameter(
"RoR Timestamp LSB") &&
45 hdr.hasIntParameter(
"RoR Timestamp MSB")) {
46 ror_ts = (
static_cast<uint64_t
>(
static_cast<uint32_t
>(
47 hdr.getIntParameter(
"RoR Timestamp MSB")))
49 static_cast<uint32_t
>(hdr.getIntParameter(
"RoR Timestamp LSB"));
51 auto timestamp =
static_cast<long>(ror_ts);
53 hits.reserve(n_multisamples - 1);
56 for (std::size_t i = 0; i < n_multisamples - 1; ++i) {
57 const uint8_t* ms = raw.data() + payload_start + i * 10;
59 uint16_t s0{0}, s1{0}, s2{0};
60 std::memcpy(&s0, ms + 0, 2);
61 std::memcpy(&s1, ms + 2, 2);
62 std::memcpy(&s2, ms + 4, 2);
64 uint8_t channel = ms[6];
65 uint8_t apv_id = ms[7] & 0x07;
66 uint8_t hybrid_id = (ms[7] >> 4) & 0x07;
67 uint8_t feb_id = ms[8] & 0x0F;
70 uint16_t trig_word{0};
71 std::memcpy(&trig_word, ms + 8, 2);
72 uint16_t apv_trigger = (trig_word >> 4) & 0x3F;
74 uint8_t flags = ms[9];
75 uint8_t read_error = (flags >> 2) & 1;
76 uint8_t tail = (flags >> 3) & 1;
77 uint8_t head = (flags >> 4) & 1;
78 uint8_t filter = (flags >> 5) & 1;
82 std::vector<short>{
static_cast<short>(s0),
static_cast<short>(s1),
83 static_cast<short>(s2)},
86 hit.setHybridId(hybrid_id);
88 hit.setApvTrigger(apv_trigger);
89 hit.setReadError(read_error);
92 hit.setFilter(filter);
93 hits.push_back(std::move(hit));