mu2e_artdaq_core  v1_02_11
 All Classes Functions
ArtFragmentReader.hh
1 #ifndef mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
2 #define mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
3 
5 // ArtFragmentReader
6 //
7 // Class derived from mu2eFragment which provides additional methods
8 // for accessing data stored in a mu2eFragment
9 //
11 
12 #include "artdaq-core/Data/Fragment.hh"
13 #include "mu2e-artdaq-core/Overlays/ArtFragment.hh"
14 
15 #include <iostream>
16 
17 namespace mu2e {
18 class ArtFragmentReader;
19 }
20 
22  public:
23  ArtFragmentReader(artdaq::Fragment const &f) : ArtFragment(f){};
24 
25  // DataBlock Header Accessor Methods (by block address)
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);
40 
41  // TRK DataBlock Payload Accessor Methods (by block address)
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);
49 
50  // CAL DataBlock Payload Accessor Methods (by block address)
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);
57 };
58 
60 // DataBlock Header Accessor Methods (by block address)
62 
63 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) { return *(pos + 0); }
64 
65 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) { return (*(pos + 1) >> 15) & 0x0001; }
66 
67 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
68  return *(pos + 1) & 0x000F; // 0x000F = 0b1111
69 }
70 
71 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
72  return (*(pos + 1) >> 4) & 0x000F; // 0x000F = 0b1111
73 }
74 
75 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
76  return *(pos + 2) & 0x07FF; // 0x07FF = 0b0111 1111 1111
77 }
78 
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);
81 }
82 
83 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) { return *(pos + 3); }
84 
85 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) { return *(pos + 4); }
86 
87 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) { return *(pos + 5); }
88 
89 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
90  return *(pos + 6) & 0x00FF; // 0x00FF = 0b1111 1111
91 }
92 
93 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) { return *(pos + 6) >> 8; }
94 
95 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) { return *(pos + 7) >> 8; }
96 
97 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
98  return (*(pos + 7) >> 6) & 0x0003; // 0x0003 = 0b0011
99 }
100 
101 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
102  return *(pos + 7) & 0x003F; // 0x003F = 0b0011 1111
103 }
104 
106 // TRK DataBlock Payload Accessor Methods (by block address)
108 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) { return *(pos + 8 + 0); }
109 
110 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
111  return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
112 }
113 
114 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
115  return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
116 }
117 
118 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos) {
119  return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
120 }
121 
122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos) {
123  return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
124 }
125 
126 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
127  std::array<adc_t, 15> waveform;
128 
129  // Four 12-bit tracker ADC samples fit into every three slots (16 bits * 3)
130  // when we pack them tightly
131 
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);
136  if (i < 3) {
137  waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
138  }
139  }
140 
141  return waveform;
142 }
143 
144 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos) { return (*(pos + 8 + 15) >> 8); }
145 
147 // CAL DataBlock Payload Accessor Methods (by block address)
149 
150 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos) {
151  return *(pos + 8 + 0) & 0x0FFF; // 0x0FFF = 0b1111 1111 1111
152 }
153 
154 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos) { return *(pos + 8 + 0) >> 12; }
155 
156 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) { return *(pos + 8 + 1); }
157 
158 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
159  return *(pos + 8 + 2) & 0x00FF;
160 }
161 
162 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos) {
163  return *(pos + 8 + 2) >> 8;
164 }
165 
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);
170  }
171  return waveform;
172 }
173 
174 #endif /* mu2e_artdaq_Overlays_ArtFragmentReader_hh */