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: AliESDpid.cxx 64123 2013-09-05 15:09:53Z morsch $ */

//-----------------------------------------------------------------
//           Implementation of the combined PID class
//           For the Event Summary Data Class
//           produced by the reconstruction process
//           and containing information on the particle identification
//      Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
//-----------------------------------------------------------------

#include "TArrayI.h"
#include "TArrayF.h"

#include "TRandom.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliTOFHeader.h"
#include "AliESDpid.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliMCEvent.h"
#include "AliTOFPIDParams.h"

#include <AliDetectorPID.h>

ClassImp(AliESDpid)

Int_t AliESDpid::MakePID(AliESDEvent *event, Bool_t TPConly, Float_t /*timeZeroTOF*/) const {
  //
  //  Calculate probabilities for all detectors, except if TPConly==kTRUE
  //  and combine PID
  //  
  //   Option TPConly==kTRUE is used during reconstruction, 
  //  because ITS tracking uses TPC pid
  //  HMPID and TRD pid are done in detector reconstructors
  //

  /*
  Float_t timeZeroTOF = 0;
  if (subtractT0) 
    timeZeroTOF = event->GetT0();
  */
  Int_t nTrk=event->GetNumberOfTracks();
  for (Int_t iTrk=0; iTrk<nTrk; iTrk++) {  
    AliESDtrack *track=event->GetTrack(iTrk);
    MakeTPCPID(track);
    if (!TPConly) {
      MakeITSPID(track);
      //MakeTOFPID(track, timeZeroTOF);
      //MakeHMPIDPID(track);
      //MakeTRDPID(track);
    }
    CombinePID(track);
  }
  return 0;
}
//_________________________________________________________________________
Float_t AliESDpid::GetTPCsignalTunedOnData(const AliVTrack *t) const {
    AliESDtrack *track = (AliESDtrack *) t;
    Float_t dedx = track->GetTPCsignalTunedOnData();

    if(dedx > 0) return dedx;

    dedx = t->GetTPCsignal();
    track->SetTPCsignalTunedOnData(dedx);
    if(dedx < 20) return dedx;

    AliPID::EParticleType type = AliPID::kPion;

    AliMCEventHandler* eventHandler=dynamic_cast<AliMCEventHandler*>(fEventHandler);
    if (eventHandler) {
	AliMCEvent* mcEvent = eventHandler->MCEvent();
	if(mcEvent){
	    Bool_t kGood = kTRUE;
	    AliMCParticle *MCpart = (AliMCParticle *) mcEvent->GetTrack(TMath::Abs(t->GetLabel()));
	    if (MCpart != NULL) { // protect against label-0 track (initial proton in Pythia events)
	      TParticle *part = MCpart->Particle(); 
	      Int_t iS = TMath::Abs(part->GetPdgCode());
	      
	      if(iS==AliPID::ParticleCode(AliPID::kElectron)){
		type = AliPID::kElectron;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kMuon)){
		type = AliPID::kMuon;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kPion)){
		type = AliPID::kPion;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kKaon)){
		type = AliPID::kKaon;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kProton)){
		type = AliPID::kProton;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kDeuteron)){ // d
		type = AliPID::kDeuteron;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kTriton)){ // t
		type = AliPID::kTriton;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kHe3)){ // 3He
		type = AliPID::kHe3;
	      }
	      else if(iS==AliPID::ParticleCode(AliPID::kAlpha)){ // 4He
		type = AliPID::kAlpha;
	      }
	      else
		kGood = kFALSE;
	    } else kGood = kFALSE;
	    
	    if(kGood){
        //TODO maybe introduce different dEdxSources?
        Double_t bethe = fTPCResponse.GetExpectedSignal(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
                                                        this->UseTPCMultiplicityCorrection());
        Double_t sigma = fTPCResponse.GetExpectedSigma(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
                                                       this->UseTPCMultiplicityCorrection());
		dedx = gRandom->Gaus(bethe,sigma);
// 		if(iS == AliPID::ParticleCode(AliPID::kHe3) || iS == AliPID::ParticleCode(AliPID::kAlpha)) dedx *= 5;
	    }
	}
    }

    track->SetTPCsignalTunedOnData(dedx);
    return dedx;
}
//_________________________________________________________________________
Float_t AliESDpid::GetTOFsignalTunedOnData(const AliVTrack *t) const {
    AliESDtrack *track = (AliESDtrack *) t;
    Double_t tofSignal = track->GetTOFsignalTunedOnData();

    if(tofSignal <  99999) return (Float_t)tofSignal; // it has been already set
    // read additional mismatch fraction
    Float_t addmism = GetTOFPIDParams()->GetTOFadditionalMismForMC();
    if(addmism > 1.){
      Float_t centr = GetCurrentCentrality();
      if(centr > 50) addmism *= 0.1667;
      else if(centr > 20) addmism *= 0.33;
    }

    tofSignal = t->GetTOFsignal() + fTOFResponse.GetTailRandomValue(t->Pt(),t->Eta(),t->GetTOFsignal(),addmism);
    track->SetTOFsignalTunedOnData(tofSignal);
    return (Float_t)tofSignal;
}
//_________________________________________________________________________
void AliESDpid::MakeTPCPID(AliESDtrack *track) const
{
  //
  //  TPC pid using bethe-bloch and gaussian response
  //
  if ((track->GetStatus()&AliESDtrack::kTPCin )==0)
    if ((track->GetStatus()&AliESDtrack::kTPCout)==0) return;

    Double_t mom = track->GetP();
    const AliExternalTrackParam *in=track->GetInnerParam();
    if (in) mom = in->GetP();

    Double_t p[AliPID::kSPECIES];
    Double_t dedx=track->GetTPCsignal(); 
    Bool_t mismatch=kTRUE, heavy=kTRUE;

    for (Int_t j=0; j<AliPID::kSPECIES; j++) {
      AliPID::EParticleType type=AliPID::EParticleType(j);
      Double_t bethe=fTPCResponse.GetExpectedSignal(mom,type); 
      Double_t sigma=fTPCResponse.GetExpectedSigma(mom,track->GetTPCsignalN(),type);
      if (TMath::Abs(dedx-bethe) > fRange*sigma) {
	p[j]=TMath::Exp(-0.5*fRange*fRange)/sigma;
      } else {
        p[j]=TMath::Exp(-0.5*(dedx-bethe)*(dedx-bethe)/(sigma*sigma))/sigma;
        mismatch=kFALSE;
      }

      // Check for particles heavier than (AliPID::kSPECIES - 1)
      if (dedx < (bethe + fRange*sigma)) heavy=kFALSE;

    }

    if (mismatch)
       for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1./AliPID::kSPECIES;

    track->SetTPCpid(p);

    if (heavy) track->ResetStatus(AliESDtrack::kTPCpid);

}
//_________________________________________________________________________
void AliESDpid::MakeITSPID(AliESDtrack *track) const
{
  //
  // ITS PID
  // Two options, depending on fITSPIDmethod:
  //  1) Truncated mean method
  //  2) Likelihood, using charges measured in all 4 layers and 
  //     Landau+gaus response functions
  //

  if ((track->GetStatus()&AliESDtrack::kITSin)==0 &&
      (track->GetStatus()&AliESDtrack::kITSout)==0) return;

  Double_t mom=track->GetP();  
  if (fITSPIDmethod == kITSTruncMean) {
    Double_t dedx=track->GetITSsignal();
    Bool_t isSA=kTRUE;
    Double_t momITS=mom;
    ULong_t trStatus=track->GetStatus();
    if(trStatus&AliESDtrack::kTPCin) isSA=kFALSE;
    UChar_t clumap=track->GetITSClusterMap();
    Int_t nPointsForPid=0;
    for(Int_t i=2; i<6; i++){
      if(clumap&(1<<i)) ++nPointsForPid;
    }

    if(nPointsForPid<3) { // track not to be used for combined PID purposes
      track->ResetStatus(AliESDtrack::kITSpid);
      return;
    }

    Double_t p[AliPID::kSPECIES];

    Bool_t mismatch=kTRUE, heavy=kTRUE;
    for (Int_t j=0; j<AliPID::kSPECIES; j++) {
      Double_t mass=AliPID::ParticleMass(j);//GeV/c^2
      Double_t bethe=fITSResponse.Bethe(momITS,mass);
      Double_t sigma=fITSResponse.GetResolution(bethe,nPointsForPid,isSA);
      if (TMath::Abs(dedx-bethe) > fRange*sigma) {
	p[j]=TMath::Exp(-0.5*fRange*fRange)/sigma;
      } else {
        p[j]=TMath::Exp(-0.5*(dedx-bethe)*(dedx-bethe)/(sigma*sigma))/sigma;
        mismatch=kFALSE;
      }

      // Check for particles heavier than (AliPID::kSPECIES - 1)
      if (dedx < (bethe + fRange*sigma)) heavy=kFALSE;

    }

    if (mismatch)
       for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1./AliPID::kSPECIES;

    track->SetITSpid(p);

    if (heavy) track->ResetStatus(AliESDtrack::kITSpid);
  }
  else {  // Likelihood method
    Double_t condprobfun[AliPID::kSPECIES];
    Double_t qclu[4];
    track->GetITSdEdxSamples(qclu);
    fITSResponse.GetITSProbabilities(mom,qclu,condprobfun);
    track->SetITSpid(condprobfun);
  }

}
//_________________________________________________________________________
void AliESDpid::MakeTOFPID(AliESDtrack *track, Float_t /*timeZeroTOF*/) const
{
  //
  //   TOF PID using gaussian response
  //

  if ((track->GetStatus()&AliESDtrack::kTOFout)==0) return;
  if ((track->GetStatus()&AliESDtrack::kTIME)==0) return;
  if ((track->GetStatus()&AliESDtrack::kITSin)==0) return;

  Int_t ibin = fTOFResponse.GetMomBin(track->GetP());
  Float_t timezero = fTOFResponse.GetT0bin(ibin);

  Double_t time[AliPID::kSPECIESC];
  track->GetIntegratedTimes(time);

  Double_t sigma[AliPID::kSPECIES];
  for (Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++) {
    sigma[iPart] = fTOFResponse.GetExpectedSigma(track->GetP(),time[iPart],AliPID::ParticleMass(iPart));
  }

  AliDebugGeneral("AliESDpid::MakeTOFPID",2,
	   Form("Expected TOF signals [ps]: %f %f %f %f %f",
		  time[AliPID::kElectron],
		  time[AliPID::kMuon],
		  time[AliPID::kPion],
		  time[AliPID::kKaon],
		  time[AliPID::kProton]));

  AliDebugGeneral("AliESDpid::MakeTOFPID",2,
	   Form("Expected TOF std deviations [ps]: %f %f %f %f %f",
		  sigma[AliPID::kElectron],
		  sigma[AliPID::kMuon],
		  sigma[AliPID::kPion],
		  sigma[AliPID::kKaon],
		  sigma[AliPID::kProton]
		  ));

  Double_t tof = track->GetTOFsignal() - timezero;

  Double_t p[AliPID::kSPECIES];
//   Bool_t mismatch = kTRUE;
  Bool_t heavy = kTRUE;
  for (Int_t j=0; j<AliPID::kSPECIES; j++) {
    Double_t sig = sigma[j];
    if (TMath::Abs(tof-time[j]) > (fRange+2)*sig) {
	p[j] = TMath::Exp(-0.5*(fRange+2)*(fRange+2))/sig;
    } else
      p[j] = TMath::Exp(-0.5*(tof-time[j])*(tof-time[j])/(sig*sig))/sig;

    // Check the mismatching
    
//     Double_t mass = AliPID::ParticleMass(j);
//     Double_t pm = fTOFResponse.GetMismatchProbability(track->GetP(),mass);
//     if (p[j]>pm) mismatch = kFALSE;

    // Check for particles heavier than (AliPID::kSPECIES - 1)
    if (tof < (time[j] + fRange*sig)) heavy=kFALSE;

  }

  /*
    if (mismatch)
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1./AliPID::kSPECIES;
  */

  track->SetTOFpid(p);

  if (heavy) track->ResetStatus(AliESDtrack::kTOFpid);
  
  // kTOFmismatch flas is not set because deprecated from 18/02/2013
  //  if (!CheckTOFMatching(track)) track->SetStatus(AliESDtrack::kTOFmismatch);
  //  else track->ResetStatus(AliESDtrack::kTOFmismatch);
}
//_________________________________________________________________________
void AliESDpid::MakeTRDPID(AliESDtrack *track) const
{
  //
  // Method to recalculate the TRD PID probabilities
  //
  Double_t prob[AliPID::kSPECIES];
  GetComputeTRDProbability(track, AliPID::kSPECIES, prob);
  track->SetTRDpid(prob);
}
//_________________________________________________________________________
void AliESDpid::CombinePID(AliESDtrack *track) const
{
  //
  // Combine the information of various detectors
  // to determine the Particle Identification
  //
  Double_t p[AliPID::kSPECIES]={1.};

  if (track->IsOn(AliESDtrack::kITSpid)) {
    Double_t d[AliPID::kSPECIES];
    track->GetITSpid(d);
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]*=d[j];
  }

  if (track->IsOn(AliESDtrack::kTPCpid)) {
    Double_t d[AliPID::kSPECIES];
    track->GetTPCpid(d);
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]*=d[j];
  }

  if (track->IsOn(AliESDtrack::kTRDpid)) {
    Double_t d[AliPID::kSPECIES];
    track->GetTRDpid(d);
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]*=d[j];
  }

  if (track->IsOn(AliESDtrack::kTOFpid)) {
    Double_t d[AliPID::kSPECIES];
    track->GetTOFpid(d);
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]*=d[j];
  }

  if (track->IsOn(AliESDtrack::kHMPIDpid)) {
    Double_t d[AliPID::kSPECIES];
    track->GetHMPIDpid(d);
    for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]*=d[j];
  }

  track->SetESDpid(p);
}
//_________________________________________________________________________
Bool_t AliESDpid::CheckTOFMatching(AliESDtrack *track) const{
  //
  // Check pid matching of TOF with TPC as reference
  //
    Bool_t status = kFALSE;
    
    Double_t exptimes[AliPID::kSPECIESC];
    track->GetIntegratedTimes(exptimes);
    
    Float_t p = track->P();
    
    Float_t dedx = track->GetTPCsignal();
    Float_t time = track->GetTOFsignal() - fTOFResponse.GetStartTime(p);
    
    Double_t ptpc[3];
    track->GetInnerPxPyPz(ptpc);
    Float_t momtpc=TMath::Sqrt(ptpc[0]*ptpc[0] + ptpc[1]*ptpc[1] + ptpc[2]*ptpc[2]);
    
    for(Int_t i=0;i < AliPID::kSPECIES;i++){
	AliPID::EParticleType type=AliPID::EParticleType(i);
	
	Float_t resolutionTOF = fTOFResponse.GetExpectedSigma(p, exptimes[i], AliPID::ParticleMass(i));
	if(TMath::Abs(exptimes[i] - time) < fRange * resolutionTOF){
	    Float_t dedxExp = fTPCResponse.GetExpectedSignal(momtpc,type);
	    Float_t resolutionTPC = fTPCResponse.GetExpectedSigma(momtpc,track->GetTPCsignalN(),type);
	    
	    if(TMath::Abs(dedx - dedxExp) < fRangeTOFMismatch * resolutionTPC){
		status = kTRUE;
	    }
	}
    }
    
    // for nuclei
    Float_t resolutionTOFpr = fTOFResponse.GetExpectedSigma(p, exptimes[4], AliPID::ParticleMass(4));
    if(!status && (exptimes[4] + fRange*resolutionTOFpr < time)) status = kTRUE;
    
    
    return status;
}

