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;
26 typedef uint16_t adc_t;
30 size_t blockIndexBytes(
size_t offset)
const;
32 size_t blockSizeBytes()
const;
33 size_t blockSizeBytes(
size_t offset)
const;
34 size_t blockEndBytes(
size_t offset)
const;
35 Header::data_t
const *dataAtBytes(
size_t offset)
const;
36 Header::data_t
const *dataAtBlockIndex(
size_t offset)
const;
38 void printPacketAtByte(
size_t offset)
const;
41 adc_t DBH_ByteCount(adc_t
const *pos);
42 bool DBH_Valid(adc_t
const *pos);
43 adc_t DBH_ROCID(adc_t
const *pos);
44 adc_t DBH_PacketType(adc_t
const *pos);
45 adc_t DBH_PacketCount(adc_t
const *pos);
46 uint64_t DBH_Timestamp(adc_t
const *pos);
47 adc_t DBH_TimestampLow(adc_t
const *pos);
48 adc_t DBH_TimestampMedium(adc_t
const *pos);
49 adc_t DBH_TimestampHigh(adc_t
const *pos);
50 adc_t DBH_Status(adc_t
const *pos);
51 adc_t DBH_FormatVersion(adc_t
const *pos);
52 adc_t DBH_EVBMode(adc_t
const *pos);
53 adc_t DBH_SubsystemID(adc_t
const *pos);
54 adc_t DBH_DTCID(adc_t
const *pos);
57 adc_t DBT_StrawIndex(adc_t
const *pos);
58 uint32_t DBT_TDC0(adc_t
const *pos);
59 uint32_t DBT_TDC1(adc_t
const *pos);
60 uint32_t DBT_TOT0(adc_t
const *pos);
61 uint32_t DBT_TOT1(adc_t
const *pos);
62 std::array<adc_t, 15> DBT_Waveform(adc_t
const *pos);
63 adc_t DBT_Flags(adc_t
const *pos);
66 adc_t DBC_CrystalID(adc_t
const *pos);
67 adc_t DBC_apdID(adc_t
const *pos);
68 adc_t DBC_Time(adc_t
const *pos);
69 adc_t DBC_NumSamples(adc_t
const *pos);
70 adc_t DBC_PeakSampleIdx(adc_t
const *pos);
71 std::vector<adc_t> DBC_Waveform(adc_t
const *pos);
81 std::bitset<128> bitArray(adc_t
const *beginning)
const;
85 void fillBitArray(std::bitset<128> &theArray, adc_t
const *beginning);
87 void printBitArray(std::bitset<128> theArray);
92 adc_t convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const;
96 inline size_t mu2e::mu2eFragmentReader::blockIndexBytes(
size_t offset)
const {
97 if (hdr_block_count() == 0) {
99 }
else if (offset >= hdr_block_count()) {
101 }
else if (offset == 0) {
104 return header_()->index[offset - 1];
108 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes()
const {
return mu2eFragment::dataEndBytes(); }
111 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes(
size_t offset)
const {
112 if (hdr_block_count() == 0) {
114 }
else if (offset > hdr_block_count() - 1) {
116 }
else if (offset == 0) {
117 return header_()->index[offset];
119 return header_()->index[offset] - header_()->index[offset - 1];
123 inline size_t mu2e::mu2eFragmentReader::blockEndBytes(
size_t offset)
const {
124 if (hdr_block_count() == 0) {
126 }
else if (offset > hdr_block_count() - 1) {
129 return header_()->index[offset];
133 inline mu2e::mu2eFragmentReader::Header::data_t
const *mu2e::mu2eFragmentReader::dataAtBytes(
size_t offset)
const {
134 return dataBegin() + (offset /
sizeof(Header::data_t));
138 inline mu2e::mu2eFragmentReader::Header::data_t
const *mu2e::mu2eFragmentReader::dataAtBlockIndex(
size_t offset)
const {
139 return dataAtBytes(blockIndexBytes(offset));
142 void mu2e::mu2eFragmentReader::printPacketAtByte(
size_t offset)
const {
143 std::bitset<128> theArray = bitArray(reinterpret_cast<mu2e::mu2eFragmentReader::adc_t const *>(dataAtBytes(offset)));
145 <<
"Packet Bits (128): ";
146 for (
int i = 0; i < 128; i++) {
147 std::cout << theArray[i];
148 if (i != 0 && i < 128 - 1 && (i + 1) % 8 == 0) {
152 std::cout << std::endl;
156 std::bitset<128> mu2e::mu2eFragmentReader::bitArray(mu2e::mu2eFragmentReader::adc_t
const *beginning)
const {
158 std::bitset<128> theArray;
159 for (
int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
160 for (
int offset = 0; offset < 16; offset++) {
161 if (((*((adc_t
const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
162 theArray.set(bitIdx);
164 theArray.reset(bitIdx);
172 void mu2e::mu2eFragmentReader::fillBitArray(std::bitset<128> &theArray,
173 mu2e::mu2eFragmentReader::adc_t
const *beginning) {
175 for (
int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
176 for (
int offset = 0; offset < 16; offset++) {
177 if (((*((adc_t
const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
178 theArray.set(bitIdx);
180 theArray.reset(bitIdx);
187 void mu2e::mu2eFragmentReader::printBitArray(std::bitset<128> theArray) {
190 <<
"Packet Bits (128): ";
191 for (
int i = 0; i < 128; i++) {
192 std::cout << theArray[i];
194 std::cout << std::endl;
197 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::convertFromBinary(std::bitset<128> theArray,
int minIdx,
199 std::bitset<16> retVal;
200 for (
int i = minIdx + 1; i <= maxIdx; i++) {
201 retVal.set(maxIdx - i, theArray[i]);
203 return retVal.to_ulong();
210 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ByteCount(adc_t
const *pos) {
return *(pos + 0); }
212 bool mu2e::mu2eFragmentReader::DBH_Valid(adc_t
const *pos) {
return (*(pos + 1) >> 15) & 0x0001; }
214 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ROCID(adc_t
const *pos) {
215 return *(pos + 1) & 0x000F;
218 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketType(adc_t
const *pos) {
219 return (*(pos + 1) >> 4) & 0x000F;
222 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketCount(adc_t
const *pos) {
223 return *(pos + 2) & 0x07FF;
226 uint64_t mu2e::mu2eFragmentReader::DBH_Timestamp(adc_t
const *pos) {
227 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
230 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampLow(adc_t
const *pos) {
return *(pos + 3); }
232 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampMedium(adc_t
const *pos) {
return *(pos + 4); }
234 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampHigh(adc_t
const *pos) {
return *(pos + 5); }
236 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_Status(adc_t
const *pos) {
237 return *(pos + 6) & 0x00FF;
240 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_FormatVersion(adc_t
const *pos) {
241 return *(pos + 6) >> 8;
244 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_EVBMode(adc_t
const *pos) {
return *(pos + 7) >> 8; }
246 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_SubsystemID(adc_t
const *pos) {
247 return (*(pos + 7) >> 6) & 0x0003;
250 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_DTCID(adc_t
const *pos) {
251 return *(pos + 7) & 0x003F;
257 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_StrawIndex(adc_t
const *pos) {
return *(pos + 8 + 0); }
259 uint32_t mu2e::mu2eFragmentReader::DBT_TDC0(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 1)) & 0xFFFF); }
261 uint32_t mu2e::mu2eFragmentReader::DBT_TDC1(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 2)) & 0xFFFF); }
263 uint32_t mu2e::mu2eFragmentReader::DBT_TOT0(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 3)) & 0x00FF); }
265 uint32_t mu2e::mu2eFragmentReader::DBT_TOT1(adc_t
const *pos) {
return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF); }
267 std::array<mu2e::mu2eFragmentReader::adc_t, 15> mu2e::mu2eFragmentReader::DBT_Waveform(adc_t
const *pos) {
268 std::array<adc_t, 15> waveform;
273 for (
size_t i = 0; i < 4; i += 1) {
274 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
275 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
276 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
278 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
285 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_Flags(adc_t
const *pos) {
return (*(pos + 8 + 15) >> 8); }
291 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_CrystalID(adc_t
const *pos) {
292 return *(pos + 8 + 0) & 0x0FFF;
295 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_apdID(adc_t
const *pos) {
return *(pos + 8 + 0) >> 12; }
297 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_Time(adc_t
const *pos) {
return *(pos + 8 + 1); }
299 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_NumSamples(adc_t
const *pos) {
300 return *(pos + 8 + 2) & 0x00FF;
303 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_PeakSampleIdx(adc_t
const *pos) {
304 return *(pos + 8 + 2) >> 8;
307 std::vector<mu2e::mu2eFragmentReader::adc_t> mu2e::mu2eFragmentReader::DBC_Waveform(adc_t
const *pos) {
308 std::vector<int> waveform(DBC_NumSamples(pos));
309 for (
size_t i = 0; i < waveform.size(); i++) {
310 waveform[i] = *(pos + 8 + 3 + i);