ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, 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: AliTOFT0v1.cxx,v 1.8 2010/01/19 16:32:20 noferini Exp $ */

//_________________________________________________________________________
// This is a TTask that made the calculation of the Time zero using TOF.
// Description: The algorithm used to calculate the time zero of interaction
// using TOF detector is the following.
// We select in the ESD some "primary" particles - or tracks in the following - 
// that strike the TOF detector (the larger part are pions, kaons or protons). 
// We choose a set of 10 selected tracks, for each track You have the length
// of the track when the TOF is reached, 
// the momentum and the time of flight
// given by the TOF detector.
// Let consider now only one set of 10 tracks (the algorithm is the same for all sets).
// Assuming the (mass) hypothesis that each track can be AUT a pion, AUT a kaon, AUT a proton,
// we consider all the 3 at 10 possible cases. 
// For each track in each (mass) configuration
// (a configuration can be e.g. pion/pion/kaon/proton/pion/proton/kaon/kaon/pion/pion)
// we calculate the time zero (we know in fact the velocity of the track after 
// the assumption about its mass, the time of flight given by the TOF, and the 
// corresponding path travelled till the TOF detector). Then for each mass configuration we have
// 10 time zero and we can calculate the ChiSquare for the current configuration using the 
// weighted mean over all 10 time zero.
// We call the best assignment the mass configuration that gives the minimum value of the ChiSquare. 
// We plot the weighted mean over all 10 time zero for the best assignment, 
// the ChiSquare for the best assignment and the corresponding confidence level.
// The strong assumption is the MC selection of primary particles. It will be introduced
// in the future also some more realistic simulation about this point. 
// Use case:
// root [0] AliTOFT0v1 * tzero = new AliTOFT0v1("galice.root")
// Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
// root [1] tzero->ExecuteTask()
// root [2] tzero->ExecuteTask("tim")
//             // available parameters:
//             tim - print benchmarking information
//             all - print usefull informations about the number of misidentified tracks 
//                   and a comparison about the true configuration (known from MC) and the best
//                   assignment
// Different Selections for pp and Pb-Pb: Momentum Range, Max Time, # pions 
//-- Author: F. Pierella
//-- Mod By Silvia Arcelli, Francesco Noferini, Barbara Guerzoni
//-- AliTOFT0v1 contains code speed up provided by Jens Wiechula (look-up table
//   for Power3)
//////////////////////////////////////////////////////////////////////////////

#include "AliESDtrack.h"
#include "AliESDEvent.h"
#include "AliTOFT0v1.h"
#include "TBenchmark.h"
#include "AliPID.h"
#include "AliESDpid.h"

ClassImp(AliTOFT0v1)
           
//____________________________________________________________________________ 
AliTOFT0v1::AliTOFT0v1(AliESDpid *extPID):
  TObject(),
  fLowerMomBound(0.5),
  fUpperMomBound(3),  
  fTimeCorr(0.), 
  fEvent(0x0),
  fPIDesd(extPID),
  fTracks(new TObjArray(10)),
  fGTracks(new TObjArray(10)),
  fTracksT0(new TObjArray(10)),
  fOptFlag(kFALSE)
{
  //
  // default constructor
  //
  if(AliPID::ParticleMass(0) == 0) new AliPID();

  if(!fPIDesd){
    fPIDesd = new AliESDpid();
  }

  Init(NULL);

  //initialise lookup table for power 3
  // a set should only have 10 tracks a t maximum
  // so up to 15 should be more than enough
  for (Int_t i=0; i<15; ++i) {
    fLookupPowerThree[i]=ToCalculatePower(3,i);
  }
}

//____________________________________________________________________________ 
AliTOFT0v1::AliTOFT0v1(AliESDEvent* event,AliESDpid *extPID): 
  TObject(),
  fLowerMomBound(0.5),
  fUpperMomBound(3.0),  
  fTimeCorr(0.), 
  fEvent(event),
  fPIDesd(extPID),
  fTracks(new TObjArray(10)),
  fGTracks(new TObjArray(10)),
  fTracksT0(new TObjArray(10)),
  fOptFlag(kFALSE)
{
  //
  // real constructor
  //
  if(AliPID::ParticleMass(0) == 0) new AliPID();

  if(!fPIDesd){
    fPIDesd = new AliESDpid();
  }

  Init(event);
  //initialise lookup table for power 3
  for (Int_t i=0; i<15; ++i) {
    fLookupPowerThree[i]=Int_t(TMath::Power(3,i));
  }
}
//____________________________________________________________________________ 
AliTOFT0v1& AliTOFT0v1::operator=(const AliTOFT0v1 &tzero)
{
 //
  // assign. operator
  //

  if (this == &tzero)
    return *this;
  
  fLowerMomBound=tzero.fLowerMomBound;
  fUpperMomBound=tzero.fUpperMomBound;  
  fTimeCorr=tzero.fTimeCorr; 
  fEvent=tzero.fEvent;
  fT0SigmaT0def[0]=tzero.fT0SigmaT0def[0];
  fT0SigmaT0def[1]=tzero.fT0SigmaT0def[1];
  fT0SigmaT0def[2]=tzero.fT0SigmaT0def[2];
  fT0SigmaT0def[3]=tzero.fT0SigmaT0def[3];

  fTracks=tzero.fTracks;
  fGTracks=tzero.fGTracks;
  fTracksT0=tzero.fTracksT0;

  for (Int_t ii=0; ii<tzero.fTracks->GetEntries(); ii++)
    fTracks->AddLast(tzero.fTracks->At(ii));

  for (Int_t ii=0; ii<tzero.fGTracks->GetEntries(); ii++)
    fGTracks->AddLast(tzero.fGTracks->At(ii));

  for (Int_t ii=0; ii<tzero.fTracksT0->GetEntries(); ii++)
    fTracksT0->AddLast(tzero.fTracksT0->At(ii));
  
  fOptFlag=tzero.fOptFlag;

  return *this;
}

//____________________________________________________________________________ 
AliTOFT0v1::~AliTOFT0v1()
{
  // dtor
  fEvent=NULL;
  
  if (fTracks) {
    fTracks->Clear();
    delete fTracks;
    fTracks=0x0;
  }

  if (fGTracks) {
    fGTracks->Clear();
    delete fGTracks;
    fGTracks=0x0;
  }

  if (fTracksT0) {
    fTracksT0->Clear();
    delete fTracksT0;
    fTracksT0=0x0;
  }


}
//____________________________________________________________________________ 

