#ifndef __AVERAGEANDERROR_HH__ #define __AVERAGEANDERROR_HH__ #include #include /// micro class to calculate averages and errors class AverageAndError { public: /// default constructor AverageAndError() { _sum = 0.0; _sum2 = 0.0; _n=0;} /// add one event inline void add(double x) { _sum += x, _sum2 += x*x; _n += 1; } /// add vector with events inline void add(std::vector v) { for(unsigned i=0;i 0) ? _sum/_n : 0. ; } /// calculate and return average of squares inline double average2() const { return (_n > 0) ? _sum2/_n : 0. ; } /// calculate and return error inline double error() const { return (_n > 1) ? std::sqrt(std::max(0.0, (_sum2/_n - _sum*_sum/_n/_n)/(_n-1))) : 0.; } /// return the error on the sum (as opposed to the error on the average) inline double error_on_sum() {return error() * n();} /// calculate and return the standard deviation inline double sd() const { return (_n > 1) ? std::sqrt(std::abs(_sum2/_n - _sum*_sum/_n/_n)) : 0.; } private: double _sum, _sum2; int _n; }; #endif // __AVERAGEANDERROR_HH__