CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/CalibCalorimetry/EcalLaserAnalyzer/src/TMom.cc

Go to the documentation of this file.
00001 /* 
00002  *  \class TMom
00003  *
00004  *  $Date: 2013/04/19 22:19:23 $
00005  *  \author: Julie Malcles - CEA/Saclay
00006  */
00007 
00008 #include <CalibCalorimetry/EcalLaserAnalyzer/interface/TMom.h>
00009 #include <CalibCalorimetry/EcalLaserAnalyzer/interface/TMarkov.h>
00010 #include <TMath.h>
00011 
00012 #include <cassert>
00013 
00014 using namespace std;
00015 
00016 //ClassImp(TMom)
00017 
00018 
00019 // Default Constructor...
00020 TMom::TMom()
00021 {
00022   init(0.0,10.0e9);
00023 }
00024 
00025 // Constructor...
00026 TMom::TMom(double cutlow, double cuthigh)
00027 {
00028   init(cutlow,cuthigh);
00029 }
00030 TMom::TMom(const std::vector<double>& cutlow, const std::vector<double>& cuthigh)
00031 {
00032   init(cutlow,cuthigh);
00033 }
00034 
00035 // Destructor
00036 TMom::~TMom()
00037 {
00038 }
00039 
00040 void TMom::init(double cutlow, double cuthigh)
00041 {
00042 
00043   nevt=0;
00044   mean=0;
00045   mean2=0;
00046   mean3=0;
00047   sum=0;
00048   sum2=0;
00049   sum3=0;
00050   rms=0;
00051   M3=0;
00052   peak=0;
00053   min=10.0e9;
00054   max=0.;
00055   _cutLow.clear();
00056   _cutHigh.clear();
00057   _dimCut=1;
00058   _cutLow.push_back(cutlow);
00059   _cutHigh.push_back(cuthigh);
00060   for(int i=0;i<101;i++){
00061     bing[i]=0;
00062   }
00063   
00064 }
00065 void TMom::init(const std::vector<double>& cutlow, const std::vector<double>& cuthigh)
00066 {
00067 
00068   nevt=0;
00069   mean=0;
00070   mean2=0;
00071   mean3=0;
00072   sum=0;
00073   sum2=0;
00074   sum3=0;
00075   rms=0;
00076   M3=0;
00077   peak=0;
00078   min=10.0e9;
00079   max=0.;
00080   assert(cutlow.size()==cuthigh.size());  
00081   _cutLow.clear();
00082   _cutHigh.clear();
00083   _dimCut=cutlow.size();
00084   _cutLow=cutlow;
00085   _cutHigh=cuthigh;
00086   for(int i=0;i<101;i++){
00087     bing[i]=0;
00088   }
00089   
00090 }
00091 void TMom::setCut(double cutlow, double cuthigh){
00092 
00093   _cutLow.clear();
00094   _cutHigh.clear();
00095   _dimCut=1;
00096   _cutLow.push_back(cutlow);
00097   _cutHigh.push_back(cuthigh);
00098 
00099 }
00100 void TMom::setCut(const std::vector<double>& cutlow ,const std::vector<double>& cuthigh){
00101   
00102   assert(cutlow.size( )== cuthigh.size());
00103   _cutLow.clear();
00104   _cutHigh.clear();
00105   _dimCut=cutlow.size();
00106   _cutLow=cutlow;
00107   _cutHigh=cuthigh;
00108   
00109 }
00110 
00111 void TMom::addEntry(double val)
00112 {
00113   std::vector<double> dumb;
00114   dumb.push_back(val);
00115   addEntry(val,dumb);
00116 }
00117   
00118 void TMom::addEntry(double val, const std::vector<double>& valcut)
00119 {
00120   
00121   int passingAllCuts=1;
00122   
00123   for (int iCut=0;iCut<_dimCut;iCut++){
00124     int passing;
00125     if( valcut.at(iCut)>_cutLow.at(iCut) && valcut.at(iCut) <=_cutHigh.at(iCut) ){
00126       passing=1;
00127     }else passing=0;
00128     passingAllCuts*=passing; 
00129   }
00130   
00131   if( passingAllCuts == 1 ){
00132     
00133     nevt+=1;
00134     sum+=val;
00135     sum2+=val*val;
00136     sum3+=val*val*val;
00137     if(val>max) max=val;
00138     if(val<min) min=val;
00139     
00140     // for peak stuff 
00141     _ampl.push_back(val);
00142   }
00143   
00144 }
00145 
00146 
00147 
00148 double  TMom::getMean(){
00149   if(nevt!=0) mean=sum/nevt;
00150   else mean=0.0;
00151   return mean;
00152 }
00153 
00154 double  TMom::getMean2(){
00155   if(nevt!=0) mean2=sum2/nevt;
00156   else mean2=0.0;
00157   return mean2;
00158 }
00159 double  TMom::getMean3(){
00160   if(nevt!=0) mean3=sum3/nevt;
00161   else mean3=0.0;
00162   return mean3;
00163 }
00164 
00165 int  TMom::getNevt(){ return nevt;}
00166 
00167 double  TMom::getRMS(){
00168   double m=getMean(); 
00169   double m2=getMean2(); 
00170   if(nevt!=0) rms=TMath::Sqrt( m2 - m*m );
00171   else rms=0.0;
00172   return rms;
00173 }
00174 
00175 double TMom::getM3(){
00176 
00177   double m=getMean(); 
00178   double m2=getMean2();
00179   double m3=getMean3();
00180   double sig = getRMS();
00181   
00182   if(nevt!=0 && sig!=0) M3=( m3 - 3.0*m*(m2-m*m) - m*m*m )/(sig*sig*sig); 
00183   else M3=0.0;
00184   return M3;
00185 }
00186 
00187 double TMom::getMin(){return min;}
00188 double  TMom::getMax(){return max;}
00189 
00190 std::vector<double> TMom::getPeak(){
00191   
00192   std::vector<double> p;
00193   double wbin=(max-min)/100.;
00194   int bung;
00195   
00196   for(unsigned int i=0;i<_ampl.size();i++){
00197     if(wbin <= 0.0)
00198       bung=1;
00199     else
00200       bung= (int) ((_ampl.at(i)-min)/wbin)+1;
00201     if(1 <= bung && bung <= 100)
00202       bing[bung]++;
00203   }
00204   
00205   TMarkov *peakM = new TMarkov();
00206 
00207   int popmax=0;
00208   
00209   for(int k=1;k<101;k++) {
00210     if(bing[k] > popmax) {
00211       popmax=bing[k];
00212     }
00213   }
00214   
00215   peakM -> peakFinder(&bing[0]);
00216   p.push_back(peakM -> getPeakValue(0));
00217   p.push_back(peakM -> getPeakValue(1));
00218         
00219   return p;
00220 }
00221