1 #ifndef mu2e_artdaq_Overlays_DetectorFragmentWriter_hh
2 #define mu2e_artdaq_Overlays_DetectorFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
23 class DetectorFragmentWriter;
45 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words ));
46 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
49 void set_hdr_run_number(Header::run_number_t run_number) {
50 header_()->run_number = run_number;
53 void resize(
size_t nAdcs);
55 virtual void printAll() {};
57 void generateOffsetTable(
const std::vector<size_t> dataBlockVec);
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::DetectorFragmentWriter::DetectorFragmentWriter(artdaq::Fragment& f ) :
81 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t) );
84 if (artdaq_Fragment_.size() !=
85 artdaq::detail::RawFragmentHeader::num_words() +
86 words_to_frag_words_( Metadata::size_words ))
88 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
89 std::cerr <<
"Expected size: " << artdaq::detail::RawFragmentHeader::num_words() +
90 words_to_frag_words_( Metadata::size_words) << std::endl;
92 throw cet::exception(
"DetectorFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the DetectorFragment::Metadata object");
96 artdaq_Fragment_.resize( words_to_frag_words_(Header::size_words) );
100 inline mu2e::DetectorFragment::adc_t * mu2e::DetectorFragmentWriter::dataBegin() {
101 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
103 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
106 inline mu2e::DetectorFragment::adc_t * mu2e::DetectorFragmentWriter::dataEnd() {
107 return dataBegin() + total_adc_values_in_data_block();
112 inline void mu2e::DetectorFragmentWriter::resize(
size_t nAdcs) {
113 auto es(calc_event_size_words_(nAdcs));
114 artdaq_Fragment_.resize(words_to_frag_words_(es));
115 header_()->event_size = es;
118 inline size_t mu2e::DetectorFragmentWriter::calc_event_size_words_(
size_t nAdcs) {
119 return adcs_to_words_(nAdcs) + hdr_size_words();
122 inline size_t mu2e::DetectorFragmentWriter::adcs_to_words_(
size_t nAdcs) {
123 auto mod(nAdcs % adcs_per_word_());
125 nAdcs / adcs_per_word_() :
126 nAdcs / adcs_per_word_() + 1;
129 inline size_t mu2e::DetectorFragmentWriter::words_to_frag_words_(
size_t nWords) {
130 size_t mod = nWords % words_per_frag_word_();
132 nWords / words_per_frag_word_() + 1 :
133 nWords / words_per_frag_word_();
136 inline void mu2e::DetectorFragmentWriter::generateOffsetTable(
const std::vector<size_t> dataBlockVec) {
142 *(dataBegin()) = (adc_t)dataBlockVec.size();
143 for(
size_t cur_index = 0, cur_offset = dataBlockVec.size()+1; cur_index < dataBlockVec.size(); cur_index++) {
146 cur_offset += 8*dataBlockVec[cur_index];
147 *(dataBegin()+1+cur_index) = (adc_t)cur_offset;
149 setDataBlockIndex(0);