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