00001 #ifndef mu2e_artdaq_core_Overlays_DTCFragment_hh
00002 #define mu2e_artdaq_core_Overlays_DTCFragment_hh
00003
00004 #include "artdaq-core/Data/Fragment.hh"
00005
00006 #include "cetlib_except/exception.h"
00007
00008 #include <ostream>
00009 #include <vector>
00010
00011
00012
00013
00014 namespace mu2e {
00015 class DTCFragment;
00016
00017 typedef uint8_t packet_t[16];
00018
00019 std::ostream &operator<<(std::ostream &, DTCFragment const &);
00020 }
00021
00022 class mu2e::DTCFragment
00023 {
00024 public:
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 struct Metadata
00039 {
00040 typedef uint8_t data_t;
00041 typedef uint32_t run_number_t;
00042
00043 data_t sim_mode : 4;
00044 data_t unused : 4;
00045
00046 data_t board_id;
00047 data_t unused2;
00048 data_t unused3;
00049
00050 run_number_t run_number;
00051
00052 static size_t const size_words = 8ul;
00053 };
00054
00055 static_assert(sizeof(Metadata) == Metadata::size_words * sizeof(Metadata::data_t),
00056 "DTCFragment::Metadata size changed");
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 struct Header
00069 {
00070 typedef uint8_t data_t;
00071
00072 typedef uint64_t timestamp_t;
00073 typedef uint32_t data_size_t;
00074
00075 data_size_t event_size;
00076
00077 timestamp_t timestamp : 48;
00078 timestamp_t unused : 16;
00079
00080 static size_t const size_words = 16ul;
00081 };
00082
00083 static_assert(sizeof(Header) == Header::size_words * sizeof(Header::data_t), "DTCFragment::Header size changed");
00084
00085
00086
00087
00088 DTCFragment(artdaq::Fragment const &f)
00089 : artdaq_Fragment_(f) {}
00090
00091
00092 Header::data_size_t hdr_packet_count() const { return header_()->event_size; }
00093 Header::timestamp_t hdr_timestamp() const { return header_()->timestamp; }
00094
00095 static constexpr size_t hdr_size_words() { return Header::size_words; }
00096
00097 size_t dataSize() const { return hdr_packet_count() * words_per_packet_(); }
00098
00099
00100 packet_t const *dataBegin() const { return reinterpret_cast<packet_t const *>(header_() + 1); }
00101
00102
00103 packet_t const *dataEnd() const { return dataBegin() + hdr_packet_count(); }
00104
00105 protected:
00106
00107
00108
00109
00110
00111 static constexpr size_t words_per_packet_() { return sizeof(packet_t) / sizeof(Header::data_t); }
00112
00113 static constexpr size_t words_per_frag_word_()
00114 {
00115 return sizeof(artdaq::Fragment::value_type) / sizeof(Header::data_t);
00116 }
00117
00118
00119
00120
00121
00122 Header const *header_() const
00123 {
00124 return reinterpret_cast<DTCFragment::Header const *>(&*artdaq_Fragment_.dataBegin());
00125 }
00126
00127 private:
00128 artdaq::Fragment const &artdaq_Fragment_;
00129 };
00130
00131 #endif