ROOT logo
/**************************************************************************
 * Copyright(c) 2007, ALICE Experiment at CERN, All rights reserved.      *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id: $ */

// This class extracts the signal parameters (energy, time, quality)
// from ALTRO samples. Energy is in ADC counts, time is in time bin units.
// Class uses FastFitting algorithm to fit sample and extract time and Amplitude 
// and evaluate sample quality = (chi^2/NDF)/some parameterization providing 
// efficiency close to 100%
// 
// Typical use case:
//     AliPHOSRawFitter *fitter=new AliPHOSRawFitter();
//     fitter->SetChannelGeo(module,cellX,cellZ,caloFlag);
//     fitter->SetCalibData(fgCalibData) ;
//     fitter->Eval(sig,sigStart,sigLength);
//     Double_t amplitude = fitter.GetEnergy();
//     Double_t time      = fitter.GetTime();
//     Bool_t   isLowGain = fitter.GetCaloFlag()==0;

// Author: Dmitri Peressounko (after A.Pavlinov - see RAW/AliCaloFastAltroFitv0.cxx)

// --- ROOT system ---
#include "TArrayI.h"
#include "TList.h"
#include "TMath.h"
#include "TH1I.h"
#include "TF1.h"
#include "TCanvas.h"
#include "TFile.h"
#include "TROOT.h"

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliPHOSCalibData.h"
#include "AliPHOSRawFitterv2.h"
#include "AliPHOSPulseGenerator.h"

ClassImp(AliPHOSRawFitterv2)

//-----------------------------------------------------------------------------
AliPHOSRawFitterv2::AliPHOSRawFitterv2():
  AliPHOSRawFitterv0(),
  fAlpha(0.1),fBeta(0.035),fMax(0) 
{
  //Default constructor.
}

//-----------------------------------------------------------------------------
AliPHOSRawFitterv2::~AliPHOSRawFitterv2()
{
  //Destructor.
}

//-----------------------------------------------------------------------------
AliPHOSRawFitterv2::AliPHOSRawFitterv2(const AliPHOSRawFitterv2 &phosFitter ):
  AliPHOSRawFitterv0(phosFitter),
  fAlpha(0.1),fBeta(0.035),fMax(0)
{
  //Copy constructor.
}

//-----------------------------------------------------------------------------
AliPHOSRawFitterv2& AliPHOSRawFitterv2::operator = (const AliPHOSRawFitterv2 & /*phosFitter*/)
{
  //Assignment operator.
  return *this;
}

