mu2e_artdaq_core  v1_02_09
 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 
24  ArtFragmentReader(artdaq::Fragment const & f) : ArtFragment(f) {};
25 
26  // DataBlock Header Accessor Methods (by block address)
27  adc_t DBH_ByteCount(adc_t const *pos);
28  bool DBH_Valid(adc_t const *pos);
29  adc_t DBH_ROCID(adc_t const *pos);
30  adc_t DBH_PacketType(adc_t const *pos);
31  adc_t DBH_PacketCount(adc_t const *pos);
32  uint64_t DBH_Timestamp(adc_t const *pos);
33  adc_t DBH_TimestampLow(adc_t const *pos);
34  adc_t DBH_TimestampMedium(adc_t const *pos);
35  adc_t DBH_TimestampHigh(adc_t const *pos);
36  adc_t DBH_Status(adc_t const *pos);
37  adc_t DBH_FormatVersion(adc_t const *pos);
38  adc_t DBH_EVBMode(adc_t const *pos);
39  adc_t DBH_SubsystemID(adc_t const *pos);
40  adc_t DBH_DTCID(adc_t const *pos);
41 
42  // TRK DataBlock Payload Accessor Methods (by block address)
43  adc_t DBT_StrawIndex(adc_t const *pos);
44  adc_t DBT_TDC0(adc_t const *pos);
45  adc_t DBT_TDC1(adc_t const *pos);
46  adc_t DBT_TOT0(adc_t const *pos);
47  adc_t DBT_TOT1(adc_t const *pos);
48  std::array<adc_t,15> DBT_Waveform(adc_t const *pos);
49  adc_t DBT_Flags(adc_t const *pos);
50 
51  // CAL DataBlock Payload Accessor Methods (by block address)
52  adc_t DBC_CrystalID(adc_t const *pos);
53  adc_t DBC_apdID(adc_t const *pos);
54  adc_t DBC_Time(adc_t const *pos);
55  adc_t DBC_NumSamples(adc_t const *pos);
56  adc_t DBC_PeakSampleIdx(adc_t const *pos);
57  std::vector<int> DBC_Waveform(adc_t const *pos);
58 
59 };
60 
62 // DataBlock Header Accessor Methods (by block address)
64 
65 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) {
66  return *(pos+0);
67 }
68 
69 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) {
70  return (*(pos+1) >> 15) & 0x0001;
71 }
72 
73 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
74  return *(pos+1) & 0x000F; // 0x000F = 0b1111
75 }
76 
77 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
78  return (*(pos+1) >> 4) & 0x000F; // 0x000F = 0b1111
79 }
80 
81 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
82  return *(pos+2) & 0x07FF; // 0x07FF = 0b0111 1111 1111
83 }
84 
85 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos) {
86  return uint64_t(*(pos+3)) + (uint64_t(*(pos+4)) << 16) + (uint64_t(*(pos+5)) << 32);
87 }
88 
89 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) {
90  return *(pos+3);
91 }
92 
93 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) {
94  return *(pos+4);
95 }
96 
97 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) {
98  return *(pos+5);
99 }
100 
101 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
102  return *(pos+6) & 0x00FF; // 0x00FF = 0b1111 1111
103 }
104 
105 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) {
106  return *(pos+6) >> 8;
107 }
108 
109 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) {
110  return *(pos+7) >> 8;
111 }
112 
113 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
114  return (*(pos+7) >> 6) & 0x0003; //0x0003 = 0b0011
115 }
116 
117 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
118  return *(pos+7) & 0x003F; // 0x003F = 0b0011 1111
119 }
120 
122 // TRK DataBlock Payload Accessor Methods (by block address)
124 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) {
125  return *(pos+8+0);
126 }
127 
128 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
129  return (uint32_t(*(pos+8+1)) & 0xFFFF);
130 }
131 
132 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
133  return (uint32_t(*(pos+8+2)) & 0xFFFF);
134 }
135 
136 
137 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos) {
138  return (uint32_t(*(pos+8+3)) & 0x00FF) ;
139 }
140 
141 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos) {
142  return ( (uint32_t(*(pos+8+3)) >> 8) & 0x00FF) ;
143 }
144 
145 std::array<mu2e::ArtFragmentReader::adc_t,15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
146  std::array<adc_t,15> waveform;
147 
148  // Four 12-bit tracker ADC samples fit into every three slots (16 bits * 3)
149  // when we pack them tightly
150 
151  for (size_t i = 0; i < 4; i+=1){
152  waveform[0 + i*4] = *(pos+8+4+i*3) & 0x0FFF ;
153  waveform[1 + i*4] = ((*(pos+8+4+i*3+1) & 0x00FF) << 4) | (*(pos+8+4+i*3) >> 12) ;
154  waveform[2 + i*4] = ((*(pos+8+4+i*3+2) & 0x000F) << 8) | (*(pos+8+4+i*3+1) >> 8) ;
155  if(i<3) {
156  waveform[3 + i*4] = (*(pos+8+4+i*3+2) >> 4) ;
157  }
158  }
159 
160  return waveform;
161 }
162 
163 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos) {
164 
165  return (*(pos+8+15) >> 8);
166 }
167 
168 
170 // CAL DataBlock Payload Accessor Methods (by block address)
172 
173 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos) {
174  return *(pos+8+0) & 0x0FFF; // 0x0FFF = 0b1111 1111 1111
175 }
176 
177 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos) {
178  return *(pos+8+0) >> 12;
179 }
180 
181 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) {
182  return *(pos+8+1);
183 }
184 
185 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
186  return *(pos+8+2) & 0x00FF;
187 }
188 
189 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos) {
190  return *(pos+8+2) >> 8;
191 }
192 
193 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos) {
194  std::vector<int> waveform(DBC_NumSamples(pos));
195  for(size_t i=0; i<waveform.size(); i++) {
196  waveform[i] = *(pos+8+3+i);
197  }
198  return waveform;
199 }
200 
201 
202 
203 
204 
205 #endif /* mu2e_artdaq_Overlays_ArtFragmentReader_hh */
206