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),
"DetectorFragment::Metadata size changed");
75 typedef uint32_t data_t;
77 typedef uint32_t event_size_t;
78 typedef uint32_t run_number_t;
80 event_size_t event_size : 28;
81 event_size_t unused_1 : 4;
83 run_number_t run_number : 32;
85 static size_t const size_words = 2ul;
88 static_assert (
sizeof (
Header) == Header::size_words *
sizeof (Header::data_t),
"DetectorFragment::Header size changed");
95 current_offset_index_(0),
103 Header::event_size_t hdr_event_size()
const {
return header_()->event_size; }
104 Header::run_number_t hdr_run_number()
const {
return header_()->run_number; }
105 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
108 size_t total_adc_values()
const {
109 return (hdr_event_size() - hdr_size_words()) * adcs_per_word_();
112 size_t total_adc_values_in_data_block()
const {
113 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(dataBlockBegin()),127-43,127-32);
114 return 8*(size_t(packetCount) + 1);
118 adc_t
const * dataBegin()
const {
119 return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1));
122 adc_t
const * dataEnd()
const {
123 return dataBegin() + total_adc_values();
128 adc_t
const * dataBlockBegin()
const {
129 return (reinterpret_cast<mu2e::DetectorFragment::adc_t const *>(header_() + 1)) + current_offset_;
133 adc_t
const * dataBlockEnd()
const {
134 return dataBlockBegin() + total_adc_values_in_data_block();
144 adc_t
const * findBadADC(
int daq_adc_bits)
const {
145 return std::find_if(dataBegin(), dataEnd(),
146 [&](mu2e::DetectorFragment::adc_t
const adc) ->
bool {
147 return (adc >> daq_adc_bits); });
150 bool fastVerify(
int daq_adc_bits)
const {
151 return (findBadADC(daq_adc_bits) == dataEnd());
155 void checkADCData(
int daq_adc_bits)
const;
159 size_t adc_range(
int daq_adc_bits) {
160 return (1ul << daq_adc_bits );
163 size_t numDataBlocks() {
165 size_t data_counter = 0;
166 size_t numDataBlocks = 0;
167 size_t totalPacketsRead = 0;
168 for(mu2e::DetectorFragment::adc_t
const *curPos = dataBegin();
171 if(data_counter==0) {
177 mu2e::DetectorFragment::adc_t packetType = convertFromBinary(bitArray(curPos),127-24,127-20);
178 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos),127-43,127-32);
180 data_counter = packetCount;
182 if(packetType==5 || packetType == 0x1 || packetType == 0x2) {
192 throw cet::exception(
"Error in DetectorFragment: Non-dataheader packet found in dataheader packet location");
200 return numDataBlocks;
204 return current_offset_;
207 size_t offsetIndex() {
208 return current_offset_index_;
211 bool setDataBlockIndex(
size_t theIndex) {
212 size_t numDB = numDataBlocks();
214 current_offset_index_ = theIndex;
218 mu2e::DetectorFragment::adc_t
const *curPos = dataBegin();
219 bool foundBlock =
false;
221 mu2e::DetectorFragment::adc_t packetCount = convertFromBinary(bitArray(curPos),127-43,127-32);
222 if(blockNum==theIndex) {
228 curPos += 8*(size_t(packetCount) + 1);
230 current_offset_ += 8*(size_t(packetCount) + 1);
248 std::vector<adc_t> timestampVector();
249 std::vector<adc_t> dataVector();
250 void printDTCHeader();
251 virtual void printAll();
260 static constexpr
size_t adcs_per_word_() {
261 return sizeof(Header::data_t) /
sizeof(adc_t);
264 static constexpr
size_t words_per_frag_word_() {
265 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
272 Header
const * header_()
const {
273 return reinterpret_cast<DetectorFragment::Header
const *
>(&*artdaq_Fragment_.dataBegin());
283 std::bitset<128> bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const;
287 void fillBitArray(std::bitset<128> &theArray, adc_t
const * beginning);
289 void printBitArray(std::bitset<128> theArray);
294 mu2e::DetectorFragment::adc_t convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const;
297 size_t current_offset_;
298 size_t current_offset_index_;
305 artdaq::Fragment
const & artdaq_Fragment_;