// Modified: Yuri Kharlov (Jul.2009)
// --- ROOT system ---
-#include "TArrayD.h"
#include "TArrayI.h"
#include "TList.h"
#include "TMath.h"
AliPHOSRawFitterv1::~AliPHOSRawFitterv1()
{
//Destructor.
+ //Destructor
if(fSampleParamsLow){
delete fSampleParamsLow ;
fSampleParamsLow=0 ;
//-----------------------------------------------------------------------------
AliPHOSRawFitterv1::AliPHOSRawFitterv1(const AliPHOSRawFitterv1 &phosFitter ):
- AliPHOSRawFitterv0(phosFitter),
+ AliPHOSRawFitterv0(phosFitter),
fSampleParamsLow(0x0),
fSampleParamsHigh(0x0),
fToFit(0x0)
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;
}
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") ;
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
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
}
//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 ;
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)
{
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) ;
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
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))) ;
-}