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 {
00028 public:
00029 DebugFragmentWriter(artdaq::Fragment &f);
00030
00031 virtual ~DebugFragmentWriter(){};
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::DebugFragmentWriter::DebugFragmentWriter(artdaq::Fragment &f)
00074 : DebugFragmentReader(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 "DebugFragmentWriter: 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::DebugFragmentWriter::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::DebugFragmentWriter::dataEnd() { return dataBegin() + total_adc_values(); }
00108
00109 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataBlockBegin()
00110 {
00111 assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
00112 return (reinterpret_cast<adc_t *>(header_() + 1)) + current_offset_;
00113 }
00114
00115 inline mu2e::DetectorFragment::adc_t *mu2e::DebugFragmentWriter::dataBlockEnd()
00116 {
00117 return dataBegin() + total_adc_values_in_data_block();
00118 }
00119
00120 inline void mu2e::DebugFragmentWriter::resize(size_t nAdcs)
00121 {
00122 auto es(calc_event_size_words_(nAdcs));
00123 artdaq_Fragment_.resize(words_to_frag_words_(es));
00124 header_()->event_size = es;
00125 }
00126
00127 inline size_t mu2e::DebugFragmentWriter::calc_event_size_words_(size_t nAdcs)
00128 {
00129 return adcs_to_words_(nAdcs) + hdr_size_words();
00130 }
00131
00132 inline size_t mu2e::DebugFragmentWriter::adcs_to_words_(size_t nAdcs)
00133 {
00134 auto mod(nAdcs % adcs_per_word_());
00135 return (mod == 0) ? nAdcs / adcs_per_word_() : nAdcs / adcs_per_word_() + 1;
00136 }
00137
00138 inline size_t mu2e::DebugFragmentWriter::words_to_frag_words_(size_t nWords)
00139 {
00140 size_t mod = nWords % words_per_frag_word_();
00141 return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
00142 }
00143
00144 #endif