1 #ifndef mu2e_artdaq_core_Overlays_mu2eFragmentReader_hh
2 #define mu2e_artdaq_core_Overlays_mu2eFragmentReader_hh
12 #include "artdaq-core/Data/Fragment.hh"
13 #include "artdaq-core/Data/Fragments.hh"
14 #include "mu2e-artdaq-core/Overlays/mu2eFragment.hh"
21 class mu2eFragmentReader;
27 typedef uint16_t adc_t;
31 size_t blockIndexBytes(
size_t offset)
const;
33 size_t blockSizeBytes()
const;
34 size_t blockSizeBytes(
size_t offset)
const;
35 size_t blockEndBytes(
size_t offset)
const;
36 Header::data_t
const * dataAtBytes(
size_t offset)
const;
37 Header::data_t
const * dataAtBlockIndex(
size_t offset)
const;
39 void printPacketAtByte(
size_t offset)
const;
42 adc_t DBH_ByteCount(adc_t
const *pos);
43 bool DBH_Valid(adc_t
const *pos);
44 adc_t DBH_ROCID(adc_t
const *pos);
45 adc_t DBH_PacketType(adc_t
const *pos);
46 adc_t DBH_PacketCount(adc_t
const *pos);
47 uint64_t DBH_Timestamp(adc_t
const *pos);
48 adc_t DBH_TimestampLow(adc_t
const *pos);
49 adc_t DBH_TimestampMedium(adc_t
const *pos);
50 adc_t DBH_TimestampHigh(adc_t
const *pos);
51 adc_t DBH_Status(adc_t
const *pos);
52 adc_t DBH_FormatVersion(adc_t
const *pos);
53 adc_t DBH_EVBMode(adc_t
const *pos);
54 adc_t DBH_SubsystemID(adc_t
const *pos);
55 adc_t DBH_DTCID(adc_t
const *pos);
58 adc_t DBT_StrawIndex(adc_t
const *pos);
59 uint32_t DBT_TDC0(adc_t
const *pos);
60 uint32_t DBT_TDC1(adc_t
const *pos);
61 uint32_t DBT_TOT0(adc_t
const *pos);
62 uint32_t DBT_TOT1(adc_t
const *pos);
63 std::array<adc_t,15> DBT_Waveform(adc_t
const *pos);
64 adc_t DBT_Flags(adc_t
const *pos);
67 adc_t DBC_CrystalID(adc_t
const *pos);
68 adc_t DBC_apdID(adc_t
const *pos);
69 adc_t DBC_Time(adc_t
const *pos);
70 adc_t DBC_NumSamples(adc_t
const *pos);
71 adc_t DBC_PeakSampleIdx(adc_t
const *pos);
72 std::vector<adc_t> DBC_Waveform(adc_t
const *pos);
83 std::bitset<128> bitArray(adc_t
const *beginning)
const;
87 void fillBitArray(std::bitset<128> &theArray, adc_t
const * beginning);
89 void printBitArray(std::bitset<128> theArray);
94 adc_t convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const;
99 inline size_t mu2e::mu2eFragmentReader::blockIndexBytes(
size_t offset)
const {
100 if(hdr_block_count() == 0) {
return 0; }
101 else if(offset>=hdr_block_count()) {
return -1; }
102 else if(offset==0) {
return 0;}
103 return header_()->index[ offset-1 ];
107 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes()
const {
108 return mu2eFragment::dataEndBytes();
112 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes(
size_t offset)
const {
113 if(hdr_block_count() == 0) {
return 0; }
114 else if(offset > hdr_block_count()-1) {
return 0; }
115 else if(offset==0) {
return header_()->index[ offset ]; }
116 return header_()->index[ offset ] - header_()->index[ offset-1 ];
120 inline size_t mu2e::mu2eFragmentReader::blockEndBytes(
size_t offset)
const {
121 if(hdr_block_count() == 0) {
return 0; }
122 else if(offset > hdr_block_count()-1) {
return 0; }
123 return header_()->index[ offset ];
127 inline mu2e::mu2eFragmentReader::Header::data_t
const * mu2e::mu2eFragmentReader::dataAtBytes(
size_t offset)
const {
128 return dataBegin() + (offset /
sizeof(Header::data_t));
132 inline mu2e::mu2eFragmentReader::Header::data_t
const * mu2e::mu2eFragmentReader::dataAtBlockIndex(
size_t offset)
const {
133 return dataAtBytes(blockIndexBytes(offset));
136 void mu2e::mu2eFragmentReader::printPacketAtByte(
size_t offset)
const {
137 std::bitset<128> theArray = bitArray( reinterpret_cast<mu2e::mu2eFragmentReader::adc_t const *>(dataAtBytes(offset)) );
138 std::cout <<
"\t\t" <<
"Packet Bits (128): ";
139 for(
int i=0; i<128; i++) {
140 std::cout << theArray[i];
141 if(i!=0 && i<128-1 && (i+1)%8==0) {
145 std::cout << std::endl;
149 std::bitset<128> mu2e::mu2eFragmentReader::bitArray(mu2e::mu2eFragmentReader::adc_t
const *beginning)
const {
151 std::bitset<128> theArray;
152 for(
int bitIdx=127, adcIdx = 0; adcIdx<8; adcIdx++) {
153 for(
int offset = 0; offset<16; offset++) {
154 if( ( (*((adc_t
const *)(beginning+adcIdx))) & (1<<offset) ) != 0) {
155 theArray.set(bitIdx);
157 theArray.reset(bitIdx);
165 void mu2e::mu2eFragmentReader::fillBitArray(std::bitset<128> &theArray, mu2e::mu2eFragmentReader::adc_t
const * beginning) {
167 for(
int bitIdx=127, adcIdx = 0; adcIdx<8; adcIdx++) {
168 for(
int offset = 0; offset<16; offset++) {
169 if( ( (*((adc_t
const *)(beginning+adcIdx))) & (1<<offset) ) != 0) {
170 theArray.set(bitIdx);
172 theArray.reset(bitIdx);
179 void mu2e::mu2eFragmentReader::printBitArray(std::bitset<128> theArray) {
181 std::cout <<
"\t\t" <<
"Packet Bits (128): ";
182 for(
int i=0; i<128; i++) {
183 std::cout << theArray[i];
185 std::cout << std::endl;
188 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const {
189 std::bitset<16> retVal;
190 for(
int i=minIdx+1; i<=maxIdx; i++) {
191 retVal.set(maxIdx-i,theArray[i]);
193 return retVal.to_ulong();
205 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ByteCount(adc_t
const *pos) {
209 bool mu2e::mu2eFragmentReader::DBH_Valid(adc_t
const *pos) {
210 return (*(pos+1) >> 15) & 0x0001;
213 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ROCID(adc_t
const *pos) {
214 return *(pos+1) & 0x000F;
217 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketType(adc_t
const *pos) {
218 return (*(pos+1) >> 4) & 0x000F;
221 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketCount(adc_t
const *pos) {
222 return *(pos+2) & 0x07FF;
225 uint64_t mu2e::mu2eFragmentReader::DBH_Timestamp(adc_t
const *pos) {
226 return uint64_t(*(pos+3)) + (uint64_t(*(pos+4)) << 16) + (uint64_t(*(pos+5)) << 32);
229 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampLow(adc_t
const *pos) {
233 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampMedium(adc_t
const *pos) {
237 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampHigh(adc_t
const *pos) {
241 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_Status(adc_t
const *pos) {
242 return *(pos+6) & 0x00FF;
245 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_FormatVersion(adc_t
const *pos) {
246 return *(pos+6) >> 8;
249 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_EVBMode(adc_t
const *pos) {
250 return *(pos+7) >> 8;
253 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_SubsystemID(adc_t
const *pos) {
254 return (*(pos+7) >> 6) & 0x0003;
257 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_DTCID(adc_t
const *pos) {
258 return *(pos+7) & 0x003F;
264 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_StrawIndex(adc_t
const *pos) {
268 uint32_t mu2e::mu2eFragmentReader::DBT_TDC0(adc_t
const *pos) {
269 return (uint32_t(*(pos+8+1)) & 0xFFFF);
272 uint32_t mu2e::mu2eFragmentReader::DBT_TDC1(adc_t
const *pos) {
273 return (uint32_t(*(pos+8+2)) & 0xFFFF);
276 uint32_t mu2e::mu2eFragmentReader::DBT_TOT0(adc_t
const *pos) {
277 return (uint32_t(*(pos+8+3)) & 0x00FF) ;
280 uint32_t mu2e::mu2eFragmentReader::DBT_TOT1(adc_t
const *pos) {
281 return ( (uint32_t(*(pos+8+3)) >> 8) & 0x00FF) ;
284 std::array<mu2e::mu2eFragmentReader::adc_t,15> mu2e::mu2eFragmentReader::DBT_Waveform(adc_t
const *pos) {
285 std::array<adc_t,15> waveform;
290 for (
size_t i = 0; i < 4; i+=1){
291 waveform[0 + i*4] = *(pos+8+4+i*3) & 0x0FFF ;
292 waveform[1 + i*4] = ((*(pos+8+4+i*3+1) & 0x00FF) << 4) | (*(pos+8+4+i*3) >> 12) ;
293 waveform[2 + i*4] = ((*(pos+8+4+i*3+2) & 0x000F) << 8) | (*(pos+8+4+i*3+1) >> 8) ;
295 waveform[3 + i*4] = (*(pos+8+4+i*3+2) >> 4) ;
302 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_Flags(adc_t
const *pos) {
304 return (*(pos+8+15) >> 8);
311 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_CrystalID(adc_t
const *pos) {
312 return *(pos+8+0) & 0x0FFF;
315 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_apdID(adc_t
const *pos) {
316 return *(pos+8+0) >> 12;
319 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_Time(adc_t
const *pos) {
323 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_NumSamples(adc_t
const *pos) {
324 return *(pos+8+2) & 0x00FF;
327 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_PeakSampleIdx(adc_t
const *pos) {
328 return *(pos+8+2) >> 8;
331 std::vector<mu2e::mu2eFragmentReader::adc_t> mu2e::mu2eFragmentReader::DBC_Waveform(adc_t
const *pos) {
332 std::vector<int> waveform(DBC_NumSamples(pos));
333 for(
size_t i=0; i<waveform.size(); i++) {
334 waveform[i] = *(pos+8+3+i);