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:
|