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 "AliPHOSRawFitterv3.h"
#include "AliPHOSPulseGenerator.h"

ClassImp(AliPHOSRawFitterv3)

//-----------------------------------------------------------------------------
AliPHOSRawFitterv3::AliPHOSRawFitterv3():
  AliPHOSRawFitterv0()
{
  //Default constructor.
}

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

//-----------------------------------------------------------------------------
AliPHOSRawFitterv3::AliPHOSRawFitterv3(const AliPHOSRawFitterv3 &phosFitter ):
  AliPHOSRawFitterv0(phosFitter) 
{
  //Copy constructor.
}

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

//-----------------------------------------------------------------------------
Bool_t AliPHOSRawFitterv3::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.

  if (fCaloFlag == 2 || fNBunches > 1) {
    fQuality = 1000;
    return kTRUE;
  }
  if(fCaloFlag!=0 && fCaloFlag!=1){//Corrupted sample
    fQuality=2000;
    fEnergy=0 ;
    return kTRUE;
  }

  Float_t pedMean = 0;
  Float_t pedRMS  = 0;
  Int_t   nPed    = 0;
  const Float_t kBaseLine   = 1.0;
  const Int_t   kPreSamples = 10;
  

  //We tryed individual taus for each channel, but
  //this approach seems to be unstable. Much better results are obtaned with
  //fixed decay time for all channels.
  const Double_t tau=22.18 ;

  TArrayD samples(sigLength); // array of sample amplitudes
  TArrayD times(sigLength); // array of sample time stamps
  for (Int_t i=sigLength-kPreSamples; i<sigLength; i++) {
    nPed++;
    pedMean += signal[i];
    pedRMS  += signal[i]*signal[i] ;
  }

  fEnergy = -111;
  fQuality= 999. ;
  const Float_t maxEtoFit=5 ; //fit only samples above this energy, accept all samples (with good aRMS) below it
  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
      fEnergy -= pedestal; // pedestal subtraction
    }
    else
      return kFALSE;
  }
  else {
    //take pedestals from DB
    pedestal = (Double_t) fAmpOffset ;
    if (fCalibData) {
      Float_t truePed       = fCalibData->GetADCpedestalEmc(fModule, fCellZ, fCellX) ;
      Int_t   altroSettings = fCalibData->GetAltroOffsetEmc(fModule, fCellZ, fCellX) ;
      pedestal += truePed - altroSettings ;
    }
    else{
//      AliWarning(Form("Can not read data from OCDB")) ;
    }
    fEnergy-=pedestal ;
  }

  if (fEnergy < kBaseLine) fEnergy = 0;
  //Evaluate time
   fTime = sigStart-sigLength-3;
  for (Int_t i=0; i<sigLength; i++) {
    samples.AddAt(signal[i]-pedestal,sigLength-i-1);
    times.AddAt(i/tau ,i);
  }
  
  //calculate time and energy
  Int_t    maxBin=0 ;
  Int_t    maxAmp=0 ;
  Int_t    nMax = 0 ; //number of points in plato
  Double_t aMean =0. ;
  Double_t aRMS  =0. ;
  Double_t wts   =0 ;
  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;
	maxBin = i ;
      }
      if(signal[i] == maxAmp){
        nMax++;
      }
    }
  }

  if (maxBin==sigLength-1){//bad "rising" sample
    fEnergy =    0. ;
    fTime   = -999. ;
    fQuality=  999. ;
    return kTRUE ;
  }

  fEnergy=Double_t(maxAmp)-pedestal ;
  fOverflow =0 ;  //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 ;
  }
  
  if (wts > 0) {
    aMean /= wts; 
    aRMS   = aRMS/wts - aMean*aMean;
  }

  //do not take too small energies
  if (fEnergy < kBaseLine) 
    fEnergy = 0;
  
  //do not test quality of too soft samples
  if (fEnergy < maxEtoFit){
    if (aRMS < 2.) //sigle peak
      fQuality = 999. ;
    else
      fQuality =   0. ;
    //Evaluate time of signal arriving
    return kTRUE ;
  }
      
  // if sample has reasonable mean and RMS, try to fit it with gamma2
  //This method can not analyse overflow samples
  if(fOverflow){
    fQuality = 99. ;
    return kTRUE ;
  }
  // First estimate t0
  Double_t a=0,b=0,c=0 ;
  Int_t minI=0 ;
  if (fPedSubtract) 
    minI=kPreSamples ;
  for(Int_t i=minI; i<sigLength; i++){
    if(samples.At(i)<=0.)
      continue ;
    Double_t t= times.At(i) ;
    Double_t f02 = TMath::Exp(-2.*t);
    Double_t f12 = t*f02;
    Double_t f22 = t*f12;
    // Derivatives
    Double_t f02d = -2.*f02;
    Double_t f12d = f02 - 2.*f12;
    Double_t f22d = 2.*(f12 - f22);
    a += f02d * samples.At(i) ;
    b -= f12d * samples.At(i) ;
    c += f22d * samples.At(i) ;
  }
  
  //Find roots
  if(a==0.){
    if(b==0.){ //no roots
      fQuality = 2000. ;
      if(AliLog::GetDebugLevel("PHOS","AliPHOSRawFitterv3")>3){
        printf(" a=%f, b=%f, c=%f \n",a,b,c) ;
        goto plot ;
      }
      return kTRUE ;
    }
    Double_t t1=-c/b ;
    Double_t amp=0.,den=0.; ;
    for(Int_t i=minI; i<sigLength; i++){
      if(samples.At(i)<=0.)
        continue ;
      Double_t dt = times.At(i) - t1;
      Double_t f = dt*dt*TMath::Exp(-2.*dt);
      amp += f*samples.At(i);
      den += f*f;
    }
    if(den>0.0) amp /= den;
    // chi2 calculation
    fQuality=0.;
    for(Int_t i=minI; i<sigLength; i++){
      if(samples.At(i)<=0.)
        continue ;
      Double_t t = times.At(i)- t1;
      Double_t dy = samples.At(i)- amp*t*t*TMath::Exp(-2.*t) ;
      fQuality += dy*dy;
    }
    fTime+=t1*tau ;
    fEnergy = amp*TMath::Exp(-2.);
    fQuality/= sigLength ; //If we have overflow the number of actually fitted points is smaller, but chi2 in this case is not important.
  }
  else{
    Double_t det = b*b - a*c;
    if(det>=1.e-6 && det<0.0) {
      det = 0.0; //rounding error
    }
    if(det<0.){ //Problem
      fQuality = 1500. ;
      if(AliLog::GetDebugLevel("PHOS","AliPHOSRawFitterv3")>3){
        printf(" det=%e \n",det) ;
        goto plot ;
      }
      return kTRUE ;
    }

    det = TMath::Sqrt(det);
    Double_t t1 = (-b + det) / a;
//    Double_t t2 = (-b - det) / a; //second root is wrong one
    Double_t amp1=0., den1=0. ;
    for(Int_t i=minI; i<sigLength; i++){
      if(samples.At(i)<=0.)
        continue ;
      Double_t dt1 = times.At(i) - t1;
      Double_t f01 = dt1*dt1*TMath::Exp(-2.*dt1);
      amp1 += f01*samples.At(i);
      den1 += f01*f01;
    }
    if(den1>0.0) amp1 /= den1;
    Double_t chi1=0.; // chi2=0. ;
    for(Int_t i=minI; i<sigLength; i++){
      if(samples.At(i)<=0.)
        continue ;
      Double_t dt1 = times.At(i)- t1;
      Double_t dy1 = samples.At(i)- amp1*dt1*dt1*TMath::Exp(-2.*dt1) ;
      chi1 += dy1*dy1;
    }
    fEnergy=amp1*TMath::Exp(-2.) ; ; 
    fTime+=t1*tau ;
    fQuality=chi1/sigLength ;
  } 

  //Impose cut on quality
  fQuality/=2.+0.004*fEnergy*fEnergy ;

  //Draw corrupted samples
  if(AliLog::GetDebugLevel("PHOS","AliPHOSRawFitterv3")>3){
    plot:
    if(fEnergy > 30. && fQuality >1. && !fOverflow ){ //Draw only bad samples
//    if(!fOverflow ){ //Draw only bad samples
      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,samples.At(i)+pedestal) ;
      }
      TF1 * fffit = new TF1("fffit","[0]+[1]*((x-[2])/[3])^2*exp(2.-2.*(x-[2])/[3])",0.,200.) ;
      fffit->SetParameters(pedestal,fEnergy,fTime,tau) ;
      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->Draw() ;
      fffit->Draw("same") ;

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