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"
14 #define DATA_BLOCKS_PER_MU2E_FRAGMENT 2500
19 static const int BLOCK_COUNT_MAX = DATA_BLOCKS_PER_MU2E_FRAGMENT;
22 std::ostream & operator << (std::ostream &, mu2eFragment
const &);
43 typedef uint64_t data_t;
51 data_t run_number : 32;
53 static size_t const size_words = 1ul;
56 static_assert (
sizeof (
Metadata) == Metadata::size_words *
sizeof (Metadata::data_t),
"mu2eFragment::Metadata size changed");
70 typedef uint64_t data_t;
71 typedef uint64_t count_t;
73 count_t block_count : 60;
74 count_t fragment_type : 4;
76 size_t index[DATA_BLOCKS_PER_MU2E_FRAGMENT];
78 static size_t constexpr size_words {1ul + (DATA_BLOCKS_PER_MU2E_FRAGMENT *
sizeof(size_t)) /
sizeof(uint64_t)};
81 static_assert (
sizeof (
Header) ==
sizeof(Header::data_t) * Header::size_words,
"mu2eFragment::Header: incorrect size");
86 mu2eFragment(artdaq::Fragment
const & f ) : artdaq_Fragment_(f) {}
89 Header::count_t hdr_block_count()
const {
return header_()->block_count; }
90 Header::data_t hdr_fragment_type()
const {
return (Header::data_t)header_()->fragment_type; }
92 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
95 Header::data_t
const * dataBegin()
const {
96 return reinterpret_cast<Header::data_t
const *
>(header_() + 1);
99 Header::data_t
const * dataEnd()
const {
100 return dataAt(hdr_block_count());
103 Header::data_t
const * dataAt(
const size_t index)
const {
104 if(index == 0)
return dataBegin();
105 auto block = header_()->index[ index - 1] /
sizeof(Header::data_t);
106 return reinterpret_cast<Header::data_t
const *
>(dataBegin() + block);
109 size_t blockSize(
const size_t index)
const {
110 auto start = blockOffset(index);
111 auto end = dataEndBytes();
112 if(index < hdr_block_count() - 1) {
113 end = blockOffset(index + 1);
118 size_t blockOffset(
const size_t index)
const {
119 if(index == 0) {
return 0; }
120 return header_()->index[ index - 1 ];
123 size_t dataEndBytes()
const {
124 return blockOffset(hdr_block_count());
127 size_t dataSize()
const {
return artdaq_Fragment_.dataSize() *
sizeof(artdaq::Fragment::value_type) -
sizeof(
Header) -
sizeof(
Metadata); }
131 static constexpr
size_t words_per_frag_word_() {
132 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
139 Header const * header_()
const {
145 artdaq::Fragment
const & artdaq_Fragment_;