1 #ifndef mu2e_artdaq_core_Overlays_mu2eFragmentWriter_hh
2 #define mu2e_artdaq_core_Overlays_mu2eFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/mu2eFragment.hh"
25 class mu2eFragmentWriter;
35 Header::data_t *dataBegin();
36 Header::data_t *dataAt(
size_t index);
37 Header::data_t *dataEnd();
38 Header::data_t *dataAtBytes(
size_t offset);
44 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
45 return reinterpret_cast<Header *
>(&*artdaq_Fragment_.dataBegin());
48 void set_hdr_fragment_type(Header::data_t type) { header_()->fragment_type = type; }
50 void addSpace(
size_t bytes);
51 void endSubEvt(
size_t bytes);
55 artdaq::Fragment &artdaq_Fragment_;
56 static size_t words_to_frag_words_(
size_t nWords);
63 mu2e::mu2eFragmentWriter::mu2eFragmentWriter(artdaq::Fragment &f) :
mu2eFragment(f), artdaq_Fragment_(f) {
69 TLOG_ARB(TLVL_DEBUG,
"mu2eFragmentWriter") <<
"mu2eFragmentWriter Constructor";
71 assert(
sizeof(Metadata::data_t) ==
sizeof(Header::data_t));
73 if (artdaq_Fragment_.size() !=
74 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
75 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
76 std::cerr <<
"Expected size: "
77 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
81 "mu2eFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
82 "mu2eFragment::Metadata object");
86 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
87 header_()->block_count = 0;
88 memset((
void *)&(header_()->index[0]), 0,
sizeof(
size_t) * mu2e::BLOCK_COUNT_MAX);
91 inline mu2e::mu2eFragmentWriter::Header::data_t *mu2e::mu2eFragmentWriter::dataBegin() {
92 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
93 return reinterpret_cast<Header::data_t *
>(header_() + 1);
96 inline mu2e::mu2eFragmentWriter::Header::data_t *mu2e::mu2eFragmentWriter::dataAt(
size_t index) {
97 if (index == 0)
return dataBegin();
98 auto block = header_()->index[index - 1] /
sizeof(Header::data_t);
99 return reinterpret_cast<Header::data_t *
>(dataBegin() + block);
102 inline mu2e::mu2eFragmentWriter::Header::data_t *mu2e::mu2eFragmentWriter::dataEnd() {
103 return dataAt(hdr_block_count());
106 inline mu2e::mu2eFragmentWriter::Header::data_t *mu2e::mu2eFragmentWriter::dataAtBytes(
size_t offset) {
107 return dataBegin() + (offset /
sizeof(Header::data_t));
110 inline size_t mu2e::mu2eFragmentWriter::words_to_frag_words_(
size_t nWords) {
111 size_t mod = nWords % words_per_frag_word_();
112 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
115 void mu2e::mu2eFragmentWriter::addSpace(
size_t bytes) {
116 TLOG_ARB(10,
"mu2eFragmentWriter") <<
"addSpace: START bytes=" << bytes;
117 auto currSize =
sizeof(artdaq::Fragment::value_type) * artdaq_Fragment_.size();
118 TLOG_ARB(10,
"mu2eFragmentWriter") <<
"addSpace: Resizing fragment: additional bytes requested: " << bytes
119 <<
", size of fragment: " << currSize;
120 artdaq_Fragment_.resizeBytes(bytes + currSize);
123 void mu2e::mu2eFragmentWriter::endSubEvt(
size_t bytes) {
124 TLOG_ARB(11,
"mu2eFragmentWriter") <<
"endSubEvt START bytes=" << bytes;
125 header_()->index[hdr_block_count()] = blockOffset(hdr_block_count()) + bytes;
126 header_()->block_count++;
127 TLOG_ARB(11,
"mu2eFragmentWriter") <<
"endSubEvt END";