artdaq_core  v1_07_00
 All Classes Namespaces Functions
MonitoredQuantity.hh
1 #ifndef artdaq_core_Core_MonitoredQuantity_hh
2 #define artdaq_core_Core_MonitoredQuantity_hh
3 
4 #include "boost/thread/mutex.hpp"
5 
6 #include <math.h>
7 #include <stdint.h>
8 #include <vector>
9 
10 namespace artdaq {
11 
22  public:
23 
24  typedef double DURATION_T;
25  typedef double TIME_POINT_T;
26 
27  class Stats;
28 
29  enum DataSetType { FULL = 0, // the full data set (all samples)
30  RECENT = 1
31  }; // recent data only
32 
33  explicit MonitoredQuantity
34  (
35  DURATION_T expectedCalculationInterval,
36  DURATION_T timeWindowForRecentResults
37  );
38 
42  void addSample(const double value = 1.0);
43 
47  void addSample(const int value = 1);
48 
52  void addSample(const uint32_t value = 1);
53 
57  void addSample(const uint64_t value = 1);
58 
66  bool calculateStatistics(TIME_POINT_T currentTime =
67  getCurrentTime());
68 
73  void reset();
74 
79  void enable();
80 
84  void disable();
85 
89  bool isEnabled() const {return _enabled;}
90 
95  void setNewTimeWindowForRecentResults(DURATION_T interval);
96 
105  DURATION_T getTimeWindowForRecentResults() const {
106  return _intervalForRecentStats;
107  }
108 
109  DURATION_T ExpectedCalculationInterval() const {
110  return _expectedCalculationInterval;
111  }
112 
113  bool waitUntilAccumulatorsHaveBeenFlushed(DURATION_T timeout) const;
114 
118  void getStats(Stats & stats) const;
119 
125  static TIME_POINT_T getCurrentTime();
126 
127  // accessors for particular statistics values (more efficient when
128  // only a single value is needed)
129  TIME_POINT_T lastCalculationTime() const;
130  DURATION_T fullDuration() const;
131  double recentValueSum() const;
132  double recentValueAverage() const;
133  long long fullSampleCount() const;
134 
135  private:
136 
137  // Prevent copying of the MonitoredQuantity
138  MonitoredQuantity(MonitoredQuantity const &);
139  MonitoredQuantity & operator=(MonitoredQuantity const &);
140 
141  // Helper functions.
142  void _reset_accumulators();
143  void _reset_results();
144 
145  TIME_POINT_T _lastCalculationTime;
146  long long _workingSampleCount;
147  double _workingValueSum;
148  double _workingValueSumOfSquares;
149  double _workingValueMin;
150  double _workingValueMax;
151  double _workingLastSampleValue;
152 
153  mutable boost::mutex _accumulationMutex;
154 
155  unsigned int _binCount;
156  unsigned int _workingBinId;
157  std::vector<long long> _binSampleCount;
158  std::vector<double> _binValueSum;
159  std::vector<double> _binValueSumOfSquares;
160  std::vector<double> _binValueMin;
161  std::vector<double> _binValueMax;
162  std::vector<DURATION_T> _binDuration;
163  std::vector<TIME_POINT_T> _binEndTime;
164 
165  long long _fullSampleCount;
166  double _fullSampleRate;
167  double _fullValueSum;
168  double _fullValueSumOfSquares;
169  double _fullValueAverage;
170  double _fullValueRMS;
171  double _fullValueMin;
172  double _fullValueMax;
173  double _fullValueRate;
174  DURATION_T _fullDuration;
175 
176  long long _recentSampleCount;
177  double _recentSampleRate;
178  double _recentValueSum;
179  double _recentValueSumOfSquares;
180  double _recentValueAverage;
181  double _recentValueRMS;
182  double _recentValueMin;
183  double _recentValueMax;
184  double _recentValueRate;
185  DURATION_T _recentDuration;
186  double _lastLatchedSampleValue;
187  double _lastLatchedValueRate;
188  TIME_POINT_T _lastLatchedCalculationTime;
189 
190  mutable boost::mutex _resultsMutex;
191 
192  bool _enabled;
193  DURATION_T _intervalForRecentStats; // seconds
194  const DURATION_T _expectedCalculationInterval; // seconds
195  };
196 
198  long long fullSampleCount;
199  double fullSampleRate;
200  double fullValueSum;
201  double fullValueSumOfSquares;
202  double fullValueAverage;
203  double fullValueRMS;
204  double fullValueMin;
205  double fullValueMax;
206  double fullValueRate;
207  double fullSampleLatency;
208  DURATION_T fullDuration;
209 
210  long long recentSampleCount;
211  double recentSampleRate;
212  double recentValueSum;
213  double recentValueSumOfSquares;
214  double recentValueAverage;
215  double recentValueRMS;
216  double recentValueMin;
217  double recentValueMax;
218  double recentValueRate;
219  double recentSampleLatency;
220  DURATION_T recentDuration;
221  std::vector<long long> recentBinnedSampleCounts;
222  std::vector<double> recentBinnedValueSums;
223  std::vector<DURATION_T> recentBinnedDurations;
224  std::vector<TIME_POINT_T> recentBinnedEndTimes;
225 
226  double lastSampleValue;
227  double lastValueRate;
228  TIME_POINT_T lastCalculationTime;
229  bool enabled;
230 
231  long long getSampleCount(DataSetType t = FULL) const { return t == RECENT ? recentSampleCount : fullSampleCount; }
232  double getValueSum(DataSetType t = FULL) const { return t == RECENT ? recentValueSum : fullValueSum; }
233  double getValueAverage(DataSetType t = FULL) const { return t == RECENT ? recentValueAverage : fullValueAverage; }
234  double getValueRate(DataSetType t = FULL) const { return t == RECENT ? recentValueRate : fullValueRate; }
235  double getValueRMS(DataSetType t = FULL) const { return t == RECENT ? recentValueRMS : fullValueRMS; }
236  double getValueMin(DataSetType t = FULL) const { return t == RECENT ? recentValueMin : fullValueMin; }
237  double getValueMax(DataSetType t = FULL) const { return t == RECENT ? recentValueMax : fullValueMax; }
238  DURATION_T getDuration(DataSetType t = FULL) const { return t == RECENT ? recentDuration : fullDuration; }
239  double getSampleRate(DataSetType t = FULL) const { return t == RECENT ? recentSampleRate : fullSampleRate; }
240  double getSampleLatency(DataSetType t = FULL) const { double v = getSampleRate(t); return v ? 1e6 / v : INFINITY;}
241  double getLastSampleValue() const { return lastSampleValue; }
242  double getLastValueRate() const { return lastValueRate; }
243  bool isEnabled() const { return enabled; }
244  };
245 
246 } // namespace artdaq
247 
248 #endif /* artdaq_core_Core_MonitoredQuantity_hh */
bool calculateStatistics(TIME_POINT_T currentTime=getCurrentTime())
static TIME_POINT_T getCurrentTime()
void addSample(const double value=1.0)
void getStats(Stats &stats) const
DURATION_T getTimeWindowForRecentResults() const
void setNewTimeWindowForRecentResults(DURATION_T interval)