$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_06_01
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef artdaq_core_Core_MonitoredQuantity_hh 00002 #define artdaq_core_Core_MonitoredQuantity_hh 00003 00004 #include <boost/thread/mutex.hpp> 00005 00006 #include <cmath> 00007 #include <cstdint> 00008 #include <vector> 00009 00010 namespace artdaq { 00014 struct MonitoredQuantityStats 00015 { 00016 typedef double DURATION_T; 00017 typedef double TIME_POINT_T; 00018 00022 enum class DataSetType 00023 { 00024 FULL = 0, 00025 RECENT = 1 00026 }; 00027 00028 size_t fullSampleCount; 00029 double fullSampleRate; 00030 double fullValueSum; 00031 double fullValueSumOfSquares; 00032 double fullValueAverage; 00033 double fullValueRMS; 00034 double fullValueMin; 00035 double fullValueMax; 00036 double fullValueRate; 00037 DURATION_T fullDuration; 00038 00039 size_t recentSampleCount; 00040 double recentSampleRate; 00041 double recentValueSum; 00042 double recentValueSumOfSquares; 00043 double recentValueAverage; 00044 double recentValueRMS; 00045 double recentValueMin; 00046 double recentValueMax; 00047 double recentValueRate; 00048 DURATION_T recentDuration; 00049 00050 std::vector<size_t> recentBinnedSampleCounts; 00051 std::vector<double> recentBinnedValueSums; 00052 std::vector<DURATION_T> recentBinnedDurations; 00053 std::vector<TIME_POINT_T> recentBinnedEndTimes; 00054 00055 double lastSampleValue; 00056 double lastValueRate; 00057 TIME_POINT_T lastCalculationTime; 00058 bool enabled; 00059 00065 size_t getSampleCount(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentSampleCount : fullSampleCount; } 00066 00072 double getValueSum(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueSum : fullValueSum; } 00073 00079 double getValueAverage(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueAverage : fullValueAverage; } 00080 00086 double getValueRate(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueRate : fullValueRate; } 00087 00093 double getValueRMS(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueRMS : fullValueRMS; } 00094 00100 double getValueMin(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueMin : fullValueMin; } 00101 00107 double getValueMax(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentValueMax : fullValueMax; } 00108 00114 DURATION_T getDuration(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentDuration : fullDuration; } 00115 00121 double getSampleRate(DataSetType t = DataSetType::FULL) const { return t == DataSetType::RECENT ? recentSampleRate : fullSampleRate; } 00122 00128 double getSampleLatency(DataSetType t = DataSetType::FULL) const 00129 { 00130 auto v = getSampleRate(t); 00131 return v != 0.0 ? 1e6 / v : INFINITY; 00132 } 00133 00138 double getLastSampleValue() const { return lastSampleValue; } 00139 00144 double getLastValueRate() const { return lastValueRate; } 00145 00150 bool isEnabled() const { return enabled; } 00151 }; 00152 00157 class MonitoredQuantity : MonitoredQuantityStats 00158 { 00159 public: 00165 explicit MonitoredQuantity( 00166 DURATION_T expectedCalculationInterval, 00167 DURATION_T timeWindowForRecentResults); 00168 00173 void addSample(const double value = 1.0); 00174 00179 void addSample(const int value = 1); 00180 00185 void addSample(const uint32_t value = 1); 00186 00191 void addSample(const uint64_t value = 1); 00192 00204 bool calculateStatistics(TIME_POINT_T currentTime = 00205 getCurrentTime()); 00206 00210 void reset(); 00211 00215 void enable(); 00216 00220 void disable(); 00221 00226 bool isEnabled() const { return enabled; } 00227 00232 void setNewTimeWindowForRecentResults(DURATION_T interval); 00233 00246 DURATION_T getTimeWindowForRecentResults() const 00247 { 00248 return _intervalForRecentStats; 00249 } 00250 00255 DURATION_T ExpectedCalculationInterval() const 00256 { 00257 return _expectedCalculationInterval; 00258 } 00259 00265 bool waitUntilAccumulatorsHaveBeenFlushed(DURATION_T timeout) const; 00266 00271 void getStats(MonitoredQuantityStats& stats) const; 00272 00281 static TIME_POINT_T getCurrentTime(); 00282 00283 // accessors for particular statistics values (more efficient when 00284 // only a single value is needed) 00285 TIME_POINT_T getLastCalculationTime() const; 00286 DURATION_T getFullDuration() const; 00287 double getRecentValueSum() const; 00288 double getRecentValueAverage() const; 00289 size_t getFullSampleCount() const; 00290 00291 private: 00292 MonitoredQuantity() = delete; 00293 00294 // Prevent copying of the MonitoredQuantity 00295 MonitoredQuantity(MonitoredQuantity const&) = delete; 00296 00297 MonitoredQuantity& operator=(MonitoredQuantity const&) = delete; 00298 00299 MonitoredQuantity(MonitoredQuantity&&) = delete; 00300 MonitoredQuantity& operator=(MonitoredQuantity&&) = delete; 00301 00302 // Helper functions. 00303 void _reset_accumulators(); 00304 00305 void _reset_results(); 00306 00307 std::atomic<TIME_POINT_T> _lastCalculationTime; 00308 size_t _workingSampleCount; 00309 double _workingValueSum; 00310 double _workingValueSumOfSquares; 00311 double _workingValueMin; 00312 double _workingValueMax; 00313 double _workingLastSampleValue; 00314 00315 mutable boost::mutex _accumulationMutex; 00316 00317 unsigned int _binCount; 00318 unsigned int _workingBinId; 00319 std::vector<double> _binValueSumOfSquares; 00320 std::vector<double> _binValueMin; 00321 std::vector<double> _binValueMax; 00322 00323 mutable boost::mutex _resultsMutex; 00324 00325 DURATION_T _intervalForRecentStats; // seconds 00326 const DURATION_T _expectedCalculationInterval; // seconds 00327 }; 00328 } // namespace artdaq 00329 00330 #endif /* artdaq_core_Core_MonitoredQuantity_hh */