]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSRawFitterv1.cxx
Updating limits to cope both with p-A and A-p ZDC timing
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawFitterv1.cxx
index 09f3a311d5ed321b018eb7a5d3162b35b09bb31e..d81c430c4829f17f0bcabcda6f699de914ae1f28 100644 (file)
 // Modified: Yuri Kharlov (Jul.2009)
 
 // --- ROOT system ---
-#include "TArrayD.h"
+#include "TArrayI.h"
 #include "TList.h"
 #include "TMath.h"
 #include "TMinuit.h"
-#include "TCanvas.h"
-#include "TH1.h"
-#include "TH2.h"
-#include "TF1.h"
-#include "TROOT.h"
 
 // --- AliRoot header files ---
 #include "AliLog.h"
@@ -78,6 +73,7 @@ AliPHOSRawFitterv1::AliPHOSRawFitterv1():
 AliPHOSRawFitterv1::~AliPHOSRawFitterv1()
 {
   //Destructor.
+  //Destructor
   if(fSampleParamsLow){
     delete fSampleParamsLow ; 
     fSampleParamsLow=0 ;
@@ -94,7 +90,7 @@ AliPHOSRawFitterv1::~AliPHOSRawFitterv1()
 
 //-----------------------------------------------------------------------------
 AliPHOSRawFitterv1::AliPHOSRawFitterv1(const AliPHOSRawFitterv1 &phosFitter ):
-  AliPHOSRawFitterv0(phosFitter), 
+  AliPHOSRawFitterv0(phosFitter),
   fSampleParamsLow(0x0),
   fSampleParamsHigh(0x0),
   fToFit(0x0)
@@ -109,15 +105,16 @@ AliPHOSRawFitterv1::AliPHOSRawFitterv1(const AliPHOSRawFitterv1 &phosFitter ):
 AliPHOSRawFitterv1& AliPHOSRawFitterv1::operator = (const AliPHOSRawFitterv1 &phosFitter)
 {
   //Assignment operator.
-
-  fToFit = new TList() ;
-  if(fSampleParamsLow){
-    fSampleParamsLow = phosFitter.fSampleParamsLow ;
-    fSampleParamsHigh= phosFitter.fSampleParamsHigh ;
-  }
-  else{
-    fSampleParamsLow =new TArrayD(*(phosFitter.fSampleParamsLow)) ; 
-    fSampleParamsHigh=new TArrayD(*(phosFitter.fSampleParamsHigh)) ;
+  if(this != &phosFitter) {
+    fToFit = new TList() ;
+    if(fSampleParamsLow){
+      fSampleParamsLow = phosFitter.fSampleParamsLow ;
+      fSampleParamsHigh= phosFitter.fSampleParamsHigh ;
+    }
+    else{
+      fSampleParamsLow =new TArrayD(*(phosFitter.fSampleParamsLow)) ; 
+      fSampleParamsHigh=new TArrayD(*(phosFitter.fSampleParamsHigh)) ;
+    }
   }
   return *this;
 }
@@ -151,8 +148,8 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
       pedMean += signal[i];
       pedRMS  += signal[i]*signal[i] ;
     }
-    fSamples->AddAt(signal[i],i);
-    fTimes  ->AddAt(       i ,i);
+    fSamples->AddAt(signal[i],sigLength-i-1);
+    fTimes  ->AddAt(i ,i);
   }
 
   fEnergy = -111;
@@ -187,6 +184,10 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
   }
 
   if (fEnergy < kBaseLine) fEnergy = 0;
+  //Evaluate time
+  Int_t iStart = 0;
+  while(iStart<sigLength && fSamples->At(iStart)-pedestal <kBaseLine) iStart++ ;
+  fTime = sigStart-sigLength+iStart; 
   
   //calculate time and energy
   Int_t    maxBin=0 ;
@@ -251,6 +252,7 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
   gMinuit->mncler();                     // Reset Minuit's list of paramters
   gMinuit->SetPrintLevel(-1) ;           // No Printout
   gMinuit->SetFCN(AliPHOSRawFitterv1::UnfoldingChiSquare) ;  
+
   // To set the address of the minimization function 
   
   fToFit->Clear("nodelete") ;
@@ -261,7 +263,7 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
       fSampleParamsLow->AddAt(double(maxAmp),5) ;
     else
       fSampleParamsLow->AddAt(double(1023),5) ;
-    fSampleParamsLow->AddAt(double(sigLength),6) ;
+    fSampleParamsLow->AddAt(double(iStart),6) ;
     fToFit->AddFirst((TObject*)fSampleParamsLow) ; 
     b=fSampleParamsLow->At(2) ;
     bmin=0.5 ;
@@ -273,7 +275,7 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
       fSampleParamsHigh->AddAt(double(maxAmp),5) ;
     else
       fSampleParamsHigh->AddAt(double(1023),5);
-    fSampleParamsHigh->AddAt(double(sigLength),6);
+    fSampleParamsHigh->AddAt(double(iStart),6);
     fToFit->AddFirst((TObject*)fSampleParamsHigh) ; 
     b=fSampleParamsHigh->At(2) ;
     bmin=0.05 ;
