$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_05_08a
$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 typedef uint32_t run_id_t; 00031 typedef uint32_t subrun_id_t; 00032 typedef uint32_t event_id_t; 00033 typedef Fragment::sequence_id_t sequence_id_t; 00034 00035 run_id_t run_id; 00036 subrun_id_t subrun_id; 00037 event_id_t event_id; 00038 sequence_id_t sequence_id; 00039 bool is_complete; 00040 00048 RawEventHeader(run_id_t run, 00049 subrun_id_t subrun, 00050 event_id_t event, 00051 sequence_id_t seq) 00052 : run_id(run) 00053 , subrun_id(subrun) 00054 , event_id(event) 00055 , sequence_id(seq) 00056 , is_complete(false) {} 00057 }; 00058 00066 class RawEvent 00067 { 00068 public: 00069 typedef detail::RawEventHeader::run_id_t run_id_t; 00070 typedef detail::RawEventHeader::subrun_id_t subrun_id_t; 00071 typedef detail::RawEventHeader::event_id_t event_id_t; 00072 typedef detail::RawEventHeader::sequence_id_t sequence_id_t; 00073 00081 RawEvent(run_id_t run, subrun_id_t subrun, event_id_t event, sequence_id_t seq); 00082 00087 explicit RawEvent(detail::RawEventHeader hdr); 00088 00089 #if HIDE_FROM_ROOT 00090 00099 void insertFragment(FragmentPtr&& pfrag); 00100 00104 void markComplete(); 00105 00110 size_t numFragments() const; 00111 00116 size_t wordCount() const; 00117 00122 run_id_t runID() const; 00123 00128 subrun_id_t subrunID() const; 00129 00134 event_id_t eventID() const; 00135 00140 sequence_id_t sequenceID() const; 00141 00146 bool isComplete() const; 00147 00152 void print(std::ostream& os) const; 00153 00162 std::unique_ptr<Fragments> releaseProduct(); 00163 00168 void fragmentTypes(std::vector<Fragment::type_t>& type_list); 00169 00182 std::unique_ptr<Fragments> releaseProduct(Fragment::type_t type); 00183 00184 #endif 00185 00186 private: 00187 detail::RawEventHeader header_; 00188 FragmentPtrs fragments_; 00189 }; 00190 00191 typedef std::shared_ptr<RawEvent> RawEvent_ptr; 00192 00193 inline RawEvent::RawEvent(run_id_t run, subrun_id_t subrun, event_id_t event, sequence_id_t seq) 00194 : header_(run, subrun, event, seq) 00195 , fragments_() {} 00196 00197 inline RawEvent::RawEvent(detail::RawEventHeader hdr) 00198 : header_(hdr), fragments_() 00199 {} 00200 00201 #if HIDE_FROM_ROOT 00202 inline void RawEvent::insertFragment(FragmentPtr&& pfrag) 00203 { 00204 if (pfrag == nullptr) 00205 { 00206 throw cet::exception("LogicError") 00207 << "Attempt to insert a null FragmentPtr into a RawEvent detected.\n"; 00208 } 00209 fragments_.emplace_back(std::move(pfrag)); 00210 } 00211 00212 inline void RawEvent::markComplete() { header_.is_complete = true; } 00213 00214 inline size_t RawEvent::numFragments() const 00215 { 00216 return fragments_.size(); 00217 } 00218 00219 inline size_t RawEvent::wordCount() const 00220 { 00221 size_t sum = 0; 00222 for (auto const& frag : fragments_) { sum += frag->size(); } 00223 return sum; 00224 } 00225 00226 inline RawEvent::run_id_t RawEvent::runID() const { return header_.run_id; } 00227 inline RawEvent::subrun_id_t RawEvent::subrunID() const { return header_.subrun_id; } 00228 inline RawEvent::event_id_t RawEvent::eventID() const { return header_.event_id; } 00229 inline RawEvent::sequence_id_t RawEvent::sequenceID() const { return header_.sequence_id; } 00230 inline bool RawEvent::isComplete() const { return header_.is_complete; } 00231 00232 inline std::unique_ptr<Fragments> RawEvent::releaseProduct() 00233 { 00234 std::unique_ptr<Fragments> result(new Fragments); 00235 result->reserve(fragments_.size()); 00236 // 03/08/2016 ELF: Moving to range-for for STL compatibility 00237 //for (size_t i = 0, sz = fragments_.size(); i < sz; ++i) { 00238 for (auto& i : fragments_) 00239 { 00240 result->emplace_back(std::move(*i)); 00241 } 00242 // It seems more hygenic to clear fragments_ rather than to leave 00243 // it full of unique_ptrs to Fragments that have been plundered by 00244 // the move. 00245 fragments_.clear(); 00246 return result; 00247 } 00248 00249 inline void RawEvent::fragmentTypes(std::vector<Fragment::type_t>& type_list) 00250 { 00251 // 03/08/2016 ELF: Moving to range-for for STL compatibility 00252 //for (size_t i = 0, sz = fragments_.size(); i < sz; ++i) { 00253 for (auto& i : fragments_) 00254 { 00255 auto fragType = i->type(); // fragments_[i]->type(); 00256 if (std::find(type_list.begin(), type_list.end(), fragType) == type_list.end()) 00257 { 00258 type_list.push_back(fragType); 00259 } 00260 } 00261 //std::sort(type_list.begin(), type_list.end()); 00262 //std::unique(type_list.begin(), type_list.end()); 00263 } 00264 00265 inline std::unique_ptr<Fragments> 00266 RawEvent::releaseProduct(Fragment::type_t fragment_type) 00267 { 00268 std::unique_ptr<Fragments> result(new Fragments); 00269 FragmentPtrs::iterator iter = fragments_.begin(); 00270 do 00271 { 00272 if ((*iter)->type() == fragment_type) 00273 { 00274 result->push_back(std::move(*(*iter))); 00275 iter = fragments_.erase(iter); 00276 } 00277 else 00278 { 00279 ++iter; 00280 } 00281 } while (iter != fragments_.end()); 00282 return result; 00283 } 00284 00291 inline std::ostream& operator<<(std::ostream& os, RawEvent const& ev) 00292 { 00293 ev.print(os); 00294 return os; 00295 } 00296 00297 #endif 00298 } // namespace artdaq 00299 00300 #endif /* artdaq_core_Data_RawEvent_hh */