//_________________________________________________________________________
Float_t AliESDpid::GetSignalDeltaTOFold(const AliVParticle *track, AliPID::EParticleType type, Bool_t ratio/*=kFALSE*/) const
{
  //
  // TOF signal - expected
  //
  AliVTrack *vtrack=(AliVTrack*)track;
  
  const Double_t expTime = fTOFResponse.GetExpectedSignal(vtrack,type);
  Double_t tofTime = 99999;
  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
  else tofTime=vtrack->GetTOFsignal();
  tofTime = tofTime  - fTOFResponse.GetStartTime(vtrack->P());
  Double_t delta=-9999.;

  if (!ratio) delta=tofTime-expTime;
  else if (expTime>1.e-20) delta=tofTime/expTime;
  
  return delta;
}

//_________________________________________________________________________
Float_t AliESDpid::GetNumberOfSigmasTOFold(const AliVParticle *track, AliPID::EParticleType type) const
{
  //
  // Number of sigma implementation for the TOF
  //

  AliVTrack *vtrack=(AliVTrack*)track;
  Double_t tofTime = 99999;
  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
  else tofTime=vtrack->GetTOFsignal();
  
  Double_t expTime = fTOFResponse.GetExpectedSignal(vtrack,type);
  return (tofTime - fTOFResponse.GetStartTime(vtrack->P()) - expTime)/fTOFResponse.GetExpectedSigma(vtrack->P(),expTime,AliPID::ParticleMassZ(type));
}

