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/exception.h"
15 #define DATA_BLOCKS_PER_MU2E_FRAGMENT 2500
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),
"mu2eFragment::Metadata size changed");
71 typedef uint64_t data_t;
72 typedef uint64_t count_t;
74 count_t block_count : 60;
75 count_t fragment_type : 4;
77 size_t index[DATA_BLOCKS_PER_MU2E_FRAGMENT];
79 static size_t constexpr size_words {1ul + (DATA_BLOCKS_PER_MU2E_FRAGMENT *
sizeof(size_t)) /
sizeof(uint64_t)};
82 static_assert (
sizeof (
Header) ==
sizeof(Header::data_t) * Header::size_words,
"mu2eFragment::Header: incorrect size");
87 mu2eFragment(artdaq::Fragment
const & f ) : artdaq_Fragment_(f) {}
90 Header::count_t hdr_block_count()
const {
return header_()->block_count; }
91 Header::data_t hdr_fragment_type()
const {
return (Header::data_t)header_()->fragment_type; }
93 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
96 Header::data_t
const * dataBegin()
const {
97 return reinterpret_cast<Header::data_t
const *
>(header_() + 1);
100 Header::data_t
const * dataEnd()
const {
101 return dataAt(hdr_block_count());
104 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 {
111 auto start = blockOffset(index);
112 auto end = dataEndBytes();
113 if(index < hdr_block_count() - 1) {
114 end = blockOffset(index + 1);
119 size_t blockOffset(
const size_t index)
const {
120 if(index == 0) {
return 0; }
121 return header_()->index[ index - 1 ];
124 size_t dataEndBytes()
const {
125 return blockOffset(hdr_block_count());
128 size_t dataSize()
const {
return artdaq_Fragment_.dataSize() *
sizeof(artdaq::Fragment::value_type) -
sizeof(
Header) -
sizeof(
Metadata); }
132 static constexpr
size_t words_per_frag_word_() {
133 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
140 Header const * header_()
const {
146 artdaq::Fragment
const & artdaq_Fragment_;