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"
13 #define DATA_BLOCKS_PER_MU2E_FRAGMENT 2500
18 static const int BLOCK_COUNT_MAX = DATA_BLOCKS_PER_MU2E_FRAGMENT;
21 std::ostream &operator<<(std::ostream &, mu2eFragment
const &);
40 typedef uint64_t data_t;
48 data_t run_number : 32;
50 static size_t const size_words = 1ul;
53 static_assert(
sizeof(
Metadata) == Metadata::size_words *
sizeof(Metadata::data_t),
54 "mu2eFragment::Metadata size changed");
67 typedef uint64_t data_t;
68 typedef uint64_t count_t;
70 count_t block_count : 60;
71 count_t fragment_type : 4;
73 size_t index[DATA_BLOCKS_PER_MU2E_FRAGMENT];
75 static size_t constexpr size_words{1ul + (DATA_BLOCKS_PER_MU2E_FRAGMENT *
sizeof(size_t)) /
79 static_assert(
sizeof(
Header) ==
sizeof(Header::data_t) * Header::size_words,
"mu2eFragment::Header: incorrect size");
84 mu2eFragment(artdaq::Fragment
const &f) : artdaq_Fragment_(f) {}
87 Header::count_t hdr_block_count()
const {
return header_()->block_count; }
88 Header::data_t hdr_fragment_type()
const {
return (Header::data_t)header_()->fragment_type; }
90 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
93 Header::data_t
const *dataBegin()
const {
return reinterpret_cast<Header::data_t
const *
>(header_() + 1); }
95 Header::data_t
const *dataEnd()
const {
return dataAt(hdr_block_count()); }
97 Header::data_t
const *dataAt(
const size_t index)
const {
98 if (index == 0)
return dataBegin();
99 auto block = header_()->index[index - 1] /
sizeof(Header::data_t);
100 return reinterpret_cast<Header::data_t
const *
>(dataBegin() + block);
103 size_t blockSize(
const size_t index)
const {
104 auto start = blockOffset(index);
105 auto end = dataEndBytes();
106 if (index < hdr_block_count() - 1) {
107 end = blockOffset(index + 1);
112 size_t blockOffset(
const size_t index)
const {
116 return header_()->index[index - 1];
119 size_t dataEndBytes()
const {
return blockOffset(hdr_block_count()); }
121 size_t dataSize()
const {
122 return artdaq_Fragment_.dataSize() *
sizeof(artdaq::Fragment::value_type) -
sizeof(
Header) -
sizeof(
Metadata);
126 static constexpr
size_t words_per_frag_word_() {
127 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
134 Header const *header_()
const {
139 artdaq::Fragment
const &artdaq_Fragment_;