00001 #ifndef mu2e_artdaq_Overlays_DebugFragmentWriter_hh
00002 #define mu2e_artdaq_Overlays_DebugFragmentWriter_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/DebugFragmentReader.hh"
00019
00020 #include <iostream>
00021
00022 namespace mu2e {
00023 class DebugFragmentWriter;
00024 }
00025
00026 class mu2e::DebugFragmentWriter : public mu2e::DebugFragmentReader {
00027 public:
00028 DebugFragmentWriter(artdaq::Fragment &f);
00029
00030 virtual ~DebugFragmentWriter(){};
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::DebugFragmentWriter::DebugFragmentWriter(artdaq::Fragment &f) : DebugFragmentReader(f), artdaq_Fragment_(f) {
00072
00073
00074
00075
00076
00077
00078
00079 assert(sizeof(Metadata::data_t) == sizeof(Header::data_t));
00080
00081 if (artdaq_Fragment_.size() !=
00082 artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
00083 std::cerr << "artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
00084 std::cerr << "Expected size: "
00085 << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
00086 << std::endl;
00087
00088 throw cet::exception(
00089 "DebugFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
00090 "DetectorFragment::Metadata object");
00091 }
00092
00093
00094 artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
00095 }
00096
00097 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataBegin() {
00098 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00099 return reinterpret_cast<adc_t *>(header_() + 1);
00100 }
00101
00102 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataEnd() { return dataBegin() + total_adc_values(); }
00103
00104 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataBlockBegin() {
00105 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00106 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
00107 }
00108
00109 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataBlockEnd() {
00110 return dataBegin() + total_adc_values_in_data_block();
00111 }
00112
00113 inline void mu2e::DebugFragmentWriter::resize(size_t nAdcs) {
00114 auto es(calc_event_size_words_(nAdcs));
00115 artdaq_Fragment_.resize(words_to_frag_words_(es));
00116 header_()->event_size = es;
00117 }
00118
00119 inline size_t mu2e::DebugFragmentWriter::calc_event_size_words_(size_t nAdcs) {
00120 return adcs_to_words_(nAdcs) + hdr_size_words();
00121 }
00122
00123 inline size_t mu2e::DebugFragmentWriter::adcs_to_words_(size_t nAdcs) {
00124 auto mod(nAdcs % adcs_per_word_());
00125 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
00126 }
00127
00128 inline size_t mu2e::DebugFragmentWriter::words_to_frag_words_(size_t nWords) {
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 #endif