1 #ifndef mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
2 #define mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
12 #include "artdaq-core/Data/Fragment.hh"
13 #include "mu2e-artdaq-core/Overlays/ArtFragment.hh"
19 class ArtFragmentReader;
21 std::ostream &operator<<(std::ostream &, ArtFragmentReader
const &);
31 adc_t DBH_ByteCount(adc_t
const *pos);
32 bool DBH_Valid(adc_t
const *pos);
33 adc_t DBH_ROCID(adc_t
const *pos);
34 adc_t DBH_PacketType(adc_t
const *pos);
35 adc_t DBH_PacketCount(adc_t
const *pos);
36 uint64_t DBH_Timestamp(adc_t
const *pos);
37 adc_t DBH_TimestampLow(adc_t
const *pos);
38 adc_t DBH_TimestampMedium(adc_t
const *pos);
39 adc_t DBH_TimestampHigh(adc_t
const *pos);
40 adc_t DBH_Status(adc_t
const *pos);
41 adc_t DBH_FormatVersion(adc_t
const *pos);
42 adc_t DBH_EVBMode(adc_t
const *pos);
43 adc_t DBH_SubsystemID(adc_t
const *pos);
44 adc_t DBH_DTCID(adc_t
const *pos);
47 adc_t DBT_StrawIndex(adc_t
const *pos);
48 adc_t DBT_TDC0(adc_t
const *pos);
49 adc_t DBT_TDC1(adc_t
const *pos);
50 adc_t DBT_TOT0(adc_t
const *pos);
51 adc_t DBT_TOT1(adc_t
const *pos);
52 std::array<adc_t, 15> DBT_Waveform(adc_t
const *pos);
53 adc_t DBT_Flags(adc_t
const *pos);
56 adc_t DBC_NumHits(adc_t
const *pos);
57 adc_t DBC_BoardID(adc_t
const *pos);
58 adc_t DBC_ChannelStatusFlagsA(adc_t
const *pos);
59 adc_t DBC_ChannelStatusFlagsB(adc_t
const *pos);
61 adc_t DBC_ChannelNum(adc_t
const *pos,
size_t hitIdx);
62 adc_t DBC_DIRACOutputA(adc_t
const *pos,
size_t hitIdx);
63 adc_t DBC_DIRACOutputB(adc_t
const *pos,
size_t hitIdx);
64 adc_t DBC_ErrorFlags(adc_t
const *pos,
size_t hitIdx);
66 adc_t DBC_Time(adc_t
const *pos,
size_t hitIdx);
67 adc_t DBC_NumSamples(adc_t
const *pos,
size_t hitIdx);
68 adc_t DBC_PeakSampleIdx(adc_t
const *pos,
size_t hitIdx);
69 std::vector<int> DBC_Waveform(adc_t
const *pos,
size_t hitIdx);
73 adc_t DBVR_ControllerID(adc_t
const *pos);
74 adc_t DBVR_PacketType(adc_t
const *pos);
75 adc_t DBVR_EventWordCount(adc_t
const *pos);
76 adc_t DBVR_ActiveFEBFlags0(adc_t
const *pos);
77 adc_t DBVR_ActiveFEBFlags1(adc_t
const *pos);
78 adc_t DBVR_ActiveFEBFlags2(adc_t
const *pos);
79 adc_t DBVR_TriggerCount(adc_t
const *pos);
80 adc_t DBVR_EventType(adc_t
const *pos);
81 adc_t DBVR_ErrorFlags(adc_t
const *pos);
83 adc_t DBVR_NumHits(adc_t
const *pos);
86 adc_t DBV_sipmID(adc_t
const *pos,
size_t hitIdx);
88 std::array<unsigned int, 8> DBV_ADCs(adc_t
const *pos,
size_t hitIdx);
89 adc_t DBV_startTDC(adc_t
const *pos,
size_t hitIdx);
96 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t
const *pos)
101 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t
const *pos)
103 return (*(pos + 1) >> 15) & 0x0001;
106 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t
const *pos)
108 return *(pos + 1) & 0x000F;
111 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t
const *pos)
113 return (*(pos + 1) >> 4) & 0x000F;
116 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t
const *pos)
118 return *(pos + 2) & 0x07FF;
121 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t
const *pos)
123 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
126 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t
const *pos)
131 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t
const *pos)
136 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t
const *pos)
141 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t
const *pos)
143 return *(pos + 6) & 0x00FF;
146 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t
const *pos)
148 return *(pos + 6) >> 8;
151 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t
const *pos)
153 return *(pos + 7) >> 8;
156 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t
const *pos)
158 return (*(pos + 7) >> 6) & 0x0003;
161 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t
const *pos)
163 return *(pos + 7) & 0x003F;
169 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t
const *pos)
171 return *(pos + 8 + 0);
174 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t
const *pos)
176 return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
179 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t
const *pos)
181 return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
184 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t
const *pos)
186 return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
189 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t
const *pos)
191 return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
194 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t
const *pos)
196 std::array<adc_t, 15> waveform;
201 for (
size_t i = 0; i < 4; i += 1) {
202 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
203 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
204 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
206 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
213 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t
const *pos)
215 return (*(pos + 8 + 15) >> 8);
222 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumHits(adc_t
const *pos)
227 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_BoardID(adc_t
const *pos)
229 return *(pos + 8 + 1 + DBC_NumHits(pos)) & 0x03FF;
232 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelStatusFlagsA(adc_t
const *pos)
234 return *(pos + 8 + 1 + DBC_NumHits(pos)) >> 10;
237 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelStatusFlagsB(adc_t
const *pos)
239 return *(pos + 8 + 1 + DBC_NumHits(pos) + 1);
242 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelNum(adc_t
const *pos,
size_t hitIdx)
244 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 0) & 0x003F;
247 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_DIRACOutputA(adc_t
const *pos,
size_t hitIdx)
249 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 0) >> 6;
252 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_DIRACOutputB(adc_t
const *pos,
size_t hitIdx)
254 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 1);
257 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ErrorFlags(adc_t
const *pos,
size_t hitIdx)
259 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 2);
262 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t
const *pos,
size_t hitIdx)
264 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 3);
267 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t
const *pos,
size_t hitIdx)
269 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 4) & 0x00FF;
272 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t
const *pos,
size_t hitIdx)
274 return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 4) >> 8;
277 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t
const *pos,
size_t hitIdx)
279 std::vector<int> waveform(DBC_NumSamples(pos,hitIdx));
280 for (
size_t i = 0; i < waveform.size(); i++) {
281 waveform[i] = *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 5 + i);
290 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ControllerID(adc_t
const *pos)
292 return *(pos + 8 + 0) >> 8;
295 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_PacketType(adc_t
const *pos)
297 return *(pos + 8 + 0) & 0x00FF;
300 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventWordCount(adc_t
const *pos)
302 return *(pos + 8 + 1);
305 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags0(adc_t
const *pos)
307 return *(pos + 8 + 3) & 0x00FF;
310 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags1(adc_t
const *pos)
312 return *(pos + 8 + 3) >> 8;
315 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags2(adc_t
const *pos)
317 return *(pos + 8 + 2) & 0x00FF;
320 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_TriggerCount(adc_t
const *pos)
322 return *(pos + 8 + 5);
325 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventType(adc_t
const *pos)
327 return *(pos + 8 + 7) >> 8;
330 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ErrorFlags(adc_t
const *pos)
332 return *(pos + 8 + 7) & 0x00FF;
335 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_NumHits(adc_t
const *pos)
338 adc_t numHits = (*(pos + 8 + 1) - 16) / 12;
342 if(*(pos + 8 + 8 + 6*(numHits-1) + 1) == 0) {
343 numHits = numHits - 1;
357 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_sipmID(adc_t
const *pos,
size_t hitIdx)
359 return *(pos + 16 + hitIdx * 6 + 0);
367 std::array<unsigned int, 8> mu2e::ArtFragmentReader::DBV_ADCs(adc_t
const *pos,
size_t hitIdx)
369 std::array<unsigned int, 8> ADCs;
370 for (
size_t i = 0; i < 8; i += 2) {
371 ADCs[i] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) & 0x00FF;
372 ADCs[i + 1] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) >> 8;
377 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_startTDC(adc_t
const *pos,
size_t hitIdx)
379 return *(pos + 16 + hitIdx * 6 + 1) & 0x00FF;