Stat.h

00001 #ifndef SCTDATA_STAT_H
00002 #define SCTDATA_STAT_H
00003 #include <vector>
00004 
00005 namespace SctData{
00006 
00013 template <class T>
00014 class Stat {
00015 public:
00016     Stat(T value, bool valid) : value(value), valid(valid) {}
00017     Stat() : valid(true) {;}
00018     T value;
00019     bool valid;
00020 };
00021 
00023 template <class T>
00024 class Stats : public vector<Stat<T> >{
00025 public:
00027     Stats<T>();
00029     Stats<T>(const unsigned n);
00031     Stats<T>(const unsigned n, const T t);
00033     Stats<T> (const unsigned n, const Stat<T> s);
00035     void resize(const unsigned n);
00037     void resize(const unsigned n, const T t);
00039     void clear();
00041     T mean() const ;
00043     T var() const ;
00045     unsigned n() const ;
00047     T sum() const ;
00049     T sumSq() const ;
00051     T meanSq() const ;
00053     const Stat<T>& getAt(const unsigned i) const;
00055     Stat<T>& modifyAt(const unsigned i);
00056  protected:
00057     // called if cache is modified.
00058     void modified(){ mean_calc=false; var_calc=false, n_calc=false;}
00059     // Cache
00060     mutable bool mean_calc;
00061     mutable bool var_calc;
00062     mutable bool n_calc;
00063     mutable T m_mean;
00064     mutable T m_var;
00065     mutable unsigned m_n;
00066 private:
00067     const Stat<T> operator[](const unsigned i) const; 
00068     Stat<T>& operator[](const unsigned i); 
00069 };
00070 
00071 //INLINES
00072     
00073     template <class T>
00074     inline Stats<T>::Stats<T>() {
00075     modified();
00076     }
00077 
00078     template <class T>
00079     inline Stats<T>::Stats<T>(const unsigned n) : vector<Stat<T> >(n, Stat<T>()) {
00080     modified();
00081     }
00082 
00083     template <class T>
00084     inline Stats<T>::Stats<T>(const unsigned n, const T t) : vector<Stat<T> >(n, Stat<T>(t, true)) {
00085     modified();
00086     }
00087 
00088     
00089     template <class T>
00090     inline Stats<T>::Stats<T>(const unsigned n, const Stat<T> s) : vector<Stat<T> >(n, s) {
00091     modified();
00092     }
00093 
00094     template <class T>
00095     inline void Stats<T>::clear() {
00096     vector<Stat<T> >::clear();
00097     modified();
00098     }
00099 
00100     template <class T>
00101     inline void Stats<T>::resize(const unsigned n) {
00102     if (n!=size()){
00103         modified();
00104         vector<Stat<T> >::resize(n, Stat<T>() );
00105     }
00106     }
00107 
00108     template <class T>
00109     inline void Stats<T>::resize(const unsigned n, const T t) {
00110     if (n!=size()){
00111         modified();
00112         vector<Stat<T> >::resize(n, t);
00113     }
00114     }
00115 
00116     template <class T>
00117     inline T Stats<T>::mean() const {
00118     if (!mean_calc){
00119         m_mean=sum();
00120         if (n()!=0) m_mean/=n();
00121         mean_calc=true;
00122     }
00123     return m_mean;
00124     }
00125     
00126     template <class T>
00127     inline unsigned Stats<T>::n() const {
00128     if (!n_calc){
00129         m_n=0;
00130         for (unsigned i=0; i<size(); ++i){
00131         if (getAt(i).valid) ++m_n;
00132         }
00133         n_calc=true;
00134     }
00135     return m_n;
00136     }
00137     
00138     template <class T>
00139     inline T Stats<T>::sum() const  {
00140         T sum(0);
00141     for (unsigned i=0; i<size(); ++i){
00142         if (getAt(i).valid) sum+=getAt(i).value;
00143     }
00144     return sum;
00145     }
00146     
00147     template <class T>
00148     inline T Stats<T>::sumSq() const  {
00149         T sumSq(0);
00150     for (unsigned i=0; i<size(); ++i){
00151         if (getAt(i).valid) {
00152         T val=getAt(i).value;
00153         sumSq += val*val;
00154         }
00155     }
00156     return sumSq;
00157     }
00158 
00159     template <class T>
00160     inline T Stats<T>::meanSq() const  {
00161     T meansq = sumSq();
00162     if (n()!=0) meansq/=n();
00163     return meansq;
00164     }
00165 
00166 
00167     template <class T>
00168     T Stats<T>::var() const  {
00169     if (!var_calc){
00170         m_mean=mean();
00171         m_var=meanSq()-m_mean*m_mean;
00172         var_calc=true;
00173     }
00174     return m_var;
00175     }
00176 
00177     template <class T>
00178     const Stat<T>& Stats<T>::getAt(unsigned i) const{
00179     return vector<Stat<T> >::operator[](i);
00180     }
00181 
00182     template <class T>
00183     Stat<T>& Stats<T>::modifyAt(const unsigned i){
00184     modified();
00185     return vector<Stat<T> >::operator[](i);
00186     }
00187 
00188 } //end of namespace SctData
00189 
00190 #endif //#ifndef SCTDATA_STAT_H

Generated on Mon Feb 6 14:01:30 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6