1 #ifndef mu2e_artdaq_Overlays_DetectorFragment_hh
2 #define mu2e_artdaq_Overlays_DetectorFragment_hh
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "cetlib_except/exception.h"
22 class DetectorFragment;
25 std::ostream &operator<<(std::ostream &, DetectorFragment
const &);
34 typedef uint16_t adc_t;
46 typedef uint32_t data_t;
49 data_t board_serial_number : 16;
50 data_t num_adc_bits : 8;
53 static size_t const size_words = 1ul;
56 static_assert(
sizeof(
Metadata) == Metadata::size_words *
sizeof(Metadata::data_t),
57 "DetectorFragment::Metadata size changed");
76 typedef uint32_t data_t;
78 typedef uint32_t event_size_t;
79 typedef uint32_t run_number_t;
81 event_size_t event_size : 28;
82 event_size_t unused_1 : 4;
84 run_number_t run_number : 32;
86 static size_t const size_words = 2ul;
89 static_assert(
sizeof(
Header) == Header::size_words *
sizeof(Header::data_t),
"DetectorFragment::Header size changed");
95 : current_offset_(0), current_offset_index_(0), artdaq_Fragment_(f) {}
101 Header::event_size_t hdr_event_size()
const {
return header_()->event_size; }
102 Header::run_number_t hdr_run_number()
const {
return header_()->run_number; }
103 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
106 size_t total_adc_values()
const {
return (hdr_event_size() - hdr_size_words()) * adcs_per_word_(); }
108 size_t total_adc_values_in_data_block()
const
110 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
111 return 8 * (size_t(packetCount) + 1);
115 adc_t
const *dataBegin()
const {
return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1)); }
117 adc_t
const *dataEnd()
const {
return dataBegin() + total_adc_values(); }
121 adc_t
const *dataBlockBegin()
const
123 return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1)) + current_offset_;
127 adc_t
const *dataBlockEnd()
const {
return dataBlockBegin() + total_adc_values_in_data_block(); }
136 adc_t
const *findBadADC(
int daq_adc_bits)
const
138 return std::find_if(dataBegin(), dataEnd(),
139 [&](mu2e::DetectorFragment::adc_t
const adc) ->
bool {
return (adc >> daq_adc_bits); });
142 bool fastVerify(
int daq_adc_bits)
const {
return (findBadADC(daq_adc_bits) == dataEnd()); };
145 void checkADCData(
int daq_adc_bits)
const;
148 size_t adc_range(
int daq_adc_bits) {
return (1ul << daq_adc_bits); }
150 size_t numDataBlocks()
152 size_t data_counter = 0;
153 size_t numDataBlocks = 0;
154 size_t totalPacketsRead = 0;
155 for (mu2e::DetectorFragment::adc_t
const *curPos = dataBegin(); curPos != dataEnd(); curPos += 8) {
156 if (data_counter == 0) {
160 mu2e::DetectorFragment::adc_t packetType = convertFromBinary(bitArray(curPos), 127 - 24, 127 - 20);
161 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos), 127 - 43, 127 - 32);
163 data_counter = packetCount;
165 if (packetType == 5 || packetType == 0x1 ||
178 throw cet::exception(
"Error in DetectorFragment: Non-dataheader packet found in dataheader packet location");
188 return numDataBlocks;
191 size_t offset() {
return current_offset_; }
193 size_t offsetIndex() {
return current_offset_index_; }
195 bool setDataBlockIndex(
size_t theIndex)
197 size_t numDB = numDataBlocks();
198 if (theIndex < numDB) {
199 current_offset_index_ = theIndex;
203 mu2e::DetectorFragment::adc_t
const *curPos = dataBegin();
204 bool foundBlock =
false;
205 while (!foundBlock) {
206 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos), 127 - 43, 127 - 32);
207 if (blockNum == theIndex) {
215 curPos += 8 * (size_t(packetCount) + 1);
217 current_offset_ += 8 * (size_t(packetCount) + 1);
237 std::vector<adc_t> timestampVector();
238 std::vector<adc_t> dataVector();
239 void printDTCHeader();
240 virtual void printAll();
248 static constexpr
size_t adcs_per_word_() {
return sizeof(Header::data_t) /
sizeof(adc_t); }
250 static constexpr
size_t words_per_frag_word_()
252 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
259 Header
const *header_()
const
261 return reinterpret_cast<DetectorFragment::Header
const *
>(&*artdaq_Fragment_.dataBegin());
271 std::bitset<128> bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const;
275 void fillBitArray(std::bitset<128> &theArray, adc_t
const *beginning);
277 void printBitArray(std::bitset<128> theArray);
282 mu2e::DetectorFragment::adc_t convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const;
285 size_t current_offset_;
286 size_t current_offset_index_;
292 artdaq::Fragment
const &artdaq_Fragment_;