Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JTrigger/JEvent.hh
Go to the documentation of this file.
1#ifndef __JTRIGGER__JEVENT__
2#define __JTRIGGER__JEVENT__
3
4#include <vector>
5#include <algorithm>
6
12
13
14/**
15 * \author mdejong
16 */
17
18namespace JTRIGGER {}
19namespace JPP { using namespace JTRIGGER; }
20
21namespace JTRIGGER {
22
25 using KM3NETDAQ::NUMBER_OF_TRIGGER_BITS;
26 using KM3NETDAQ::getTriggerMask;
27
28
29 /**
30 * Triggered event.
31 */
32 class JEvent :
33 public JDAQChronometer,
34 public JDAQTriggerMask,
35 public std::vector<JTriggeredHit>
36 {
37 public:
38 /**
39 * Default constructor.
40 */
44 overlays(0)
45 {}
46
47
48 /**
49 * Constructor.
50 *
51 * The triggered hits will be sorted to ensure proper functioning of method JEvent::merge and class JEventOverlap.
52 *
53 * \param chronometer DAQ chronometer
54 * \param __begin begin of hit list
55 * \param __end end of hit list
56 * \param bit trigger bit
57 */
58 template<class T>
59 JEvent(const JDAQChronometer& chronometer,
60 T __begin,
61 T __end,
62 const unsigned int bit) :
63 JDAQChronometer(chronometer),
64 JDAQTriggerMask(KM3NETDAQ::getTriggerMask(bit)),
65 overlays(0)
66 {
67 for (T i = __begin; i != __end; ++i) {
68 push_back(JTriggeredHit(*i, this->getTriggerMask()));
69 }
70
71 std::sort(this->begin(), this->end());
72 }
73
74
75 /**
76 * Constructor.
77 *
78 * The triggered hits will be sorted to ensure proper functioning of method JEvent::merge and class JEventOverlap.
79 *
80 * \param chronometer DAQ chronometer
81 * \param root root hit
82 * \param __begin begin of hit list
83 * \param __end end of hit list
84 * \param bit trigger bit
85 */
86 template<class JHit_t, class T>
87 JEvent(const JDAQChronometer& chronometer,
88 const JHit_t& root,
89 T __begin,
90 T __end,
91 const unsigned int bit) :
92 JDAQChronometer(chronometer),
93 JDAQTriggerMask(KM3NETDAQ::getTriggerMask(bit)),
94 overlays(0)
95 {
96 push_back(JTriggeredHit(root, this->getTriggerMask()));
97
98 for (T i = __begin; i != __end; ++i) {
99 push_back(JTriggeredHit(*i, this->getTriggerMask()));
100 }
101
102 std::sort(this->begin(), this->end());
103 }
104
105
106 /**
107 * Constructor.
108 *
109 * The triggered hits will be sorted to ensure proper functioning of method JEvent::merge and class JEventOverlap.
110 *
111 * \param chronometer DAQ chronometer
112 * \param root root hit
113 * \param bit trigger bit
114 */
115 template<class JHit_t>
116 JEvent(const JDAQChronometer& chronometer,
117 const JHit_t& root,
118 const unsigned int bit) :
119 JDAQChronometer(chronometer),
120 JDAQTriggerMask(KM3NETDAQ::getTriggerMask(bit)),
122 overlays(0)
123 {
124 push_back(JTriggeredHit(root, this->getTriggerMask()));
125 }
126
127
128 /**
129 * Merge event.
130 *
131 * \param event event
132 */
133 void merge(const JEvent& event)
134 {
135 using namespace std;
136
138
139 const_iterator __hit1 = this ->begin();
140 const_iterator __end1 = this ->end();
141
142 const_iterator __hit2 = event.begin();
143 const_iterator __end2 = event.end();
144
145 buffer.resize(this->size() + event.size());
146
147 iterator out = buffer.begin();
148
149 while (__hit1 != __end1 && __hit2 != __end2) {
150
151 if (*__hit1 < *__hit2) {
152
153 *out = *__hit1;
154 ++__hit1;
155
156 } else if (*__hit2 < *__hit1) {
157
158 *out = *__hit2;
159 ++__hit2;
160
161 } else {
162
163 *out = *__hit1;
164
165 out->addTriggerMask(*__hit2);
166
167 ++__hit1;
168 ++__hit2;
169 }
170
171 ++out;
172 }
173
174 // append remaining hits from either set
175
176 out = copy(__hit1, __end1, out);
177 out = copy(__hit2, __end2, out);
178
179 buffer.resize(distance(buffer.begin(), out));
180
181 this->swap(buffer);
182
183 ++overlays;
184 }
185
186
187 /**
188 * Get number of overlays.
189 *
190 * \return number of overlays
191 */
192 unsigned int getOverlays() const
193 {
194 return overlays;
195 }
196
197
198 protected:
199 unsigned int overlays;
200
201 private:
203 };
204
205
206 /**
207 * Less than operator for events.
208 *
209 * The less than operator is applied to the first hit in the events.
210 *
211 * \param first first event
212 * \param second second event
213 * \return true if first event earliear than second; else false
214 */
215 inline bool operator<(const JEvent& first, const JEvent& second)
216 {
217 if (first.empty() || second.empty()) {
218 throw JTriggerException("Comparison with empty event(s).");
219 }
220
221 return first.begin()->getT() < second.begin()->getT();
222 }
223}
224
225#endif
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Triggered event.
JEvent(const JDAQChronometer &chronometer, const JHit_t &root, const unsigned int bit)
Constructor.
unsigned int getOverlays() const
Get number of overlays.
JEvent(const JDAQChronometer &chronometer, const JHit_t &root, T __begin, T __end, const unsigned int bit)
Constructor.
std::vector< JTriggeredHit > buffer
JEvent(const JDAQChronometer &chronometer, T __begin, T __end, const unsigned int bit)
Constructor.
unsigned int overlays
JEvent()
Default constructor.
void merge(const JEvent &event)
Merge event.
Data structure for triggered hit.
Auxiliary class for trigger mask.
JDAQTriggerMask & addTriggerMask(const JDAQTriggerMask &mask)
Add trigger bit pattern.
JTriggerMask_t getTriggerMask() const
Get trigger mask.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition JHead.cc:163
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary classes and methods for triggering.
bool operator<(const JEvent &first, const JEvent &second)
Less than operator for events.
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
Definition root.py:1
Auxiliary class to set-up Hit.
Definition JSirene.hh:58