00001 #ifndef mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
00002 #define mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
00003
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017 #include "artdaq-core/Data/Fragment.hh"
00018 #include "mu2e-artdaq-core/Overlays/DTCFragment.hh"
00019
00020 #include <iostream>
00021
00022 namespace mu2e {
00023 class DTCFragmentWriter;
00024 }
00025
00026 class mu2e::DTCFragmentWriter : public mu2e::DTCFragment
00027 {
00028 public:
00029 DTCFragmentWriter(artdaq::Fragment &f);
00030
00031
00032
00033
00034 packet_t *dataBegin();
00035 packet_t *dataEnd();
00036
00037
00038
00039
00040 Header *header_()
00041 {
00042 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
00043 return reinterpret_cast<Header *>(&*artdaq_Fragment_.dataBegin());
00044 }
00045
00046 void set_hdr_timestamp(Header::timestamp_t timestamp) { header_()->timestamp = timestamp; }
00047
00048 void resize(size_t nPackets);
00049
00050 size_t size() { return artdaq_Fragment_.size(); }
00051
00052 private:
00053 size_t calc_event_size_words_(size_t nPackets);
00054
00055 static size_t packets_to_words_(size_t nPackets);
00056 static size_t words_to_frag_words_(size_t nWords);
00057
00058
00059 artdaq::Fragment &artdaq_Fragment_;
00060 };
00061
00062
00063
00064
00065
00066 mu2e::DTCFragmentWriter::DTCFragmentWriter(artdaq::Fragment &f)
00067 : DTCFragment(f), artdaq_Fragment_(f)
00068 {
00069
00070
00071
00072
00073
00074 assert(sizeof(Metadata::data_t) == sizeof(Header::data_t));
00075
00076 if (artdaq_Fragment_.size() !=
00077 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
00078 std::cerr << "artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
00079 std::cerr << "Expected size: "
00080 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
00081 << std::endl;
00082
00083 throw cet::exception(
00084 "DTCFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
00085 "DTCFragment::Metadata object");
00086 }
00087
00088
00089 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
00090 }
00091
00092 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataBegin()
00093 {
00094 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00095 return reinterpret_cast<packet_t *>(header_() + 1);
00096 }
00097
00098 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataEnd() { return dataBegin() + hdr_packet_count(); }
00099
00100 inline void mu2e::DTCFragmentWriter::resize(size_t nPackets)
00101 {
00102 auto es(calc_event_size_words_(nPackets));
00103 artdaq_Fragment_.resize(words_to_frag_words_(es));
00104 header_()->event_size = nPackets;
00105 }
00106
00107 inline size_t mu2e::DTCFragmentWriter::calc_event_size_words_(size_t nPackets)
00108 {
00109 return packets_to_words_(nPackets) + hdr_size_words();
00110 }
00111
00112 inline size_t mu2e::DTCFragmentWriter::packets_to_words_(size_t nPackets) { return nPackets * words_per_packet_(); }
00113
00114 inline size_t mu2e::DTCFragmentWriter::words_to_frag_words_(size_t nWords)
00115 {
00116 size_t mod = nWords % words_per_frag_word_();
00117 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
00118 }
00119
00120 #endif