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