1 #ifndef mu2e_artdaq_Overlays_CosmicVetoFragmentWriter_hh
2 #define mu2e_artdaq_Overlays_CosmicVetoFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/CosmicVetoFragmentReader.hh"
23 class CosmicVetoFragmentWriter;
41 adc_t * dataBlockBegin();
42 adc_t * dataBlockEnd();
49 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words ));
50 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
53 void set_hdr_run_number(Header::run_number_t run_number) {
54 header_()->run_number = run_number;
57 void resize(
size_t nAdcs);
64 size_t calc_event_size_words_(
size_t nAdcs);
66 static size_t adcs_to_words_(
size_t nAdcs);
67 static size_t words_to_frag_words_(
size_t nWords);
70 artdaq::Fragment & artdaq_Fragment_;
77 mu2e::CosmicVetoFragmentWriter::CosmicVetoFragmentWriter(artdaq::Fragment& f ) :
86 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t) );
89 if (artdaq_Fragment_.size() !=
90 artdaq::detail::RawFragmentHeader::num_words() +
91 words_to_frag_words_( Metadata::size_words ))
93 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
94 std::cerr <<
"Expected size: " << artdaq::detail::RawFragmentHeader::num_words() +
95 words_to_frag_words_( Metadata::size_words) << std::endl;
97 throw cet::exception(
"CosmicVetoFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the DetectorFragment::Metadata object");
101 artdaq_Fragment_.resize( words_to_frag_words_(Header::size_words) );
105 inline mu2e::DetectorFragment::adc_t * mu2e::CosmicVetoFragmentWriter::dataBegin() {
106 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
107 return reinterpret_cast<adc_t *
>(header_() + 1);
110 inline mu2e::DetectorFragment::adc_t * mu2e::CosmicVetoFragmentWriter::dataEnd() {
111 return dataBegin() + total_adc_values();
114 inline mu2e::DetectorFragment::adc_t * mu2e::CosmicVetoFragmentWriter::dataBlockBegin() {
115 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
116 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
119 inline mu2e::DetectorFragment::adc_t * mu2e::CosmicVetoFragmentWriter::dataBlockEnd() {
120 return dataBegin() + total_adc_values_in_data_block();
123 inline void mu2e::CosmicVetoFragmentWriter::resize(
size_t nAdcs) {
124 auto es(calc_event_size_words_(nAdcs));
125 artdaq_Fragment_.resize(words_to_frag_words_(es));
126 header_()->event_size = es;
129 inline size_t mu2e::CosmicVetoFragmentWriter::calc_event_size_words_(
size_t nAdcs) {
130 return adcs_to_words_(nAdcs) + hdr_size_words();
133 inline size_t mu2e::CosmicVetoFragmentWriter::adcs_to_words_(
size_t nAdcs) {
134 auto mod(nAdcs % adcs_per_word_());
136 nAdcs / adcs_per_word_() :
137 nAdcs / adcs_per_word_() + 1;
140 inline size_t mu2e::CosmicVetoFragmentWriter::words_to_frag_words_(
size_t nWords) {
141 size_t mod = nWords % words_per_frag_word_();
143 nWords / words_per_frag_word_() + 1 :
144 nWords / words_per_frag_word_();