1 #ifndef mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
2 #define mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/DTCFragment.hh"
23 class DTCFragmentWriter;
33 packet_t *dataBegin();
40 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
41 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
44 void set_hdr_timestamp(Header::timestamp_t timestamp) { header_()->timestamp = timestamp; }
46 void resize(
size_t nPackets);
48 size_t size() {
return artdaq_Fragment_.size(); }
51 size_t calc_event_size_words_(
size_t nPackets);
53 static size_t packets_to_words_(
size_t nPackets);
54 static size_t words_to_frag_words_(
size_t nWords);
57 artdaq::Fragment &artdaq_Fragment_;
64 mu2e::DTCFragmentWriter::DTCFragmentWriter(artdaq::Fragment &f) :
DTCFragment(f), artdaq_Fragment_(f) {
70 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t));
72 if (artdaq_Fragment_.size() !=
73 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
74 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
75 std::cerr <<
"Expected size: "
76 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
80 "DTCFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
81 "DTCFragment::Metadata object");
85 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
88 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataBegin() {
89 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
90 return reinterpret_cast<packet_t *
>(header_() + 1);
93 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataEnd() {
return dataBegin() + hdr_packet_count(); }
95 inline void mu2e::DTCFragmentWriter::resize(
size_t nPackets) {
96 auto es(calc_event_size_words_(nPackets));
97 artdaq_Fragment_.resize(words_to_frag_words_(es));
98 header_()->event_size = nPackets;
101 inline size_t mu2e::DTCFragmentWriter::calc_event_size_words_(
size_t nPackets) {
102 return packets_to_words_(nPackets) + hdr_size_words();
105 inline size_t mu2e::DTCFragmentWriter::packets_to_words_(
size_t nPackets) {
return nPackets * words_per_packet_(); }
107 inline size_t mu2e::DTCFragmentWriter::words_to_frag_words_(
size_t nWords) {
108 size_t mod = nWords % words_per_frag_word_();
109 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();