00001 #ifndef artdaq_core_Core_MonitoredQuantity_hh
00002 #define artdaq_core_Core_MonitoredQuantity_hh
00003
00004 #include "boost/thread/mutex.hpp"
00005
00006 #include <math.h>
00007 #include <stdint.h>
00008 #include <vector>
00009
00010 namespace artdaq {
00011
00021 class MonitoredQuantity {
00022 public:
00023
00024 typedef double DURATION_T;
00025 typedef double TIME_POINT_T;
00026
00027 class Stats;
00028
00029 enum DataSetType { FULL = 0,
00030 RECENT = 1
00031 };
00032
00033 explicit MonitoredQuantity
00034 (
00035 DURATION_T expectedCalculationInterval,
00036 DURATION_T timeWindowForRecentResults
00037 );
00038
00042 void addSample(const double value = 1.0);
00043
00047 void addSample(const int value = 1);
00048
00052 void addSample(const uint32_t value = 1);
00053
00057 void addSample(const uint64_t value = 1);
00058
00066 bool calculateStatistics(TIME_POINT_T currentTime =
00067 getCurrentTime());
00068
00073 void reset();
00074
00079 void enable();
00080
00084 void disable();
00085
00089 bool isEnabled() const {return _enabled;}
00090
00095 void setNewTimeWindowForRecentResults(DURATION_T interval);
00096
00105 DURATION_T getTimeWindowForRecentResults() const {
00106 return _intervalForRecentStats;
00107 }
00108
00109 DURATION_T ExpectedCalculationInterval() const {
00110 return _expectedCalculationInterval;
00111 }
00112
00113 bool waitUntilAccumulatorsHaveBeenFlushed(DURATION_T timeout) const;
00114
00118 void getStats(Stats & stats) const;
00119
00125 static TIME_POINT_T getCurrentTime();
00126
00127
00128
00129 TIME_POINT_T lastCalculationTime() const;
00130 DURATION_T fullDuration() const;
00131 double recentValueSum() const;
00132 double recentValueAverage() const;
00133 long long fullSampleCount() const;
00134
00135 private:
00136
00137
00138 MonitoredQuantity(MonitoredQuantity const &);
00139 MonitoredQuantity & operator=(MonitoredQuantity const &);
00140
00141
00142 void _reset_accumulators();
00143 void _reset_results();
00144
00145 TIME_POINT_T _lastCalculationTime;
00146 long long _workingSampleCount;
00147 double _workingValueSum;
00148 double _workingValueSumOfSquares;
00149 double _workingValueMin;
00150 double _workingValueMax;
00151 double _workingLastSampleValue;
00152
00153 mutable boost::mutex _accumulationMutex;
00154
00155 unsigned int _binCount;
00156 unsigned int _workingBinId;
00157 std::vector<long long> _binSampleCount;
00158 std::vector<double> _binValueSum;
00159 std::vector<double> _binValueSumOfSquares;
00160 std::vector<double> _binValueMin;
00161 std::vector<double> _binValueMax;
00162 std::vector<DURATION_T> _binDuration;
00163 std::vector<TIME_POINT_T> _binEndTime;
00164
00165 long long _fullSampleCount;
00166 double _fullSampleRate;
00167 double _fullValueSum;
00168 double _fullValueSumOfSquares;
00169 double _fullValueAverage;
00170 double _fullValueRMS;
00171 double _fullValueMin;
00172 double _fullValueMax;
00173 double _fullValueRate;
00174 DURATION_T _fullDuration;
00175
00176 long long _recentSampleCount;
00177 double _recentSampleRate;
00178 double _recentValueSum;
00179 double _recentValueSumOfSquares;
00180 double _recentValueAverage;
00181 double _recentValueRMS;
00182 double _recentValueMin;
00183 double _recentValueMax;
00184 double _recentValueRate;
00185 DURATION_T _recentDuration;
00186 double _lastLatchedSampleValue;
00187 double _lastLatchedValueRate;
00188 TIME_POINT_T _lastLatchedCalculationTime;
00189
00190 mutable boost::mutex _resultsMutex;
00191
00192 bool _enabled;
00193 DURATION_T _intervalForRecentStats;
00194 const DURATION_T _expectedCalculationInterval;
00195 };
00196
00197 struct MonitoredQuantity::Stats {
00198 long long fullSampleCount;
00199 double fullSampleRate;
00200 double fullValueSum;
00201 double fullValueSumOfSquares;
00202 double fullValueAverage;
00203 double fullValueRMS;
00204 double fullValueMin;
00205 double fullValueMax;
00206 double fullValueRate;
00207 double fullSampleLatency;
00208 DURATION_T fullDuration;
00209
00210 long long recentSampleCount;
00211 double recentSampleRate;
00212 double recentValueSum;
00213 double recentValueSumOfSquares;
00214 double recentValueAverage;
00215 double recentValueRMS;
00216 double recentValueMin;
00217 double recentValueMax;
00218 double recentValueRate;
00219 double recentSampleLatency;
00220 DURATION_T recentDuration;
00221 std::vector<long long> recentBinnedSampleCounts;
00222 std::vector<double> recentBinnedValueSums;
00223 std::vector<DURATION_T> recentBinnedDurations;
00224 std::vector<TIME_POINT_T> recentBinnedEndTimes;
00225
00226 double lastSampleValue;
00227 double lastValueRate;
00228 TIME_POINT_T lastCalculationTime;
00229 bool enabled;
00230
00231 long long getSampleCount(DataSetType t = FULL) const { return t == RECENT ? recentSampleCount : fullSampleCount; }
00232 double getValueSum(DataSetType t = FULL) const { return t == RECENT ? recentValueSum : fullValueSum; }
00233 double getValueAverage(DataSetType t = FULL) const { return t == RECENT ? recentValueAverage : fullValueAverage; }
00234 double getValueRate(DataSetType t = FULL) const { return t == RECENT ? recentValueRate : fullValueRate; }
00235 double getValueRMS(DataSetType t = FULL) const { return t == RECENT ? recentValueRMS : fullValueRMS; }
00236 double getValueMin(DataSetType t = FULL) const { return t == RECENT ? recentValueMin : fullValueMin; }
00237 double getValueMax(DataSetType t = FULL) const { return t == RECENT ? recentValueMax : fullValueMax; }
00238 DURATION_T getDuration(DataSetType t = FULL) const { return t == RECENT ? recentDuration : fullDuration; }
00239 double getSampleRate(DataSetType t = FULL) const { return t == RECENT ? recentSampleRate : fullSampleRate; }
00240 double getSampleLatency(DataSetType t = FULL) const { double v = getSampleRate(t); return v ? 1e6 / v : INFINITY;}
00241 double getLastSampleValue() const { return lastSampleValue; }
00242 double getLastValueRate() const { return lastValueRate; }
00243 bool isEnabled() const { return enabled; }
00244 };
00245
00246 }
00247
00248 #endif