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"
18 class ArtFragmentReader;
26 adc_t DBH_ByteCount(adc_t
const *pos);
27 bool DBH_Valid(adc_t
const *pos);
28 adc_t DBH_ROCID(adc_t
const *pos);
29 adc_t DBH_PacketType(adc_t
const *pos);
30 adc_t DBH_PacketCount(adc_t
const *pos);
31 uint64_t DBH_Timestamp(adc_t
const *pos);
32 adc_t DBH_TimestampLow(adc_t
const *pos);
33 adc_t DBH_TimestampMedium(adc_t
const *pos);
34 adc_t DBH_TimestampHigh(adc_t
const *pos);
35 adc_t DBH_Status(adc_t
const *pos);
36 adc_t DBH_FormatVersion(adc_t
const *pos);
37 adc_t DBH_EVBMode(adc_t
const *pos);
38 adc_t DBH_SubsystemID(adc_t
const *pos);
39 adc_t DBH_DTCID(adc_t
const *pos);
42 adc_t DBT_StrawIndex(adc_t
const *pos);
43 adc_t DBT_TDC0(adc_t
const *pos);
44 adc_t DBT_TDC1(adc_t
const *pos);
45 adc_t DBT_TOT0(adc_t
const *pos);
46 adc_t DBT_TOT1(adc_t
const *pos);
47 std::array<adc_t, 15> DBT_Waveform(adc_t
const *pos);
48 adc_t DBT_Flags(adc_t
const *pos);
51 adc_t DBC_CrystalID(adc_t
const *pos);
52 adc_t DBC_apdID(adc_t
const *pos);
53 adc_t DBC_Time(adc_t
const *pos);
54 adc_t DBC_NumSamples(adc_t
const *pos);
55 adc_t DBC_PeakSampleIdx(adc_t
const *pos);
56 std::vector<int> DBC_Waveform(adc_t
const *pos);
63 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t
const *pos) {
return *(pos + 0); }
65 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t
const *pos) {
return (*(pos + 1) >> 15) & 0x0001; }
67 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t
const *pos) {
68 return *(pos + 1) & 0x000F;
71 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t
const *pos) {
72 return (*(pos + 1) >> 4) & 0x000F;
75 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t
const *pos) {
76 return *(pos + 2) & 0x07FF;
79 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t
const *pos) {
80 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
83 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t
const *pos) {
return *(pos + 3); }
85 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t
const *pos) {
return *(pos + 4); }
87 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t
const *pos) {
return *(pos + 5); }
89 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t
const *pos) {
90 return *(pos + 6) & 0x00FF;
93 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t
const *pos) {
return *(pos + 6) >> 8; }
95 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t
const *pos) {
return *(pos + 7) >> 8; }
97 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t
const *pos) {
98 return (*(pos + 7) >> 6) & 0x0003;
101 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t
const *pos) {
102 return *(pos + 7) & 0x003F;
108 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t
const *pos) {
return *(pos + 8 + 0); }
110 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t
const *pos) {
111 return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
114 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t
const *pos) {
115 return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
118 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t
const *pos) {
119 return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t
const *pos) {
123 return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
126 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t
const *pos) {
127 std::array<adc_t, 15> waveform;
132 for (
size_t i = 0; i < 4; i += 1) {
133 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
134 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
135 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
137 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
144 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t
const *pos) {
return (*(pos + 8 + 15) >> 8); }
150 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t
const *pos) {
151 return *(pos + 8 + 0) & 0x0FFF;
154 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t
const *pos) {
return *(pos + 8 + 0) >> 12; }
156 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t
const *pos) {
return *(pos + 8 + 1); }
158 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t
const *pos) {
159 return *(pos + 8 + 2) & 0x00FF;
162 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t
const *pos) {
163 return *(pos + 8 + 2) >> 8;
166 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t
const *pos) {
167 std::vector<int> waveform(DBC_NumSamples(pos));
168 for (
size_t i = 0; i < waveform.size(); i++) {
169 waveform[i] = *(pos + 8 + 3 + i);