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 public:
00028 DetectorFragmentWriter(artdaq::Fragment &f);
00029
00030 virtual ~DetectorFragmentWriter(){};
00031
00032
00033
00034
00035 adc_t *dataBegin();
00036 adc_t *dataEnd();
00037
00038
00039
00040
00041 Header *header_() {
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_run_number(Header::run_number_t run_number) { header_()->run_number = run_number; }
00047
00048 void resize(size_t nAdcs);
00049
00050 virtual void printAll(){};
00051
00052 void generateOffsetTable(const std::vector<size_t> dataBlockVec);
00053
00054 private:
00055 size_t calc_event_size_words_(size_t nAdcs);
00056
00057 static size_t adcs_to_words_(size_t nAdcs);
00058 static size_t words_to_frag_words_(size_t nWords);
00059
00060
00061 artdaq::Fragment &artdaq_Fragment_;
00062 };
00063
00064
00065
00066
00067
00068 mu2e::DetectorFragmentWriter::DetectorFragmentWriter(artdaq::Fragment &f) : DetectorFragment(f), artdaq_Fragment_(f) {
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 "DetectorFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
00085 "DetectorFragment::Metadata object");
00086 }
00087
00088
00089 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
00090 }
00091
00092 inline mu2e::DetectorFragment::adc_t *mu2e::DetectorFragmentWriter::dataBegin() {
00093 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00094
00095 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
00096 }
00097
00098 inline mu2e::DetectorFragment::adc_t *mu2e::DetectorFragmentWriter::dataEnd() {
00099 return dataBegin() + total_adc_values_in_data_block();
00100
00101 }
00102
00103 inline void mu2e::DetectorFragmentWriter::resize(size_t nAdcs) {
00104 auto es(calc_event_size_words_(nAdcs));
00105 artdaq_Fragment_.resize(words_to_frag_words_(es));
00106 header_()->event_size = es;
00107 }
00108
00109 inline size_t mu2e::DetectorFragmentWriter::calc_event_size_words_(size_t nAdcs) {
00110 return adcs_to_words_(nAdcs) + hdr_size_words();
00111 }
00112
00113 inline size_t mu2e::DetectorFragmentWriter::adcs_to_words_(size_t nAdcs) {
00114 auto mod(nAdcs % adcs_per_word_());
00115 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
00116 }
00117
00118 inline size_t mu2e::DetectorFragmentWriter::words_to_frag_words_(size_t nWords) {
00119 size_t mod = nWords % words_per_frag_word_();
00120 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
00121 }
00122
00123 inline void mu2e::DetectorFragmentWriter::generateOffsetTable(const std::vector<size_t> dataBlockVec) {
00124 initializeOffset();
00125
00126
00127
00128
00129 *(dataBegin()) = (adc_t)dataBlockVec.size();
00130 for (size_t cur_index = 0, cur_offset = dataBlockVec.size() + 1; cur_index < dataBlockVec.size(); cur_index++) {
00131
00132
00133 cur_offset += 8 * dataBlockVec[cur_index];
00134 *(dataBegin() + 1 + cur_index) = (adc_t)cur_offset;
00135 }
00136 setDataBlockIndex(0);
00137
00138 return;
00139 }
00140
00141 #endif