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