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;
32 size_t blockIndexBytes(
size_t offset)
const;
34 size_t blockSizeBytes()
const;
35 size_t blockSizeBytes(
size_t offset)
const;
36 size_t blockEndBytes(
size_t offset)
const;
37 Header::data_t
const *dataAtBytes(
size_t offset)
const;
38 Header::data_t
const *dataAtBlockIndex(
size_t offset)
const;
40 void printPacketAtByte(
size_t offset)
const;
43 adc_t DBH_ByteCount(adc_t
const *pos);
44 bool DBH_Valid(adc_t
const *pos);
45 adc_t DBH_ROCID(adc_t
const *pos);
46 adc_t DBH_PacketType(adc_t
const *pos);
47 adc_t DBH_PacketCount(adc_t
const *pos);
48 uint64_t DBH_Timestamp(adc_t
const *pos);
49 adc_t DBH_TimestampLow(adc_t
const *pos);
50 adc_t DBH_TimestampMedium(adc_t
const *pos);
51 adc_t DBH_TimestampHigh(adc_t
const *pos);
52 adc_t DBH_Status(adc_t
const *pos);
53 adc_t DBH_FormatVersion(adc_t
const *pos);
54 adc_t DBH_EVBMode(adc_t
const *pos);
55 adc_t DBH_SubsystemID(adc_t
const *pos);
56 adc_t DBH_DTCID(adc_t
const *pos);
59 adc_t DBT_StrawIndex(adc_t
const *pos);
60 uint32_t DBT_TDC0(adc_t
const *pos);
61 uint32_t DBT_TDC1(adc_t
const *pos);
62 uint32_t DBT_TOT0(adc_t
const *pos);
63 uint32_t DBT_TOT1(adc_t
const *pos);
64 std::array<adc_t, 15> DBT_Waveform(adc_t
const *pos);
65 adc_t DBT_Flags(adc_t
const *pos);
68 adc_t DBC_CrystalID(adc_t
const *pos);
69 adc_t DBC_apdID(adc_t
const *pos);
70 adc_t DBC_Time(adc_t
const *pos);
71 adc_t DBC_NumSamples(adc_t
const *pos);
72 adc_t DBC_PeakSampleIdx(adc_t
const *pos);
73 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;
98 inline size_t mu2e::mu2eFragmentReader::blockIndexBytes(
size_t offset)
const
100 if (hdr_block_count() == 0) {
103 else if (offset >= hdr_block_count())
107 else if (offset == 0)
111 return header_()->index[offset - 1];
115 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes()
const {
return mu2eFragment::dataEndBytes(); }
118 inline size_t mu2e::mu2eFragmentReader::blockSizeBytes(
size_t offset)
const
120 if (hdr_block_count() == 0) {
123 else if (offset > hdr_block_count() - 1)
127 else if (offset == 0)
129 return header_()->index[offset];
131 return header_()->index[offset] - header_()->index[offset - 1];
135 inline size_t mu2e::mu2eFragmentReader::blockEndBytes(
size_t offset)
const
137 if (hdr_block_count() == 0) {
140 else if (offset > hdr_block_count() - 1)
144 return header_()->index[offset];
148 inline mu2e::mu2eFragmentReader::Header::data_t
const *mu2e::mu2eFragmentReader::dataAtBytes(
size_t offset)
const
150 return dataBegin() + (offset /
sizeof(Header::data_t));
154 inline mu2e::mu2eFragmentReader::Header::data_t
const *mu2e::mu2eFragmentReader::dataAtBlockIndex(
size_t offset)
const
156 return dataAtBytes(blockIndexBytes(offset));
159 void mu2e::mu2eFragmentReader::printPacketAtByte(
size_t offset)
const
161 std::bitset<128> theArray = bitArray(reinterpret_cast<mu2e::mu2eFragmentReader::adc_t const *>(dataAtBytes(offset)));
163 <<
"Packet Bits (128): ";
164 for (
int i = 0; i < 128; i++) {
165 std::cout << theArray[i];
166 if (i != 0 && i < 128 - 1 && (i + 1) % 8 == 0) {
170 std::cout << std::endl;
174 std::bitset<128> mu2e::mu2eFragmentReader::bitArray(mu2e::mu2eFragmentReader::adc_t
const *beginning)
const
177 std::bitset<128> theArray;
178 for (
int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
179 for (
int offset = 0; offset < 16; offset++) {
180 if (((*((adc_t
const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
181 theArray.set(bitIdx);
185 theArray.reset(bitIdx);
193 void mu2e::mu2eFragmentReader::fillBitArray(std::bitset<128> &theArray,
194 mu2e::mu2eFragmentReader::adc_t
const *beginning)
197 for (
int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
198 for (
int offset = 0; offset < 16; offset++) {
199 if (((*((adc_t
const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
200 theArray.set(bitIdx);
204 theArray.reset(bitIdx);
211 void mu2e::mu2eFragmentReader::printBitArray(std::bitset<128> theArray)
215 <<
"Packet Bits (128): ";
216 for (
int i = 0; i < 128; i++) {
217 std::cout << theArray[i];
219 std::cout << std::endl;
222 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::convertFromBinary(std::bitset<128> theArray,
int minIdx,
225 std::bitset<16> retVal;
226 for (
int i = minIdx + 1; i <= maxIdx; i++) {
227 retVal.set(maxIdx - i, theArray[i]);
229 return retVal.to_ulong();
236 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ByteCount(adc_t
const *pos) {
return *(pos + 0); }
238 bool mu2e::mu2eFragmentReader::DBH_Valid(adc_t
const *pos) {
return (*(pos + 1) >> 15) & 0x0001; }
240 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_ROCID(adc_t
const *pos)
242 return *(pos + 1) & 0x000F;
245 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketType(adc_t
const *pos)
247 return (*(pos + 1) >> 4) & 0x000F;
250 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_PacketCount(adc_t
const *pos)
252 return *(pos + 2) & 0x07FF;
255 uint64_t mu2e::mu2eFragmentReader::DBH_Timestamp(adc_t
const *pos)
257 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
260 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampLow(adc_t
const *pos) {
return *(pos + 3); }
262 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampMedium(adc_t
const *pos) {
return *(pos + 4); }
264 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_TimestampHigh(adc_t
const *pos) {
return *(pos + 5); }
266 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_Status(adc_t
const *pos)
268 return *(pos + 6) & 0x00FF;
271 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_FormatVersion(adc_t
const *pos)
273 return *(pos + 6) >> 8;
276 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_EVBMode(adc_t
const *pos) {
return *(pos + 7) >> 8; }
278 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_SubsystemID(adc_t
const *pos)
280 return (*(pos + 7) >> 6) & 0x0003;
283 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBH_DTCID(adc_t
const *pos)
285 return *(pos + 7) & 0x003F;
291 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_StrawIndex(adc_t
const *pos) {
return *(pos + 8 + 0); }
293 uint32_t mu2e::mu2eFragmentReader::DBT_TDC0(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 1)) & 0xFFFF); }
295 uint32_t mu2e::mu2eFragmentReader::DBT_TDC1(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 2)) & 0xFFFF); }
297 uint32_t mu2e::mu2eFragmentReader::DBT_TOT0(adc_t
const *pos) {
return (uint32_t(*(pos + 8 + 3)) & 0x00FF); }
299 uint32_t mu2e::mu2eFragmentReader::DBT_TOT1(adc_t
const *pos) {
return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF); }
301 std::array<mu2e::mu2eFragmentReader::adc_t, 15> mu2e::mu2eFragmentReader::DBT_Waveform(adc_t
const *pos)
303 std::array<adc_t, 15> waveform;
308 for (
size_t i = 0; i < 4; i += 1) {
309 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
310 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
311 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
313 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
320 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBT_Flags(adc_t
const *pos) {
return (*(pos + 8 + 15) >> 8); }
326 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_CrystalID(adc_t
const *pos)
328 return *(pos + 8 + 0) & 0x0FFF;
331 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_apdID(adc_t
const *pos) {
return *(pos + 8 + 0) >> 12; }
333 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_Time(adc_t
const *pos) {
return *(pos + 8 + 1); }
335 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_NumSamples(adc_t
const *pos)
337 return *(pos + 8 + 2) & 0x00FF;
340 mu2e::mu2eFragmentReader::adc_t mu2e::mu2eFragmentReader::DBC_PeakSampleIdx(adc_t
const *pos)
342 return *(pos + 8 + 2) >> 8;
345 std::vector<mu2e::mu2eFragmentReader::adc_t> mu2e::mu2eFragmentReader::DBC_Waveform(adc_t
const *pos)
347 std::vector<int> waveform(DBC_NumSamples(pos));
348 for (
size_t i = 0; i < waveform.size(); i++) {
349 waveform[i] = *(pos + 8 + 3 + i);