1 #ifndef artdaq_core_Core_MonitoredQuantity_hh
2 #define artdaq_core_Core_MonitoredQuantity_hh
4 #include "boost/thread/mutex.hpp"
24 typedef double DURATION_T;
25 typedef double TIME_POINT_T;
29 enum DataSetType { FULL = 0,
35 DURATION_T expectedCalculationInterval,
36 DURATION_T timeWindowForRecentResults
106 return _intervalForRecentStats;
109 DURATION_T ExpectedCalculationInterval()
const {
110 return _expectedCalculationInterval;
113 bool waitUntilAccumulatorsHaveBeenFlushed(DURATION_T timeout)
const;
129 TIME_POINT_T lastCalculationTime()
const;
130 DURATION_T fullDuration()
const;
131 double recentValueSum()
const;
132 double recentValueAverage()
const;
133 long long fullSampleCount()
const;
138 MonitoredQuantity(MonitoredQuantity
const &);
139 MonitoredQuantity & operator=(MonitoredQuantity
const &);
142 void _reset_accumulators();
143 void _reset_results();
145 TIME_POINT_T _lastCalculationTime;
146 long long _workingSampleCount;
147 double _workingValueSum;
148 double _workingValueSumOfSquares;
149 double _workingValueMin;
150 double _workingValueMax;
151 double _workingLastSampleValue;
153 mutable boost::mutex _accumulationMutex;
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;
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;
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;
190 mutable boost::mutex _resultsMutex;
193 DURATION_T _intervalForRecentStats;
194 const DURATION_T _expectedCalculationInterval;
198 long long fullSampleCount;
199 double fullSampleRate;
201 double fullValueSumOfSquares;
202 double fullValueAverage;
206 double fullValueRate;
207 double fullSampleLatency;
208 DURATION_T fullDuration;
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;
226 double lastSampleValue;
227 double lastValueRate;
228 TIME_POINT_T lastCalculationTime;
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; }
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)