Jpp  19.1.0-rc.1
the software that should make you happy
PhysicsEvent.hh
Go to the documentation of this file.
1 #ifndef __ANTARESDAQ_PHYSICSEVENT__
2 #define __ANTARESDAQ_PHYSICSEVENT__
3 
4 #include <ostream>
5 #include <iomanip>
6 #include <vector>
7 #include <limits>
8 
9 #include <TROOT.h>
10 #include <TObject.h>
11 
15 
16 
17 /**
18  * Template hit.
19  */
20 template<class T>
21 class ARS_Hit : public T {
22 public:
23  typedef T data_type;
24 
25  /** LCM identifier */
26  unsigned short lcm_id;
27  /** ARS identifier */
28  unsigned char ars_id;
29 
30  /**
31  * Default constructor.
32  */
33  ARS_Hit() :
34  T(),
35  lcm_id(0),
36  ars_id(0)
37  {}
38 
39  /**
40  * print ASCII
41  * \param out output stream
42  * \param object hit
43  * \return output stream
44  */
45  friend std::ostream& operator<<(std::ostream& out, const ARS_Hit& object)
46  {
47  using namespace std;
48 
49  out << setw(5) << (int) object. lcm_id << ' '
50  << setw(2) << (int) object. ars_id << ' ';
51  out << static_cast<const T&>(object);
52 
53  return out;
54  }
55 
57 };
58 
61 
62 
63 /**
64  * SPE hit
65  */
66 class SPE_Hit : public ARS_Hit<SPE_Item> {
67 public:
68  /**
69  * Default constructor.
70  */
71  SPE_Hit() :
72  ARS_Hit<SPE_Item>()
73  {}
74 
76 };
77 
78 
79 /**
80  * AWF hit
81  */
82 class AWF_Hit : public ARS_Hit<AWF_Item> {
83 public:
84  /**
85  * Default constructor.
86  */
87  AWF_Hit() :
88  ARS_Hit<AWF_Item>()
89  {}
90 
92 };
93 
94 
95 /**
96  * DWF hit
97  */
98 class DWF_Hit : public ARS_Hit<DWF_Item> {
99 public:
100  /**
101  * Default constructor.
102  */
104  ARS_Hit<DWF_Item>()
105  {}
106 
108 };
109 
110 
111 /**
112  * Triggered SPE hit
113  */
114 class TriggeredSPE_Hit : public SPE_Hit {
115 public:
116  /**
117  * Default constructor.
118  */
120  SPE_Hit()
121  {}
122 
124 };
125 
126 
127 /**
128  * Physics event
129  */
131  public EventPreamble
132 {
133 protected:
134  unsigned int EventType_;
135  unsigned int TriggerCounter_;
136  double MinT_;
137  double MaxT_;
138  float MaxA_;
139  float TotA_;
140 
145 
146 public:
147  /**
148  * Default constructor.
149  */
151  EventPreamble(),
152  EventType_(0),
153  TriggerCounter_(0),
154  MinT_(+std::numeric_limits<double>::max()),
155  MaxT_(-std::numeric_limits<double>::max()),
156  MaxA_(0),
157  TotA_(0)
158  {}
159 
160  /**
161  * Virtual destructor.
162  */
163  virtual ~PhysicsEvent()
164  {}
165 
166  /** Identifier of processor that created this event */
167  const unsigned short FrameTarget() const { return frameTarget; }
168  /** most significant word of frametime */
169  const unsigned int FrameTime1() const { return frameTime1; }
170  /** least significant word of frametime */
171  const unsigned int FrameTime2() const { return frameTime2; }
172  /** frame index */
173  const unsigned int FrameIndex() const { return frameIndex; }
174  /** Run number */
175  const unsigned int RunNumber() const { return runNumber; }
176 
177  /** Type of PhysicsEvent */
178  const unsigned int EventType() const { return EventType_; }
179  /** Trigger nr. since start of run */
180  const unsigned int TriggerCounter() const { return TriggerCounter_; }
181  /** time of first hit in event */
182  const double MinT() const { return MinT_; }
183  /** time of last hit in event */
184  const double MaxT() const { return MaxT_; }
185  /** amplitude of largest hit in event */
186  const float MaxA() const { return MaxA_; }
187  /** sum of all amplitudes */
188  const float TotA() const { return TotA_; }
189 
190  /** Triggered hits */
191  const std::vector<TriggeredSPE_Hit>& TriggeredSPEHits() const { return TriggeredSPEHits_; }
192  /** SPE hits */
193  const std::vector<SPE_Hit>& SPE_Hits() const { return SPEHits_; }
194  /** Waveform hits */
195  const std::vector<AWF_Hit>& AWF_Hits() const { return AWFHits_; }
196  /** Dynode hits */
197  const std::vector<DWF_Hit>& DWF_Hits() const { return DWFHits_; }
198 
199  /**
200  * Template vector<T>::iterator
201  */
202  template<class T> class const_iterator : public std::vector<T>::const_iterator {
203  public:
205  std::vector<T>::const_iterator()
206  {}
207 
209  std::vector<T>::const_iterator(i)
210  {}
211 
213  {
214  (typename std::vector<T>::const_iterator&) *this = i;
215  return *this;
216  }
217  };
218 
219  /** template size method for nested vector */
220  template<class T> size_t size() const;
221 
222  /** template begin const_iterator for nested vector */
223  template<class T> typename std::vector<T>::const_iterator begin() const;
224 
225  /** template end const_iterator for nested vector */
226  template<class T> typename std::vector<T>::const_iterator end() const;
227 
228  /**
229  * Print ASCII.
230  *
231  * \param out output stream
232  * \param object physics event
233  * \return output stream
234  */
235  friend std::ostream& operator<<(std::ostream& out, const PhysicsEvent& object)
236  {
237  using namespace std;
238 
239  out << " +-------------------------------------+ " << endl;
240  out << " | EventType_ " << object.EventType_ << endl;
241  out << " | RunNumber_ " << object.RunNumber() << endl;
242  out << " | TriggerCounter_ " << object.TriggerCounter_ << endl;
243  out << " | FrameTarget_ " << object.FrameTarget() << endl;
244  out << " | FrameTime1_ " << object.FrameTime1() << endl;
245  out << " | FrameTime2_ " << object.FrameTime2() << endl;
246  out << " | FrameIndex_ " << object.FrameIndex() << endl;
247  out << setprecision(11) << setw(14)
248  << " | MinT_ " << object.MinT_ << endl;
249  out << setprecision(11) << setw(14)
250  << " | MaxT_ " << object.MaxT_ << endl;
251  out << setprecision( 6) << setw(10)
252  << " | MaxA_ " << object.MaxA_ << endl;
253  out << setprecision( 6) << setw(10)
254  << " | TotA_ " << object.TotA_ << endl;
255  out << " +-------------------------------------+ " << endl;
256  out << " | Triggered hits " << object.TriggeredSPEHits_.size() << endl;
257  out << " | SPE hits " << object.SPEHits_.size() << endl;
258  out << " | AWF hits " << object.AWFHits_.size() << endl;
259  out << " | DWF hits " << object.DWFHits_.size() << endl;
260  out << " +-------------------------------------+ " << endl;
261  out << endl;
262 
263  return out;
264  }
265 
267 };
268 
269 
270 /** specialisation for TriggeredSPE_Hit size */
271 template<> inline size_t
272 PhysicsEvent::size<TriggeredSPE_Hit>() const
273 {
274  return TriggeredSPEHits_.size();
275 }
276 
277 /** specialisation for SPE_Hit size */
278 template<> inline size_t
279 PhysicsEvent::size<SPE_Hit>() const
280 {
281  return SPEHits_.size();
282 }
283 
284 /** specialisation for AWF_Hit size */
285 template<> inline size_t
286 PhysicsEvent::size<AWF_Hit>() const
287 {
288  return AWFHits_.size();
289 }
290 
291 /** specialisation for DWF_Hit size */
292 template<> inline size_t
293 PhysicsEvent::size<DWF_Hit>() const
294 {
295  return DWFHits_.size();
296 }
297 
298 /** specialisation for TriggeredSPE_Hit iterator begin */
300 PhysicsEvent::begin<TriggeredSPE_Hit>() const
301 {
302  return TriggeredSPEHits_.begin();
303 }
304 
305 /** specialisation for TriggeredSPE_Hit iterator end */
307 PhysicsEvent::end<TriggeredSPE_Hit>() const
308 {
309  return TriggeredSPEHits_.end();
310 }
311 
312 /** specialisation for SPE_Hit iterator begin */
314 PhysicsEvent::begin<SPE_Hit>() const
315 {
316  return SPEHits_.begin();
317 }
318 
319 /** specialisation for SPE_Hit iterator end */
321 PhysicsEvent::end<SPE_Hit>() const
322 {
323  return SPEHits_.end();
324 }
325 
326 /** specialisation for AWF_Hit iterator begin */
328 PhysicsEvent::begin<AWF_Hit>() const
329 {
330  return AWFHits_.begin();
331 }
332 
333 /** specialisation for AWF_Hit iterator end */
335 PhysicsEvent::end<AWF_Hit>() const
336 {
337  return AWFHits_.end();
338 }
339 
340 /** specialisation for DWF_Hit iterator begin */
342 PhysicsEvent::begin<DWF_Hit>() const
343 {
344  return DWFHits_.begin();
345 }
346 
347 /** specialisation for DWF_Hit iterator end */
349 PhysicsEvent::end<DWF_Hit>() const
350 {
351  return DWFHits_.end();
352 }
353 
354 
355 /**
356  * equal operator for SPE hit.
357  *
358  * \param first SPE hit
359  * \param second SPE hit
360  * \return true if first equals second; else false
361  */
362 inline bool operator==(const SPE_Hit& first, const SPE_Hit& second)
363 {
364  return (first.lcm_id == second.lcm_id &&
365  first.ars_id == second.ars_id &&
366  first.timestamp == second.timestamp &&
367  first.tvc == second.tvc &&
368  first.avc == second.avc);
369 }
370 
371 /**
372  * not-equal operator for SPE hit.
373  *
374  * \param first SPE hit
375  * \param second SPE hit
376  * \return true if first not equals second; else false
377  */
378 inline bool operator!=(const SPE_Hit& first, const SPE_Hit& second)
379 {
380  return (first.lcm_id != second.lcm_id ||
381  first.ars_id != second.ars_id ||
382  first.timestamp != second.timestamp ||
383  first.tvc != second.tvc ||
384  first.avc != second.avc);
385 }
386 
387 
388 /**
389  * equal operator for physics event.
390  *
391  * \param first physics event
392  * \param second physics event
393  * \return true if first equals second; else false
394  */
395 inline bool operator==(const PhysicsEvent& first, const PhysicsEvent& second)
396 {
397  return (first.MinT() < second.MaxT() &&
398  first.MaxT() > second.MinT());
399 }
400 
401 /**
402  * not-equal operator for physics event.
403  *
404  * \param first physics event
405  * \param second physics event
406  * \return true if first not equals second; else false
407  */
408 inline bool operator!=(const PhysicsEvent& first, const PhysicsEvent& second)
409 {
410  return (first.MinT() > second.MaxT() ||
411  first.MaxT() < second.MinT());
412 }
413 
414 /**
415  * Comparator for physics event; earliest event first.
416  *
417  * \param first physics event
418  * \param second physics event
419  * \return true if first earlier than second; else false
420  */
421 inline bool operator<(const PhysicsEvent& first, const PhysicsEvent& second)
422 {
423  return first.MinT() < second.MinT();
424 }
425 
426 /**
427  * Specialisation of STL distance.
428  *
429  * \param first first position
430  * \param second last position
431  * \return distance
432  */
433 template<class T>
435  typename PhysicsEvent::const_iterator<T> second)
436 {
437  return std::distance(first, (typename std::vector<T>::const_iterator&) second);
438 }
439 
440 #endif
bool operator<(const PhysicsEvent &first, const PhysicsEvent &second)
Comparator for physics event; earliest event first.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
ClassDefT2(ARS_Hit, T)
bool operator==(const SPE_Hit &first, const SPE_Hit &second)
equal operator for SPE hit.
ClassImpT(ARS_Hit, T)
bool operator!=(const SPE_Hit &first, const SPE_Hit &second)
not-equal operator for SPE hit.
Template hit.
Definition: PhysicsEvent.hh:21
ClassDef(ARS_Hit, 2)
friend std::ostream & operator<<(std::ostream &out, const ARS_Hit &object)
print ASCII
Definition: PhysicsEvent.hh:45
unsigned short lcm_id
LCM identifier.
Definition: PhysicsEvent.hh:26
unsigned char ars_id
ARS identifier.
Definition: PhysicsEvent.hh:28
ARS_Hit()
Default constructor.
Definition: PhysicsEvent.hh:33
AWF hit.
Definition: PhysicsEvent.hh:82
AWF_Hit()
Default constructor.
Definition: PhysicsEvent.hh:87
ClassDef(AWF_Hit, 2)
ARS Anode waveform.
Definition: Ars.hh:310
DWF hit.
Definition: PhysicsEvent.hh:98
ClassDef(DWF_Hit, 2)
DWF_Hit()
Default constructor.
ARS Dynode waveform.
Definition: Ars.hh:327
Interface for event classes.
Template vector<T>::iterator.
const_iterator(const typename std::vector< T >::const_iterator &i)
const_iterator & operator=(const typename std::vector< T >::const_iterator &i)
Physics event.
const unsigned int TriggerCounter() const
Trigger nr.
friend std::ostream & operator<<(std::ostream &out, const PhysicsEvent &object)
Print ASCII.
const unsigned int EventType() const
Type of PhysicsEvent.
const std::vector< SPE_Hit > & SPE_Hits() const
SPE hits.
unsigned int EventType_
std::vector< SPE_Hit > SPEHits_
ClassDef(PhysicsEvent, 2)
std::vector< DWF_Hit > DWFHits_
const unsigned int FrameTime2() const
least significant word of frametime
const float TotA() const
sum of all amplitudes
size_t size() const
template size method for nested vector
const unsigned int FrameTime1() const
most significant word of frametime
std::vector< T >::const_iterator end() const
template end const_iterator for nested vector
unsigned int TriggerCounter_
virtual ~PhysicsEvent()
Virtual destructor.
const std::vector< TriggeredSPE_Hit > & TriggeredSPEHits() const
Triggered hits.
const std::vector< DWF_Hit > & DWF_Hits() const
Dynode hits.
std::vector< T >::const_iterator begin() const
template begin const_iterator for nested vector
const double MinT() const
time of first hit in event
const unsigned int FrameIndex() const
frame index
const float MaxA() const
amplitude of largest hit in event
const unsigned int RunNumber() const
Run number.
const double MaxT() const
time of last hit in event
const unsigned short FrameTarget() const
Identifier of processor that created this event.
PhysicsEvent()
Default constructor.
const std::vector< AWF_Hit > & AWF_Hits() const
Waveform hits.
std::vector< AWF_Hit > AWFHits_
std::vector< TriggeredSPE_Hit > TriggeredSPEHits_
SPE hit.
Definition: PhysicsEvent.hh:66
ClassDef(SPE_Hit, 2)
SPE_Hit()
Default constructor.
Definition: PhysicsEvent.hh:71
ARS SPE.
Definition: Ars.hh:139
unsigned char avc
ARS Analogue to Voltage Convertor.
Definition: Ars.hh:142
unsigned char tvc
ARS Time to Voltage Convertor.
Definition: Ars.hh:145
unsigned int timestamp
ARS timestamp (24 bits)
Definition: Ars.hh:44
Triggered SPE hit.
ClassDef(TriggeredSPE_Hit, 2)
TriggeredSPE_Hit()
Default constructor.
Definition: JSTDTypes.hh:14