1 #ifndef artdaq_core_Data_ContainerFragmentLoader_hh
2 #define artdaq_core_Data_ContainerFragmentLoader_hh
13 #include "artdaq-core/Data/Fragment.hh"
14 #include "artdaq-core/Data/Fragments.hh"
15 #include "artdaq-core/Data/ContainerFragment.hh"
21 class ContainerFragmentLoader;
32 assert(artdaq_Fragment_.hasMetadata());
33 return reinterpret_cast<Metadata *
>(&*artdaq_Fragment_.metadataAddress());
36 void set_fragment_type(Fragment::type_t type) {
37 metadata()->fragment_type = type;
40 void set_missing_data(
bool isDataMissing) {
41 metadata()->missing_data = isDataMissing;
45 void addFragment(artdaq::FragmentPtr& frag);
46 void addFragments(artdaq::FragmentPtrs & frags);
51 static size_t words_to_frag_words_(
size_t nWords);
52 void addSpace_(
size_t bytes);
53 uint8_t* dataBegin_() {
return reinterpret_cast<uint8_t*
>(&*artdaq_Fragment_.dataBegin()); }
54 void* dataEnd_() {
return reinterpret_cast<void*
>(dataBegin_() + lastFragmentIndex()); }
61 artdaq::ContainerFragmentLoader::ContainerFragmentLoader(
artdaq::Fragment& f) :
63 artdaq_Fragment_.setSystemType(Fragment::ContainerFragmentType);
66 m.fragment_type = Fragment::EmptyFragmentType;
67 m.missing_data =
false;
68 for (
int ii = 0; ii < FRAGMENT_COUNT_MAX; ++ii) {
71 artdaq_Fragment_.setMetadata<Metadata>(m);
73 if (artdaq_Fragment_.size() !=
74 artdaq::detail::RawFragmentHeader::num_words() +
75 words_to_frag_words_(Metadata::size_words))
77 std::cerr <<
"artdaq_Fragment size: " << artdaq_Fragment_.size() << std::endl;
78 std::cerr <<
"Expected size: " << artdaq::detail::RawFragmentHeader::num_words() +
79 words_to_frag_words_(Metadata::size_words) << std::endl;
81 throw cet::exception(
"ContainerFragmentLoader: Raw artdaq::Fragment object size suggests it does not consist of its own header + the ContainerFragment::Metadata object");
85 inline size_t artdaq::ContainerFragmentLoader::words_to_frag_words_(
size_t nWords)
87 size_t mod = nWords % words_per_frag_word_();
89 nWords / words_per_frag_word_() + 1 :
90 nWords / words_per_frag_word_();
93 void artdaq::ContainerFragmentLoader::addSpace_(
size_t bytes)
95 auto currSize =
sizeof(artdaq::Fragment::value_type) * artdaq_Fragment_.dataSize();
96 artdaq_Fragment_.resizeBytes(bytes + currSize);
97 TRACE(4,
"ContainerFragmentLoader::addSpace_: dataEnd_ is now at %p", dataEnd_());
102 TRACE(4,
"ContainerFragmentLoader::addFragment: Adding Fragment with payload size %llu to Container", (
unsigned long long)frag.dataSizeBytes());
103 if (metadata()->fragment_type == Fragment::EmptyFragmentType) metadata()->fragment_type = frag.type();
104 else if (frag.type() != metadata()->fragment_type) {
105 throw cet::exception(
"ContainerFragmentLoader::addFragment: Trying to add a fragment of different type than what's already been added!");
107 TRACE(4,
"ContainerFragmentLoader::addFragment: Payload Size is %llu, lastFragmentIndex is %llu, and frag.size is %llu", (
unsigned long long)artdaq_Fragment_.dataSizeBytes(), (
unsigned long long)lastFragmentIndex(), (
unsigned long long)frag.sizeBytes());
108 if (artdaq_Fragment_.dataSizeBytes() < lastFragmentIndex() + frag.sizeBytes()) {
109 addSpace_(frag.sizeBytes());
111 frag.setSequenceID(artdaq_Fragment_.sequenceID());
112 TRACE(4,
"ContainerFragmentLoader::addFragment, copying %llu bytes from %p to %p", (
long long unsigned int)frag.sizeBytes(), (
void*)frag.headerAddress(), dataEnd_());
113 memcpy(dataEnd_(), frag.headerAddress(), frag.sizeBytes());
114 metadata()->index[block_count()] = lastFragmentIndex() + frag.sizeBytes();
115 metadata()->block_count++;
118 void artdaq::ContainerFragmentLoader::addFragment(artdaq::FragmentPtr & frag)
123 void artdaq::ContainerFragmentLoader::addFragments(artdaq::FragmentPtrs & frags)
125 for (
auto & frag : frags)
127 addFragment((*frag));