00001 #ifndef mu2e_artdaq_Overlays_DetectorFragmentWriter_hh
00002 #define mu2e_artdaq_Overlays_DetectorFragmentWriter_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/DetectorFragment.hh"
00019
00020 #include <iostream>
00021
00022 namespace mu2e {
00023 class DetectorFragmentWriter;
00024 }
00025
00026 class mu2e::DetectorFragmentWriter : public mu2e::DetectorFragment
00027 {
00028 public:
00029 DetectorFragmentWriter(artdaq::Fragment &f);
00030
00031 virtual ~DetectorFragmentWriter(){};
00032
00033
00034
00035
00036 adc_t *dataBegin();
00037 adc_t *dataEnd();
00038
00039
00040
00041
00042 Header *header_()
00043 {
00044 assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
00045 return reinterpret_cast<Header *>(&*artdaq_Fragment_.dataBegin());
00046 }
00047
00048 void set_hdr_run_number(Header::run_number_t run_number) { header_()->run_number = run_number; }
00049
00050 void resize(size_t nAdcs);
00051
00052 virtual void printAll(){};
00053
00054 void generateOffsetTable(const std::vector<size_t> dataBlockVec);
00055
00056 private:
00057 size_t calc_event_size_words_(size_t nAdcs);
00058
00059 static size_t adcs_to_words_(size_t nAdcs);
00060 static size_t words_to_frag_words_(size_t nWords);
00061
00062
00063 artdaq::Fragment &artdaq_Fragment_;
00064 };
00065
00066
00067
00068
00069
00070 mu2e::DetectorFragmentWriter::DetectorFragmentWriter(artdaq::Fragment &f)
00071 : DetectorFragment(f), artdaq_Fragment_(f)
00072 {
00073
00074
00075
00076
00077
00078 assert(sizeof(Metadata::data_t) == sizeof(Header::data_t));
00079
00080 if (artdaq_Fragment_.size() !=
00081 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
00082 std::cerr << "artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
00083 std::cerr << "Expected size: "
00084 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
00085 << std::endl;
00086
00087 throw cet::exception(
00088 "DetectorFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
00089 "DetectorFragment::Metadata object");
00090 }
00091
00092
00093 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
00094 }
00095
00096 inline mu2e::DetectorFragment::adc_t *mu2e::DetectorFragmentWriter::dataBegin()
00097 {
00098 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00099
00100 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
00101 }
00102
00103 inline mu2e::DetectorFragment::adc_t *mu2e::DetectorFragmentWriter::dataEnd()
00104 {
00105 return dataBegin() + total_adc_values_in_data_block();
00106
00107 }
00108
00109 inline void mu2e::DetectorFragmentWriter::resize(size_t nAdcs)
00110 {
00111 auto es(calc_event_size_words_(nAdcs));
00112 artdaq_Fragment_.resize(words_to_frag_words_(es));
00113 header_()->event_size = es;
00114 }
00115
00116 inline size_t mu2e::DetectorFragmentWriter::calc_event_size_words_(size_t nAdcs)
00117 {
00118 return adcs_to_words_(nAdcs) + hdr_size_words();
00119 }
00120
00121 inline size_t mu2e::DetectorFragmentWriter::adcs_to_words_(size_t nAdcs)
00122 {
00123 auto mod(nAdcs % adcs_per_word_());
00124 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
00125 }
00126
00127 inline size_t mu2e::DetectorFragmentWriter::words_to_frag_words_(size_t nWords)
00128 {
00129 size_t mod = nWords % words_per_frag_word_();
00130 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
00131 }
00132
00133 inline void mu2e::DetectorFragmentWriter::generateOffsetTable(const std::vector<size_t> dataBlockVec)
00134 {
00135 initializeOffset();
00136
00137
00138
00139
00140 *(dataBegin()) = (adc_t)dataBlockVec.size();
00141 for (size_t cur_index = 0, cur_offset = dataBlockVec.size() + 1; cur_index < dataBlockVec.size(); cur_index++) {
00142
00143
00144 cur_offset += 8 * dataBlockVec[cur_index];
00145 *(dataBegin() + 1 + cur_index) = (adc_t)cur_offset;
00146 }
00147 setDataBlockIndex(0);
00148
00149 return;
00150 }
00151
00152 #endif