//_________________________________________________________________________
void AliESDpid::SetPIDForTracking(AliESDtrack *esdtr) const
{
  // assign mass for tracking
  //

  // in principle AliPIDCombined could be used to also set priors
  //AliPIDCombined pidProb;
  //pidProb.SetDetectorMask(kDetTPC);              // use only TPC information, couls also be changed
  //pidProb.SetSelectedSpecies(AliPID::kSPECIESC); // number of species to use
  //pidProb.SetDefaultTPCPriors();                 // load default priors

  Double_t prob[AliPID::kSPECIESC]={0.};
  EDetPidStatus pidStatus=ComputePIDProbability(kTPC, esdtr, AliPID::kSPECIESC, prob);
  // check if a valid signal was found, otherwise return pion mass
  if (pidStatus==kDetNoSignal) { //kDetPidOk) {
    esdtr->SetPIDForTracking(AliPID::kPion);
    return;
  }

  // or with AliPIDCombined
  // pidProb.ComputeProbabilities(esdtr, this, p);

  // find max probability
  Float_t max=0.,min=1.e9;
  Int_t pid=-1;
  for (Int_t i=0; i<AliPID::kSPECIESC; ++i) {
    if (prob[i]>max) {pid=i; max=prob[i];}
    if (prob[i]<min) min=prob[i];
  }

  //int pid = AliPID::kPion; // this should be substituted by real most probable TPC pid (e,mu -> pion) or poin if no PID possible

  //
  if (pid>AliPID::kSPECIESC-1 || (min>=max)) pid = AliPID::kPion;
  //
  esdtr->SetPIDForTracking( pid );
  //
}


