#ifndef _Stat_H #define _Stat_H //! $Id: Stat.H,v 1.1 2003/03/17 13:51:03 nbecker Exp $ #include template struct Stat_t { typedef T value_t; }; template struct Stat_t< std::complex > { typedef typename std::complex::value_type value_t; }; template class Stat { typedef typename Stat_t::value_t value_t; T sumX; value_t sumXsqr; cnt_t count; public: Stat() : sumX (0), sumXsqr (0), count (0) {} void Reset() { sumX = 0; sumXsqr = 0; count = 0; } template void Compute (in_t in, in_t inend) { for (; in != inend; in++) Compute (*in); } void Compute (T x) { operator += (x); } void operator += (T x) { count++; sumX += x; sumXsqr += (abs(x) * abs(x)); } void operator() (T x) { operator += (x); } value_t Mean() const { if ( count > 0) return (sumX / count); else return ( 0.0 ); } value_t Var() const { if (count > 1) return (sumXsqr - ((abs(sumX) * abs (sumX)) / count)) / (count - 1); else return 0.0; } value_t StdDev() const { if (count <= 0) return 0; else return sqrt (Var()); } value_t RMS() const { return StdDev(); } cnt_t Cnt() const { return count; } value_t XsqrBar() const { return (sumXsqr / count); } }; #endif