void
AliTOFT0v1::Init(AliESDEvent *event) 
{

  /* 
   * init
   */

  fEvent = event;
  fT0SigmaT0def[0]=0.;
  fT0SigmaT0def[1]=0.6;
  fT0SigmaT0def[2]=0.;
  fT0SigmaT0def[3]=0.;

}
//____________________________________________________________________________ 
Double_t * AliTOFT0v1::DefineT0(Option_t *option,Float_t pMinCut,Float_t pMaxCut) 
{ 
  TBenchmark *bench=new TBenchmark();
  bench->Start("t0computation");

  // Caluclate the Event Time using the ESD TOF time

  fT0SigmaT0def[0]=0.;
  fT0SigmaT0def[1]=0.600;
  fT0SigmaT0def[2]=0.;
  fT0SigmaT0def[3]=0.;
  
  const Int_t nmaxtracksinsetMax=10;
  Int_t nmaxtracksinset=10;
//   if(strstr(option,"all")){
//     cout << "Selecting primary tracks with momentum between " << fLowerMomBound << " GeV/c and " << fUpperMomBound << " GeV/c" << endl;
//     cout << "Memorandum: 0 means PION | 1 means KAON | 2 means PROTON" << endl;
//   }
  
  
  Int_t nsets=0;
  Int_t nUsedTracks=0;
  Int_t ngoodsetsSel= 0;
  Float_t t0bestSel[300];
  Float_t eT0bestSel[300];
  Float_t chiSquarebestSel[300];
  Float_t confLevelbestSel[300];
  Float_t t0bestallSel=0.;
  Float_t eT0bestallSel=0.;
  Float_t sumWt0bestallSel=0.;
  Float_t eMeanTzeroPi=0.;
  Float_t meantzeropi=0.;
  Float_t sumAllweightspi=0.;
  Double_t t0def=-999;
  Double_t deltat0def=999;
  Int_t ngoodtrktrulyused=0;
  Int_t ntracksinsetmyCut = 0;

  Int_t ntrk=fEvent->GetNumberOfTracks();
  
  Int_t ngoodtrk=0;
  Int_t ngoodtrkt0 =0;
  Float_t meantime =0;
  
  // First Track loop, Selection of good tracks

  fTracks->Clear();
  for (Int_t itrk=0; itrk<ntrk; itrk++) {
    AliESDtrack *t=fEvent->GetTrack(itrk);
    Double_t momOld=t->GetP();
    Double_t mom=momOld-0.0036*momOld;
    if ((t->GetStatus()&AliESDtrack::kTIME)==0) continue;
    if ((t->GetStatus()&AliESDtrack::kTOFout)==0) continue;
    Double_t time=t->GetTOFsignal();
    
    time*=1.E-3; // tof given in nanoseconds	   
    if (!(mom<=fUpperMomBound && mom>=fLowerMomBound))continue;

    if (!AcceptTrack(t)) continue;

    if(t->GetIntegratedLength() < 350)continue; //skip decays
    if(t->GetP() > pMinCut && t->GetP() < pMaxCut) continue;

    meantime+=time;
    fTracks->AddLast(t);
    ngoodtrk++;
  }

  if(ngoodtrk > 1) meantime /= ngoodtrk;

  if(ngoodtrk>22) nmaxtracksinset = 6;

  fGTracks->Clear();
  for (Int_t jtrk=0; jtrk< fTracks->GetEntries(); jtrk++) {
    AliESDtrack *t=(AliESDtrack*)fTracks->At(jtrk);
    //    Double_t time=t->GetTOFsignal();
    //    if((time-meantime*1.E3)<50.E3){ // For pp and per 
    fGTracks->AddLast(t);
    ngoodtrkt0++;
      //    }
  }

  fTracks->Clear();

  Int_t nseteq = (ngoodtrkt0-1)/nmaxtracksinset + 1;
  Int_t nmaxtracksinsetCurrent=ngoodtrkt0/nseteq;
  if(nmaxtracksinsetCurrent*nseteq < ngoodtrkt0) nmaxtracksinsetCurrent++;


  if(ngoodtrkt0<2){
    t0def=-999;
    deltat0def=0.600;
    fT0SigmaT0def[0]=t0def;
    fT0SigmaT0def[1]=deltat0def;
    fT0SigmaT0def[2]=ngoodtrkt0;
    fT0SigmaT0def[3]=ngoodtrkt0;
    //goto finish;
  }
  if(ngoodtrkt0>=2){
  // Decide how many tracks in set 
    Int_t ntracksinset = std::min(ngoodtrkt0,nmaxtracksinsetCurrent);
    Int_t nset=1;

    if(ngoodtrkt0>nmaxtracksinsetCurrent) {nset= (Int_t)(ngoodtrkt0/ntracksinset)+1;} 
        
    // Loop over selected sets
    
    if(nset>=1){
      for (Int_t i=0; i< nset; i++) {   
	//	printf("Set %i of %i\n",i+1,nset);
	Float_t t0best=999.;
	Float_t eT0best=999.;
	Float_t chisquarebest=99999.;
	Int_t npionbest=0;
	
	fTracksT0->Clear();
	Int_t ntracksinsetmy=0;      
	for (Int_t itrk=0; itrk<ntracksinset; itrk++) {
	  Int_t index = itrk+i*ntracksinset;
	  if(index < fGTracks->GetEntries()){
	    AliESDtrack *t=(AliESDtrack*)fGTracks->At(index);
	    fTracksT0->AddLast(t);
	    ntracksinsetmy++;
	  }
	}

	// Analyse it
	
	Int_t   assparticle[nmaxtracksinsetMax];
	Float_t exptof[nmaxtracksinsetMax][3];
	Float_t momErr[nmaxtracksinsetMax][3];
	Float_t timeofflight[nmaxtracksinsetMax];
	Float_t momentum[nmaxtracksinsetMax];
	Float_t timezero[nmaxtracksinsetMax];
	Float_t weightedtimezero[nmaxtracksinsetMax];
	Float_t beta[nmaxtracksinsetMax];
	Float_t texp[nmaxtracksinsetMax];
	Float_t dtexp[nmaxtracksinsetMax];
	Float_t sqMomError[nmaxtracksinsetMax];
	Float_t sqTrackError[nmaxtracksinsetMax];
	Float_t massarray[3]={0.13957,0.493677,0.9382723};
	Float_t tracktoflen[nmaxtracksinsetMax];
	Float_t besttimezero[nmaxtracksinsetMax];
	Float_t besttexp[nmaxtracksinsetMax];
	Float_t besttimeofflight[nmaxtracksinsetMax];
	Float_t bestmomentum[nmaxtracksinsetMax];
	Float_t bestchisquare[nmaxtracksinsetMax];
	Float_t bestweightedtimezero[nmaxtracksinsetMax];
	Float_t bestsqTrackError[nmaxtracksinsetMax];
	Int_t imass[nmaxtracksinsetMax];
	
	for (Int_t j=0; j<ntracksinset; j++) {
	  assparticle[j] = 3;
	  timeofflight[j] = 0;
	  momentum[j] = 0;
	  timezero[j] = 0;
	  weightedtimezero[j] = 0;
	  beta[j] = 0;
	  texp[j] = 0;
	  dtexp[j] = 0;
	  sqMomError[j] = 0;
	  sqTrackError[j] = 0;
	  tracktoflen[j] = 0;
	  besttimezero[j] = 0;
	  besttexp[j] = 0;
	  besttimeofflight[j] = 0;
	  bestmomentum[j] = 0;
	  bestchisquare[j] = 0;
	  bestweightedtimezero[j] = 0;
	  bestsqTrackError[j] = 0;
	  imass[j] = 1;
	}
	
	for (Int_t j=0; j<fTracksT0->GetEntries(); j++) {
	  AliESDtrack *t=(AliESDtrack*)fTracksT0->At(j);
	  Double_t momOld=t->GetP();
	  Double_t mom=momOld-0.0036*momOld;
	  Double_t time=t->GetTOFsignal();
	  
	  time*=1.E-3; // tof given in nanoseconds	   
	  Double_t exptime[AliPID::kSPECIESC]; 
	  t->GetIntegratedTimes(exptime,AliPID::kSPECIESC);
	  Double_t toflen=t->GetIntegratedLength();
	  toflen=toflen/100.; // toflen given in m 
	  
	  timeofflight[j]=time;
	  tracktoflen[j]=toflen;
	  exptof[j][0]=exptime[2]*1.E-3+fTimeCorr;// in ns
	  exptof[j][1]=exptime[3]*1.E-3+fTimeCorr;
	  exptof[j][2]=exptime[4]*1.E-3+fTimeCorr;
	  momentum[j]=mom;
	  assparticle[j]=3;

	  // in principle GetMomError only depends on two indices k=imass[j] and j itslef (see blow in the ncombinatorial loop)
	  // so it should be possible to make a lookup in order to speed up the code:
	  if (fOptFlag) {
	    momErr[j][0]=GetMomError(0, momentum[j], exptof[j][0]);
	    momErr[j][1]=GetMomError(1, momentum[j], exptof[j][1]);
	    momErr[j][2]=GetMomError(2, momentum[j], exptof[j][2]);
	  }
  } //end  for (Int_t j=0; j<ntracksinsetmy; j++) {
	
	for (Int_t itz=0; itz<ntracksinsetmy;itz++) {
	  beta[itz]=momentum[itz]/sqrt(massarray[0]*massarray[0]
				       +momentum[itz]*momentum[itz]);
	  sqMomError[itz]= ((1.-beta[itz]*beta[itz])*0.01)*((1.-beta[itz]*beta[itz])*0.01)*(tracktoflen[itz]/(0.299792*beta[itz]))*(tracktoflen[itz]/(0.299792*beta[itz])); 
	  sqTrackError[itz]=sqMomError[itz]; //in ns
	  timezero[itz]=exptof[itz][0]-timeofflight[itz];// in ns
	  weightedtimezero[itz]=timezero[itz]/sqTrackError[itz];
	  sumAllweightspi+=1./sqTrackError[itz];
	  meantzeropi+=weightedtimezero[itz];	
	} // end loop for (Int_t itz=0; itz< ntracksinset;itz++)
	
	
	// Then, Combinatorial Algorithm
	
	if(ntracksinsetmy<2 )break;
	
	for (Int_t j=0; j<ntracksinsetmy; j++) {
	  imass[j] = 3;
	}

	Int_t ncombinatorial;
	if (fOptFlag) ncombinatorial = fLookupPowerThree[ntracksinsetmy];
	else ncombinatorial = ToCalculatePower(3,ntracksinsetmy);


	// Loop on mass hypotheses
	for (Int_t k=0; k < ncombinatorial;k++) {
	  for (Int_t j=0; j<ntracksinsetmy; j++) {
	    imass[j] = (k % fLookupPowerThree[ntracksinsetmy-j])/fLookupPowerThree[ntracksinsetmy-j-1];
	    texp[j]=exptof[j][imass[j]];
            if (fOptFlag) dtexp[j]=momErr[j][imass[j]]; // see comments above in the initialisation of momErr
 	    else dtexp[j]=GetMomError(imass[j], momentum[j], texp[j]);
	  }

	  Float_t sumAllweights=0.;
	  Float_t meantzero=0.;
	  Float_t eMeanTzero=0.;
	  
	  for (Int_t itz=0; itz<ntracksinsetmy;itz++) {
	    sqTrackError[itz]=dtexp[itz]*dtexp[itz]*1E-6; //in ns2
	    
	    timezero[itz]=texp[itz]-timeofflight[itz];// in ns		    	  
	    
	    weightedtimezero[itz]=timezero[itz]/sqTrackError[itz];
	    sumAllweights+=1./sqTrackError[itz];
	    meantzero+=weightedtimezero[itz];
	    
	  } // end loop for (Int_t itz=0; itz<15;itz++)
	  
	  meantzero=meantzero/sumAllweights; // it is given in [ns]
	  eMeanTzero=sqrt(1./sumAllweights); // it is given in [ns]
	  
	  // calculate chisquare
	  Float_t chisquare=0.;		
	  for (Int_t icsq=0; icsq<ntracksinsetmy;icsq++) {
	    chisquare+=(timezero[icsq]-meantzero)*(timezero[icsq]-meantzero)/sqTrackError[icsq];
	  } // end loop for (Int_t icsq=0; icsq<15;icsq++) 
	  
	  if(chisquare<=chisquarebest){
	    for(Int_t iqsq = 0; iqsq<ntracksinsetmy; iqsq++) {
	      
	      bestsqTrackError[iqsq]=sqTrackError[iqsq]; 
	      besttimezero[iqsq]=timezero[iqsq]; 
	      bestmomentum[iqsq]=momentum[iqsq]; 
	      besttimeofflight[iqsq]=timeofflight[iqsq]; 
	      besttexp[iqsq]=texp[iqsq]; 
	      bestweightedtimezero[iqsq]=weightedtimezero[iqsq]; 
	      bestchisquare[iqsq]=(timezero[iqsq]-meantzero)*(timezero[iqsq]-meantzero)/sqTrackError[iqsq];
	    }
	    
	    Int_t npion=0;
	    for (Int_t j=0; j<ntracksinsetmy; j++) {
	      assparticle[j]=imass[j];
	      if(imass[j] == 0) npion++;
	    }
	    npionbest=npion;
	    chisquarebest=chisquare;	      
	    t0best=meantzero;
	    eT0best=eMeanTzero;
	  } // close if(dummychisquare<=chisquare)
	}
	
	Double_t chi2cut[nmaxtracksinsetMax];
	chi2cut[0] = 0;
	chi2cut[1] = 6.6; // corresponding to a C.L. of 0.01
	for (Int_t j=2; j<ntracksinset; j++) {
	  chi2cut[j] = chi2cut[1] * TMath::Sqrt(j*1.);
	}
	
	Double_t chi2singlecut = chi2cut[ntracksinsetmy-1]/ntracksinsetmy + TMath::Abs(chisquarebest-chi2cut[ntracksinsetmy-1])/ntracksinsetmy;
	
	//	printf("tracks removed with a chi2 > %f (chi2total = %f w.r.t. the limit of %f)\n",chi2singlecut,chisquarebest,chi2cut[ntracksinsetmy-1]);
	
	Bool_t kRedoT0 = kFALSE;
        ntracksinsetmyCut = ntracksinsetmy;
	Bool_t usetrack[nmaxtracksinsetMax];
	for (Int_t icsq=0; icsq<ntracksinsetmy;icsq++) {
	  usetrack[icsq] = kTRUE;
	  if((bestchisquare[icsq] > chisquarebest*0.5 && ntracksinsetmy > 2) || (bestchisquare[icsq] > chi2singlecut)){
	      kRedoT0 = kTRUE;
	      ntracksinsetmyCut--;
	      usetrack[icsq] = kFALSE;
	      //	      printf("tracks chi2 = %f\n",bestchisquare[icsq]);
	  }
	} // end loop for (Int_t icsq=0; icsq<15;icsq++) 
	
	// Loop on mass hypotheses Redo
	if(kRedoT0 && ntracksinsetmyCut > 1){
	  //	  printf("Redo T0\n");
	  for (Int_t k=0; k < ncombinatorial;k++) {
	    for (Int_t j=0; j<ntracksinsetmy; j++) {
	      imass[j] = (k % fLookupPowerThree[ntracksinsetmy-j]) / fLookupPowerThree[ntracksinsetmy-j-1];
	      texp[j]=exptof[j][imass[j]];
	      if (fOptFlag) dtexp[j]=momErr[j][imass[j]]; // see comments above in the initialisation of momErr
	      else dtexp[j]=GetMomError(imass[j], momentum[j], texp[j]);
	    }
	    
	    Float_t sumAllweights=0.;
	    Float_t meantzero=0.;
	    Float_t eMeanTzero=0.;
	    
	    for (Int_t itz=0; itz<ntracksinsetmy;itz++) {
	      if(! usetrack[itz]) continue;
	      sqTrackError[itz]=dtexp[itz]*dtexp[itz]*1E-6; //in ns2
	      
	      timezero[itz]=texp[itz]-timeofflight[itz];// in ns		    	  
	      
	      weightedtimezero[itz]=timezero[itz]/sqTrackError[itz];
	      sumAllweights+=1./sqTrackError[itz];
	      meantzero+=weightedtimezero[itz];
	      
	    } // end loop for (Int_t itz=0; itz<15;itz++)
	    
	    meantzero=meantzero/sumAllweights; // it is given in [ns]
	    eMeanTzero=sqrt(1./sumAllweights); // it is given in [ns]
	    
	    // calculate chisquare
	    
	    Float_t chisquare=0.;		
	    for (Int_t icsq=0; icsq<ntracksinsetmy;icsq++) {
	      if(! usetrack[icsq]) continue;
	      chisquare+=(timezero[icsq]-meantzero)*(timezero[icsq]-meantzero)/sqTrackError[icsq];
	    } // end loop for (Int_t icsq=0; icsq<15;icsq++) 
	    
	    Int_t npion=0;
	    for (Int_t j=0; j<ntracksinsetmy; j++) {
	      assparticle[j]=imass[j];
	      if(imass[j] == 0) npion++;
	    }
	    
	    if(chisquare<=chisquarebest && npion>0){
	      for(Int_t iqsq = 0; iqsq<ntracksinsetmy; iqsq++) {
		if(! usetrack[iqsq]) continue;
		bestsqTrackError[iqsq]=sqTrackError[iqsq]; 
		besttimezero[iqsq]=timezero[iqsq]; 
		bestmomentum[iqsq]=momentum[iqsq]; 
		besttimeofflight[iqsq]=timeofflight[iqsq]; 
		besttexp[iqsq]=texp[iqsq]; 
		bestweightedtimezero[iqsq]=weightedtimezero[iqsq]; 
		bestchisquare[iqsq]=(timezero[iqsq]-meantzero)*(timezero[iqsq]-meantzero)/sqTrackError[iqsq];
	      }
	      
	      npionbest=npion;
	      chisquarebest=chisquare;	      
	      t0best=meantzero;
	      eT0best=eMeanTzero;
	    } // close if(dummychisquare<=chisquare)
	    
	  }
	}
		
	// filling histos
	Float_t confLevel=999;
	
	// Sets with decent chisquares
	//	printf("Chi2best of the set = %f \n",chisquarebest);
	
	if(chisquarebest<999.){
	  Double_t dblechisquare=(Double_t)chisquarebest;
	  confLevel=(Float_t)TMath::Prob(dblechisquare,ntracksinsetmyCut-1); 

	  Int_t ntrackincurrentsel=0;
	  for(Int_t icsq=0; icsq<ntracksinsetmy;icsq++){

	    if(! usetrack[icsq]) continue;
	    
	    ntrackincurrentsel++;
	  }
	  
	  //	  printf("%i) CL(Chi2) = %f < 0.01\n",ngoodsetsSel,confLevel);

	  // Pick up only those with C.L. >1%
	  if(confLevel>0.01 && ngoodsetsSel<200){
	    chiSquarebestSel[ngoodsetsSel]=chisquarebest;
	    confLevelbestSel[ngoodsetsSel]=confLevel;
	    t0bestSel[ngoodsetsSel]=t0best/eT0best/eT0best;
	    eT0bestSel[ngoodsetsSel]=1./eT0best/eT0best;
	    t0bestallSel += t0best/eT0best/eT0best;
	    sumWt0bestallSel += 1./eT0best/eT0best;
	    ngoodsetsSel++;
	    ngoodtrktrulyused+=ntracksinsetmyCut;
	    //	    printf("T0best = %f +/- %f (%i-%i) -- conflevel = %f\n",t0best,eT0best,ntrackincurrentsel,npionbest,confLevel);
	  }
	  else{
	    //	    printf("conflevel = %f -- ngoodsetsSel = %i -- ntrackset = %i\n",confLevel,ngoodsetsSel,ntracksinsetmy);
	  }
	}	
	fTracksT0->Clear();
	nsets++;
	
      } // end for the current set
      
      //Redo the computation of the best in order to esclude very bad samples
	if(ngoodsetsSel > 1){
	    Double_t t0BestStep1 = t0bestallSel/sumWt0bestallSel;
	    Int_t nsamples=ngoodsetsSel;
	    ngoodsetsSel=0;
	    t0bestallSel=0;
	    sumWt0bestallSel=0;
	    for (Int_t itz=0; itz<nsamples;itz++) {
		if(TMath::Abs(t0bestSel[itz]/eT0bestSel[itz]-t0BestStep1)<1.0){
		    t0bestallSel += t0bestSel[itz];
		    sumWt0bestallSel += eT0bestSel[itz];	      
		    ngoodsetsSel++;   
		    //	      printf("not rejected %f +/- %f\n",t0bestSel[itz]/eT0bestSel[itz],1./TMath::Sqrt(eT0bestSel[itz]));
		}
		else{
		  //	      printf("rejected %f +/- %f\n",t0bestSel[itz]/eT0bestSel[itz],1./TMath::Sqrt(eT0bestSel[itz]));
		}
	    }
	}
	if(ngoodsetsSel < 1){
	    sumWt0bestallSel = 0.0;
	}
      //--------------------------------End recomputation

      nUsedTracks =  ngoodtrkt0;  
      if(strstr(option,"all")){
	if(sumAllweightspi>0.){
	  meantzeropi=meantzeropi/sumAllweightspi; // it is given in [ns]
	  eMeanTzeroPi=sqrt(1./sumAllweightspi); // it is given in [ns]
	}      
	
	//	printf("t0bestallSel = %f -- eT0bestallSel = %f\n",t0bestallSel,sumWt0bestallSel);

	if(sumWt0bestallSel>0){
	  t0bestallSel  = t0bestallSel/sumWt0bestallSel;
	  eT0bestallSel = sqrt(1./sumWt0bestallSel);
	  //	  printf("Final) t0bestallSel = %f -- eT0bestallSel = %f\n",t0bestallSel,eT0bestallSel);	  
	}// end of if(sumWt0bestallSel>0){
	
      }
      
      t0def=t0bestallSel;
      deltat0def=eT0bestallSel;
      
      fT0SigmaT0def[0]=t0def;
      fT0SigmaT0def[1]=TMath::Sqrt(deltat0def*deltat0def);//*ngoodtrktrulyused/(ngoodtrktrulyused-1));
      fT0SigmaT0def[2]=ngoodtrkt0;
      fT0SigmaT0def[3]=ngoodtrktrulyused;
    }
  }

  fGTracks->Clear();

  if(fT0SigmaT0def[1] < 0.00001) fT0SigmaT0def[1] = 0.6;

  bench->Stop("t0computation");

  fT0SigmaT0def[4]=bench->GetRealTime("t0computation");
  fT0SigmaT0def[5]=bench->GetCpuTime("t0computation");

//   bench->Print("t0computation");
//   printf("(%4.1f < p < %4.1f GeV/c) T0-TOF =%9.1f +/- %5.1f ps (n_track = %i)\n\n",pMinCut,pMaxCut,-fT0SigmaT0def[0]*1000,fT0SigmaT0def[1]*1000,Int_t(fT0SigmaT0def[3]));

  delete bench;
  bench=NULL;

  return fT0SigmaT0def;
  }
