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 &);
33 typedef uint16_t adc_t;
44 typedef uint32_t data_t;
47 data_t board_serial_number : 16;
48 data_t num_adc_bits : 8;
51 static size_t const size_words = 1ul;
54 static_assert(
sizeof(
Metadata) == Metadata::size_words *
sizeof(Metadata::data_t),
55 "DetectorFragment::Metadata size changed");
73 typedef uint32_t data_t;
75 typedef uint32_t event_size_t;
76 typedef uint32_t run_number_t;
78 event_size_t event_size : 28;
79 event_size_t unused_1 : 4;
81 run_number_t run_number : 32;
83 static size_t const size_words = 2ul;
86 static_assert(
sizeof(
Header) == Header::size_words *
sizeof(Header::data_t),
"DetectorFragment::Header size changed");
91 DetectorFragment(artdaq::Fragment
const &f) : current_offset_(0), current_offset_index_(0), artdaq_Fragment_(f) {}
97 Header::event_size_t hdr_event_size()
const {
return header_()->event_size; }
98 Header::run_number_t hdr_run_number()
const {
return header_()->run_number; }
99 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
102 size_t total_adc_values()
const {
return (hdr_event_size() - hdr_size_words()) * adcs_per_word_(); }
104 size_t total_adc_values_in_data_block()
const {
105 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
106 return 8 * (size_t(packetCount) + 1);
110 adc_t
const *dataBegin()
const {
return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1)); }
112 adc_t
const *dataEnd()
const {
return dataBegin() + total_adc_values(); }
116 adc_t
const *dataBlockBegin()
const {
117 return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1)) + current_offset_;
121 adc_t
const *dataBlockEnd()
const {
return dataBlockBegin() + total_adc_values_in_data_block(); }
130 adc_t
const *findBadADC(
int daq_adc_bits)
const {
131 return std::find_if(dataBegin(), dataEnd(),
132 [&](mu2e::DetectorFragment::adc_t
const adc) ->
bool {
return (adc >> daq_adc_bits); });
135 bool fastVerify(
int daq_adc_bits)
const {
return (findBadADC(daq_adc_bits) == dataEnd()); };
138 void checkADCData(
int daq_adc_bits)
const;
141 size_t adc_range(
int daq_adc_bits) {
return (1ul << daq_adc_bits); }
143 size_t numDataBlocks() {
144 size_t data_counter = 0;
145 size_t numDataBlocks = 0;
146 size_t totalPacketsRead = 0;
147 for (mu2e::DetectorFragment::adc_t
const *curPos = dataBegin(); curPos != dataEnd(); curPos += 8) {
148 if (data_counter == 0) {
152 mu2e::DetectorFragment::adc_t packetType = convertFromBinary(bitArray(curPos), 127 - 24, 127 - 20);
153 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos), 127 - 43, 127 - 32);
155 data_counter = packetCount;
157 if (packetType == 5 || packetType == 0x1 ||
168 throw cet::exception(
"Error in DetectorFragment: Non-dataheader packet found in dataheader packet location");
176 return numDataBlocks;
179 size_t offset() {
return current_offset_; }
181 size_t offsetIndex() {
return current_offset_index_; }
183 bool setDataBlockIndex(
size_t theIndex) {
184 size_t numDB = numDataBlocks();
185 if (theIndex < numDB) {
186 current_offset_index_ = theIndex;
190 mu2e::DetectorFragment::adc_t
const *curPos = dataBegin();
191 bool foundBlock =
false;
192 while (!foundBlock) {
193 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos), 127 - 43, 127 - 32);
194 if (blockNum == theIndex) {
200 curPos += 8 * (size_t(packetCount) + 1);
202 current_offset_ += 8 * (size_t(packetCount) + 1);
220 std::vector<adc_t> timestampVector();
221 std::vector<adc_t> dataVector();
222 void printDTCHeader();
223 virtual void printAll();
231 static constexpr
size_t adcs_per_word_() {
return sizeof(Header::data_t) /
sizeof(adc_t); }
233 static constexpr
size_t words_per_frag_word_() {
234 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
241 Header
const *header_()
const {
242 return reinterpret_cast<DetectorFragment::Header
const *
>(&*artdaq_Fragment_.dataBegin());
252 std::bitset<128> bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const;
256 void fillBitArray(std::bitset<128> &theArray, adc_t
const *beginning);
258 void printBitArray(std::bitset<128> theArray);
263 mu2e::DetectorFragment::adc_t convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const;
266 size_t current_offset_;
267 size_t current_offset_index_;
273 artdaq::Fragment
const &artdaq_Fragment_;