//_________________________________________________________________________
void AliESDpid::MakePIDForTracking(AliESDEvent *event) const
{
  // assign masses using for tracking
  Int_t nTrk=event->GetNumberOfTracks();
  for (Int_t iTrk=nTrk; iTrk--;) {  
    AliESDtrack *track = event->GetTrack(iTrk);
    SetPIDForTracking(track);
  }

}
 AliESDpid.cxx:1
 AliESDpid.cxx:2
 AliESDpid.cxx:3
 AliESDpid.cxx:4
 AliESDpid.cxx:5
 AliESDpid.cxx:6
 AliESDpid.cxx:7
 AliESDpid.cxx:8
 AliESDpid.cxx:9
 AliESDpid.cxx:10
 AliESDpid.cxx:11
 AliESDpid.cxx:12
 AliESDpid.cxx:13
 AliESDpid.cxx:14
 AliESDpid.cxx:15
 AliESDpid.cxx:16
 AliESDpid.cxx:17
 AliESDpid.cxx:18
 AliESDpid.cxx:19
 AliESDpid.cxx:20
 AliESDpid.cxx:21
 AliESDpid.cxx:22
 AliESDpid.cxx:23
 AliESDpid.cxx:24
 AliESDpid.cxx:25
 AliESDpid.cxx:26
 AliESDpid.cxx:27
 AliESDpid.cxx:28
 AliESDpid.cxx:29
 AliESDpid.cxx:30
 AliESDpid.cxx:31
 AliESDpid.cxx:32
 AliESDpid.cxx:33
 AliESDpid.cxx:34
 AliESDpid.cxx:35
 AliESDpid.cxx:36
 AliESDpid.cxx:37
 AliESDpid.cxx:38
 AliESDpid.cxx:39
 AliESDpid.cxx:40
 AliESDpid.cxx:41
 AliESDpid.cxx:42
 AliESDpid.cxx:43
 AliESDpid.cxx:44
 AliESDpid.cxx:45
 AliESDpid.cxx:46
 AliESDpid.cxx:47
 AliESDpid.cxx:48
 AliESDpid.cxx:49
 AliESDpid.cxx:50
 AliESDpid.cxx:51
 AliESDpid.cxx:52
 AliESDpid.cxx:53
 AliESDpid.cxx:54
 AliESDpid.cxx:55
 AliESDpid.cxx:56
 AliESDpid.cxx:57
 AliESDpid.cxx:58
 AliESDpid.cxx:59
 AliESDpid.cxx:60
 AliESDpid.cxx:61
 AliESDpid.cxx:62
 AliESDpid.cxx:63
 AliESDpid.cxx:64
 AliESDpid.cxx:65
 AliESDpid.cxx:66
 AliESDpid.cxx:67
 AliESDpid.cxx:68
 AliESDpid.cxx:69
 AliESDpid.cxx:70
 AliESDpid.cxx:71
 AliESDpid.cxx:72
 AliESDpid.cxx:73
 AliESDpid.cxx:74
 AliESDpid.cxx:75
 AliESDpid.cxx:76
 AliESDpid.cxx:77
 AliESDpid.cxx:78
 AliESDpid.cxx:79
 AliESDpid.cxx:80
 AliESDpid.cxx:81
 AliESDpid.cxx:82
 AliESDpid.cxx:83
 AliESDpid.cxx:84
 AliESDpid.cxx:85
 AliESDpid.cxx:86
 AliESDpid.cxx:87
 AliESDpid.cxx:88
 AliESDpid.cxx:89
 AliESDpid.cxx:90
 AliESDpid.cxx:91
 AliESDpid.cxx:92
 AliESDpid.cxx:93
 AliESDpid.cxx:94
 AliESDpid.cxx:95
 AliESDpid.cxx:96
 AliESDpid.cxx:97
 AliESDpid.cxx:98
 AliESDpid.cxx:99
 AliESDpid.cxx:100
 AliESDpid.cxx:101
 AliESDpid.cxx:102
 AliESDpid.cxx:103
 AliESDpid.cxx:104
 AliESDpid.cxx:105
 AliESDpid.cxx:106
 AliESDpid.cxx:107
 AliESDpid.cxx:108
 AliESDpid.cxx:109
 AliESDpid.cxx:110
 AliESDpid.cxx:111
 AliESDpid.cxx:112
 AliESDpid.cxx:113
 AliESDpid.cxx:114
 AliESDpid.cxx:115
 AliESDpid.cxx:116
 AliESDpid.cxx:117
 AliESDpid.cxx:118
 AliESDpid.cxx:119
 AliESDpid.cxx:120
 AliESDpid.cxx:121
 AliESDpid.cxx:122
 AliESDpid.cxx:123
 AliESDpid.cxx:124
 AliESDpid.cxx:125
 AliESDpid.cxx:126
 AliESDpid.cxx:127
 AliESDpid.cxx:128
 AliESDpid.cxx:129
 AliESDpid.cxx:130
 AliESDpid.cxx:131
 AliESDpid.cxx:132
 AliESDpid.cxx:133
 AliESDpid.cxx:134
 AliESDpid.cxx:135
 AliESDpid.cxx:136
 AliESDpid.cxx:137
 AliESDpid.cxx:138
 AliESDpid.cxx:139
 AliESDpid.cxx:140
 AliESDpid.cxx:141
 AliESDpid.cxx:142
 AliESDpid.cxx:143
 AliESDpid.cxx:144
 AliESDpid.cxx:145
 AliESDpid.cxx:146
 AliESDpid.cxx:147
 AliESDpid.cxx:148
 AliESDpid.cxx:149
 AliESDpid.cxx:150
 AliESDpid.cxx:151
 AliESDpid.cxx:152
 AliESDpid.cxx:153
 AliESDpid.cxx:154
 AliESDpid.cxx:155
 AliESDpid.cxx:156
 AliESDpid.cxx:157
 AliESDpid.cxx:158
 AliESDpid.cxx:159
 AliESDpid.cxx:160
 AliESDpid.cxx:161
 AliESDpid.cxx:162
 AliESDpid.cxx:163
 AliESDpid.cxx:164
 AliESDpid.cxx:165
 AliESDpid.cxx:166
 AliESDpid.cxx:167
 AliESDpid.cxx:168
 AliESDpid.cxx:169
 AliESDpid.cxx:170
 AliESDpid.cxx:171
 AliESDpid.cxx:172
 AliESDpid.cxx:173
 AliESDpid.cxx:174
 AliESDpid.cxx:175
 AliESDpid.cxx:176
 AliESDpid.cxx:177
 AliESDpid.cxx:178
 AliESDpid.cxx:179
 AliESDpid.cxx:180
 AliESDpid.cxx:181
 AliESDpid.cxx:182
 AliESDpid.cxx:183
 AliESDpid.cxx:184
 AliESDpid.cxx:185
 AliESDpid.cxx:186
 AliESDpid.cxx:187
 AliESDpid.cxx:188
 AliESDpid.cxx:189
 AliESDpid.cxx:190
 AliESDpid.cxx:191
 AliESDpid.cxx:192
 AliESDpid.cxx:193
 AliESDpid.cxx:194
 AliESDpid.cxx:195
 AliESDpid.cxx:196
 AliESDpid.cxx:197
 AliESDpid.cxx:198
 AliESDpid.cxx:199
 AliESDpid.cxx:200
 AliESDpid.cxx:201
 AliESDpid.cxx:202
 AliESDpid.cxx:203
 AliESDpid.cxx:204
 AliESDpid.cxx:205
 AliESDpid.cxx:206
 AliESDpid.cxx:207
 AliESDpid.cxx:208
 AliESDpid.cxx:209
 AliESDpid.cxx:210
 AliESDpid.cxx:211
 AliESDpid.cxx:212
 AliESDpid.cxx:213
 AliESDpid.cxx:214
 AliESDpid.cxx:215
 AliESDpid.cxx:216
 AliESDpid.cxx:217
 AliESDpid.cxx:218
 AliESDpid.cxx:219
 AliESDpid.cxx:220
 AliESDpid.cxx:221
 AliESDpid.cxx:222
 AliESDpid.cxx:223
 AliESDpid.cxx:224
 AliESDpid.cxx:225
 AliESDpid.cxx:226
 AliESDpid.cxx:227
 AliESDpid.cxx:228
 AliESDpid.cxx:229
 AliESDpid.cxx:230
 AliESDpid.cxx:231
 AliESDpid.cxx:232
 AliESDpid.cxx:233
 AliESDpid.cxx:234
 AliESDpid.cxx:235
 AliESDpid.cxx:236
 AliESDpid.cxx:237
 AliESDpid.cxx:238
 AliESDpid.cxx:239
 AliESDpid.cxx:240
 AliESDpid.cxx:241
 AliESDpid.cxx:242
 AliESDpid.cxx:243
 AliESDpid.cxx:244
 AliESDpid.cxx:245
 AliESDpid.cxx:246
 AliESDpid.cxx:247
 AliESDpid.cxx:248
 AliESDpid.cxx:249
 AliESDpid.cxx:250
 AliESDpid.cxx:251
 AliESDpid.cxx:252
 AliESDpid.cxx:253
 AliESDpid.cxx:254
 AliESDpid.cxx:255
 AliESDpid.cxx:256
 AliESDpid.cxx:257
 AliESDpid.cxx:258
 AliESDpid.cxx:259
 AliESDpid.cxx:260
 AliESDpid.cxx:261
 AliESDpid.cxx:262
 AliESDpid.cxx:263
 AliESDpid.cxx:264
 AliESDpid.cxx:265
 AliESDpid.cxx:266
 AliESDpid.cxx:267
 AliESDpid.cxx:268
 AliESDpid.cxx:269
 AliESDpid.cxx:270
 AliESDpid.cxx:271
 AliESDpid.cxx:272
 AliESDpid.cxx:273
 AliESDpid.cxx:274
 AliESDpid.cxx:275
 AliESDpid.cxx:276
 AliESDpid.cxx:277
 AliESDpid.cxx:278
 AliESDpid.cxx:279
 AliESDpid.cxx:280
 AliESDpid.cxx:281
 AliESDpid.cxx:282
 AliESDpid.cxx:283
 AliESDpid.cxx:284
 AliESDpid.cxx:285
 AliESDpid.cxx:286
 AliESDpid.cxx:287
 AliESDpid.cxx:288
 AliESDpid.cxx:289
 AliESDpid.cxx:290
 AliESDpid.cxx:291
 AliESDpid.cxx:292
 AliESDpid.cxx:293
 AliESDpid.cxx:294
 AliESDpid.cxx:295
 AliESDpid.cxx:296
 AliESDpid.cxx:297
 AliESDpid.cxx:298
 AliESDpid.cxx:299
 AliESDpid.cxx:300
 AliESDpid.cxx:301
 AliESDpid.cxx:302
 AliESDpid.cxx:303
 AliESDpid.cxx:304
 AliESDpid.cxx:305
 AliESDpid.cxx:306
 AliESDpid.cxx:307
 AliESDpid.cxx:308
 AliESDpid.cxx:309
 AliESDpid.cxx:310
 AliESDpid.cxx:311
 AliESDpid.cxx:312
 AliESDpid.cxx:313
 AliESDpid.cxx:314
 AliESDpid.cxx:315
 AliESDpid.cxx:316
 AliESDpid.cxx:317
 AliESDpid.cxx:318
 AliESDpid.cxx:319
 AliESDpid.cxx:320
 AliESDpid.cxx:321
 AliESDpid.cxx:322
 AliESDpid.cxx:323
 AliESDpid.cxx:324
 AliESDpid.cxx:325
 AliESDpid.cxx:326
 AliESDpid.cxx:327
 AliESDpid.cxx:328
 AliESDpid.cxx:329
 AliESDpid.cxx:330
 AliESDpid.cxx:331
 AliESDpid.cxx:332
 AliESDpid.cxx:333
 AliESDpid.cxx:334
 AliESDpid.cxx:335
 AliESDpid.cxx:336
 AliESDpid.cxx:337
 AliESDpid.cxx:338
 AliESDpid.cxx:339
 AliESDpid.cxx:340
 AliESDpid.cxx:341
 AliESDpid.cxx:342
 AliESDpid.cxx:343
 AliESDpid.cxx:344
 AliESDpid.cxx:345
 AliESDpid.cxx:346
 AliESDpid.cxx:347
 AliESDpid.cxx:348
 AliESDpid.cxx:349
 AliESDpid.cxx:350
 AliESDpid.cxx:351
 AliESDpid.cxx:352
 AliESDpid.cxx:353
 AliESDpid.cxx:354
 AliESDpid.cxx:355
 AliESDpid.cxx:356
 AliESDpid.cxx:357
 AliESDpid.cxx:358
 AliESDpid.cxx:359
 AliESDpid.cxx:360
 AliESDpid.cxx:361
 AliESDpid.cxx:362
 AliESDpid.cxx:363
 AliESDpid.cxx:364
 AliESDpid.cxx:365
 AliESDpid.cxx:366
 AliESDpid.cxx:367
 AliESDpid.cxx:368
 AliESDpid.cxx:369
 AliESDpid.cxx:370
 AliESDpid.cxx:371
 AliESDpid.cxx:372
 AliESDpid.cxx:373
 AliESDpid.cxx:374
 AliESDpid.cxx:375
 AliESDpid.cxx:376
 AliESDpid.cxx:377
 AliESDpid.cxx:378
 AliESDpid.cxx:379
 AliESDpid.cxx:380
 AliESDpid.cxx:381
 AliESDpid.cxx:382
 AliESDpid.cxx:383
 AliESDpid.cxx:384
 AliESDpid.cxx:385
 AliESDpid.cxx:386
 AliESDpid.cxx:387
 AliESDpid.cxx:388
 AliESDpid.cxx:389
 AliESDpid.cxx:390
 AliESDpid.cxx:391
 AliESDpid.cxx:392
 AliESDpid.cxx:393
 AliESDpid.cxx:394
 AliESDpid.cxx:395
 AliESDpid.cxx:396
 AliESDpid.cxx:397
 AliESDpid.cxx:398
 AliESDpid.cxx:399
 AliESDpid.cxx:400
 AliESDpid.cxx:401
 AliESDpid.cxx:402
 AliESDpid.cxx:403
 AliESDpid.cxx:404
 AliESDpid.cxx:405
 AliESDpid.cxx:406
 AliESDpid.cxx:407
 AliESDpid.cxx:408
 AliESDpid.cxx:409
 AliESDpid.cxx:410
 AliESDpid.cxx:411
 AliESDpid.cxx:412
 AliESDpid.cxx:413
 AliESDpid.cxx:414
 AliESDpid.cxx:415
 AliESDpid.cxx:416
 AliESDpid.cxx:417
 AliESDpid.cxx:418
 AliESDpid.cxx:419
 AliESDpid.cxx:420
 AliESDpid.cxx:421
 AliESDpid.cxx:422
 AliESDpid.cxx:423
 AliESDpid.cxx:424
 AliESDpid.cxx:425
 AliESDpid.cxx:426
 AliESDpid.cxx:427
 AliESDpid.cxx:428
 AliESDpid.cxx:429
 AliESDpid.cxx:430
 AliESDpid.cxx:431
 AliESDpid.cxx:432
 AliESDpid.cxx:433
 AliESDpid.cxx:434
 AliESDpid.cxx:435
 AliESDpid.cxx:436
 AliESDpid.cxx:437
 AliESDpid.cxx:438
 AliESDpid.cxx:439
 AliESDpid.cxx:440
 AliESDpid.cxx:441
 AliESDpid.cxx:442
 AliESDpid.cxx:443
 AliESDpid.cxx:444
 AliESDpid.cxx:445
 AliESDpid.cxx:446
 AliESDpid.cxx:447
 AliESDpid.cxx:448
 AliESDpid.cxx:449
 AliESDpid.cxx:450
 AliESDpid.cxx:451
 AliESDpid.cxx:452
 AliESDpid.cxx:453
 AliESDpid.cxx:454
 AliESDpid.cxx:455
 AliESDpid.cxx:456
 AliESDpid.cxx:457
 AliESDpid.cxx:458
 AliESDpid.cxx:459
 AliESDpid.cxx:460
 AliESDpid.cxx:461
 AliESDpid.cxx:462
 AliESDpid.cxx:463
 AliESDpid.cxx:464
 AliESDpid.cxx:465
 AliESDpid.cxx:466
 AliESDpid.cxx:467
 AliESDpid.cxx:468
 AliESDpid.cxx:469
 AliESDpid.cxx:470
 AliESDpid.cxx:471
 AliESDpid.cxx:472
 AliESDpid.cxx:473
 AliESDpid.cxx:474
 AliESDpid.cxx:475
 AliESDpid.cxx:476
 AliESDpid.cxx:477
 AliESDpid.cxx:478
 AliESDpid.cxx:479
 AliESDpid.cxx:480
 AliESDpid.cxx:481
 AliESDpid.cxx:482
 AliESDpid.cxx:483
 AliESDpid.cxx:484
 AliESDpid.cxx:485
 AliESDpid.cxx:486
 AliESDpid.cxx:487
 AliESDpid.cxx:488
 AliESDpid.cxx:489
 AliESDpid.cxx:490
 AliESDpid.cxx:491
 AliESDpid.cxx:492
 AliESDpid.cxx:493
 AliESDpid.cxx:494
 AliESDpid.cxx:495
 AliESDpid.cxx:496
 AliESDpid.cxx:497
 AliESDpid.cxx:498
 AliESDpid.cxx:499
 AliESDpid.cxx:500
 AliESDpid.cxx:501
 AliESDpid.cxx:502
 AliESDpid.cxx:503
 AliESDpid.cxx:504
 AliESDpid.cxx:505
 AliESDpid.cxx:506
 AliESDpid.cxx:507
 AliESDpid.cxx:508
 AliESDpid.cxx:509
 AliESDpid.cxx:510
 AliESDpid.cxx:511
 AliESDpid.cxx:512
 AliESDpid.cxx:513
 AliESDpid.cxx:514
 AliESDpid.cxx:515
 AliESDpid.cxx:516
 AliESDpid.cxx:517
 AliESDpid.cxx:518
 AliESDpid.cxx:519
 AliESDpid.cxx:520
 AliESDpid.cxx:521
 AliESDpid.cxx:522