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 public:
00028 TrackerFragmentWriter(artdaq::Fragment &f);
00029
00030 virtual ~TrackerFragmentWriter(){};
00031
00032
00033
00034
00035 adc_t *dataBegin();
00036 adc_t *dataEnd();
00037
00038 adc_t *dataBlockBegin();
00039 adc_t *dataBlockEnd();
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) { header_()->run_number = run_number; }
00050
00051 void resize(size_t nAdcs);
00052
00053
00054
00055
00056
00057 private:
00058 size_t calc_event_size_words_(size_t nAdcs);
00059
00060 static size_t adcs_to_words_(size_t nAdcs);
00061 static size_t words_to_frag_words_(size_t nWords);
00062
00063
00064 artdaq::Fragment &artdaq_Fragment_;
00065 };
00066
00067
00068
00069
00070
00071 mu2e::TrackerFragmentWriter::TrackerFragmentWriter(artdaq::Fragment &f)
00072 : TrackerFragmentReader(f), artdaq_Fragment_(f) {
00073
00074
00075
00076
00077
00078
00079
00080 assert(sizeof(Metadata::data_t) == sizeof(Header::data_t));
00081
00082 if (artdaq_Fragment_.size() !=
00083 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
00084 std::cerr << "artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
00085 std::cerr << "Expected size: "
00086 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
00087 << std::endl;
00088
00089 throw cet::exception(
00090 "TrackerFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
00091 "DetectorFragment::Metadata object");
00092 }
00093
00094
00095 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
00096 }
00097
00098 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBegin() {
00099 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00100 return reinterpret_cast<adc_t *>(header_() + 1);
00101 }
00102
00103 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataEnd() {
00104 return dataBegin() + total_adc_values();
00105 }
00106
00107 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBlockBegin() {
00108 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00109 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
00110 }
00111
00112 inline mu2e::DetectorFragment::adc_t *mu2e::TrackerFragmentWriter::dataBlockEnd() {
00113 return dataBegin() + total_adc_values_in_data_block();
00114 }
00115
00116 inline void mu2e::TrackerFragmentWriter::resize(size_t nAdcs) {
00117 auto es(calc_event_size_words_(nAdcs));
00118 artdaq_Fragment_.resize(words_to_frag_words_(es));
00119 header_()->event_size = es;
00120 }
00121
00122 inline size_t mu2e::TrackerFragmentWriter::calc_event_size_words_(size_t nAdcs) {
00123 return adcs_to_words_(nAdcs) + hdr_size_words();
00124 }
00125
00126 inline size_t mu2e::TrackerFragmentWriter::adcs_to_words_(size_t nAdcs) {
00127 auto mod(nAdcs % adcs_per_word_());
00128 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
00129 }
00130
00131 inline size_t mu2e::TrackerFragmentWriter::words_to_frag_words_(size_t nWords) {
00132 size_t mod = nWords % words_per_frag_word_();
00133 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
00134 }
00135
00136 #endif