1 #ifndef mu2e_artdaq_Overlays_TrackerFragmentWriter_hh
2 #define mu2e_artdaq_Overlays_TrackerFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/TrackerFragmentReader.hh"
23 class TrackerFragmentWriter;
39 adc_t *dataBlockBegin();
40 adc_t *dataBlockEnd();
47 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
48 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
51 void set_hdr_run_number(Header::run_number_t run_number) { header_()->run_number = run_number; }
53 void resize(
size_t nAdcs);
60 size_t calc_event_size_words_(
size_t nAdcs);
62 static size_t adcs_to_words_(
size_t nAdcs);
63 static size_t words_to_frag_words_(
size_t nWords);
66 artdaq::Fragment &artdaq_Fragment_;
73 mu2e::TrackerFragmentWriter::TrackerFragmentWriter(artdaq::Fragment &f)
83 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t));
85 if (artdaq_Fragment_.size() !=
86 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
87 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
88 std::cerr <<
"Expected size: "
89 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
93 "TrackerFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
94 "DetectorFragment::Metadata object");
98 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
101 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBegin()
103 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
104 return reinterpret_cast<adc_t *
>(header_() + 1);
107 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataEnd()
109 return dataBegin() + total_adc_values();
112 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBlockBegin()
114 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
115 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
118 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBlockEnd()
120 return dataBegin() + total_adc_values_in_data_block();
123 inline void mu2e::TrackerFragmentWriter::resize(
size_t nAdcs)
125 auto es(calc_event_size_words_(nAdcs));
126 artdaq_Fragment_.resize(words_to_frag_words_(es));
127 header_()->event_size = es;
130 inline size_t mu2e::TrackerFragmentWriter::calc_event_size_words_(
size_t nAdcs)
132 return adcs_to_words_(nAdcs) + hdr_size_words();
135 inline size_t mu2e::TrackerFragmentWriter::adcs_to_words_(
size_t nAdcs)
137 auto mod(nAdcs % adcs_per_word_());
138 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
141 inline size_t mu2e::TrackerFragmentWriter::words_to_frag_words_(
size_t nWords)
143 size_t mod = nWords % words_per_frag_word_();
144 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();