mu2e_artdaq_core  v1_02_16
 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 //#include "RecoDataProducts/CrvDigi.hh"
15 
16 #include <iostream>
17 
18 namespace mu2e {
19 class ArtFragmentReader;
20 
21 std::ostream &operator<<(std::ostream &, ArtFragmentReader const &);
22 } // namespace mu2e
23 
25 {
26 public:
27  ArtFragmentReader(artdaq::Fragment const &f)
28  : ArtFragment(f){};
29 
30  // DataBlock Header Accessor Methods (by block address)
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);
45 
46  // TRK DataBlock Payload Accessor Methods (by block address)
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);
54 
55  // CAL DataBlock Payload Accessor Methods (by block address)
56  adc_t DBC_CrystalID(adc_t const *pos);
57  adc_t DBC_apdID(adc_t const *pos);
58  adc_t DBC_Time(adc_t const *pos);
59  adc_t DBC_NumSamples(adc_t const *pos);
60  adc_t DBC_PeakSampleIdx(adc_t const *pos);
61  std::vector<int> DBC_Waveform(adc_t const *pos);
62 
63  // CRV ROC Status Accessor Methods
64  adc_t DBVR_ControllerID(adc_t const *pos);
65  adc_t DBVR_PacketType(adc_t const *pos);
66  adc_t DBVR_EventWordCount(adc_t const *pos);
67  adc_t DBVR_ActiveFEBFlags0(adc_t const *pos);
68  adc_t DBVR_ActiveFEBFlags1(adc_t const *pos);
69  adc_t DBVR_ActiveFEBFlags2(adc_t const *pos);
70  adc_t DBVR_TriggerCount(adc_t const *pos);
71  adc_t DBVR_EventType(adc_t const *pos);
72  adc_t DBVR_ErrorFlags(adc_t const *pos);
73 
74  adc_t DBVR_NumHits(adc_t const *pos);
75 
76  // CRV DataBlock Payload Accessor Methods (by block address and hit index)
77  adc_t DBV_sipmID(adc_t const *pos, size_t hitIdx);
78  // std::array<unsigned int, mu2e::CrvDigi::NSamples> DBV_ADCs(adc_t const *pos, size_t hitIdx);
79  std::array<unsigned int, 8> DBV_ADCs(adc_t const *pos, size_t hitIdx);
80  adc_t DBV_startTDC(adc_t const *pos, size_t hitIdx);
81 };
82 
84 // DataBlock Header Accessor Methods (by block address)
86 
87 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos)
88 {
89  return *(pos + 0);
90 }
91 
92 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos)
93 {
94  return (*(pos + 1) >> 15) & 0x0001;
95 }
96 
97 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos)
98 {
99  return *(pos + 1) & 0x000F; // 0x000F = 0b1111
100 }
101 
102 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos)
103 {
104  return (*(pos + 1) >> 4) & 0x000F; // 0x000F = 0b1111
105 }
106 
107 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos)
108 {
109  return *(pos + 2) & 0x07FF; // 0x07FF = 0b0111 1111 1111
110 }
111 
112 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos)
113 {
114  return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
115 }
116 
117 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos)
118 {
119  return *(pos + 3);
120 }
121 
122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos)
123 {
124  return *(pos + 4);
125 }
126 
127 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos)
128 {
129  return *(pos + 5);
130 }
131 
132 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos)
133 {
134  return *(pos + 6) & 0x00FF; // 0x00FF = 0b1111 1111
135 }
136 
137 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos)
138 {
139  return *(pos + 6) >> 8;
140 }
141 
142 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos)
143 {
144  return *(pos + 7) >> 8;
145 }
146 
147 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos)
148 {
149  return (*(pos + 7) >> 6) & 0x0003; //0x0003 = 0b0011
150 }
151 
152 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos)
153 {
154  return *(pos + 7) & 0x003F; // 0x003F = 0b0011 1111
155 }
156 
158 // TRK DataBlock Payload Accessor Methods (by block address)
160 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos)
161 {
162  return *(pos + 8 + 0);
163 }
164 
165 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos)
166 {
167  return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
168 }
169 
170 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos)
171 {
172  return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
173 }
174 
175 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos)
176 {
177  return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
178 }
179 
180 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos)
181 {
182  return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
183 }
184 
185 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos)
186 {
187  std::array<adc_t, 15> waveform;
188 
189  // Four 12-bit tracker ADC samples fit into every three slots (16 bits * 3)
190  // when we pack them tightly
191 
192  for (size_t i = 0; i < 4; i += 1) {
193  waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
194  waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
195  waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
196  if (i < 3) {
197  waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
198  }
199  }
200 
201  return waveform;
202 }
203 
204 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos)
205 {
206  return (*(pos + 8 + 15) >> 8);
207 }
208 
210 // CAL DataBlock Payload Accessor Methods (by block address)
212 
213 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos)
214 {
215  return *(pos + 8 + 0) & 0x0FFF; // 0x0FFF = 0b1111 1111 1111
216 }
217 
218 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos)
219 {
220  return *(pos + 8 + 0) >> 12;
221 }
222 
223 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos)
224 {
225  return *(pos + 8 + 1);
226 }
227 
228 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos)
229 {
230  return *(pos + 8 + 2) & 0x00FF;
231 }
232 
233 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos)
234 {
235  return *(pos + 8 + 2) >> 8;
236 }
237 
238 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos)
239 {
240  std::vector<int> waveform(DBC_NumSamples(pos));
241  for (size_t i = 0; i < waveform.size(); i++) {
242  waveform[i] = *(pos + 8 + 3 + i);
243  }
244  return waveform;
245 }
246 
248 // CRV ROC Status Accessor Methods
250 
251 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ControllerID(adc_t const *pos)
252 {
253  return *(pos + 8 + 0) >> 8;
254 }
255 
256 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_PacketType(adc_t const *pos)
257 {
258  return *(pos + 8 + 0) & 0x00FF;
259 }
260 
261 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventWordCount(adc_t const *pos)
262 {
263  return *(pos + 8 + 1);
264 }
265 
266 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags0(adc_t const *pos)
267 {
268  return *(pos + 8 + 3) & 0x00FF;
269 }
270 
271 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags1(adc_t const *pos)
272 {
273  return *(pos + 8 + 3) >> 8;
274 }
275 
276 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags2(adc_t const *pos)
277 {
278  return *(pos + 8 + 2) & 0x00FF;
279 }
280 
281 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_TriggerCount(adc_t const *pos)
282 {
283  return *(pos + 8 + 5);
284 }
285 
286 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventType(adc_t const *pos)
287 {
288  return *(pos + 8 + 7) >> 8;
289 }
290 
291 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ErrorFlags(adc_t const *pos)
292 {
293  return *(pos + 8 + 7) & 0x00FF;
294 }
295 
296 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_NumHits(adc_t const *pos)
297 {
298  // Currently hardcoded to assume 12 bytes per hit (corresponding to 8 samples)
299  return *(pos + 8 + 1) / 12;
300 }
301 
303 // CRV DataBlock Payload Accessor Methods (by block address)
305 
306 // Note: The following accessor methods are hardcoded to assume 6 16-bit values
307 // per CRV hit (corresponding to 8 samples per hit)
308 
309 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_sipmID(adc_t const *pos, size_t hitIdx)
310 {
311  return *(pos + 16 + hitIdx * 6 + 0) & 0x00FF;
312 }
313 
314 //std::array<unsigned int, mu2e::CrvDigi::NSamples> mu2e::ArtFragmentReader::DBV_ADCs(adc_t const *pos, size_t hitIdx) {
315 // std::array<unsigned int, mu2e::CrvDigi::NSamples> ADCs;
316 // for(size_t i=0; i<mu2e::CrvDigi::NSamples; i+=2) {
317 
318 // Hardcoding the number of samples per CRV hit to 8
319 std::array<unsigned int, 8> mu2e::ArtFragmentReader::DBV_ADCs(adc_t const *pos, size_t hitIdx)
320 {
321  std::array<unsigned int, 8> ADCs;
322  for (size_t i = 0; i < 8; i += 2) {
323  ADCs[i] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) & 0x00FF;
324  ADCs[i + 1] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) >> 8;
325  }
326  return ADCs;
327 }
328 
329 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_startTDC(adc_t const *pos, size_t hitIdx)
330 {
331  return *(pos + 16 + hitIdx * 6 + 1) & 0x00FF;
332 }
333 
334 #endif /* mu2e_artdaq_Overlays_ArtFragmentReader_hh */