//-----------------------------------------------------------------------------
Bool_t AliPHOSRawFitterv2::Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength)
{
  //Extract an energy deposited in the crystal,
  //crystal' position (module,column,row),
  //time and gain (high or low).
  //First collects sample, then evaluates it and if it has
  //reasonable shape, fits it with Gamma2 function and extracts 
  //energy and time.

  const Float_t maxEtoFit=5 ; //fit only samples above this energy, accept all samples (with good aRMS) below it
  const Float_t kBaseLine   = 1.0;
  const Int_t   kPreSamples = 10;

  fOverflow = kFALSE ;  
  fEnergy=0 ;
  if (fCaloFlag == 2 || fNBunches > 1) {
    fQuality = 150;
    return kTRUE;
  }
  if(fCaloFlag!=0 && fCaloFlag!=1){//Corrupted sample
    fQuality=200;
    fEnergy=0 ;
    return kTRUE;
  }

  //Evaluate pedestals 
  Float_t pedMean = 0;
  Float_t pedRMS  = 0;
  Int_t   nPed    = 0;
  for (Int_t i=sigLength-kPreSamples; i<sigLength; i++) {
    nPed++;
    pedMean += signal[i];
    pedRMS  += signal[i]*signal[i] ;
  }

  fEnergy = -111;
  fQuality= 999. ;
  Double_t pedestal = 0;

  if (fPedSubtract) {
    if (nPed > 0) {
      fPedestalRMS=(pedRMS - pedMean*pedMean/nPed)/nPed ;
      if(fPedestalRMS > 0.) 
	fPedestalRMS = TMath::Sqrt(fPedestalRMS) ;
      pedestal = (Double_t)(pedMean/nPed); // pedestal subtraction
    }
    else
      return kFALSE;
  }
  else {
    //take pedestals from DB
    pedestal = (Double_t) fAmpOffset ;
  }

  
  //calculate rough quality of the sample and check for overflow
  Int_t    maxAmp=0 ;
  Int_t    minAmp= signal[0] ;
  Int_t    nMax = 0 ; //number of points in plato
  Double_t aMean =0. ;
  Double_t aRMS  =0. ;
  Double_t wts   =0 ;
  Bool_t falling = kTRUE ; //Bad monotoneusly falling sample
  Bool_t rising = kTRUE ; //Bad monotoneusly riging sample
  for (Int_t i=0; i<sigLength; i++){
    if(signal[i] > pedestal){
      Double_t de = signal[i] - pedestal ;
      if(de > 1.) {
	aMean += de*i ;
	aRMS  += de*i*i ;
	wts   += de; 
      }
      if(signal[i] >  maxAmp){
        maxAmp = signal[i]; 
        nMax=0;
      }
      if(signal[i] == maxAmp){
        nMax++;
      }
      if(signal[i] <  minAmp)
        minAmp=signal[i] ;
      if(falling && i>0 && signal[i]<signal[i-1])
        falling=kFALSE ;
      if(rising && i>0 && signal[i]>signal[i-1])
        rising=kFALSE ;
    }
  }

  if(rising || falling){//bad "rising" or falling  sample
    fEnergy =    0. ;
    fTime   = 0. ; //-999. ;
    fQuality=  250. ;
    return kTRUE ;
  }
  if(maxAmp-minAmp<3 && maxAmp>7 && sigLength>20){ //bad flat sample
    fEnergy =    0. ;
    fTime   = 0; //-999. ;
    fQuality=  260. ;
    return kTRUE ;
  }

  fEnergy=Double_t(maxAmp)-pedestal ;
  if (fEnergy < kBaseLine) fEnergy = 0;
  fTime = sigStart-sigLength-3;

  //do not test quality of too soft samples
  if (wts > 0) {
    aMean /= wts; 
    aRMS   = aRMS/wts - aMean*aMean;
  }
  if (fEnergy <= maxEtoFit){
    if (aRMS < 2.) //sigle peak
      fQuality = 299. ;
    else
      fQuality =   0. ;
    //Evaluate time of signal arriving
    return kTRUE ;
  }

  //look for plato on the top of sample
  if (fEnergy>500 &&  //this is not fluctuation of soft sample
     nMax>2){ //and there is a plato
    fOverflow = kTRUE ;
  }
  

  //do not fit High Gain samples with overflow
  if(fCaloFlag==1 && fOverflow){
    fQuality = 99. ;
    return kTRUE;

  }

  //----Now fit sample with reasonable shape------
  TArrayD samples(sigLength); // array of sample amplitudes
  TArrayD times(sigLength); // array of sample time stamps
  for (Int_t i=0; i<sigLength; i++) {
    samples.AddAt(signal[i]-pedestal,sigLength-i-1);
    times.AddAt(double(i),i);
  }
      
  if(fMax==0)
    FindMax() ;
  if(!FindAmpT(samples,times)){
    if(AliLog::GetDebugLevel("PHOS","AliPHOSRawFitterv2")>3){
      goto plot ;
    }
    else{
      return kFALSE ;
    }
  }
  fEnergy*=fMax ;
  fTime += sigStart-sigLength-3;


  //Impose cut on quality
//  fQuality/=4. ;
  fQuality/=1.+0.005*fEnergy ;

  //Draw corrupted samples
  if(AliLog::GetDebugLevel("PHOS","AliPHOSRawFitterv2")>3){
    if(fEnergy > 50. ){
    plot:
      printf("Sample par: amp=%f,  t0=%f, Quality=%f \n",fEnergy,fTime,fQuality) ;
      TH1I * h = (TH1I*)gROOT->FindObjectAny("hSamples") ;
      if(!h) h = new TH1I("hSamples","Samples",65,0.,65.) ;
      h->Reset() ;
      for (Int_t i=0; i<sigLength; i++) {
        h->SetBinContent(i+1,float(samples.At(i))) ;
      }
//      TF1 * fffit = new TF1("fffit","[0]+[1]*((x-[2])/[3])^2*exp(2.-2.*(x-[2])/[3])",0.,200.) ;
      TF1 * fffit = new TF1("fffit","[0]*((x-[1])*(x-[1])*exp(-[2]*(x-[1]))+(x-[1])*exp(-[3]*(x-[1])))",0.,60.) ;
      fffit->SetParameters(fEnergy/fMax,fTime-(sigStart-sigLength-3),fAlpha,fBeta) ;
      fffit->SetLineColor(2) ;
      TCanvas * can = (TCanvas*)gROOT->FindObjectAny("cSamples") ;
      if(!can){
        can = new TCanvas("cSamples","cSamples",10,10,600,600) ;
        can->SetFillColor(0) ;
        can->SetFillStyle(0) ;
        can->Range(0,0,1,1);
        can->SetBorderSize(0);
      }
      can->cd() ;
  
      TPad * spectrum_1 = new TPad("spectrum_1", "spectrum_1",0.001,0.32,0.99,0.99);
      spectrum_1->Draw();
      spectrum_1->cd();
      spectrum_1->Range(0,0,1,1);
      spectrum_1->SetFillColor(0);
      spectrum_1->SetFillStyle(4000);
      spectrum_1->SetBorderSize(1);
      spectrum_1->SetBottomMargin(0.012);
      spectrum_1->SetTopMargin(0.03);
      spectrum_1->SetLeftMargin(0.10);
      spectrum_1->SetRightMargin(0.05);

      char title[155] ;
      snprintf(title,155,"Sample, mod=%d, x=%d, z=%d, Quality=%5.1f",fModule,fCellX,fCellZ,fQuality) ;
      h->SetTitle(title) ;
//      h->Fit(fffit,"","",0.,51.) ;
      h->Draw() ;
      fffit->Draw("same") ;
/*
      sprintf(title,"mod%d_x%d_z%d_HG_qu%4.1f",fModule,fCellX,fCellZ,fQuality) ;
      TFile fout("samples_bad.root","update") ;
      h->Write(title);
      fout.Close() ;
*/
      can->cd() ;
      TPad *spectrum_2 = new TPad("spectrum_2", "spectrum_2",0.001,0.01,0.99,0.32);
      spectrum_2->SetFillColor(0) ;
      spectrum_2->SetFillStyle(0) ;
      spectrum_2->SetGridy() ;
      spectrum_2->Draw();
      spectrum_2->Range(0,0,1,1);
      spectrum_2->SetFillColor(0);
      spectrum_2->SetBorderSize(1);
      spectrum_2->SetTopMargin(0.01);
      spectrum_2->SetBottomMargin(0.25);
      spectrum_2->SetLeftMargin(0.10);
      spectrum_2->SetRightMargin(0.05);
      spectrum_2->cd() ;

      TH1I * hd = (TH1I*)gROOT->FindObjectAny("hSamplesDif") ;
      if(!hd) hd = new TH1I("hd","Samples",65,0.,65.) ;
      hd->Reset() ;
      for (Int_t i=0; i<sigLength; i++) {
        hd->SetBinContent(i+1,TMath::Max(-1023.,TMath::Min(1023.,samples.At(i)+pedestal-fffit->Eval(i)))) ;
      }
      hd->Draw();
 
      can->Update() ;
      printf("Press <enter> to continue\n") ;
      getchar();


      delete fffit ;
      delete spectrum_1 ;
      delete spectrum_2 ;
    }
  }
  
  return kTRUE;
}
//------------------------------------------------------------------
Bool_t AliPHOSRawFitterv2::FindAmpT(TArrayD samples, TArrayD times){
// makes fit

  const Int_t nMaxIter=50 ;   //Maximal number of iterations
  const Double_t epsdt = 1.e-3 ; //expected precision of t0 calculation

  Double_t dTime=times.At(0)-0.5 ; //Most probable Initial approximation
//printf(" start fit... \n") ;

  Int_t nPoints = samples.GetSize() ;
  Double_t dea=TMath::Exp(-fAlpha) ;
  Double_t deb=TMath::Exp(-fBeta) ;
  Double_t dt=1.,timeOld=dTime,dfOld=0. ; 
  for(Int_t iter=0; iter<nMaxIter; iter++){
    Double_t yy=0.;
    Double_t yf=0. ;
    Double_t ydf=0. ;
    Double_t yddf=0. ;
    Double_t ff=0. ;
    Double_t fdf=0. ;
    Double_t dfdf=0. ;
    Double_t fddf=0. ;
    Int_t nfit=0 ;
    Double_t aexp=TMath::Exp(-fAlpha*(times.At(0)-1.-dTime)) ;
    Double_t bexp=TMath::Exp(-fBeta*(times.At(0)-1.-dTime)) ;
    for(Int_t i=0; i<nPoints; i++){
      Double_t t= times.At(i)-dTime ;
      aexp*=dea ;
      bexp*=deb ;
      if(t<0.) continue ;
      Double_t y=samples.At(i) ;
      if(y<=fAmpThreshold)
        continue ;
      nfit++ ;
      Double_t at=fAlpha*t ;
      Double_t bt = fBeta*t ;
      Double_t phi=t*(t*aexp+bexp) ;
      Double_t dphi=t*aexp*(2.-at)+(1.-bt)*bexp ;
      Double_t ddphi=aexp*(2.-4.*at+at*at)+bexp*fBeta*(bt-2.) ;
      yy+=y*y ;
      yf+=y*phi ;
      ydf+=y*dphi ;
      yddf+=y*ddphi ;
      ff+=phi*phi ;
      fdf+=phi*dphi ;
      dfdf+=dphi*dphi ;
      fddf+=phi*ddphi ;
    }

    if(ff<1.e-09||nfit==0 ){
      fQuality=199 ;
      return kFALSE ;
    }
    Double_t f=ydf*ff-yf*fdf ;     //d(chi2)/dt
    Double_t df=yf*(dfdf+fddf)-yddf*ff-ydf*fdf;
    if(df<=0.){ //we are too far from the root. In the wicinity of root df>0
      if(iter!=0 && dfOld>0.){//If at previous step df was OK, just reduce step size
        dt*=0.5 ;
        dTime=timeOld+dt ;  
        continue ;
      }
      if(f<0){ //f<0 => dTime is too small and we still do not know root region
        dTime+=2. ;
        continue ;
      }
      else{ //dTime is too large, we are beyond the root region
        dTime-=2. ;
        continue ;
      }
    }
    dt=-f/df ; 
    if(TMath::Abs(dt)<epsdt){
      fQuality=(yy-yf*yf/ff)/nfit ;
      fEnergy=yf/ff ;  //ff!=0 already tested
      fTime=dTime ;
      return kTRUE ;
    }
    //In some cases time steps are huge (derivative ~0)
    if(dt>10.) dt=10. ;   //restrict step size
    if(dt<-10.) dt=-5.3 ; //this restriction should be asimmetric to avoid jumping from one point to another
    timeOld=dTime ;  //remember current position for the case
    dfOld=df ;       //of reduction of dt step size
    dTime+=dt ;

    if(dTime>100. || dTime<-30.){ //this is corrupted sample, do not spend time improving accuracy.
      fQuality=(yy-yf*yf/ff)/nfit ;
      fEnergy=yf/ff ;  //ff!=0 already tested
      fTime=dTime ;
      return kFALSE ;
    }

  }
  //failed to find a root, too many iterations
  fQuality=99.;
  fEnergy=0 ; 
  return kFALSE ;
}
//_________________________________________
void AliPHOSRawFitterv2::FindMax(){
  //Finds maxumum of currecnt parameterization
  Double_t t=2./fAlpha ;
  fMax = t*t*TMath::Exp(-fAlpha*t)+t*TMath::Exp(-fBeta*t) ;
  Double_t dt=15 ;
  while(dt>0.01){
     Double_t dfdt=(2.*t-fAlpha*t*t)*TMath::Exp(-fAlpha*t)+(1.-fBeta*t)*TMath::Exp(-fBeta*t) ;
     if(dfdt>0.)
        t+=dt ;
     else
       t-=dt ;
     Double_t maxNew = t*t*TMath::Exp(-fAlpha*t)+t*TMath::Exp(-fBeta*t) ;
     if(maxNew>fMax)
        fMax=maxNew ;
     else{
       dt/=2 ;
       if(dfdt<0.)
         t+=dt ;
       else
        t-=dt ;
     }
  }   
}
 
 AliPHOSRawFitterv2.cxx:1
 AliPHOSRawFitterv2.cxx:2
 AliPHOSRawFitterv2.cxx:3
 AliPHOSRawFitterv2.cxx:4
 AliPHOSRawFitterv2.cxx:5
 AliPHOSRawFitterv2.cxx:6
 AliPHOSRawFitterv2.cxx:7
 AliPHOSRawFitterv2.cxx:8
 AliPHOSRawFitterv2.cxx:9
 AliPHOSRawFitterv2.cxx:10
 AliPHOSRawFitterv2.cxx:11
 AliPHOSRawFitterv2.cxx:12
 AliPHOSRawFitterv2.cxx:13
 AliPHOSRawFitterv2.cxx:14
 AliPHOSRawFitterv2.cxx:15
 AliPHOSRawFitterv2.cxx:16
 AliPHOSRawFitterv2.cxx:17
 AliPHOSRawFitterv2.cxx:18
 AliPHOSRawFitterv2.cxx:19
 AliPHOSRawFitterv2.cxx:20
 AliPHOSRawFitterv2.cxx:21
 AliPHOSRawFitterv2.cxx:22
 AliPHOSRawFitterv2.cxx:23
 AliPHOSRawFitterv2.cxx:24
 AliPHOSRawFitterv2.cxx:25
 AliPHOSRawFitterv2.cxx:26
 AliPHOSRawFitterv2.cxx:27
 AliPHOSRawFitterv2.cxx:28
 AliPHOSRawFitterv2.cxx:29
 AliPHOSRawFitterv2.cxx:30
 AliPHOSRawFitterv2.cxx:31
 AliPHOSRawFitterv2.cxx:32
 AliPHOSRawFitterv2.cxx:33
 AliPHOSRawFitterv2.cxx:34
 AliPHOSRawFitterv2.cxx:35
 AliPHOSRawFitterv2.cxx:36
 AliPHOSRawFitterv2.cxx:37
 AliPHOSRawFitterv2.cxx:38
 AliPHOSRawFitterv2.cxx:39
 AliPHOSRawFitterv2.cxx:40
 AliPHOSRawFitterv2.cxx:41
 AliPHOSRawFitterv2.cxx:42
 AliPHOSRawFitterv2.cxx:43
 AliPHOSRawFitterv2.cxx:44
 AliPHOSRawFitterv2.cxx:45
 AliPHOSRawFitterv2.cxx:46
 AliPHOSRawFitterv2.cxx:47
 AliPHOSRawFitterv2.cxx:48
 AliPHOSRawFitterv2.cxx:49
 AliPHOSRawFitterv2.cxx:50
 AliPHOSRawFitterv2.cxx:51
 AliPHOSRawFitterv2.cxx:52
 AliPHOSRawFitterv2.cxx:53
 AliPHOSRawFitterv2.cxx:54
 AliPHOSRawFitterv2.cxx:55
 AliPHOSRawFitterv2.cxx:56
 AliPHOSRawFitterv2.cxx:57
 AliPHOSRawFitterv2.cxx:58
 AliPHOSRawFitterv2.cxx:59
 AliPHOSRawFitterv2.cxx:60
 AliPHOSRawFitterv2.cxx:61
 AliPHOSRawFitterv2.cxx:62
 AliPHOSRawFitterv2.cxx:63
 AliPHOSRawFitterv2.cxx:64
 AliPHOSRawFitterv2.cxx:65
 AliPHOSRawFitterv2.cxx:66
 AliPHOSRawFitterv2.cxx:67
 AliPHOSRawFitterv2.cxx:68
 AliPHOSRawFitterv2.cxx:69
 AliPHOSRawFitterv2.cxx:70
 AliPHOSRawFitterv2.cxx:71
 AliPHOSRawFitterv2.cxx:72
 AliPHOSRawFitterv2.cxx:73
 AliPHOSRawFitterv2.cxx:74
 AliPHOSRawFitterv2.cxx:75
 AliPHOSRawFitterv2.cxx:76
 AliPHOSRawFitterv2.cxx:77
 AliPHOSRawFitterv2.cxx:78
 AliPHOSRawFitterv2.cxx:79
 AliPHOSRawFitterv2.cxx:80
 AliPHOSRawFitterv2.cxx:81
 AliPHOSRawFitterv2.cxx:82
 AliPHOSRawFitterv2.cxx:83
 AliPHOSRawFitterv2.cxx:84
 AliPHOSRawFitterv2.cxx:85
 AliPHOSRawFitterv2.cxx:86
 AliPHOSRawFitterv2.cxx:87
 AliPHOSRawFitterv2.cxx:88
 AliPHOSRawFitterv2.cxx:89
 AliPHOSRawFitterv2.cxx:90
 AliPHOSRawFitterv2.cxx:91
 AliPHOSRawFitterv2.cxx:92
 AliPHOSRawFitterv2.cxx:93
 AliPHOSRawFitterv2.cxx:94
 AliPHOSRawFitterv2.cxx:95
 AliPHOSRawFitterv2.cxx:96
 AliPHOSRawFitterv2.cxx:97
 AliPHOSRawFitterv2.cxx:98
 AliPHOSRawFitterv2.cxx:99
 AliPHOSRawFitterv2.cxx:100
 AliPHOSRawFitterv2.cxx:101
 AliPHOSRawFitterv2.cxx:102
 AliPHOSRawFitterv2.cxx:103
 AliPHOSRawFitterv2.cxx:104
 AliPHOSRawFitterv2.cxx:105
 AliPHOSRawFitterv2.cxx:106
 AliPHOSRawFitterv2.cxx:107
 AliPHOSRawFitterv2.cxx:108
 AliPHOSRawFitterv2.cxx:109
 AliPHOSRawFitterv2.cxx:110
 AliPHOSRawFitterv2.cxx:111
 AliPHOSRawFitterv2.cxx:112
 AliPHOSRawFitterv2.cxx:113
 AliPHOSRawFitterv2.cxx:114
 AliPHOSRawFitterv2.cxx:115
 AliPHOSRawFitterv2.cxx:116
 AliPHOSRawFitterv2.cxx:117
 AliPHOSRawFitterv2.cxx:118
 AliPHOSRawFitterv2.cxx:119
 AliPHOSRawFitterv2.cxx:120
 AliPHOSRawFitterv2.cxx:121
 AliPHOSRawFitterv2.cxx:122
 AliPHOSRawFitterv2.cxx:123
 AliPHOSRawFitterv2.cxx:124
 AliPHOSRawFitterv2.cxx:125
 AliPHOSRawFitterv2.cxx:126
 AliPHOSRawFitterv2.cxx:127
 AliPHOSRawFitterv2.cxx:128
 AliPHOSRawFitterv2.cxx:129
 AliPHOSRawFitterv2.cxx:130
 AliPHOSRawFitterv2.cxx:131
 AliPHOSRawFitterv2.cxx:132
 AliPHOSRawFitterv2.cxx:133
 AliPHOSRawFitterv2.cxx:134
 AliPHOSRawFitterv2.cxx:135
 AliPHOSRawFitterv2.cxx:136
 AliPHOSRawFitterv2.cxx:137
 AliPHOSRawFitterv2.cxx:138
 AliPHOSRawFitterv2.cxx:139
 AliPHOSRawFitterv2.cxx:140
 AliPHOSRawFitterv2.cxx:141
 AliPHOSRawFitterv2.cxx:142
 AliPHOSRawFitterv2.cxx:143
 AliPHOSRawFitterv2.cxx:144
 AliPHOSRawFitterv2.cxx:145
 AliPHOSRawFitterv2.cxx:146
 AliPHOSRawFitterv2.cxx:147
 AliPHOSRawFitterv2.cxx:148
 AliPHOSRawFitterv2.cxx:149
 AliPHOSRawFitterv2.cxx:150
 AliPHOSRawFitterv2.cxx:151
 AliPHOSRawFitterv2.cxx:152
 AliPHOSRawFitterv2.cxx:153
 AliPHOSRawFitterv2.cxx:154
 AliPHOSRawFitterv2.cxx:155
 AliPHOSRawFitterv2.cxx:156
 AliPHOSRawFitterv2.cxx:157
 AliPHOSRawFitterv2.cxx:158
 AliPHOSRawFitterv2.cxx:159
 AliPHOSRawFitterv2.cxx:160
 AliPHOSRawFitterv2.cxx:161
 AliPHOSRawFitterv2.cxx:162
 AliPHOSRawFitterv2.cxx:163
 AliPHOSRawFitterv2.cxx:164
 AliPHOSRawFitterv2.cxx:165
 AliPHOSRawFitterv2.cxx:166
 AliPHOSRawFitterv2.cxx:167
 AliPHOSRawFitterv2.cxx:168
 AliPHOSRawFitterv2.cxx:169
 AliPHOSRawFitterv2.cxx:170
 AliPHOSRawFitterv2.cxx:171
 AliPHOSRawFitterv2.cxx:172
 AliPHOSRawFitterv2.cxx:173
 AliPHOSRawFitterv2.cxx:174
 AliPHOSRawFitterv2.cxx:175
 AliPHOSRawFitterv2.cxx:176
 AliPHOSRawFitterv2.cxx:177
 AliPHOSRawFitterv2.cxx:178
 AliPHOSRawFitterv2.cxx:179
 AliPHOSRawFitterv2.cxx:180
 AliPHOSRawFitterv2.cxx:181
 AliPHOSRawFitterv2.cxx:182
 AliPHOSRawFitterv2.cxx:183
 AliPHOSRawFitterv2.cxx:184
 AliPHOSRawFitterv2.cxx:185
 AliPHOSRawFitterv2.cxx:186
 AliPHOSRawFitterv2.cxx:187
 AliPHOSRawFitterv2.cxx:188
 AliPHOSRawFitterv2.cxx:189
 AliPHOSRawFitterv2.cxx:190
 AliPHOSRawFitterv2.cxx:191
 AliPHOSRawFitterv2.cxx:192
 AliPHOSRawFitterv2.cxx:193
 AliPHOSRawFitterv2.cxx:194
 AliPHOSRawFitterv2.cxx:195
 AliPHOSRawFitterv2.cxx:196
 AliPHOSRawFitterv2.cxx:197
 AliPHOSRawFitterv2.cxx:198
 AliPHOSRawFitterv2.cxx:199
 AliPHOSRawFitterv2.cxx:200
 AliPHOSRawFitterv2.cxx:201
 AliPHOSRawFitterv2.cxx:202
 AliPHOSRawFitterv2.cxx:203
 AliPHOSRawFitterv2.cxx:204
 AliPHOSRawFitterv2.cxx:205
 AliPHOSRawFitterv2.cxx:206
 AliPHOSRawFitterv2.cxx:207
 AliPHOSRawFitterv2.cxx:208
 AliPHOSRawFitterv2.cxx:209
 AliPHOSRawFitterv2.cxx:210
 AliPHOSRawFitterv2.cxx:211
 AliPHOSRawFitterv2.cxx:212
 AliPHOSRawFitterv2.cxx:213
 AliPHOSRawFitterv2.cxx:214
 AliPHOSRawFitterv2.cxx:215
 AliPHOSRawFitterv2.cxx:216
 AliPHOSRawFitterv2.cxx:217
 AliPHOSRawFitterv2.cxx:218
 AliPHOSRawFitterv2.cxx:219
 AliPHOSRawFitterv2.cxx:220
 AliPHOSRawFitterv2.cxx:221
 AliPHOSRawFitterv2.cxx:222
 AliPHOSRawFitterv2.cxx:223
 AliPHOSRawFitterv2.cxx:224
 AliPHOSRawFitterv2.cxx:225
 AliPHOSRawFitterv2.cxx:226
 AliPHOSRawFitterv2.cxx:227
 AliPHOSRawFitterv2.cxx:228
 AliPHOSRawFitterv2.cxx:229
 AliPHOSRawFitterv2.cxx:230
 AliPHOSRawFitterv2.cxx:231
 AliPHOSRawFitterv2.cxx:232
 AliPHOSRawFitterv2.cxx:233
 AliPHOSRawFitterv2.cxx:234
 AliPHOSRawFitterv2.cxx:235
 AliPHOSRawFitterv2.cxx:236
 AliPHOSRawFitterv2.cxx:237
 AliPHOSRawFitterv2.cxx:238
 AliPHOSRawFitterv2.cxx:239
 AliPHOSRawFitterv2.cxx:240
 AliPHOSRawFitterv2.cxx:241
 AliPHOSRawFitterv2.cxx:242
 AliPHOSRawFitterv2.cxx:243
 AliPHOSRawFitterv2.cxx:244
 AliPHOSRawFitterv2.cxx:245
 AliPHOSRawFitterv2.cxx:246
 AliPHOSRawFitterv2.cxx:247
 AliPHOSRawFitterv2.cxx:248
 AliPHOSRawFitterv2.cxx:249
 AliPHOSRawFitterv2.cxx:250
 AliPHOSRawFitterv2.cxx:251
 AliPHOSRawFitterv2.cxx:252
 AliPHOSRawFitterv2.cxx:253
 AliPHOSRawFitterv2.cxx:254
 AliPHOSRawFitterv2.cxx:255
 AliPHOSRawFitterv2.cxx:256
 AliPHOSRawFitterv2.cxx:257
 AliPHOSRawFitterv2.cxx:258
 AliPHOSRawFitterv2.cxx:259
 AliPHOSRawFitterv2.cxx:260
 AliPHOSRawFitterv2.cxx:261
 AliPHOSRawFitterv2.cxx:262
 AliPHOSRawFitterv2.cxx:263
 AliPHOSRawFitterv2.cxx:264
 AliPHOSRawFitterv2.cxx:265
 AliPHOSRawFitterv2.cxx:266
 AliPHOSRawFitterv2.cxx:267
 AliPHOSRawFitterv2.cxx:268
 AliPHOSRawFitterv2.cxx:269
 AliPHOSRawFitterv2.cxx:270
 AliPHOSRawFitterv2.cxx:271
 AliPHOSRawFitterv2.cxx:272
 AliPHOSRawFitterv2.cxx:273
 AliPHOSRawFitterv2.cxx:274
 AliPHOSRawFitterv2.cxx:275
 AliPHOSRawFitterv2.cxx:276
 AliPHOSRawFitterv2.cxx:277
 AliPHOSRawFitterv2.cxx:278
 AliPHOSRawFitterv2.cxx:279
 AliPHOSRawFitterv2.cxx:280
 AliPHOSRawFitterv2.cxx:281
 AliPHOSRawFitterv2.cxx:282
 AliPHOSRawFitterv2.cxx:283
 AliPHOSRawFitterv2.cxx:284
 AliPHOSRawFitterv2.cxx:285
 AliPHOSRawFitterv2.cxx:286
 AliPHOSRawFitterv2.cxx:287
 AliPHOSRawFitterv2.cxx:288
 AliPHOSRawFitterv2.cxx:289
 AliPHOSRawFitterv2.cxx:290
 AliPHOSRawFitterv2.cxx:291
 AliPHOSRawFitterv2.cxx:292
 AliPHOSRawFitterv2.cxx:293
 AliPHOSRawFitterv2.cxx:294
 AliPHOSRawFitterv2.cxx:295
 AliPHOSRawFitterv2.cxx:296
 AliPHOSRawFitterv2.cxx:297
 AliPHOSRawFitterv2.cxx:298
 AliPHOSRawFitterv2.cxx:299
 AliPHOSRawFitterv2.cxx:300
 AliPHOSRawFitterv2.cxx:301
 AliPHOSRawFitterv2.cxx:302
 AliPHOSRawFitterv2.cxx:303
 AliPHOSRawFitterv2.cxx:304
 AliPHOSRawFitterv2.cxx:305
 AliPHOSRawFitterv2.cxx:306
 AliPHOSRawFitterv2.cxx:307
 AliPHOSRawFitterv2.cxx:308
 AliPHOSRawFitterv2.cxx:309
 AliPHOSRawFitterv2.cxx:310
 AliPHOSRawFitterv2.cxx:311
 AliPHOSRawFitterv2.cxx:312
 AliPHOSRawFitterv2.cxx:313
 AliPHOSRawFitterv2.cxx:314
 AliPHOSRawFitterv2.cxx:315
 AliPHOSRawFitterv2.cxx:316
 AliPHOSRawFitterv2.cxx:317
 AliPHOSRawFitterv2.cxx:318
 AliPHOSRawFitterv2.cxx:319
 AliPHOSRawFitterv2.cxx:320
 AliPHOSRawFitterv2.cxx:321
 AliPHOSRawFitterv2.cxx:322
 AliPHOSRawFitterv2.cxx:323
 AliPHOSRawFitterv2.cxx:324
 AliPHOSRawFitterv2.cxx:325
 AliPHOSRawFitterv2.cxx:326
 AliPHOSRawFitterv2.cxx:327
 AliPHOSRawFitterv2.cxx:328
 AliPHOSRawFitterv2.cxx:329
 AliPHOSRawFitterv2.cxx:330
 AliPHOSRawFitterv2.cxx:331
 AliPHOSRawFitterv2.cxx:332
 AliPHOSRawFitterv2.cxx:333
 AliPHOSRawFitterv2.cxx:334
 AliPHOSRawFitterv2.cxx:335
 AliPHOSRawFitterv2.cxx:336
 AliPHOSRawFitterv2.cxx:337
 AliPHOSRawFitterv2.cxx:338
 AliPHOSRawFitterv2.cxx:339
 AliPHOSRawFitterv2.cxx:340
 AliPHOSRawFitterv2.cxx:341
 AliPHOSRawFitterv2.cxx:342
 AliPHOSRawFitterv2.cxx:343
 AliPHOSRawFitterv2.cxx:344
 AliPHOSRawFitterv2.cxx:345
 AliPHOSRawFitterv2.cxx:346
 AliPHOSRawFitterv2.cxx:347
 AliPHOSRawFitterv2.cxx:348
 AliPHOSRawFitterv2.cxx:349
 AliPHOSRawFitterv2.cxx:350
 AliPHOSRawFitterv2.cxx:351
 AliPHOSRawFitterv2.cxx:352
 AliPHOSRawFitterv2.cxx:353
 AliPHOSRawFitterv2.cxx:354
 AliPHOSRawFitterv2.cxx:355
 AliPHOSRawFitterv2.cxx:356
 AliPHOSRawFitterv2.cxx:357
 AliPHOSRawFitterv2.cxx:358
 AliPHOSRawFitterv2.cxx:359
 AliPHOSRawFitterv2.cxx:360
 AliPHOSRawFitterv2.cxx:361
 AliPHOSRawFitterv2.cxx:362
 AliPHOSRawFitterv2.cxx:363
 AliPHOSRawFitterv2.cxx:364
 AliPHOSRawFitterv2.cxx:365
 AliPHOSRawFitterv2.cxx:366
 AliPHOSRawFitterv2.cxx:367
 AliPHOSRawFitterv2.cxx:368
 AliPHOSRawFitterv2.cxx:369
 AliPHOSRawFitterv2.cxx:370
 AliPHOSRawFitterv2.cxx:371
 AliPHOSRawFitterv2.cxx:372
 AliPHOSRawFitterv2.cxx:373
 AliPHOSRawFitterv2.cxx:374
 AliPHOSRawFitterv2.cxx:375
 AliPHOSRawFitterv2.cxx:376
 AliPHOSRawFitterv2.cxx:377
 AliPHOSRawFitterv2.cxx:378
 AliPHOSRawFitterv2.cxx:379
 AliPHOSRawFitterv2.cxx:380
 AliPHOSRawFitterv2.cxx:381
 AliPHOSRawFitterv2.cxx:382
 AliPHOSRawFitterv2.cxx:383
 AliPHOSRawFitterv2.cxx:384
 AliPHOSRawFitterv2.cxx:385
 AliPHOSRawFitterv2.cxx:386
 AliPHOSRawFitterv2.cxx:387
 AliPHOSRawFitterv2.cxx:388
 AliPHOSRawFitterv2.cxx:389
 AliPHOSRawFitterv2.cxx:390
 AliPHOSRawFitterv2.cxx:391
 AliPHOSRawFitterv2.cxx:392
 AliPHOSRawFitterv2.cxx:393
 AliPHOSRawFitterv2.cxx:394
 AliPHOSRawFitterv2.cxx:395
 AliPHOSRawFitterv2.cxx:396
 AliPHOSRawFitterv2.cxx:397
 AliPHOSRawFitterv2.cxx:398
 AliPHOSRawFitterv2.cxx:399
 AliPHOSRawFitterv2.cxx:400
 AliPHOSRawFitterv2.cxx:401
 AliPHOSRawFitterv2.cxx:402
 AliPHOSRawFitterv2.cxx:403
 AliPHOSRawFitterv2.cxx:404
 AliPHOSRawFitterv2.cxx:405
 AliPHOSRawFitterv2.cxx:406
 AliPHOSRawFitterv2.cxx:407
 AliPHOSRawFitterv2.cxx:408
 AliPHOSRawFitterv2.cxx:409
 AliPHOSRawFitterv2.cxx:410
 AliPHOSRawFitterv2.cxx:411
 AliPHOSRawFitterv2.cxx:412
 AliPHOSRawFitterv2.cxx:413
 AliPHOSRawFitterv2.cxx:414
 AliPHOSRawFitterv2.cxx:415
 AliPHOSRawFitterv2.cxx:416
 AliPHOSRawFitterv2.cxx:417
 AliPHOSRawFitterv2.cxx:418
 AliPHOSRawFitterv2.cxx:419
 AliPHOSRawFitterv2.cxx:420
 AliPHOSRawFitterv2.cxx:421
 AliPHOSRawFitterv2.cxx:422
 AliPHOSRawFitterv2.cxx:423
 AliPHOSRawFitterv2.cxx:424
 AliPHOSRawFitterv2.cxx:425
 AliPHOSRawFitterv2.cxx:426
 AliPHOSRawFitterv2.cxx:427
 AliPHOSRawFitterv2.cxx:428
 AliPHOSRawFitterv2.cxx:429
 AliPHOSRawFitterv2.cxx:430
 AliPHOSRawFitterv2.cxx:431
 AliPHOSRawFitterv2.cxx:432
 AliPHOSRawFitterv2.cxx:433
 AliPHOSRawFitterv2.cxx:434
 AliPHOSRawFitterv2.cxx:435
 AliPHOSRawFitterv2.cxx:436
 AliPHOSRawFitterv2.cxx:437
 AliPHOSRawFitterv2.cxx:438
 AliPHOSRawFitterv2.cxx:439
 AliPHOSRawFitterv2.cxx:440
 AliPHOSRawFitterv2.cxx:441
 AliPHOSRawFitterv2.cxx:442
 AliPHOSRawFitterv2.cxx:443
 AliPHOSRawFitterv2.cxx:444
 AliPHOSRawFitterv2.cxx:445
 AliPHOSRawFitterv2.cxx:446
 AliPHOSRawFitterv2.cxx:447
 AliPHOSRawFitterv2.cxx:448
 AliPHOSRawFitterv2.cxx:449