//__________________________________________________________________
Float_t AliTOFT0v1::GetMomError(Int_t index, Float_t mom, Float_t texp) const
{
  // Take the error extimate for the TOF time in the track reconstruction

  static const Double_t kMasses[]={
    0.000511, 0.105658, 0.139570, 0.493677, 0.938272, 1.875613
  };

  Double_t mass=kMasses[index+2];

  Float_t sigma = fPIDesd->GetTOFResponse().GetExpectedSigma(mom,texp,mass);

  return sigma;
}

//__________________________________________________________________
Bool_t AliTOFT0v1::AcceptTrack(AliESDtrack *track)
{

  /* TPC refit */
  if (!(track->GetStatus() & AliESDtrack::kTPCrefit)) return kFALSE;
  /* do not accept kink daughters */
  if (track->GetKinkIndex(0)>0) return kFALSE;
  /* N clusters TPC */
  if (track->GetTPCclusters(0) < 50) return kFALSE;
  /* chi2 TPC */
  if (track->GetTPCchi2()/Float_t(track->GetTPCclusters(0)) > 3.5) return kFALSE;
  /* sigma to vertex */
  if (GetSigmaToVertex(track) > 4.) return kFALSE;
  
  /* accept track */
  return kTRUE;

}

//____________________________________________________________________
Float_t AliTOFT0v1::GetSigmaToVertex(AliESDtrack* esdTrack) const
{
  // Calculates the number of sigma to the vertex.

  Float_t b[2];
  Float_t bRes[2];
  Float_t bCov[3];
  esdTrack->GetImpactParameters(b,bCov);
  
  if (bCov[0]<=0 || bCov[2]<=0) {
    bCov[0]=0; bCov[2]=0;
  }
  bRes[0] = TMath::Sqrt(bCov[0]);
  bRes[1] = TMath::Sqrt(bCov[2]);

  // -----------------------------------
  // How to get to a n-sigma cut?
  //
  // The accumulated statistics from 0 to d is
  //
  // ->  Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
  // ->  1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
  //
  // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
  // Can this be expressed in a different way?

  if (bRes[0] == 0 || bRes[1] ==0)
    return -1;

  //Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
  Float_t d = TMath::Sqrt(ToCalculatePower(b[0]/bRes[0],2) + ToCalculatePower(b[1]/bRes[1],2));

  // work around precision problem
  // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
  // 1e-15 corresponds to nsigma ~ 7.7
  if (TMath::Exp(-d * d / 2) < 1e-15)
    return 1000;

  Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
  return nSigma;
}
//____________________________________________________________________

