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