@@ -287,7 +289,7 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
   gMinuit->mnparm(0, "t0",  1.*tStart, 0.01, -500., 500., ierflg) ;
   if(ierflg != 0){
     //   AliWarning(Form("Unable to set initial value for fit procedure : t0=%e\n",1.*tStart) ) ;
-    fEnergy =   0. ;
+   fEnergy =   0. ;
     fTime   =-999. ;
     fQuality= 999. ;
     return kTRUE ; //will scan further
@@ -327,12 +329,12 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
   
   gMinuit->mnexcm("MIGRAD", &p0, 0, ierflg) ;    // minimize 
   
-  Double_t err,t0err ;
-  Double_t t0,efit ;
+  Double_t err=0.,t0err=0. ;
+  Double_t t0=0.,efit=0. ;
   gMinuit->GetParameter(0,t0, t0err) ;
   gMinuit->GetParameter(1,efit, err) ;
   
-  Double_t bfit, berr ;
+  Double_t bfit=0., berr=0. ;
   gMinuit->GetParameter(2,bfit,berr) ;
   
   //Calculate total energy
@@ -350,7 +352,7 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
   }                                                                             
   
   //evaluate fit quality
-  Double_t fmin,fedm,errdef ;
+  Double_t fmin=0.,fedm=0.,errdef=0. ;
   Int_t npari,nparx,istat;
   gMinuit->mnstat(fmin,fedm,errdef,npari,nparx,istat) ;
   fQuality = fmin/sigLength ;
@@ -361,13 +363,26 @@ Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t si
     fQuality /= 0.75 + 0.0025*fEnergy ;
   
   fEnergy = efit ;
-  fTime   = t0 - 4.024*bfit ; //-10.402*bfit+4.669*bfit*bfit ; //Correction for 70 samples
-  fTime  += sigStart;
+  fTime  += t0 - 4.024*bfit ; //-10.402*bfit+4.669*bfit*bfit ; //Correction for 70 samples
+//  fTime  += sigStart;
   
   delete fSamples ;
   delete fTimes ;
   return kTRUE;
 }
+//-----------------------------------------------------------------------------
+Double_t AliPHOSRawFitterv1::Gamma2(Double_t dt,Double_t en,Double_t b,TArrayD * params){  //Function for fitting samples
+  //parameters:
+  //dt-time after start
+  //en-amplutude
+  //function parameters
+  
+  Double_t ped=params->At(4) ;
+  if(dt<0.)
+    return ped ; //pedestal
+  else
+    return ped+en*(TMath::Power(dt,params->At(0))*TMath::Exp(-dt*params->At(1))+b*dt*dt*TMath::Exp(-dt*params->At(3))) ;
+}
 //_____________________________________________________________________________
 void AliPHOSRawFitterv1::UnfoldingChiSquare(Int_t & /*nPar*/, Double_t * Grad, Double_t & fret, Double_t * x, Int_t iflag)
 {
@@ -389,7 +404,7 @@ void AliPHOSRawFitterv1::UnfoldingChiSquare(Int_t & /*nPar*/, Double_t * Grad, D
   Double_t n=params->At(0) ;
   Double_t alpha=params->At(1) ;
   Double_t beta=params->At(3) ;
-  Double_t ped=params->At(4) ;
+  //  Double_t ped=params->At(4) ;
 
   Double_t overflow=params->At(5) ;
   Int_t iBin = (Int_t) params->At(6) ;
@@ -404,20 +419,24 @@ void AliPHOSRawFitterv1::UnfoldingChiSquare(Int_t & /*nPar*/, Double_t * Grad, D
   for(Int_t i = iBin; i<nSamples ; i++) {
     Double_t dt=double(times->At(i))-t0 ;
     Double_t fsample = double(samples->At(i)) ;
-    if(fsample>=overflow)
-      continue ;
-    Double_t diff ;
+    Double_t diff=0. ;
     exp1*=dexp1 ;
     exp2*=dexp2 ;
+//    if(fsample>=overflow)
+//      continue ;    
     if(dt<=0.){
-      diff=fsample - ped 
+      diff=fsample ; 
       fret += diff*diff ;
       continue ;
     }
+    
     Double_t dtn=TMath::Power(dt,n) ;
     Double_t dtnE=dtn*exp1 ;
     Double_t dt2E=dt*dt*exp2 ;
-    Double_t fit=ped+en*(dtnE + b*dt2E) ;
+    Double_t fit=en*(dtnE + b*dt2E) ;
+    if(fsample>=overflow && fit>=overflow)
+      continue ;    
+
     diff = fsample - fit ;
     fret += diff*diff ;
     if(iflag == 2){  // calculate gradient
@@ -425,21 +444,9 @@ void AliPHOSRawFitterv1::UnfoldingChiSquare(Int_t & /*nPar*/, Double_t * Grad, D
       Grad[1] -= diff*(dtnE+b*dt2E) ;
       Grad[2] -= en*diff*dt2E ;
     }
+    
   }
   if(iflag == 2)
     for(Int_t iparam = 0 ; iparam < 3 ; iparam++)    
       Grad[iparam] *= 2. ; 
 }
-//-----------------------------------------------------------------------------
-Double_t AliPHOSRawFitterv1::Gamma2(Double_t dt,Double_t en,Double_t b,TArrayD * params){  //Function for fitting samples
-  //parameters:
-  //dt-time after start
-  //en-amplutude
-  //function parameters
-  
-  Double_t ped=params->At(4) ;
-  if(dt<0.)
-    return ped ; //pedestal
-  else
-    return ped+en*(TMath::Power(dt,params->At(0))*TMath::Exp(-dt*params->At(1))+b*dt*dt*TMath::Exp(-dt*params->At(3))) ;
-}