Bool_t AliTOFT0v1::CheckTPCMatching(AliESDtrack *track,Int_t imass) const{
    Bool_t status = kFALSE;
    
    Double_t exptimes[AliPID::kSPECIESC];
    track->GetIntegratedTimes(exptimes,AliPID::kSPECIESC);
    
    Float_t dedx = track->GetTPCsignal();
    
    Double_t ptpc[3];
    track->GetInnerPxPyPz(ptpc);
    Float_t momtpc=TMath::Sqrt(ptpc[0]*ptpc[0] + ptpc[1]*ptpc[1] + ptpc[2]*ptpc[2]);

    if(imass > 2 || imass < 0) return status;
    Int_t i = imass+2;
    
    AliPID::EParticleType type=AliPID::EParticleType(i);
    
    Float_t dedxExp = fPIDesd->GetTPCResponse().GetExpectedSignal(momtpc,type);
    Float_t resolutionTPC = fPIDesd->GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),type);
	
    if(TMath::Abs(dedx - dedxExp) < 5 * resolutionTPC){
	status = kTRUE;
    }
    
    return status;
}

//____________________________________________________________________
Float_t AliTOFT0v1::ToCalculatePower(Float_t base, Int_t exponent) const
{
  //
  // Returns base^exponent
  //

  Float_t power=1.;

  for (Int_t ii=exponent; ii>0; ii--)
      power=power*base;

  return power;

}
//____________________________________________________________________
Int_t AliTOFT0v1::ToCalculatePower(Int_t base, Int_t exponent) const
{
  //
  // Returns base^exponent
  //

  Int_t power=1;

  for (Int_t ii=exponent; ii>0; ii--)
      power=power*base;

  return power;

}
 AliTOFT0v1.cxx:1
 AliTOFT0v1.cxx:2
 AliTOFT0v1.cxx:3
 AliTOFT0v1.cxx:4
 AliTOFT0v1.cxx:5
 AliTOFT0v1.cxx:6
 AliTOFT0v1.cxx:7
 AliTOFT0v1.cxx:8
 AliTOFT0v1.cxx:9
 AliTOFT0v1.cxx:10
 AliTOFT0v1.cxx:11
 AliTOFT0v1.cxx:12
 AliTOFT0v1.cxx:13
 AliTOFT0v1.cxx:14
 AliTOFT0v1.cxx:15
 AliTOFT0v1.cxx:16
 AliTOFT0v1.cxx:17
 AliTOFT0v1.cxx:18
 AliTOFT0v1.cxx:19
 AliTOFT0v1.cxx:20
 AliTOFT0v1.cxx:21
 AliTOFT0v1.cxx:22
 AliTOFT0v1.cxx:23
 AliTOFT0v1.cxx:24
 AliTOFT0v1.cxx:25
 AliTOFT0v1.cxx:26
 AliTOFT0v1.cxx:27
 AliTOFT0v1.cxx:28
 AliTOFT0v1.cxx:29
 AliTOFT0v1.cxx:30
 AliTOFT0v1.cxx:31
 AliTOFT0v1.cxx:32
 AliTOFT0v1.cxx:33
 AliTOFT0v1.cxx:34
 AliTOFT0v1.cxx:35
 AliTOFT0v1.cxx:36
 AliTOFT0v1.cxx:37
 AliTOFT0v1.cxx:38
 AliTOFT0v1.cxx:39
 AliTOFT0v1.cxx:40
 AliTOFT0v1.cxx:41
 AliTOFT0v1.cxx:42
 AliTOFT0v1.cxx:43
 AliTOFT0v1.cxx:44
 AliTOFT0v1.cxx:45
 AliTOFT0v1.cxx:46
 AliTOFT0v1.cxx:47
 AliTOFT0v1.cxx:48
 AliTOFT0v1.cxx:49
 AliTOFT0v1.cxx:50
 AliTOFT0v1.cxx:51
 AliTOFT0v1.cxx:52
 AliTOFT0v1.cxx:53
 AliTOFT0v1.cxx:54
 AliTOFT0v1.cxx:55
 AliTOFT0v1.cxx:56
 AliTOFT0v1.cxx:57
 AliTOFT0v1.cxx:58
 AliTOFT0v1.cxx:59
 AliTOFT0v1.cxx:60
 AliTOFT0v1.cxx:61
 AliTOFT0v1.cxx:62
 AliTOFT0v1.cxx:63
 AliTOFT0v1.cxx:64
 AliTOFT0v1.cxx:65
 AliTOFT0v1.cxx:66
 AliTOFT0v1.cxx:67
 AliTOFT0v1.cxx:68
 AliTOFT0v1.cxx:69
 AliTOFT0v1.cxx:70
 AliTOFT0v1.cxx:71
 AliTOFT0v1.cxx:72
 AliTOFT0v1.cxx:73
 AliTOFT0v1.cxx:74
 AliTOFT0v1.cxx:75
 AliTOFT0v1.cxx:76
 AliTOFT0v1.cxx:77
 AliTOFT0v1.cxx:78
 AliTOFT0v1.cxx:79
 AliTOFT0v1.cxx:80
 AliTOFT0v1.cxx:81
 AliTOFT0v1.cxx:82
 AliTOFT0v1.cxx:83
 AliTOFT0v1.cxx:84
 AliTOFT0v1.cxx:85
 AliTOFT0v1.cxx:86
 AliTOFT0v1.cxx:87
 AliTOFT0v1.cxx:88
 AliTOFT0v1.cxx:89
 AliTOFT0v1.cxx:90
 AliTOFT0v1.cxx:91
 AliTOFT0v1.cxx:92
 AliTOFT0v1.cxx:93
 AliTOFT0v1.cxx:94
 AliTOFT0v1.cxx:95
 AliTOFT0v1.cxx:96
 AliTOFT0v1.cxx:97
 AliTOFT0v1.cxx:98
 AliTOFT0v1.cxx:99
 AliTOFT0v1.cxx:100
 AliTOFT0v1.cxx:101
 AliTOFT0v1.cxx:102
 AliTOFT0v1.cxx:103
 AliTOFT0v1.cxx:104
 AliTOFT0v1.cxx:105
 AliTOFT0v1.cxx:106
 AliTOFT0v1.cxx:107
 AliTOFT0v1.cxx:108
 AliTOFT0v1.cxx:109
 AliTOFT0v1.cxx:110
 AliTOFT0v1.cxx:111
 AliTOFT0v1.cxx:112
 AliTOFT0v1.cxx:113
 AliTOFT0v1.cxx:114
 AliTOFT0v1.cxx:115
 AliTOFT0v1.cxx:116
 AliTOFT0v1.cxx:117
 AliTOFT0v1.cxx:118
 AliTOFT0v1.cxx:119
 AliTOFT0v1.cxx:120
 AliTOFT0v1.cxx:121
 AliTOFT0v1.cxx:122
 AliTOFT0v1.cxx:123
 AliTOFT0v1.cxx:124
 AliTOFT0v1.cxx:125
 AliTOFT0v1.cxx:126
 AliTOFT0v1.cxx:127
 AliTOFT0v1.cxx:128
 AliTOFT0v1.cxx:129
 AliTOFT0v1.cxx:130
 AliTOFT0v1.cxx:131
 AliTOFT0v1.cxx:132
 AliTOFT0v1.cxx:133
 AliTOFT0v1.cxx:134
 AliTOFT0v1.cxx:135
 AliTOFT0v1.cxx:136
 AliTOFT0v1.cxx:137
 AliTOFT0v1.cxx:138
 AliTOFT0v1.cxx:139
 AliTOFT0v1.cxx:140
 AliTOFT0v1.cxx:141
 AliTOFT0v1.cxx:142
 AliTOFT0v1.cxx:143
 AliTOFT0v1.cxx:144
 AliTOFT0v1.cxx:145
 AliTOFT0v1.cxx:146
 AliTOFT0v1.cxx:147
 AliTOFT0v1.cxx:148
 AliTOFT0v1.cxx:149
 AliTOFT0v1.cxx:150
 AliTOFT0v1.cxx:151
 AliTOFT0v1.cxx:152
 AliTOFT0v1.cxx:153
 AliTOFT0v1.cxx:154
 AliTOFT0v1.cxx:155
 AliTOFT0v1.cxx:156
 AliTOFT0v1.cxx:157
 AliTOFT0v1.cxx:158
 AliTOFT0v1.cxx:159
 AliTOFT0v1.cxx:160
 AliTOFT0v1.cxx:161
 AliTOFT0v1.cxx:162
 AliTOFT0v1.cxx:163
 AliTOFT0v1.cxx:164
 AliTOFT0v1.cxx:165
 AliTOFT0v1.cxx:166
 AliTOFT0v1.cxx:167
 AliTOFT0v1.cxx:168
 AliTOFT0v1.cxx:169
 AliTOFT0v1.cxx:170
 AliTOFT0v1.cxx:171
 AliTOFT0v1.cxx:172
 AliTOFT0v1.cxx:173
 AliTOFT0v1.cxx:174
 AliTOFT0v1.cxx:175
 AliTOFT0v1.cxx:176
 AliTOFT0v1.cxx:177
 AliTOFT0v1.cxx:178
 AliTOFT0v1.cxx:179
 AliTOFT0v1.cxx:180
 AliTOFT0v1.cxx:181
 AliTOFT0v1.cxx:182
 AliTOFT0v1.cxx:183
 AliTOFT0v1.cxx:184
 AliTOFT0v1.cxx:185
 AliTOFT0v1.cxx:186
 AliTOFT0v1.cxx:187
 AliTOFT0v1.cxx:188
 AliTOFT0v1.cxx:189
 AliTOFT0v1.cxx:190
 AliTOFT0v1.cxx:191
 AliTOFT0v1.cxx:192
 AliTOFT0v1.cxx:193
 AliTOFT0v1.cxx:194
 AliTOFT0v1.cxx:195
 AliTOFT0v1.cxx:196
 AliTOFT0v1.cxx:197
 AliTOFT0v1.cxx:198
 AliTOFT0v1.cxx:199
 AliTOFT0v1.cxx:200
 AliTOFT0v1.cxx:201
 AliTOFT0v1.cxx:202
 AliTOFT0v1.cxx:203
 AliTOFT0v1.cxx:204
 AliTOFT0v1.cxx:205
 AliTOFT0v1.cxx:206
 AliTOFT0v1.cxx:207
 AliTOFT0v1.cxx:208
 AliTOFT0v1.cxx:209
 AliTOFT0v1.cxx:210
 AliTOFT0v1.cxx:211
 AliTOFT0v1.cxx:212
 AliTOFT0v1.cxx:213
 AliTOFT0v1.cxx:214
 AliTOFT0v1.cxx:215
 AliTOFT0v1.cxx:216
 AliTOFT0v1.cxx:217
 AliTOFT0v1.cxx:218
 AliTOFT0v1.cxx:219
 AliTOFT0v1.cxx:220
 AliTOFT0v1.cxx:221
 AliTOFT0v1.cxx:222
 AliTOFT0v1.cxx:223
 AliTOFT0v1.cxx:224
 AliTOFT0v1.cxx:225
 AliTOFT0v1.cxx:226
 AliTOFT0v1.cxx:227
 AliTOFT0v1.cxx:228
 AliTOFT0v1.cxx:229
 AliTOFT0v1.cxx:230
 AliTOFT0v1.cxx:231
 AliTOFT0v1.cxx:232
 AliTOFT0v1.cxx:233
 AliTOFT0v1.cxx:234
 AliTOFT0v1.cxx:235
 AliTOFT0v1.cxx:236
 AliTOFT0v1.cxx:237
 AliTOFT0v1.cxx:238
 AliTOFT0v1.cxx:239
 AliTOFT0v1.cxx:240
 AliTOFT0v1.cxx:241
 AliTOFT0v1.cxx:242
 AliTOFT0v1.cxx:243
 AliTOFT0v1.cxx:244
 AliTOFT0v1.cxx:245
 AliTOFT0v1.cxx:246
 AliTOFT0v1.cxx:247
 AliTOFT0v1.cxx:248
 AliTOFT0v1.cxx:249
 AliTOFT0v1.cxx:250
 AliTOFT0v1.cxx:251
 AliTOFT0v1.cxx:252
 AliTOFT0v1.cxx:253
 AliTOFT0v1.cxx:254
 AliTOFT0v1.cxx:255
 AliTOFT0v1.cxx:256
 AliTOFT0v1.cxx:257
 AliTOFT0v1.cxx:258
 AliTOFT0v1.cxx:259
 AliTOFT0v1.cxx:260
 AliTOFT0v1.cxx:261
 AliTOFT0v1.cxx:262
 AliTOFT0v1.cxx:263
 AliTOFT0v1.cxx:264
 AliTOFT0v1.cxx:265
 AliTOFT0v1.cxx:266
 AliTOFT0v1.cxx:267
 AliTOFT0v1.cxx:268
 AliTOFT0v1.cxx:269
 AliTOFT0v1.cxx:270
 AliTOFT0v1.cxx:271
 AliTOFT0v1.cxx:272
 AliTOFT0v1.cxx:273
 AliTOFT0v1.cxx:274
 AliTOFT0v1.cxx:275
 AliTOFT0v1.cxx:276
 AliTOFT0v1.cxx:277
 AliTOFT0v1.cxx:278
 AliTOFT0v1.cxx:279
 AliTOFT0v1.cxx:280
 AliTOFT0v1.cxx:281
 AliTOFT0v1.cxx:282
 AliTOFT0v1.cxx:283
 AliTOFT0v1.cxx:284
 AliTOFT0v1.cxx:285
 AliTOFT0v1.cxx:286
 AliTOFT0v1.cxx:287
 AliTOFT0v1.cxx:288
 AliTOFT0v1.cxx:289
 AliTOFT0v1.cxx:290
 AliTOFT0v1.cxx:291
 AliTOFT0v1.cxx:292
 AliTOFT0v1.cxx:293
 AliTOFT0v1.cxx:294
 AliTOFT0v1.cxx:295
 AliTOFT0v1.cxx:296
 AliTOFT0v1.cxx:297
 AliTOFT0v1.cxx:298
 AliTOFT0v1.cxx:299
 AliTOFT0v1.cxx:300
 AliTOFT0v1.cxx:301
 AliTOFT0v1.cxx:302
 AliTOFT0v1.cxx:303
 AliTOFT0v1.cxx:304
 AliTOFT0v1.cxx:305
 AliTOFT0v1.cxx:306
 AliTOFT0v1.cxx:307
 AliTOFT0v1.cxx:308
 AliTOFT0v1.cxx:309
 AliTOFT0v1.cxx:310
 AliTOFT0v1.cxx:311
 AliTOFT0v1.cxx:312
 AliTOFT0v1.cxx:313
 AliTOFT0v1.cxx:314
 AliTOFT0v1.cxx:315
 AliTOFT0v1.cxx:316
 AliTOFT0v1.cxx:317
 AliTOFT0v1.cxx:318
 AliTOFT0v1.cxx:319
 AliTOFT0v1.cxx:320
 AliTOFT0v1.cxx:321
 AliTOFT0v1.cxx:322
 AliTOFT0v1.cxx:323
 AliTOFT0v1.cxx:324
 AliTOFT0v1.cxx:325
 AliTOFT0v1.cxx:326
 AliTOFT0v1.cxx:327
 AliTOFT0v1.cxx:328
 AliTOFT0v1.cxx:329
 AliTOFT0v1.cxx:330
 AliTOFT0v1.cxx:331
 AliTOFT0v1.cxx:332
 AliTOFT0v1.cxx:333
 AliTOFT0v1.cxx:334
 AliTOFT0v1.cxx:335
 AliTOFT0v1.cxx:336
 AliTOFT0v1.cxx:337
 AliTOFT0v1.cxx:338
 AliTOFT0v1.cxx:339
 AliTOFT0v1.cxx:340
 AliTOFT0v1.cxx:341
 AliTOFT0v1.cxx:342
 AliTOFT0v1.cxx:343
 AliTOFT0v1.cxx:344
 AliTOFT0v1.cxx:345
 AliTOFT0v1.cxx:346
 AliTOFT0v1.cxx:347
 AliTOFT0v1.cxx:348
 AliTOFT0v1.cxx:349
 AliTOFT0v1.cxx:350
 AliTOFT0v1.cxx:351
 AliTOFT0v1.cxx:352
 AliTOFT0v1.cxx:353
 AliTOFT0v1.cxx:354
 AliTOFT0v1.cxx:355
 AliTOFT0v1.cxx:356
 AliTOFT0v1.cxx:357
 AliTOFT0v1.cxx:358
 AliTOFT0v1.cxx:359
 AliTOFT0v1.cxx:360
 AliTOFT0v1.cxx:361
 AliTOFT0v1.cxx:362
 AliTOFT0v1.cxx:363
 AliTOFT0v1.cxx:364
 AliTOFT0v1.cxx:365
 AliTOFT0v1.cxx:366
 AliTOFT0v1.cxx:367
 AliTOFT0v1.cxx:368
 AliTOFT0v1.cxx:369
 AliTOFT0v1.cxx:370
 AliTOFT0v1.cxx:371
 AliTOFT0v1.cxx:372
 AliTOFT0v1.cxx:373
 AliTOFT0v1.cxx:374
 AliTOFT0v1.cxx:375
 AliTOFT0v1.cxx:376
 AliTOFT0v1.cxx:377
 AliTOFT0v1.cxx:378
 AliTOFT0v1.cxx:379
 AliTOFT0v1.cxx:380
 AliTOFT0v1.cxx:381
 AliTOFT0v1.cxx:382
 AliTOFT0v1.cxx:383
 AliTOFT0v1.cxx:384
 AliTOFT0v1.cxx:385
 AliTOFT0v1.cxx:386
 AliTOFT0v1.cxx:387
 AliTOFT0v1.cxx:388
 AliTOFT0v1.cxx:389
 AliTOFT0v1.cxx:390
 AliTOFT0v1.cxx:391
 AliTOFT0v1.cxx:392
 AliTOFT0v1.cxx:393
 AliTOFT0v1.cxx:394
 AliTOFT0v1.cxx:395
 AliTOFT0v1.cxx:396
 AliTOFT0v1.cxx:397
 AliTOFT0v1.cxx:398
 AliTOFT0v1.cxx:399
 AliTOFT0v1.cxx:400
 AliTOFT0v1.cxx:401
 AliTOFT0v1.cxx:402
 AliTOFT0v1.cxx:403
 AliTOFT0v1.cxx:404
 AliTOFT0v1.cxx:405
 AliTOFT0v1.cxx:406
 AliTOFT0v1.cxx:407
 AliTOFT0v1.cxx:408
 AliTOFT0v1.cxx:409
 AliTOFT0v1.cxx:410
 AliTOFT0v1.cxx:411
 AliTOFT0v1.cxx:412
 AliTOFT0v1.cxx:413
 AliTOFT0v1.cxx:414
 AliTOFT0v1.cxx:415
 AliTOFT0v1.cxx:416
 AliTOFT0v1.cxx:417
 AliTOFT0v1.cxx:418
 AliTOFT0v1.cxx:419
 AliTOFT0v1.cxx:420
 AliTOFT0v1.cxx:421
 AliTOFT0v1.cxx:422
 AliTOFT0v1.cxx:423
 AliTOFT0v1.cxx:424
 AliTOFT0v1.cxx:425
 AliTOFT0v1.cxx:426
 AliTOFT0v1.cxx:427
 AliTOFT0v1.cxx:428
 AliTOFT0v1.cxx:429
 AliTOFT0v1.cxx:430
 AliTOFT0v1.cxx:431
 AliTOFT0v1.cxx:432
 AliTOFT0v1.cxx:433
 AliTOFT0v1.cxx:434
 AliTOFT0v1.cxx:435
 AliTOFT0v1.cxx:436
 AliTOFT0v1.cxx:437
 AliTOFT0v1.cxx:438
 AliTOFT0v1.cxx:439
 AliTOFT0v1.cxx:440
 AliTOFT0v1.cxx:441
 AliTOFT0v1.cxx:442
 AliTOFT0v1.cxx:443
 AliTOFT0v1.cxx:444
 AliTOFT0v1.cxx:445
 AliTOFT0v1.cxx:446
 AliTOFT0v1.cxx:447
 AliTOFT0v1.cxx:448
 AliTOFT0v1.cxx:449
 AliTOFT0v1.cxx:450
 AliTOFT0v1.cxx:451
 AliTOFT0v1.cxx:452
 AliTOFT0v1.cxx:453
 AliTOFT0v1.cxx:454
 AliTOFT0v1.cxx:455
 AliTOFT0v1.cxx:456
 AliTOFT0v1.cxx:457
 AliTOFT0v1.cxx:458
 AliTOFT0v1.cxx:459
 AliTOFT0v1.cxx:460
 AliTOFT0v1.cxx:461
 AliTOFT0v1.cxx:462
 AliTOFT0v1.cxx:463
 AliTOFT0v1.cxx:464
 AliTOFT0v1.cxx:465
 AliTOFT0v1.cxx:466
 AliTOFT0v1.cxx:467
 AliTOFT0v1.cxx:468
 AliTOFT0v1.cxx:469
 AliTOFT0v1.cxx:470
 AliTOFT0v1.cxx:471
 AliTOFT0v1.cxx:472
 AliTOFT0v1.cxx:473
 AliTOFT0v1.cxx:474
 AliTOFT0v1.cxx:475
 AliTOFT0v1.cxx:476
 AliTOFT0v1.cxx:477
 AliTOFT0v1.cxx:478
 AliTOFT0v1.cxx:479
 AliTOFT0v1.cxx:480
 AliTOFT0v1.cxx:481
 AliTOFT0v1.cxx:482
 AliTOFT0v1.cxx:483
 AliTOFT0v1.cxx:484
 AliTOFT0v1.cxx:485
 AliTOFT0v1.cxx:486
 AliTOFT0v1.cxx:487
 AliTOFT0v1.cxx:488
 AliTOFT0v1.cxx:489
 AliTOFT0v1.cxx:490
 AliTOFT0v1.cxx:491
 AliTOFT0v1.cxx:492
 AliTOFT0v1.cxx:493
 AliTOFT0v1.cxx:494
 AliTOFT0v1.cxx:495
 AliTOFT0v1.cxx:496
 AliTOFT0v1.cxx:497
 AliTOFT0v1.cxx:498
 AliTOFT0v1.cxx:499
 AliTOFT0v1.cxx:500
 AliTOFT0v1.cxx:501
 AliTOFT0v1.cxx:502
 AliTOFT0v1.cxx:503
 AliTOFT0v1.cxx:504
 AliTOFT0v1.cxx:505
 AliTOFT0v1.cxx:506
 AliTOFT0v1.cxx:507
 AliTOFT0v1.cxx:508
 AliTOFT0v1.cxx:509
 AliTOFT0v1.cxx:510
 AliTOFT0v1.cxx:511
 AliTOFT0v1.cxx:512
 AliTOFT0v1.cxx:513
 AliTOFT0v1.cxx:514
 AliTOFT0v1.cxx:515
 AliTOFT0v1.cxx:516
 AliTOFT0v1.cxx:517
 AliTOFT0v1.cxx:518
 AliTOFT0v1.cxx:519
 AliTOFT0v1.cxx:520
 AliTOFT0v1.cxx:521
 AliTOFT0v1.cxx:522
 AliTOFT0v1.cxx:523
 AliTOFT0v1.cxx:524
 AliTOFT0v1.cxx:525
 AliTOFT0v1.cxx:526
 AliTOFT0v1.cxx:527
 AliTOFT0v1.cxx:528
 AliTOFT0v1.cxx:529
 AliTOFT0v1.cxx:530
 AliTOFT0v1.cxx:531
 AliTOFT0v1.cxx:532
 AliTOFT0v1.cxx:533
 AliTOFT0v1.cxx:534
 AliTOFT0v1.cxx:535
 AliTOFT0v1.cxx:536
 AliTOFT0v1.cxx:537
 AliTOFT0v1.cxx:538
 AliTOFT0v1.cxx:539
 AliTOFT0v1.cxx:540
 AliTOFT0v1.cxx:541
 AliTOFT0v1.cxx:542
 AliTOFT0v1.cxx:543
 AliTOFT0v1.cxx:544
 AliTOFT0v1.cxx:545
 AliTOFT0v1.cxx:546
 AliTOFT0v1.cxx:547
 AliTOFT0v1.cxx:548
 AliTOFT0v1.cxx:549
 AliTOFT0v1.cxx:550
 AliTOFT0v1.cxx:551
 AliTOFT0v1.cxx:552
 AliTOFT0v1.cxx:553
 AliTOFT0v1.cxx:554
 AliTOFT0v1.cxx:555
 AliTOFT0v1.cxx:556
 AliTOFT0v1.cxx:557
 AliTOFT0v1.cxx:558
 AliTOFT0v1.cxx:559
 AliTOFT0v1.cxx:560
 AliTOFT0v1.cxx:561
 AliTOFT0v1.cxx:562
 AliTOFT0v1.cxx:563
 AliTOFT0v1.cxx:564
 AliTOFT0v1.cxx:565
 AliTOFT0v1.cxx:566
 AliTOFT0v1.cxx:567
 AliTOFT0v1.cxx:568
 AliTOFT0v1.cxx:569
 AliTOFT0v1.cxx:570
 AliTOFT0v1.cxx:571
 AliTOFT0v1.cxx:572
 AliTOFT0v1.cxx:573
 AliTOFT0v1.cxx:574
 AliTOFT0v1.cxx:575
 AliTOFT0v1.cxx:576
 AliTOFT0v1.cxx:577
 AliTOFT0v1.cxx:578
 AliTOFT0v1.cxx:579
 AliTOFT0v1.cxx:580
 AliTOFT0v1.cxx:581
 AliTOFT0v1.cxx:582
 AliTOFT0v1.cxx:583
 AliTOFT0v1.cxx:584
 AliTOFT0v1.cxx:585
 AliTOFT0v1.cxx:586
 AliTOFT0v1.cxx:587
 AliTOFT0v1.cxx:588
 AliTOFT0v1.cxx:589
 AliTOFT0v1.cxx:590
 AliTOFT0v1.cxx:591
 AliTOFT0v1.cxx:592
 AliTOFT0v1.cxx:593
 AliTOFT0v1.cxx:594
 AliTOFT0v1.cxx:595
 AliTOFT0v1.cxx:596
 AliTOFT0v1.cxx:597
 AliTOFT0v1.cxx:598
 AliTOFT0v1.cxx:599
 AliTOFT0v1.cxx:600
 AliTOFT0v1.cxx:601
 AliTOFT0v1.cxx:602
 AliTOFT0v1.cxx:603
 AliTOFT0v1.cxx:604
 AliTOFT0v1.cxx:605
 AliTOFT0v1.cxx:606
 AliTOFT0v1.cxx:607
 AliTOFT0v1.cxx:608
 AliTOFT0v1.cxx:609
 AliTOFT0v1.cxx:610
 AliTOFT0v1.cxx:611
 AliTOFT0v1.cxx:612
 AliTOFT0v1.cxx:613
 AliTOFT0v1.cxx:614
 AliTOFT0v1.cxx:615
 AliTOFT0v1.cxx:616
 AliTOFT0v1.cxx:617
 AliTOFT0v1.cxx:618
 AliTOFT0v1.cxx:619
 AliTOFT0v1.cxx:620
 AliTOFT0v1.cxx:621
 AliTOFT0v1.cxx:622
 AliTOFT0v1.cxx:623
 AliTOFT0v1.cxx:624
 AliTOFT0v1.cxx:625
 AliTOFT0v1.cxx:626
 AliTOFT0v1.cxx:627
 AliTOFT0v1.cxx:628
 AliTOFT0v1.cxx:629
 AliTOFT0v1.cxx:630
 AliTOFT0v1.cxx:631
 AliTOFT0v1.cxx:632
 AliTOFT0v1.cxx:633
 AliTOFT0v1.cxx:634
 AliTOFT0v1.cxx:635
 AliTOFT0v1.cxx:636
 AliTOFT0v1.cxx:637
 AliTOFT0v1.cxx:638
 AliTOFT0v1.cxx:639
 AliTOFT0v1.cxx:640
 AliTOFT0v1.cxx:641
 AliTOFT0v1.cxx:642
 AliTOFT0v1.cxx:643
 AliTOFT0v1.cxx:644
 AliTOFT0v1.cxx:645
 AliTOFT0v1.cxx:646
 AliTOFT0v1.cxx:647
 AliTOFT0v1.cxx:648
 AliTOFT0v1.cxx:649
 AliTOFT0v1.cxx:650
 AliTOFT0v1.cxx:651
 AliTOFT0v1.cxx:652
 AliTOFT0v1.cxx:653
 AliTOFT0v1.cxx:654
 AliTOFT0v1.cxx:655
 AliTOFT0v1.cxx:656
 AliTOFT0v1.cxx:657
 AliTOFT0v1.cxx:658
 AliTOFT0v1.cxx:659
 AliTOFT0v1.cxx:660
 AliTOFT0v1.cxx:661
 AliTOFT0v1.cxx:662
 AliTOFT0v1.cxx:663
 AliTOFT0v1.cxx:664
 AliTOFT0v1.cxx:665
 AliTOFT0v1.cxx:666
 AliTOFT0v1.cxx:667
 AliTOFT0v1.cxx:668
 AliTOFT0v1.cxx:669
 AliTOFT0v1.cxx:670
 AliTOFT0v1.cxx:671
 AliTOFT0v1.cxx:672
 AliTOFT0v1.cxx:673
 AliTOFT0v1.cxx:674
 AliTOFT0v1.cxx:675
 AliTOFT0v1.cxx:676
 AliTOFT0v1.cxx:677
 AliTOFT0v1.cxx:678
 AliTOFT0v1.cxx:679
 AliTOFT0v1.cxx:680
 AliTOFT0v1.cxx:681
 AliTOFT0v1.cxx:682
 AliTOFT0v1.cxx:683
 AliTOFT0v1.cxx:684
 AliTOFT0v1.cxx:685
 AliTOFT0v1.cxx:686
 AliTOFT0v1.cxx:687
 AliTOFT0v1.cxx:688
 AliTOFT0v1.cxx:689
 AliTOFT0v1.cxx:690
 AliTOFT0v1.cxx:691
 AliTOFT0v1.cxx:692
 AliTOFT0v1.cxx:693
 AliTOFT0v1.cxx:694
 AliTOFT0v1.cxx:695
 AliTOFT0v1.cxx:696
 AliTOFT0v1.cxx:697
 AliTOFT0v1.cxx:698
 AliTOFT0v1.cxx:699
 AliTOFT0v1.cxx:700
 AliTOFT0v1.cxx:701
 AliTOFT0v1.cxx:702
 AliTOFT0v1.cxx:703
 AliTOFT0v1.cxx:704
 AliTOFT0v1.cxx:705
 AliTOFT0v1.cxx:706
 AliTOFT0v1.cxx:707
 AliTOFT0v1.cxx:708
 AliTOFT0v1.cxx:709
 AliTOFT0v1.cxx:710
 AliTOFT0v1.cxx:711
 AliTOFT0v1.cxx:712
 AliTOFT0v1.cxx:713
 AliTOFT0v1.cxx:714
 AliTOFT0v1.cxx:715
 AliTOFT0v1.cxx:716
 AliTOFT0v1.cxx:717
 AliTOFT0v1.cxx:718
 AliTOFT0v1.cxx:719
 AliTOFT0v1.cxx:720
 AliTOFT0v1.cxx:721
 AliTOFT0v1.cxx:722
 AliTOFT0v1.cxx:723
 AliTOFT0v1.cxx:724
 AliTOFT0v1.cxx:725
 AliTOFT0v1.cxx:726
 AliTOFT0v1.cxx:727
 AliTOFT0v1.cxx:728
 AliTOFT0v1.cxx:729
 AliTOFT0v1.cxx:730
 AliTOFT0v1.cxx:731
 AliTOFT0v1.cxx:732
 AliTOFT0v1.cxx:733
 AliTOFT0v1.cxx:734
 AliTOFT0v1.cxx:735
 AliTOFT0v1.cxx:736
 AliTOFT0v1.cxx:737
 AliTOFT0v1.cxx:738
 AliTOFT0v1.cxx:739
 AliTOFT0v1.cxx:740
 AliTOFT0v1.cxx:741
 AliTOFT0v1.cxx:742
 AliTOFT0v1.cxx:743
 AliTOFT0v1.cxx:744
 AliTOFT0v1.cxx:745
 AliTOFT0v1.cxx:746
 AliTOFT0v1.cxx:747
 AliTOFT0v1.cxx:748
 AliTOFT0v1.cxx:749
 AliTOFT0v1.cxx:750
 AliTOFT0v1.cxx:751
 AliTOFT0v1.cxx:752
 AliTOFT0v1.cxx:753
 AliTOFT0v1.cxx:754
 AliTOFT0v1.cxx:755
 AliTOFT0v1.cxx:756
 AliTOFT0v1.cxx:757
 AliTOFT0v1.cxx:758
 AliTOFT0v1.cxx:759
 AliTOFT0v1.cxx:760
 AliTOFT0v1.cxx:761
 AliTOFT0v1.cxx:762
 AliTOFT0v1.cxx:763
 AliTOFT0v1.cxx:764
 AliTOFT0v1.cxx:765
 AliTOFT0v1.cxx:766
 AliTOFT0v1.cxx:767
 AliTOFT0v1.cxx:768
 AliTOFT0v1.cxx:769
 AliTOFT0v1.cxx:770
 AliTOFT0v1.cxx:771
 AliTOFT0v1.cxx:772
 AliTOFT0v1.cxx:773
 AliTOFT0v1.cxx:774
 AliTOFT0v1.cxx:775
 AliTOFT0v1.cxx:776
 AliTOFT0v1.cxx:777
 AliTOFT0v1.cxx:778
 AliTOFT0v1.cxx:779
 AliTOFT0v1.cxx:780
 AliTOFT0v1.cxx:781
 AliTOFT0v1.cxx:782
 AliTOFT0v1.cxx:783
 AliTOFT0v1.cxx:784
 AliTOFT0v1.cxx:785
 AliTOFT0v1.cxx:786
 AliTOFT0v1.cxx:787
 AliTOFT0v1.cxx:788
 AliTOFT0v1.cxx:789
 AliTOFT0v1.cxx:790
 AliTOFT0v1.cxx:791
 AliTOFT0v1.cxx:792
 AliTOFT0v1.cxx:793
 AliTOFT0v1.cxx:794
 AliTOFT0v1.cxx:795
 AliTOFT0v1.cxx:796
 AliTOFT0v1.cxx:797
 AliTOFT0v1.cxx:798
 AliTOFT0v1.cxx:799
 AliTOFT0v1.cxx:800
 AliTOFT0v1.cxx:801
 AliTOFT0v1.cxx:802
 AliTOFT0v1.cxx:803
 AliTOFT0v1.cxx:804
 AliTOFT0v1.cxx:805
 AliTOFT0v1.cxx:806
 AliTOFT0v1.cxx:807
 AliTOFT0v1.cxx:808
 AliTOFT0v1.cxx:809
 AliTOFT0v1.cxx:810
 AliTOFT0v1.cxx:811
 AliTOFT0v1.cxx:812
 AliTOFT0v1.cxx:813
 AliTOFT0v1.cxx:814
 AliTOFT0v1.cxx:815
 AliTOFT0v1.cxx:816
 AliTOFT0v1.cxx:817
 AliTOFT0v1.cxx:818
 AliTOFT0v1.cxx:819
 AliTOFT0v1.cxx:820
 AliTOFT0v1.cxx:821
 AliTOFT0v1.cxx:822
 AliTOFT0v1.cxx:823
 AliTOFT0v1.cxx:824
 AliTOFT0v1.cxx:825
 AliTOFT0v1.cxx:826
 AliTOFT0v1.cxx:827
 AliTOFT0v1.cxx:828