mu2e_artdaq_core  v1_02_15
 All Classes Functions
DTCFragmentWriter.hh
1 #ifndef mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
2 #define mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh
3 
5 // DTCFragmentWriter
6 //
7 // Class derived from DTCFragment which allows writes to the data (for
8 // simulation purposes). Note that for this reason it contains
9 // non-const members which hide the const members in its parent class,
10 // DTCFragment, including its reference to the artdaq::Fragment
11 // object, artdaq_Fragment_, as well as its functions pointing to the
12 // beginning and end of ADC values in the fragment, dataBegin() and
13 // dataEnd()
14 //
16 
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "mu2e-artdaq-core/Overlays/DTCFragment.hh"
19 
20 #include <iostream>
21 
22 namespace mu2e {
23 class DTCFragmentWriter;
24 }
25 
27 {
28 public:
29  DTCFragmentWriter(artdaq::Fragment &f);
30 
31  // These functions form overload sets with const functions from
32  // mu2e::DTCFragment
33 
34  packet_t *dataBegin();
35  packet_t *dataEnd();
36 
37  // We'll need to hide the const version of header in DTCFragment in
38  // order to be able to perform writes
39 
40  Header *header_()
41  {
42  assert(artdaq_Fragment_.dataSize() >= words_to_frag_words_(Header::size_words));
43  return reinterpret_cast<Header *>(&*artdaq_Fragment_.dataBegin());
44  }
45 
46  void set_hdr_timestamp(Header::timestamp_t timestamp) { header_()->timestamp = timestamp; }
47 
48  void resize(size_t nPackets);
49 
50  size_t size() { return artdaq_Fragment_.size(); }
51 
52 private:
53  size_t calc_event_size_words_(size_t nPackets);
54 
55  static size_t packets_to_words_(size_t nPackets);
56  static size_t words_to_frag_words_(size_t nWords);
57 
58  // Note that this non-const reference hides the const reference in the base class
59  artdaq::Fragment &artdaq_Fragment_;
60 };
61 
62 // The constructor will expect the artdaq::Fragment object it's been
63 // passed to contain the artdaq::Fragment header + the
64 // DTCFragment::Metadata object, otherwise it throws
65 
66 mu2e::DTCFragmentWriter::DTCFragmentWriter(artdaq::Fragment &f)
67  : DTCFragment(f), artdaq_Fragment_(f)
68 {
69  // If this assert doesn't hold, then can't call
70  // "words_to_frag_words_" below, translating between the
71  // DTCFragment's standard data type size and the
72  // artdaq::Fragment's data type size, on the Metadata object
73 
74  assert(sizeof(Metadata::data_t) == sizeof(Header::data_t));
75 
76  if (artdaq_Fragment_.size() !=
77  artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)) {
78  std::cerr << "artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
79  std::cerr << "Expected size: "
80  << artdaq::detail::RawFragmentHeader::num_words() + words_to_frag_words_(Metadata::size_words)
81  << std::endl;
82 
83  throw cet::exception(
84  "DTCFragmentWriter: Raw artdaq::Fragment object size suggests it does not consist of its own header + the "
85  "DTCFragment::Metadata object");
86  }
87 
88  // Allocate space for the header
89  artdaq_Fragment_.resize(words_to_frag_words_(Header::size_words));
90 }
91 
92 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataBegin()
93 {
94  assert(artdaq_Fragment_.dataSize() > words_to_frag_words_(Header::size_words));
95  return reinterpret_cast<packet_t *>(header_() + 1);
96 }
97 
98 inline mu2e::packet_t *mu2e::DTCFragmentWriter::dataEnd() { return dataBegin() + hdr_packet_count(); }
99 
100 inline void mu2e::DTCFragmentWriter::resize(size_t nPackets)
101 {
102  auto es(calc_event_size_words_(nPackets));
103  artdaq_Fragment_.resize(words_to_frag_words_(es));
104  header_()->event_size = nPackets;
105 }
106 
107 inline size_t mu2e::DTCFragmentWriter::calc_event_size_words_(size_t nPackets)
108 {
109  return packets_to_words_(nPackets) + hdr_size_words();
110 }
111 
112 inline size_t mu2e::DTCFragmentWriter::packets_to_words_(size_t nPackets) { return nPackets * words_per_packet_(); }
113 
114 inline size_t mu2e::DTCFragmentWriter::words_to_frag_words_(size_t nWords)
115 {
116  size_t mod = nWords % words_per_frag_word_();
117  return mod ? nWords / words_per_frag_word_() + 1 : nWords / words_per_frag_word_();
118 }
119 
120 #endif /* mu2e_artdaq_core_Overlays_DTCFragmentWriter_hh */