mu2e_artdaq_core  v1_02_30
 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 Method (by block address)
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);
60 
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);
65 
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);
70 
71 
72  // CRV ROC Status Accessor Methods (by block address)
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);
82 
83  adc_t DBVR_NumHits(adc_t const *pos);
84 
85  // CRV DataBlock Payload Accessor Methods (by block address and hit index)
86  adc_t DBV_sipmID(adc_t const *pos, size_t hitIdx);
87  // std::array<unsigned int, mu2e::CrvDigi::NSamples> DBV_ADCs(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);
90 };
91 
93 // DataBlock Header Accessor Methods (by block address)
95 
96 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos)
97 {
98  return *(pos + 0);
99 }
100 
101 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos)
102 {
103  return (*(pos + 1) >> 15) & 0x0001;
104 }
105 
106 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos)
107 {
108  return *(pos + 1) & 0x000F; // 0x000F = 0b1111
109 }
110 
111 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos)
112 {
113  return (*(pos + 1) >> 4) & 0x000F; // 0x000F = 0b1111
114 }
115 
116 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos)
117 {
118  return *(pos + 2) & 0x07FF; // 0x07FF = 0b0111 1111 1111
119 }
120 
121 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos)
122 {
123  return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
124 }
125 
126 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos)
127 {
128  return *(pos + 3);
129 }
130 
131 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos)
132 {
133  return *(pos + 4);
134 }
135 
136 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos)
137 {
138  return *(pos + 5);
139 }
140 
141 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos)
142 {
143  return *(pos + 6) & 0x00FF; // 0x00FF = 0b1111 1111
144 }
145 
146 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos)
147 {
148  return *(pos + 6) >> 8;
149 }
150 
151 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos)
152 {
153  return *(pos + 7) >> 8;
154 }
155 
156 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos)
157 {
158  return (*(pos + 7) >> 6) & 0x0003; //0x0003 = 0b0011
159 }
160 
161 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos)
162 {
163  return *(pos + 7) & 0x003F; // 0x003F = 0b0011 1111
164 }
165 
167 // TRK DataBlock Payload Accessor Methods (by block address)
169 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos)
170 {
171  return *(pos + 8 + 0);
172 }
173 
174 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos)
175 {
176  return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
177 }
178 
179 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos)
180 {
181  return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
182 }
183 
184 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos)
185 {
186  return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
187 }
188 
189 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos)
190 {
191  return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
192 }
193 
194 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos)
195 {
196  std::array<adc_t, 15> waveform;
197 
198  // Four 12-bit tracker ADC samples fit into every three slots (16 bits * 3)
199  // when we pack them tightly
200 
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);
205  if (i < 3) {
206  waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
207  }
208  }
209 
210  return waveform;
211 }
212 
213 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos)
214 {
215  return (*(pos + 8 + 15) >> 8);
216 }
217 
219 // CAL DataBlock Payload Accessor Methods (by block address)
221 
222 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumHits(adc_t const *pos)
223 {
224  return *(pos + 8);
225 }
226 
227 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_BoardID(adc_t const *pos)
228 {
229  return *(pos + 8 + 1 + DBC_NumHits(pos)) & 0x03FF;
230 }
231 
232 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelStatusFlagsA(adc_t const *pos)
233 {
234  return *(pos + 8 + 1 + DBC_NumHits(pos)) >> 10;
235 }
236 
237 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelStatusFlagsB(adc_t const *pos)
238 {
239  return *(pos + 8 + 1 + DBC_NumHits(pos) + 1);
240 }
241 
242 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ChannelNum(adc_t const *pos, size_t hitIdx)
243 {
244  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 0) & 0x003F;
245 }
246 
247 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_DIRACOutputA(adc_t const *pos, size_t hitIdx)
248 {
249  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 0) >> 6;
250 }
251 
252 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_DIRACOutputB(adc_t const *pos, size_t hitIdx)
253 {
254  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 1);
255 }
256 
257 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_ErrorFlags(adc_t const *pos, size_t hitIdx)
258 {
259  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 2);
260 }
261 
262 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos, size_t hitIdx)
263 {
264  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 3);
265 }
266 
267 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos, size_t hitIdx)
268 {
269  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 4) & 0x00FF;
270 }
271 
272 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos, size_t hitIdx)
273 {
274  return *(pos + 8 + *(pos + 8 + 1 + hitIdx) + 4) >> 8;
275 }
276 
277 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos, size_t hitIdx)
278 {
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);
282  }
283  return waveform;
284 }
285 
287 // CRV ROC Status Accessor Methods
289 
290 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ControllerID(adc_t const *pos)
291 {
292  return *(pos + 8 + 0) >> 8;
293 }
294 
295 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_PacketType(adc_t const *pos)
296 {
297  return *(pos + 8 + 0) & 0x00FF;
298 }
299 
300 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventWordCount(adc_t const *pos)
301 {
302  return *(pos + 8 + 1);
303 }
304 
305 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags0(adc_t const *pos)
306 {
307  return *(pos + 8 + 3) & 0x00FF;
308 }
309 
310 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags1(adc_t const *pos)
311 {
312  return *(pos + 8 + 3) >> 8;
313 }
314 
315 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags2(adc_t const *pos)
316 {
317  return *(pos + 8 + 2) & 0x00FF;
318 }
319 
320 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_TriggerCount(adc_t const *pos)
321 {
322  return *(pos + 8 + 5);
323 }
324 
325 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventType(adc_t const *pos)
326 {
327  return *(pos + 8 + 7) >> 8;
328 }
329 
330 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ErrorFlags(adc_t const *pos)
331 {
332  return *(pos + 8 + 7) & 0x00FF;
333 }
334 
335 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_NumHits(adc_t const *pos)
336 {
337  // Currently hardcoded to assume 12 bytes per hit (corresponding to 8 samples)
338  adc_t numHits = (*(pos + 8 + 1) - 16) / 12; // Subtract 16 for the ROC header packet
339 
340  // Check whether the last hit is actually just empty filler in the last packet
341  if(numHits>0) {
342  if(*(pos + 8 + 8 + 6*(numHits-1) + 1) == 0) {
343  numHits = numHits - 1;
344  }
345  }
346 
347  return numHits;
348 }
349 
351 // CRV DataBlock Payload Accessor Methods (by block address)
353 
354 // Note: The following accessor methods are hardcoded to assume 6 16-bit values
355 // per CRV hit (corresponding to 8 samples per hit)
356 
357 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_sipmID(adc_t const *pos, size_t hitIdx)
358 {
359  return *(pos + 16 + hitIdx * 6 + 0);
360 }
361 
362 //std::array<unsigned int, mu2e::CrvDigi::NSamples> mu2e::ArtFragmentReader::DBV_ADCs(adc_t const *pos, size_t hitIdx) {
363 // std::array<unsigned int, mu2e::CrvDigi::NSamples> ADCs;
364 // for(size_t i=0; i<mu2e::CrvDigi::NSamples; i+=2) {
365 
366 // Hardcoding the number of samples per CRV hit to 8
367 std::array<unsigned int, 8> mu2e::ArtFragmentReader::DBV_ADCs(adc_t const *pos, size_t hitIdx)
368 {
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;
373  }
374  return ADCs;
375 }
376 
377 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_startTDC(adc_t const *pos, size_t hitIdx)
378 {
379  return *(pos + 16 + hitIdx * 6 + 1) & 0x00FF;
380 }
381 
382 #endif /* mu2e_artdaq_Overlays_ArtFragmentReader_hh */