1 #ifndef artdaq_core_Data_RawEvent_hh
2 #define artdaq_core_Data_RawEvent_hh
4 #include "artdaq-core/Data/dictionarycontrol.hh"
5 #include "artdaq-core/Data/Fragments.hh"
7 #include "cetlib/exception.h"
22 namespace detail {
struct RawEventHeader; }
25 typedef uint32_t run_id_t;
26 typedef uint32_t subrun_id_t;
27 typedef Fragment::sequence_id_t sequence_id_t;
30 subrun_id_t subrun_id;
31 sequence_id_t sequence_id;
36 sequence_id_t event) :
51 typedef detail::RawEventHeader::run_id_t run_id_t;
52 typedef detail::RawEventHeader::subrun_id_t subrun_id_t;
53 typedef detail::RawEventHeader::sequence_id_t sequence_id_t;
55 RawEvent(run_id_t run, subrun_id_t subrun, sequence_id_t event);
61 void insertFragment(FragmentPtr && pfrag);
67 size_t numFragments()
const;
70 size_t wordCount()
const;
73 run_id_t runID()
const;
74 subrun_id_t subrunID()
const;
75 sequence_id_t sequenceID()
const;
76 bool isComplete()
const;
79 void print(std::ostream & os)
const;
84 std::unique_ptr<std::vector<Fragment>> releaseProduct();
87 void fragmentTypes(std::vector<Fragment::type_t>& type_list);
95 std::unique_ptr<std::vector<Fragment>> releaseProduct(Fragment::type_t);
101 FragmentPtrs fragments_;
104 typedef std::shared_ptr<RawEvent> RawEvent_ptr;
107 RawEvent::RawEvent(run_id_t run, subrun_id_t subrun, sequence_id_t event) :
108 header_(run, subrun, event),
114 void RawEvent::insertFragment(FragmentPtr && pfrag)
116 if (pfrag ==
nullptr) {
117 throw cet::exception(
"LogicError")
118 <<
"Attempt to insert a null FragmentPtr into a RawEvent detected.\n";
120 fragments_.emplace_back(std::move(pfrag));
123 inline void RawEvent::markComplete() { header_.is_complete =
true; }
126 size_t RawEvent::numFragments()
const
128 return fragments_.size();
132 size_t RawEvent::wordCount()
const
135 for (
auto const & frag : fragments_) { sum += frag->size(); }
139 inline RawEvent::run_id_t RawEvent::runID()
const {
return header_.run_id; }
140 inline RawEvent::subrun_id_t RawEvent::subrunID()
const {
return header_.subrun_id; }
141 inline RawEvent::sequence_id_t RawEvent::sequenceID()
const {
return header_.sequence_id; }
142 inline bool RawEvent::isComplete()
const {
return header_.is_complete; }
145 std::unique_ptr<std::vector<Fragment>> RawEvent::releaseProduct()
147 std::unique_ptr<std::vector<Fragment>> result(
new std::vector<Fragment>);
148 result->reserve(fragments_.size());
151 for (
auto & i : fragments_) {
152 result->emplace_back(std::move(*i));
162 void RawEvent::fragmentTypes(std::vector<Fragment::type_t>& type_list)
166 for (
auto& i : fragments_) {
167 Fragment::type_t fragType = i->type();
168 if (std::find(type_list.begin(), type_list.end(), fragType) == type_list.end()) {
169 type_list.push_back(fragType);
177 std::unique_ptr<std::vector<Fragment>>
178 RawEvent::releaseProduct(Fragment::type_t fragment_type)
180 std::unique_ptr<std::vector<Fragment>> result(
new std::vector<Fragment>);
181 FragmentPtrs::iterator iter = fragments_.begin();
183 if ((*iter)->type() == fragment_type) {
184 result->push_back(std::move(*(*iter)));
185 iter = fragments_.erase(iter);
190 }
while (iter != fragments_.end());
195 std::ostream & operator<<(std::ostream & os, RawEvent
const & ev)