Pottu
TimeHistogrammer.hpp
Go to the documentation of this file.
1 
6 #ifndef H_TIMEHISTOGRAMMER
7 #define H_TIMEHISTOGRAMMER
8 
9 
10 
12 
13 #include "DetectorEvent.hpp"
14 #include "DAQChannels.hpp"
15 #include "StageDetectorEvent.hpp"
16 
17 #include <deque>
18 
19 
20 namespace pottu {
21 
22 
23  template <class SelectorTrigger,class SelectorTarget>
25  public:
26 
27 
28 #ifndef POTTU_ROOT_SUPPORT
29 
41  TimeHistogrammer( SelectorTrigger selTrigger, SelectorTarget selTarget, _histogram_1d_type *histogram )
42  : _ctxh( ContextBase::getActive().createHandle("TimeHistogrammer") ),
43  _selTrigger(selTrigger), _selTarget(selTarget),
44  _h(histogram),
45  _low( _h->_binner.low() ),
46  _high( _h->_binner.high() )
47  {
48  if( !_h )
49  throw std::runtime_error( "No histogram given" );
50  if( _low >= _high )
51  throw std::runtime_error( "Bad range for histogram." );
52  }
53 #endif
54 
55  TimeHistogrammer( SelectorTrigger selTrigger, SelectorTarget selTarget,
56  _result_tree_type tree,
57  const std::string &histname, double low, double high, uint32_t binc )
58  : _ctxh( ContextBase::getActive().createHandle("TimeHistogrammer") ),
59  _selTrigger(selTrigger), _selTarget(selTarget),
60  _h( createHistogram1D( tree, histname.c_str(), low, high, binc ) ),
61  _low( low ),
62  _high( high )
63  {
64  if( !_h )
65  throw std::runtime_error( "No histogram given" );
66  }
67 
68 
69 
70  //template <class Cont>
71  virtual void process( std::vector<DetectorEvent> &data ) noexcept {
72  /*
73  static_assert( std::is_same<typename Cont::value_type,DetectorEvent>::value,
74  "TimeHistogrammer requires DetectorEvent as a datapacket value_type" );
75  */
76  for( const auto &event : data ) {
77  if( event.time < _tsPrev ) {
78  // Time order error! Clearing the queues
79  _queueTrigger.clear();
80  _queueTarget.clear();
81  }
82 
83  if( _selTrigger(event) ) {
84 
85  // Popping too old items from targets
86  while( _queueTarget.size() && _queueTarget.front()-event.time < _low )
87  _queueTarget.pop_front();
88 
89  for( const auto &tTarget : _queueTarget )
90  fill( _h, tTarget-event.time );
91 
92  _queueTrigger.push_back( event.time );
93 
94  }
95 
96  if( _selTarget(event) ) {
97 
98  // Popping too old items from triggers
99  while( _queueTrigger.size() && event.time - _queueTrigger.front() > _high )
100  _queueTrigger.pop_front();
101 
102  for( const auto &tTrigger : _queueTrigger )
103  fill( _h, event.time-tTrigger );
104 
105  _queueTarget.push_back( event.time );
106 
107  }
108 
109  _tsPrev = event.time;
110 
111  }
112  }
113 
114 
115  ContextHandle *_ctxh;
116 
117  SelectorTrigger _selTrigger;
118  SelectorTarget _selTarget;
119 
120  _histogram_1d_type *_h;
121  double _low;
122  double _high;
123 
124  int64_t _tsPrev{0};
125  std::deque<int64_t> _queueTrigger;
126  std::deque<int64_t> _queueTarget;
127  };
128 
129 
130 
131 }
132 
133 
134 #endif
135 
Handle to context used by specific class.
Definition: ContextBase.hpp:188
Simple 1D histogram.
Definition: Histogram1D.hpp:26
Class holding tree of histograms and subtrees.
Definition: ObjectTree.hpp:44
Abstract baseclass for all stages which uses or modifies detector events.
Definition: StageDetectorEvent.hpp:20
Definition: TimeHistogrammer.hpp:24
TimeHistogrammer(SelectorTrigger selTrigger, SelectorTarget selTarget, _histogram_1d_type *histogram)
Constructor of TimeHistogrammer DEPRECATED.
Definition: TimeHistogrammer.hpp:41
virtual void process(std::vector< DetectorEvent > &data) noexcept
Uses or modifies detector events in a container.
Definition: TimeHistogrammer.hpp:71
Definition: mainpage.dox:6
Default context for printing and collecting statistics.
Definition: ContextBase.hpp:41