LCOV - code coverage report
Current view: top level - artdaq/ArtModules - ArtdaqEvent.hh (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 0.0 % 27 0
Test Date: 2026-10-29 00:35:58 Functions: 0.0 % 4 0

            Line data    Source code
       1              : #ifndef artdaq_ArtModules_ArtdaqEvent_hh
       2              : #define artdaq_ArtModules_ArtdaqEvent_hh
       3              : 
       4              : #include "artdaq-core/Data/RawEvent.hh"
       5              : 
       6              : #include <unordered_map>
       7              : 
       8              : /**
       9              :  * \brief An Artdaq Event, consisting of a header and a map of contained Fragments
      10              :  */
      11              : struct ArtdaqEvent
      12              : {
      13              :         std::shared_ptr<artdaq::detail::RawEventHeader> header;
      14              :         std::unordered_map<artdaq::Fragment::type_t, std::unique_ptr<artdaq::Fragments>> fragments;
      15              : 
      16              :         /**
      17              :          * \brief Default constructor
      18              :          */
      19            0 :         ArtdaqEvent()
      20            0 :             : header(nullptr), fragments() {}
      21              : 
      22              :         /**
      23              :          * \brief Get the type of the first Fragment in the event
      24              :          * \return The Fragment type of the first entry, or artdaq::Fragment::InvalidFragmentType if empty
      25              :          */
      26            0 :         artdaq::Fragment::type_t FirstFragmentType() const
      27              :         {
      28            0 :                 if (fragments.empty()) return artdaq::Fragment::InvalidFragmentType;
      29            0 :                 return fragments.begin()->first;
      30              :         }
      31              : 
      32              :         /**
      33              :          * \brief Get the total number of Fragments in the event across all types
      34              :          * \return Total Fragment count
      35              :          */
      36              :         size_t size() const
      37              :         {
      38              :                 size_t output = 0;
      39              : 
      40              :                 for (auto& type_pair : fragments)
      41              :                 {
      42              :                         output += type_pair.second->size();
      43              :                 }
      44              : 
      45              :                 return output;
      46              :         }
      47              : };
      48              : 
      49              : /**
      50              :  * \brief Less-than comparison operator for ArtdaqEvent objects
      51              :  *
      52              :  * Orders events such that Init Fragments come first, EndOfData Fragments come last,
      53              :  * and regular events are ordered by run ID, subrun ID, and sequence ID.
      54              :  * \param l Left-hand ArtdaqEvent
      55              :  * \param r Right-hand ArtdaqEvent
      56              :  * \return true if \a l should be ordered before \a r
      57              :  */
      58            0 : inline bool operator<(ArtdaqEvent const& l, ArtdaqEvent const& r)
      59              : {
      60            0 :         auto left = l.FirstFragmentType();
      61            0 :         auto right = r.FirstFragmentType();
      62              :         // Init Fragments are always first, EndOfData Fragments are always last
      63            0 :         if (left == artdaq::Fragment::InitFragmentType || right == artdaq::Fragment::InitFragmentType || left == artdaq::Fragment::EndOfDataFragmentType || right == artdaq::Fragment::EndOfDataFragmentType)
      64              :         {
      65            0 :                 if (left == right)
      66              :                 {
      67              :                         // Stable ordering
      68            0 :                         return l.header->sequence_id < r.header->sequence_id;
      69              :                 }
      70              :                 else
      71              :                 {
      72            0 :                         return left == artdaq::Fragment::InitFragmentType || right == artdaq::Fragment::EndOfDataFragmentType;
      73              :                 }
      74              :         }
      75            0 :         else if (l.header->run_id == r.header->run_id)
      76              :         {
      77              :                 // EndRun are last in run
      78            0 :                 if (left == artdaq::Fragment::EndOfRunFragmentType || right == artdaq::Fragment::EndOfRunFragmentType || left == artdaq::Fragment::RunDataFragmentType || right == artdaq::Fragment::RunDataFragmentType)
      79              :                 {
      80            0 :                         if (left == right)
      81              :                         {
      82              :                                 // Stable ordering
      83            0 :                                 return l.header->sequence_id < r.header->sequence_id;
      84              :                         }
      85              :                         else
      86              :                         {
      87            0 :                                 return right == artdaq::Fragment::EndOfRunFragmentType || right == artdaq::Fragment::RunDataFragmentType;
      88              :                         }
      89              :                 }
      90              : 
      91            0 :                 if (l.header->subrun_id == r.header->subrun_id)
      92              :                 {
      93              :                         // EndSubrun are last within a subrun
      94            0 :                         if (left == artdaq::Fragment::EndOfSubrunFragmentType || right == artdaq::Fragment::EndOfSubrunFragmentType || left == artdaq::Fragment::SubrunDataFragmentType || right == artdaq::Fragment::SubrunDataFragmentType)
      95              :                         {
      96            0 :                                 if (left == right)
      97              :                                 {
      98              :                                         // Stable ordering
      99            0 :                                         return l.header->sequence_id < r.header->sequence_id;
     100              :                                 }
     101              :                                 else
     102              :                                 {
     103            0 :                                         return right == artdaq::Fragment::EndOfSubrunFragmentType || right == artdaq::Fragment::SubrunDataFragmentType;
     104              :                                 }
     105              :                         }
     106              : 
     107              :                         // Order by sequence ID if not a recognized system broadcast
     108            0 :                         return l.header->sequence_id < r.header->sequence_id;
     109              :                 }
     110              :                 else
     111              :                 {
     112            0 :                         return l.header->subrun_id < r.header->subrun_id;
     113              :                 }
     114              :         }
     115              :         else
     116              :         {
     117            0 :                 return l.header->run_id < r.header->run_id;
     118              :         }
     119              : }
     120              : 
     121              : /**
     122              :  * \brief Less-than comparison operator for shared pointers to ArtdaqEvent objects
     123              :  * \param l Left-hand shared pointer to ArtdaqEvent
     124              :  * \param r Right-hand shared pointer to ArtdaqEvent
     125              :  * \return true if the event pointed to by \a l should be ordered before the one pointed to by \a r
     126              :  */
     127            0 : inline bool operator<(std::shared_ptr<ArtdaqEvent> const& l, std::shared_ptr<ArtdaqEvent> const& r)
     128              : {
     129            0 :         return *l < *r;
     130              : }
     131              : 
     132              : #endif /* artdaq_ArtModules_ArtdaqEvent_hh */
     133              : 
     134              : // Local Variables:
     135              : // mode: c++
     136              : // End:
        

Generated by: LCOV version 2.0-1