$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_06_01
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef artdaq_core_Data_RawEvent_hh 00002 #define artdaq_core_Data_RawEvent_hh 00003 00004 #include "artdaq-core/Data/Fragment.hh" 00005 #include "artdaq-core/Data/dictionarycontrol.hh" 00006 00007 #include "cetlib_except/exception.h" 00008 00009 #include <algorithm> 00010 #include <iosfwd> 00011 #include <memory> 00012 00013 namespace artdaq { 00017 namespace detail { 00018 struct RawEventHeader; 00019 } 00020 00028 struct detail::RawEventHeader 00029 { 00030 static constexpr uint8_t CURRENT_VERSION = 0; 00031 typedef uint32_t run_id_t; 00032 typedef uint32_t subrun_id_t; 00033 typedef uint32_t event_id_t; 00034 typedef uint64_t sequence_id_t; 00035 typedef uint64_t timestamp_t; 00036 00037 run_id_t run_id; 00038 subrun_id_t subrun_id; 00039 event_id_t event_id; 00040 sequence_id_t sequence_id; 00041 timestamp_t timestamp; 00042 bool is_complete; 00043 uint8_t version; 00044 00048 RawEventHeader() 00049 : run_id(0), subrun_id(0), event_id(0), sequence_id(0), timestamp(0), is_complete(false), version(CURRENT_VERSION) {} 00050 00059 RawEventHeader(run_id_t run, 00060 subrun_id_t subrun, 00061 event_id_t event, 00062 sequence_id_t seq, 00063 timestamp_t ts) 00064 : run_id(run) 00065 , subrun_id(subrun) 00066 , event_id(event) 00067 , sequence_id(seq) 00068 , timestamp(ts) 00069 , is_complete(false) 00070 , version(CURRENT_VERSION) 00071 {} 00072 00073 void print(std::ostream& os) const; 00074 }; 00075 00076 #if HIDE_FROM_ROOT 00077 00083 inline std::ostream& operator<<(std::ostream& os, detail::RawEventHeader const& evh) 00084 { 00085 evh.print(os); 00086 return os; 00087 } 00088 #endif 00089 00097 class RawEvent 00098 { 00099 public: 00100 typedef detail::RawEventHeader::run_id_t run_id_t; 00101 typedef detail::RawEventHeader::subrun_id_t subrun_id_t; 00102 typedef detail::RawEventHeader::event_id_t event_id_t; 00103 typedef detail::RawEventHeader::sequence_id_t sequence_id_t; 00104 typedef detail::RawEventHeader::timestamp_t timestamp_t; 00105 00114 RawEvent(run_id_t run, subrun_id_t subrun, event_id_t event, sequence_id_t seq, timestamp_t ts); 00115 00120 explicit RawEvent(detail::RawEventHeader hdr); 00121 00122 #if HIDE_FROM_ROOT 00123 00132 void insertFragment(FragmentPtr&& pfrag); 00133 00137 void markComplete(); 00138 00143 size_t numFragments() const; 00144 00149 size_t wordCount() const; 00150 00155 run_id_t runID() const; 00156 00161 subrun_id_t subrunID() const; 00162 00167 event_id_t eventID() const; 00168 00173 sequence_id_t sequenceID() const; 00174 00179 timestamp_t timestamp() const; 00180 00185 bool isComplete() const; 00186 00191 void print(std::ostream& os) const; 00192 00201 std::unique_ptr<Fragments> releaseProduct(); 00202 00207 void fragmentTypes(std::vector<Fragment::type_t>& type_list); 00208 00221 std::unique_ptr<Fragments> releaseProduct(Fragment::type_t type); 00222 00223 #endif 00224 00225 private: 00226 detail::RawEventHeader header_; 00227 FragmentPtrs fragments_; 00228 }; 00229 00230 typedef std::shared_ptr<RawEvent> RawEvent_ptr; 00231 00232 inline RawEvent::RawEvent(run_id_t run, subrun_id_t subrun, event_id_t event, sequence_id_t seq, timestamp_t ts) 00233 : header_(run, subrun, event, seq, ts) 00234 , fragments_() {} 00235 00236 inline RawEvent::RawEvent(detail::RawEventHeader hdr) 00237 : header_(hdr), fragments_() 00238 {} 00239 00240 #if HIDE_FROM_ROOT 00241 inline void RawEvent::insertFragment(FragmentPtr&& pfrag) 00242 { 00243 if (pfrag == nullptr) 00244 { 00245 throw cet::exception("LogicError") // NOLINT(cert-err60-cpp) 00246 << "Attempt to insert a null FragmentPtr into a RawEvent detected.\n"; 00247 } 00248 fragments_.emplace_back(std::move(pfrag)); 00249 } 00250 00251 inline void RawEvent::markComplete() { header_.is_complete = true; } 00252 00253 inline size_t RawEvent::numFragments() const 00254 { 00255 return fragments_.size(); 00256 } 00257 00258 inline size_t RawEvent::wordCount() const 00259 { 00260 size_t sum = 0; 00261 for (auto const& frag : fragments_) { sum += frag->size(); } 00262 return sum; 00263 } 00264 00265 inline RawEvent::run_id_t RawEvent::runID() const { return header_.run_id; } 00266 inline RawEvent::subrun_id_t RawEvent::subrunID() const { return header_.subrun_id; } 00267 inline RawEvent::event_id_t RawEvent::eventID() const { return header_.event_id; } 00268 inline RawEvent::sequence_id_t RawEvent::sequenceID() const { return header_.sequence_id; } 00269 inline RawEvent::timestamp_t RawEvent::timestamp() const { return header_.timestamp; } 00270 inline bool RawEvent::isComplete() const { return header_.is_complete; } 00271 00272 inline std::unique_ptr<Fragments> RawEvent::releaseProduct() 00273 { 00274 std::unique_ptr<Fragments> result(new Fragments); 00275 result->reserve(fragments_.size()); 00276 // 03/08/2016 ELF: Moving to range-for for STL compatibility 00277 //for (size_t i = 0, sz = fragments_.size(); i < sz; ++i) { 00278 for (auto& i : fragments_) 00279 { 00280 result->emplace_back(std::move(*i)); 00281 } 00282 // It seems more hygenic to clear fragments_ rather than to leave 00283 // it full of unique_ptrs to Fragments that have been plundered by 00284 // the move. 00285 fragments_.clear(); 00286 return result; 00287 } 00288 00289 inline void RawEvent::fragmentTypes(std::vector<Fragment::type_t>& type_list) 00290 { 00291 // 03/08/2016 ELF: Moving to range-for for STL compatibility 00292 //for (size_t i = 0, sz = fragments_.size(); i < sz; ++i) { 00293 for (auto& i : fragments_) 00294 { 00295 auto fragType = i->type(); // fragments_[i]->type(); 00296 if (std::find(type_list.begin(), type_list.end(), fragType) == type_list.end()) 00297 { 00298 type_list.push_back(fragType); 00299 } 00300 } 00301 //std::sort(type_list.begin(), type_list.end()); 00302 //std::unique(type_list.begin(), type_list.end()); 00303 } 00304 00305 inline std::unique_ptr<Fragments> 00306 RawEvent::releaseProduct(Fragment::type_t fragment_type) 00307 { 00308 std::unique_ptr<Fragments> result(new Fragments); 00309 auto iter = fragments_.begin(); 00310 do 00311 { 00312 if ((*iter)->type() == fragment_type) 00313 { 00314 result->push_back(std::move(*(*iter))); 00315 iter = fragments_.erase(iter); 00316 } 00317 else 00318 { 00319 ++iter; 00320 } 00321 } while (iter != fragments_.end()); 00322 return result; 00323 } 00324 00331 inline std::ostream& operator<<(std::ostream& os, RawEvent const& ev) 00332 { 00333 ev.print(os); 00334 return os; 00335 } 00336 00337 #endif 00338 } // namespace artdaq 00339 00340 #endif /* artdaq_core_Data_RawEvent_hh */