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