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;
36 packet_t * dataBegin();
43 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words ));
44 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
47 void set_hdr_timestamp(Header::timestamp_t timestamp) {
48 header_()->timestamp = timestamp;
51 void resize(
size_t nPackets);
53 size_t size() {
return artdaq_Fragment_.size(); }
56 size_t calc_event_size_words_(
size_t nPackets);
58 static size_t packets_to_words_(
size_t nPackets);
59 static size_t words_to_frag_words_(
size_t nWords);
62 artdaq::Fragment & artdaq_Fragment_;
69 mu2e::DTCFragmentWriter::DTCFragmentWriter(artdaq::Fragment& f ) :
77 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t) );
80 if (artdaq_Fragment_.size() !=
81 artdaq::detail::RawFragmentHeader::num_words() +
82 words_to_frag_words_( Metadata::size_words ))
84 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
85 std::cerr <<
"Expected size: " << artdaq::detail::RawFragmentHeader::num_words() +
86 words_to_frag_words_( Metadata::size_words) << std::endl;
88 throw cet::exception(
"DTCFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the DTCFragment::Metadata object");
92 artdaq_Fragment_.resize( words_to_frag_words_(Header::size_words) );
96 inline mu2e::packet_t * mu2e::DTCFragmentWriter::dataBegin() {
97 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
98 return reinterpret_cast<packet_t *
>(header_() + 1);
101 inline mu2e::packet_t * mu2e::DTCFragmentWriter::dataEnd() {
102 return dataBegin() + hdr_packet_count();
106 inline void mu2e::DTCFragmentWriter::resize(
size_t nPackets) {
107 auto es(calc_event_size_words_(nPackets));
108 artdaq_Fragment_.resize(words_to_frag_words_(es));
109 header_()->event_size = nPackets;
112 inline size_t mu2e::DTCFragmentWriter::calc_event_size_words_(
size_t nPackets) {
113 return packets_to_words_(nPackets) + hdr_size_words();
116 inline size_t mu2e::DTCFragmentWriter::packets_to_words_(
size_t nPackets) {
117 return nPackets * words_per_packet_();
120 inline size_t mu2e::DTCFragmentWriter::words_to_frag_words_(
size_t nWords) {
121 size_t mod = nWords % words_per_frag_word_();
123 nWords / words_per_frag_word_() + 1 :
124 nWords / words_per_frag_word_();