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