// @(#)root/mathcore:$Id$
// Author: G. Ganis 2012

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TStatistic
#define ROOT_TStatistic


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TStatistic                                                           //
//                                                                      //
// Statistical variable, defined by its mean, RMS and related errors.   //
// Named, streamable, storable and mergeable.                           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TCollection
#include "TCollection.h"
#endif

#ifndef ROOT_TMath
#include "TMath.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif

#ifndef ROOT_TROOT
#include "TROOT.h"
#endif

class TStatistic : public TObject {

private:
   TString     fName;
   Long64_t    fN;       // Number of fills
   Double_t    fW;       // Sum of weights
   Double_t    fW2;      // Sum of weights**2
   Double_t    fM;       // Sum of elements ( i.e. mean * sum_of_weights)
   Double_t    fM2;      // Second order momentum

public:

   TStatistic(const char *name = "") : fName(name), fN(0), fW(0.), fW2(0.), fM(0.), fM2(0.) { }
   TStatistic(const char *name, Int_t n, const Double_t *val, const Double_t *w = 0);
   ~TStatistic() { }

   // Getters
   const char    *GetName() const { return fName; }
   ULong_t        Hash() const { return fName.Hash(); }

   inline       Long64_t GetN() const { return fN; }
   inline       Long64_t GetNeff() const { return fW*fW/fW2; }
   inline       Double_t GetM2() const { return fM2; }
   inline       Double_t GetMean() const { return (fW > 0) ? fM/fW : 0; }
   inline       Double_t GetMeanErr() const { return  (fW > 0.) ?  TMath::Sqrt( GetVar()/ GetNeff() ) : 0; }
   inline       Double_t GetRMS() const { double var = GetVar(); return (var>0) ? TMath::Sqrt(var) : -1; }  
   inline       Double_t GetVar() const { return (fW>0) ? ( (fN>1) ? (fM2 / fW)*(fN / (fN-1.)) : 0 ) : -1; }
   inline       Double_t GetW() const { return fW; }
   inline       Double_t GetW2() const { return fW2; }

   // Merging
   Int_t Merge(TCollection *in);

   // Fill
   void Fill(Double_t val, Double_t w = 1.);

   // Print
   void Print(Option_t * = "") const;
   void ls(Option_t *opt = "") const { Print(opt); }

   ClassDef(TStatistic,2)  //Named statistical variable
};

#endif
 TStatistic.h:1
 TStatistic.h:2
 TStatistic.h:3
 TStatistic.h:4
 TStatistic.h:5
 TStatistic.h:6
 TStatistic.h:7
 TStatistic.h:8
 TStatistic.h:9
 TStatistic.h:10
 TStatistic.h:11
 TStatistic.h:12
 TStatistic.h:13
 TStatistic.h:14
 TStatistic.h:15
 TStatistic.h:16
 TStatistic.h:17
 TStatistic.h:18
 TStatistic.h:19
 TStatistic.h:20
 TStatistic.h:21
 TStatistic.h:22
 TStatistic.h:23
 TStatistic.h:24
 TStatistic.h:25
 TStatistic.h:26
 TStatistic.h:27
 TStatistic.h:28
 TStatistic.h:29
 TStatistic.h:30
 TStatistic.h:31
 TStatistic.h:32
 TStatistic.h:33
 TStatistic.h:34
 TStatistic.h:35
 TStatistic.h:36
 TStatistic.h:37
 TStatistic.h:38
 TStatistic.h:39
 TStatistic.h:40
 TStatistic.h:41
 TStatistic.h:42
 TStatistic.h:43
 TStatistic.h:44
 TStatistic.h:45
 TStatistic.h:46
 TStatistic.h:47
 TStatistic.h:48
 TStatistic.h:49
 TStatistic.h:50
 TStatistic.h:51
 TStatistic.h:52
 TStatistic.h:53
 TStatistic.h:54
 TStatistic.h:55
 TStatistic.h:56
 TStatistic.h:57
 TStatistic.h:58
 TStatistic.h:59
 TStatistic.h:60
 TStatistic.h:61
 TStatistic.h:62
 TStatistic.h:63
 TStatistic.h:64
 TStatistic.h:65
 TStatistic.h:66
 TStatistic.h:67
 TStatistic.h:68
 TStatistic.h:69
 TStatistic.h:70
 TStatistic.h:71
 TStatistic.h:72
 TStatistic.h:73
 TStatistic.h:74
 TStatistic.h:75
 TStatistic.h:76
 TStatistic.h:77
 TStatistic.h:78
 TStatistic.h:79
 TStatistic.h:80
 TStatistic.h:81
 TStatistic.h:82
 TStatistic.h:83
 TStatistic.h:84
 TStatistic.h:85
 TStatistic.h:86
 TStatistic.h:87
 TStatistic.h:88