1 #ifndef mu2e_artdaq_core_Overlays_mu2eFragment_hh
2 #define mu2e_artdaq_core_Overlays_mu2eFragment_hh
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "cetlib_except/exception.h"
15 #define DATA_BLOCKS_PER_MU2E_FRAGMENT 100
20 static const int BLOCK_COUNT_MAX = DATA_BLOCKS_PER_MU2E_FRAGMENT;
23 std::ostream &operator<<(std::ostream &, mu2eFragment
const &);
44 typedef uint64_t data_t;
52 data_t run_number : 32;
54 static size_t const size_words = 1ul;
57 static_assert(
sizeof(
Metadata) == Metadata::size_words *
sizeof(Metadata::data_t),
58 "mu2eFragment::Metadata size changed");
72 typedef uint64_t data_t;
73 typedef uint64_t count_t;
75 count_t block_count : 60;
76 count_t fragment_type : 4;
78 size_t index[DATA_BLOCKS_PER_MU2E_FRAGMENT];
80 static size_t constexpr size_words{1ul + (DATA_BLOCKS_PER_MU2E_FRAGMENT *
sizeof(size_t)) /
84 static_assert(
sizeof(
Header) ==
sizeof(Header::data_t) * Header::size_words,
"mu2eFragment::Header: incorrect size");
90 : artdaq_Fragment_(f) {}
93 Header::count_t hdr_block_count()
const {
return header_()->block_count; }
94 Header::data_t hdr_fragment_type()
const {
return (Header::data_t)header_()->fragment_type; }
96 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
99 Header::data_t
const *dataBegin()
const {
return reinterpret_cast<Header::data_t
const *
>(header_() + 1); }
101 Header::data_t
const *dataEnd()
const {
return dataAt(hdr_block_count()); }
103 Header::data_t
const *dataAt(
const size_t index)
const
105 if (index == 0)
return dataBegin();
106 auto block = header_()->index[index - 1] /
sizeof(Header::data_t);
107 return reinterpret_cast<Header::data_t
const *
>(dataBegin() + block);
110 size_t blockSize(
const size_t index)
const
112 auto start = blockOffset(index);
113 auto end = dataEndBytes();
114 if (index < hdr_block_count() - 1) {
115 end = blockOffset(index + 1);
120 size_t blockOffset(
const size_t index)
const
125 return header_()->index[index - 1];
128 size_t dataEndBytes()
const {
return blockOffset(hdr_block_count()); }
130 size_t dataSize()
const
132 return artdaq_Fragment_.dataSize() *
sizeof(artdaq::Fragment::value_type) -
sizeof(
Header) -
sizeof(
Metadata);
136 static constexpr
size_t words_per_frag_word_()
138 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
145 Header const *header_()
const
151 artdaq::Fragment
const &artdaq_Fragment_;