ROOT logo

/**************************************************************************
 * Copyright(c) 1998-2009, 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.                  *
 **************************************************************************/

//-----------------------------------------------------------------
//         AliHelperPID class
//-----------------------------------------------------------------

#include "AliHelperPID.h"
#include "AliVEvent.h"      
#include "AliAODEvent.h"      
#include "AliMCEvent.h"      
#include "AliMCEventHandler.h"      
#include "TH1F.h"             
#include "TH2F.h"             
#include "TList.h"            
#include "AliStack.h"            
#include "AliVTrack.h"      
#include "TParticle.h"
#include "AliAODMCParticle.h" 
#include "AliPIDResponse.h"   
#include "AliPIDCombined.h"   
#include "AliAnalysisManager.h"
#include "AliInputEventHandler.h"

using namespace AliHelperPIDNameSpace;
using namespace std;

const char * kPIDTypeName[]={"TPC","TOF","TPC-TOF"} ;
const char * kDetectorName[]={"ITS","TPC","TOF"} ;
const char * kParticleSpeciesName[]={"Pions","Kaons","Protons","Undefined"} ;

ClassImp(AliHelperPID)

AliHelperPID::AliHelperPID() : TNamed("HelperPID", "PID object"),fisMC(0), fPIDType(kNSigmaTPCTOF), fNSigmaPID(3), fBayesCut(0.8), fPIDResponse(0x0), fPIDCombined(0x0),fOutputList(0x0),fRequestTOFPID(1),fRemoveTracksT0Fill(0),fUseExclusiveNSigma(0),fPtTOFPID(.6),fHasTOFPID(0){
  
  for(Int_t ipart=0;ipart<kNSpecies;ipart++)
    for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++)
      fnsigmas[ipart][ipid]=999.;
  
  for(Int_t ipart=0;ipart<kNSpecies;ipart++)fHasDoubleCounting[ipart]=kFALSE;
  
  fOutputList = new TList;
  fOutputList->SetOwner();
  fOutputList->SetName("OutputList");
  
  //nsigma plot
  for(Int_t ipart=0;ipart<kNSpecies;ipart++){
    for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
      Double_t miny=-30;
      Double_t maxy=30;
      if(ipid==kNSigmaTPCTOF){miny=0;maxy=50;}
      TH2F *fHistoNSigma=new TH2F(Form("NSigma_%d_%d",ipart,ipid),Form("n#sigma %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]),200,0,10,500,miny,maxy);
      fHistoNSigma->GetXaxis()->SetTitle("P_{T} (GeV / c)");
      fHistoNSigma->GetYaxis()->SetTitle(Form("n#sigma %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]));
      fOutputList->Add(fHistoNSigma);
    }
  }
  
  //nsigmaRec plot
  for(Int_t ipart=0;ipart<kNSpecies;ipart++){
    for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
      Double_t miny=-10;
      Double_t maxy=10;
      if(ipid==kNSigmaTPCTOF){miny=0;maxy=20;}
      TH2F *fHistoNSigma=new TH2F(Form("NSigmaRec_%d_%d",ipart,ipid),
				  Form("n#sigma for reconstructed %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]),200,0,10,500,miny,maxy);
      fHistoNSigma->GetXaxis()->SetTitle("P_{T} (GeV / c)");
      fHistoNSigma->GetYaxis()->SetTitle(Form("n#sigma %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]));
      fOutputList->Add(fHistoNSigma);
    }
  }
  
  //BayesRec plot
  for(Int_t ipart=0;ipart<kNSpecies;ipart++){
    Double_t miny=0.;
    Double_t maxy=1;
    TH2F *fHistoBayes=new TH2F(Form("BayesRec_%d",ipart),
			       Form("probability for reconstructed %s",kParticleSpeciesName[ipart]),200,0,10,500,miny,maxy);
    fHistoBayes->GetXaxis()->SetTitle("P_{T} (GeV / c)");
    fHistoBayes->GetYaxis()->SetTitle(Form("Bayes prob %s",kParticleSpeciesName[ipart]));
    fOutputList->Add(fHistoBayes);
  }
  
  //nsigmaDC plot
  for(Int_t ipart=0;ipart<kNSpecies;ipart++){
    for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
      Double_t miny=-10;
      Double_t maxy=10;
      if(ipid==kNSigmaTPCTOF){miny=0;maxy=20;}
      TH2F *fHistoNSigma=new TH2F(Form("NSigmaDC_%d_%d",ipart,ipid),
				  Form("n#sigma for double counting %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]),200,0,10,500,miny,maxy);
      fHistoNSigma->GetXaxis()->SetTitle("P_{T} (GeV / c)");
      fHistoNSigma->GetYaxis()->SetTitle(Form("n#sigma %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]));
      fOutputList->Add(fHistoNSigma);
    }
  }
  
  //nsigmaMC plot
  for(Int_t ipart=0;ipart<kNSpecies;ipart++){
    for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
      Double_t miny=-30;
      Double_t maxy=30;
      if(ipid==kNSigmaTPCTOF){miny=0;maxy=50;}
      TH2F *fHistoNSigma=new TH2F(Form("NSigmaMC_%d_%d",ipart,ipid),
				  Form("n#sigma for MC %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]),200,0,10,500,miny,maxy);
      fHistoNSigma->GetXaxis()->SetTitle("P_{T} (GeV / c)");
      fHistoNSigma->GetYaxis()->SetTitle(Form("n#sigma %s %s",kParticleSpeciesName[ipart],kPIDTypeName[ipid]));
      fOutputList->Add(fHistoNSigma);
    }
  }
  
  //PID signal plot
  for(Int_t idet=0;idet<kNDetectors;idet++){
    for(Int_t ipart=0;ipart<kNSpecies;ipart++){
      Double_t maxy=500;
      if(idet==kTOF)maxy=1.1;
      TH2F *fHistoPID=new TH2F(Form("PID_%d_%d",idet,ipart),Form("%s signal - %s",kDetectorName[idet],kParticleSpeciesName[ipart]),200,0,10,500,-maxy,maxy);
      fHistoPID->GetXaxis()->SetTitle("P (GeV / c)");
      fHistoPID->GetYaxis()->SetTitle(Form("%s signal",kDetectorName[idet]));
      fOutputList->Add(fHistoPID);
    }
  }
  //PID signal plot, before PID cut
  for(Int_t idet=0;idet<kNDetectors;idet++){
    Double_t maxy=500;
    if(idet==kTOF)maxy=1.1;
    TH2F *fHistoPID=new TH2F(Form("PIDAll_%d",idet),Form("%s signal",kDetectorName[idet]),200,0,10,500,-maxy,maxy);
    fHistoPID->GetXaxis()->SetTitle("P (GeV / c)");
    fHistoPID->GetYaxis()->SetTitle(Form("%s signal",kDetectorName[idet]));
    fOutputList->Add(fHistoPID);
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////////

TH2F* AliHelperPID::GetHistogram2D(const char * name){
  // returns histo named name
  return (TH2F*) fOutputList->FindObject(name);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Int_t AliHelperPID::GetParticleSpecies(AliVTrack * trk, Bool_t FIllQAHistos){ 
  //return the specie according to the minimum nsigma value
  //no double counting, this has to be evaluated using CheckDoubleCounting()
  
  Int_t ID=kSpUndefined;
  
  //get the PID response
  if(!fPIDResponse) {
    AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
    AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
  }
  if(!fPIDResponse) {
    AliFatal("Cannot get pid response");
  }
  
  //calculate nsigmas (used also by the bayesian)
  CalculateNSigmas(trk,FIllQAHistos);//fill the data member fnsigmas with the nsigmas value [ipart][iPID]
  
  //Do PID
  if(fPIDType==kBayes){//use bayesianPID
    
    if(!fPIDCombined) {
      // ------- setup PIDCombined
      fPIDCombined=new AliPIDCombined;
      fPIDCombined->SetDefaultTPCPriors();
      fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);  
    }
    if(!fPIDCombined) {
      AliFatal("PIDCombined object not found");
    }
    
    ID = GetIDBayes(trk,FIllQAHistos);
    
  }else{ //use nsigma PID
    
    ID=FindMinNSigma(trk,FIllQAHistos);
    
    if(fUseExclusiveNSigma){ //if one particle has double counting and exclusive nsigma is requested ID = kSpUndefined
      Bool_t *HasDC;
      HasDC=GetDoubleCounting(trk,FIllQAHistos);
      for(Int_t ipart=0;ipart<kNSpecies;ipart++){
	if(HasDC[ipart]==kTRUE)  ID = kSpUndefined;
      }
    }
  }

  if(FIllQAHistos){
    //Fill PID signal plot
    if(ID != kSpUndefined){
      for(Int_t idet=0;idet<kNDetectors;idet++){
	TH2F *h=GetHistogram2D(Form("PID_%d_%d",idet,ID));
	if(idet==kITS)h->Fill(trk->P(),trk->GetITSsignal()*trk->Charge());
	if(idet==kTPC)h->Fill(trk->P(),trk->GetTPCsignal()*trk->Charge());
	if(idet==kTOF && fHasTOFPID)h->Fill(trk->P(),TOFBetaCalc(trk)*trk->Charge());
      }
    }
    //Fill PID signal plot without cuts
    for(Int_t idet=0;idet<kNDetectors;idet++){
      TH2F *h=GetHistogram2D(Form("PIDAll_%d",idet));
      if(idet==kITS)h->Fill(trk->P(),trk->GetITSsignal()*trk->Charge());
      if(idet==kTPC)h->Fill(trk->P(),trk->GetTPCsignal()*trk->Charge());
      if(idet==kTOF && fHasTOFPID)h->Fill(trk->P(),TOFBetaCalc(trk)*trk->Charge());
    }
  }
  return ID;
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Int_t AliHelperPID::GetParticleSpecies(AliVParticle * part) {
  // return PID according to MC truth
  switch(TMath::Abs(part->PdgCode())){
  case 2212:
    return kSpProton;
    break;
  case 321:
    return kSpKaon;
    break;
  case 211:
    return kSpPion;
    break;
  default:
    return kSpUndefined;
  } 
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Int_t AliHelperPID::GetIDBayes(AliVTrack * trk, Bool_t FIllQAHistos){ 
  
  Bool_t *IDs=GetAllCompatibleIdentitiesNSigma(trk,FIllQAHistos);
  
  Double_t probBayes[AliPID::kSPECIES];
  
  UInt_t detUsed= 0;
  CheckTOF(trk);
  if(fHasTOFPID && trk->Pt()>fPtTOFPID){//use TOF information
    detUsed = CalcPIDCombined(trk, fPIDResponse, AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC, probBayes);
    if(detUsed != (AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC))return kSpUndefined;//check that TPC and TOF are used
  }else{
    detUsed = CalcPIDCombined(trk, fPIDResponse,AliPIDResponse::kDetTPC, probBayes);
    if(detUsed != AliPIDResponse::kDetTPC)return kSpUndefined;//check that TPC is used
  }
  
  //the probability has to be normalized to one, we check it
  Double_t sump=0.;
  for(Int_t ipart=0;ipart<AliPID::kSPECIES;ipart++)sump+=probBayes[ipart];
  if(sump<.99 && sump>1.01){//FIXME precision problem in the sum, workaround
    AliFatal("Bayesian probability not normalized to one");
  }
  
  //probabilities are normalized to one, if the cut is above .5 there is no problem
  if(probBayes[AliPID::kPion]>fBayesCut && IDs[kSpPion]==1){
    TH2F *h=GetHistogram2D(Form("BayesRec_%d",kSpPion));
    h->Fill(trk->Pt(),probBayes[AliPID::kPion]);
    return kSpPion;
  }
  else if(probBayes[AliPID::kKaon]>fBayesCut && IDs[kSpKaon]==1){
    TH2F *h=GetHistogram2D(Form("BayesRec_%d",kSpKaon));
    h->Fill(trk->Pt(),probBayes[AliPID::kKaon]);
    return kSpKaon;
  }
  else if(probBayes[AliPID::kProton]>fBayesCut && IDs[kSpProton]==1){
    TH2F *h=GetHistogram2D(Form("BayesRec_%d",kSpProton));
    h->Fill(trk->Pt(),probBayes[AliPID::kProton]);
    return kSpProton;
  }
  else{
    return kSpUndefined;
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////////

UInt_t AliHelperPID::CalcPIDCombined(const AliVTrack *track,const AliPIDResponse *PIDResponse, Int_t detMask, Double_t* prob) const{
  //
  // Bayesian PID calculation
  //
  for(Int_t i=0;i<AliPID::kSPECIES;i++)
    {
      prob[i]=0.;
    }
  fPIDCombined->SetDetectorMask(detMask);
  
  return fPIDCombined->ComputeProbabilities((AliVTrack*)track, PIDResponse, prob);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

void AliHelperPID::CalculateNSigmas(AliVTrack * trk, Bool_t FIllQAHistos){ 
  //defines data member fnsigmas
  
  // Compute nsigma for each hypthesis
  AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(trk);
  // --- TPC
  Double_t nsigmaTPCkProton = fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton);
  Double_t nsigmaTPCkKaon   = fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon); 
  Double_t nsigmaTPCkPion   = fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion); 
  // --- TOF
  Double_t nsigmaTOFkProton=999.,nsigmaTOFkKaon=999.,nsigmaTOFkPion=999.;
  Double_t nsigmaTPCTOFkProton=999.,nsigmaTPCTOFkKaon=999.,nsigmaTPCTOFkPion=999.;

  CheckTOF(trk);
  
  if(fHasTOFPID && trk->Pt()>fPtTOFPID){//use TOF information
    nsigmaTOFkProton = fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton);
    nsigmaTOFkKaon   = fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon); 
    nsigmaTOFkPion   = fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion); 
    Double_t d2Proton=nsigmaTPCkProton * nsigmaTPCkProton + nsigmaTOFkProton * nsigmaTOFkProton;
    Double_t d2Kaon=nsigmaTPCkKaon * nsigmaTPCkKaon + nsigmaTOFkKaon * nsigmaTOFkKaon;
    Double_t d2Pion=nsigmaTPCkPion * nsigmaTPCkPion + nsigmaTOFkPion * nsigmaTOFkPion;
    //commented, this is done in analogy with AliESDTrackCuts, nsigma combind according to the probability
    // --- combined
    // -----------------------------------
    // 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)
    //
    // work around precision problem
    // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
    //if(TMath::Exp(- d2Proton / 2) > 1e-15)nsigmaTPCTOFkProton  =  TMath::Sqrt(2)*TMath::ErfInverse(1 - TMath::Exp(- d2Proton / 2));
    //if(TMath::Exp(- d2Kaon / 2) > 1e-15)nsigmaTPCTOFkKaon    = TMath::Sqrt(2)*TMath::ErfInverse(1 - TMath::Exp(- d2Kaon / 2));
    //if(TMath::Exp(- d2Pion / 2) > 1e-15)nsigmaTPCTOFkPion     = TMath::Sqrt(2)*TMath::ErfInverse(1 - TMath::Exp(- d2Pion / 2));
    
    //used for the 2PC PID paper (circular cut)
    nsigmaTPCTOFkProton  =  TMath::Sqrt(d2Proton);
    nsigmaTPCTOFkKaon    =  TMath::Sqrt(d2Kaon);
    nsigmaTPCTOFkPion    =  TMath::Sqrt(d2Pion);
  }else{
    // --- combined
    // if TOF is missing and below fPtTOFPID only the TPC information is used
    nsigmaTPCTOFkProton = TMath::Abs(nsigmaTPCkProton);
    nsigmaTPCTOFkKaon   = TMath::Abs(nsigmaTPCkKaon);
    nsigmaTPCTOFkPion   = TMath::Abs(nsigmaTPCkPion);
  }
  
  //set data member fnsigmas
  fnsigmas[kSpPion][kNSigmaTPC]=nsigmaTPCkPion;
  fnsigmas[kSpKaon][kNSigmaTPC]=nsigmaTPCkKaon;
  fnsigmas[kSpProton][kNSigmaTPC]=nsigmaTPCkProton;
  fnsigmas[kSpPion][kNSigmaTOF]=nsigmaTOFkPion;
  fnsigmas[kSpKaon][kNSigmaTOF]=nsigmaTOFkKaon;
  fnsigmas[kSpProton][kNSigmaTOF]=nsigmaTOFkProton;
  fnsigmas[kSpPion][kNSigmaTPCTOF]=nsigmaTPCTOFkPion;
  fnsigmas[kSpKaon][kNSigmaTPCTOF]=nsigmaTPCTOFkKaon;
  fnsigmas[kSpProton][kNSigmaTPCTOF]=nsigmaTPCTOFkProton;
  
  if(FIllQAHistos){
    //Fill NSigma SeparationPlot
    for(Int_t ipart=0;ipart<kNSpecies;ipart++){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && trk->Pt()<fPtTOFPID)continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigma_%d_%d",ipart,ipid));
	h->Fill(trk->Pt(),fnsigmas[ipart][ipid]);
      }
    }
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Int_t AliHelperPID::FindMinNSigma(AliVTrack * trk,Bool_t FillQAHistos){ 
  
  CheckTOF(trk);  
  if(fRequestTOFPID && (!fHasTOFPID) && trk->Pt()>fPtTOFPID)return kSpUndefined;
  
  //get the identity of the particle with the minimum Nsigma
  Double_t nsigmaPion=999., nsigmaKaon=999., nsigmaProton=999.;
  switch (fPIDType){
  case kNSigmaTPC:
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPC]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPC])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPC])  ;
    break;
  case kNSigmaTOF:
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTOF])  ;
    break;
  case kNSigmaTPCTOF://In case of no TOF matching the combined nsigma is the TPC one
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPCTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPCTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPCTOF])  ;
    break;
  case kBayes://the nsigma in the bayesian is used to clean with a very large n-sigma value
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPCTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPCTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPCTOF])  ;
    break;
  }
  
  // guess the particle based on the smaller nsigma (within fNSigmaPID)
  if( ( nsigmaKaon==nsigmaPion ) && ( nsigmaKaon==nsigmaProton )) return kSpUndefined;//if is the default value for the three
  
  if( ( nsigmaKaon   < nsigmaPion ) && ( nsigmaKaon < nsigmaProton ) && (nsigmaKaon   < fNSigmaPID)){
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaRec_%d_%d",kSpKaon,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpKaon][ipid]);
      }
    }
    return kSpKaon;
  }
  if( ( nsigmaPion   < nsigmaKaon ) && ( nsigmaPion < nsigmaProton ) && (nsigmaPion   < fNSigmaPID)){
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaRec_%d_%d",kSpPion,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpPion][ipid]);
      }
    }
    return kSpPion;
  }
  if( ( nsigmaProton < nsigmaKaon ) && ( nsigmaProton < nsigmaPion ) && (nsigmaProton < fNSigmaPID)){
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaRec_%d_%d",kSpProton,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpProton][ipid]);
      }
    }
    return kSpProton;
  }
  // else, return undefined
  return kSpUndefined;
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Bool_t* AliHelperPID::GetDoubleCounting(AliVTrack * trk,Bool_t FIllQAHistos){ 
  //if a particle has double counting set fHasDoubleCounting[ipart]=kTRUE
  //fill DC histos
  for(Int_t ipart=0;ipart<kNSpecies;ipart++)fHasDoubleCounting[ipart]=kFALSE;//array with kTRUE for second (or third) identity of the track
  
  Int_t MinNSigma=FindMinNSigma(trk,kFALSE);//not filling the NSigmaRec histos
  
  CheckTOF(trk);
  
  if(MinNSigma==kSpUndefined)return fHasDoubleCounting;//in case of undefined no Double counting
  
  Double_t nsigmaPion=999., nsigmaKaon=999., nsigmaProton=999.;
  switch (fPIDType) {
  case kNSigmaTPC:
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPC]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPC])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPC])  ;
    break;
  case kNSigmaTOF:
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTOF])  ;
    break;
  case kNSigmaTPCTOF://In case of no TOF matching the combined nsigma is the TPC one
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPCTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPCTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPCTOF])  ;
    break;
  case kBayes://the nsigma in the bayesian is used to clean with a very large n-sigma value
    nsigmaProton  =  TMath::Abs(fnsigmas[kSpProton][kNSigmaTPCTOF]);
    nsigmaKaon	  =  TMath::Abs(fnsigmas[kSpKaon][kNSigmaTPCTOF])  ;
    nsigmaPion    =  TMath::Abs(fnsigmas[kSpPion][kNSigmaTPCTOF])  ;
    break;
  }
  if(nsigmaPion<fNSigmaPID && MinNSigma!=kSpPion)fHasDoubleCounting[kSpPion]=kTRUE;
  if(nsigmaKaon<fNSigmaPID && MinNSigma!=kSpKaon)fHasDoubleCounting[kSpKaon]=kTRUE;
  if(nsigmaProton<fNSigmaPID && MinNSigma!=kSpProton)fHasDoubleCounting[kSpProton]=kTRUE;
  
  if(FIllQAHistos){
    //fill NSigma distr for double counting
    for(Int_t ipart=0;ipart<kNSpecies;ipart++){
      if(fHasDoubleCounting[ipart]){
	for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	  if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	  TH2F *h=GetHistogram2D(Form("NSigmaDC_%d_%d",ipart,ipid));
	  h->Fill(trk->Pt(),fnsigmas[ipart][ipid]);
	}
      }
    }
  }
  return fHasDoubleCounting;
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Bool_t* AliHelperPID::GetAllCompatibleIdentitiesNSigma(AliVTrack * trk,Bool_t FIllQAHistos){ 
  
  Bool_t *IDs=GetDoubleCounting(trk,FIllQAHistos);
  IDs[FindMinNSigma(trk,FIllQAHistos)]=kTRUE;
  return IDs;
  
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Int_t AliHelperPID::GetMCParticleSpecie(AliVEvent* event, AliVTrack * trk, Bool_t FillQAHistos){ 
  //return the specie according to the MC truth
  CheckTOF(trk);
  
  if(!fisMC)AliFatal("Error: AliHelperPID::GetMCParticleSpecie called on data\n");
  
  Int_t code=999;
  Bool_t isAOD=kFALSE;
  Bool_t isESD=kFALSE;
  TString nameoftrack(event->ClassName());  
  if(!nameoftrack.CompareTo("AliESDEvent"))isESD=kTRUE;
  else if(!nameoftrack.CompareTo("AliAODEvent"))isAOD=kTRUE;
  else AliFatal("Not processing AODs nor ESDs") ;
  
  if(isAOD){
    TClonesArray *arrayMC = 0;
    arrayMC = (TClonesArray*) event->GetList()->FindObject(AliAODMCParticle::StdBranchName());
    if (!arrayMC)AliFatal("Error: MC particles branch not found!\n");
    AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(trk->GetLabel()));
    if (!partMC){
      AliError("Cannot get MC particle");
      return kSpUndefined;
    }
    code=partMC->GetPdgCode();
  }
  if(isESD){
    AliStack* stack=0x0;
    AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
    if (!eventHandler) AliFatal("ERROR: Could not retrieve MC event handler");
    AliMCEvent* mcEvent = eventHandler->MCEvent();
    if (!mcEvent)AliFatal("ERROR: Could not retrieve MC event");
    stack = mcEvent->Stack();
    if (!stack) AliFatal("ERROR: stack not available\n");
    TParticle *part=0;
    part = (TParticle*)stack->Particle(TMath::Abs(trk->GetLabel()));
    if (!part){
      AliError("Cannot get MC particle");
      return kSpUndefined;
    }
    code = part->GetPdgCode();
  }
  switch(TMath::Abs(code)){
  case 2212:
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaMC_%d_%d",kSpProton,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpProton][ipid]);
      }
    }
    return kSpProton;
    break;
  case 321:
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaMC_%d_%d",kSpKaon,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpKaon][ipid]);
      }
    }
    return kSpKaon;
    break;
  case 211:
    if(FillQAHistos){
      for(Int_t ipid=0;ipid<=kNSigmaPIDType;ipid++){
	if((ipid!=kNSigmaTPC) && (!fHasTOFPID) && (trk->Pt()<fPtTOFPID))continue;//not filling TOF and combined if no TOF PID
	TH2F *h=GetHistogram2D(Form("NSigmaMC_%d_%d",kSpPion,ipid));
	h->Fill(trk->Pt(),fnsigmas[kSpPion][ipid]);
      }
    }
    return kSpPion;
    break;
  default:
    return kSpUndefined;
  }

}

//////////////////////////////////////////////////////////////////////////////////////////////////

void AliHelperPID::CheckTOF(AliVTrack * trk)
{
  //check if the particle has TOF Matching
  
  //get the PIDResponse
  if(fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,trk)==0)fHasTOFPID=kFALSE;
  else fHasTOFPID=kTRUE;
  
  //in addition to TOF status we look at the pt
  if(trk->Pt()<fPtTOFPID)fHasTOFPID=kFALSE;
  
  if(fRemoveTracksT0Fill)
    {
      Int_t startTimeMask = fPIDResponse->GetTOFResponse().GetStartTimeMask(trk->P());
      if (startTimeMask < 0)fHasTOFPID=kFALSE; 
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Double_t AliHelperPID::TOFBetaCalc(AliVTrack *track) const{
  //TOF beta calculation
  Double_t tofTime=track->GetTOFsignal();
  
  Double_t c=TMath::C()*1.E-9;// m/ns
  Float_t startTime = fPIDResponse->GetTOFResponse().GetStartTime(((AliVTrack*)track)->P());//in ps
  Double_t length= fPIDResponse->GetTOFResponse().GetExpectedSignal(track,AliPID::kElectron)*1E-3*c;
  tofTime -= startTime;      // subtract startTime to the signal
  Double_t tof= tofTime*1E-3; // ns, average T0 fill subtracted, no info from T0detector 	 
  tof=tof*c;
  return length/tof;
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Double_t AliHelperPID::GetMass(AliHelperParticleSpecies_t id) const{
  //return Mass according to AliHelperParticleSpecies_t. If undefined return -999.
  Double_t mass=-999.;
  if (id == kSpProton) { mass=9.38271999999999995e-01; }
  if (id == kSpKaon)   { mass=4.93676999999999977e-01; }
  if (id == kSpPion)    { mass=1.39570000000000000e-01; }
  return mass;
}

//////////////////////////////////////////////////////////////////////////////////////////////////

Long64_t AliHelperPID::Merge(TCollection* list)
{
  // Merging interface.
  // Returns the number of merged objects (including this).
  Printf("Merging");
  if (!list)
    return 0;
  if (list->IsEmpty())
    return 1;
  TIterator* iter = list->MakeIterator();
  TObject* obj;
  // collections of TList with output histos
  TList collections;
  Int_t count = 0;
  while ((obj = iter->Next())) {
    AliHelperPID* entry = dynamic_cast<AliHelperPID*> (obj);
    if (entry == 0) 
      continue;
    TList * outputlist = entry->GetOutputList();      
    collections.Add(outputlist);
    count++;
  }
  fOutputList->Merge(&collections);
  delete iter;
  Printf("OK");
  return count+1;
}
 AliHelperPID.cxx:1
 AliHelperPID.cxx:2
 AliHelperPID.cxx:3
 AliHelperPID.cxx:4
 AliHelperPID.cxx:5
 AliHelperPID.cxx:6
 AliHelperPID.cxx:7
 AliHelperPID.cxx:8
 AliHelperPID.cxx:9
 AliHelperPID.cxx:10
 AliHelperPID.cxx:11
 AliHelperPID.cxx:12
 AliHelperPID.cxx:13
 AliHelperPID.cxx:14
 AliHelperPID.cxx:15
 AliHelperPID.cxx:16
 AliHelperPID.cxx:17
 AliHelperPID.cxx:18
 AliHelperPID.cxx:19
 AliHelperPID.cxx:20
 AliHelperPID.cxx:21
 AliHelperPID.cxx:22
 AliHelperPID.cxx:23
 AliHelperPID.cxx:24
 AliHelperPID.cxx:25
 AliHelperPID.cxx:26
 AliHelperPID.cxx:27
 AliHelperPID.cxx:28
 AliHelperPID.cxx:29
 AliHelperPID.cxx:30
 AliHelperPID.cxx:31
 AliHelperPID.cxx:32
 AliHelperPID.cxx:33
 AliHelperPID.cxx:34
 AliHelperPID.cxx:35
 AliHelperPID.cxx:36
 AliHelperPID.cxx:37
 AliHelperPID.cxx:38
 AliHelperPID.cxx:39
 AliHelperPID.cxx:40
 AliHelperPID.cxx:41
 AliHelperPID.cxx:42
 AliHelperPID.cxx:43
 AliHelperPID.cxx:44
 AliHelperPID.cxx:45
 AliHelperPID.cxx:46
 AliHelperPID.cxx:47
 AliHelperPID.cxx:48
 AliHelperPID.cxx:49
 AliHelperPID.cxx:50
 AliHelperPID.cxx:51
 AliHelperPID.cxx:52
 AliHelperPID.cxx:53
 AliHelperPID.cxx:54
 AliHelperPID.cxx:55
 AliHelperPID.cxx:56
 AliHelperPID.cxx:57
 AliHelperPID.cxx:58
 AliHelperPID.cxx:59
 AliHelperPID.cxx:60
 AliHelperPID.cxx:61
 AliHelperPID.cxx:62
 AliHelperPID.cxx:63
 AliHelperPID.cxx:64
 AliHelperPID.cxx:65
 AliHelperPID.cxx:66
 AliHelperPID.cxx:67
 AliHelperPID.cxx:68
 AliHelperPID.cxx:69
 AliHelperPID.cxx:70
 AliHelperPID.cxx:71
 AliHelperPID.cxx:72
 AliHelperPID.cxx:73
 AliHelperPID.cxx:74
 AliHelperPID.cxx:75
 AliHelperPID.cxx:76
 AliHelperPID.cxx:77
 AliHelperPID.cxx:78
 AliHelperPID.cxx:79
 AliHelperPID.cxx:80
 AliHelperPID.cxx:81
 AliHelperPID.cxx:82
 AliHelperPID.cxx:83
 AliHelperPID.cxx:84
 AliHelperPID.cxx:85
 AliHelperPID.cxx:86
 AliHelperPID.cxx:87
 AliHelperPID.cxx:88
 AliHelperPID.cxx:89
 AliHelperPID.cxx:90
 AliHelperPID.cxx:91
 AliHelperPID.cxx:92
 AliHelperPID.cxx:93
 AliHelperPID.cxx:94
 AliHelperPID.cxx:95
 AliHelperPID.cxx:96
 AliHelperPID.cxx:97
 AliHelperPID.cxx:98
 AliHelperPID.cxx:99
 AliHelperPID.cxx:100
 AliHelperPID.cxx:101
 AliHelperPID.cxx:102
 AliHelperPID.cxx:103
 AliHelperPID.cxx:104
 AliHelperPID.cxx:105
 AliHelperPID.cxx:106
 AliHelperPID.cxx:107
 AliHelperPID.cxx:108
 AliHelperPID.cxx:109
 AliHelperPID.cxx:110
 AliHelperPID.cxx:111
 AliHelperPID.cxx:112
 AliHelperPID.cxx:113
 AliHelperPID.cxx:114
 AliHelperPID.cxx:115
 AliHelperPID.cxx:116
 AliHelperPID.cxx:117
 AliHelperPID.cxx:118
 AliHelperPID.cxx:119
 AliHelperPID.cxx:120
 AliHelperPID.cxx:121
 AliHelperPID.cxx:122
 AliHelperPID.cxx:123
 AliHelperPID.cxx:124
 AliHelperPID.cxx:125
 AliHelperPID.cxx:126
 AliHelperPID.cxx:127
 AliHelperPID.cxx:128
 AliHelperPID.cxx:129
 AliHelperPID.cxx:130
 AliHelperPID.cxx:131
 AliHelperPID.cxx:132
 AliHelperPID.cxx:133
 AliHelperPID.cxx:134
 AliHelperPID.cxx:135
 AliHelperPID.cxx:136
 AliHelperPID.cxx:137
 AliHelperPID.cxx:138
 AliHelperPID.cxx:139
 AliHelperPID.cxx:140
 AliHelperPID.cxx:141
 AliHelperPID.cxx:142
 AliHelperPID.cxx:143
 AliHelperPID.cxx:144
 AliHelperPID.cxx:145
 AliHelperPID.cxx:146
 AliHelperPID.cxx:147
 AliHelperPID.cxx:148
 AliHelperPID.cxx:149
 AliHelperPID.cxx:150
 AliHelperPID.cxx:151
 AliHelperPID.cxx:152
 AliHelperPID.cxx:153
 AliHelperPID.cxx:154
 AliHelperPID.cxx:155
 AliHelperPID.cxx:156
 AliHelperPID.cxx:157
 AliHelperPID.cxx:158
 AliHelperPID.cxx:159
 AliHelperPID.cxx:160
 AliHelperPID.cxx:161
 AliHelperPID.cxx:162
 AliHelperPID.cxx:163
 AliHelperPID.cxx:164
 AliHelperPID.cxx:165
 AliHelperPID.cxx:166
 AliHelperPID.cxx:167
 AliHelperPID.cxx:168
 AliHelperPID.cxx:169
 AliHelperPID.cxx:170
 AliHelperPID.cxx:171
 AliHelperPID.cxx:172
 AliHelperPID.cxx:173
 AliHelperPID.cxx:174
 AliHelperPID.cxx:175
 AliHelperPID.cxx:176
 AliHelperPID.cxx:177
 AliHelperPID.cxx:178
 AliHelperPID.cxx:179
 AliHelperPID.cxx:180
 AliHelperPID.cxx:181
 AliHelperPID.cxx:182
 AliHelperPID.cxx:183
 AliHelperPID.cxx:184
 AliHelperPID.cxx:185
 AliHelperPID.cxx:186
 AliHelperPID.cxx:187
 AliHelperPID.cxx:188
 AliHelperPID.cxx:189
 AliHelperPID.cxx:190
 AliHelperPID.cxx:191
 AliHelperPID.cxx:192
 AliHelperPID.cxx:193
 AliHelperPID.cxx:194
 AliHelperPID.cxx:195
 AliHelperPID.cxx:196
 AliHelperPID.cxx:197
 AliHelperPID.cxx:198
 AliHelperPID.cxx:199
 AliHelperPID.cxx:200
 AliHelperPID.cxx:201
 AliHelperPID.cxx:202
 AliHelperPID.cxx:203
 AliHelperPID.cxx:204
 AliHelperPID.cxx:205
 AliHelperPID.cxx:206
 AliHelperPID.cxx:207
 AliHelperPID.cxx:208
 AliHelperPID.cxx:209
 AliHelperPID.cxx:210
 AliHelperPID.cxx:211
 AliHelperPID.cxx:212
 AliHelperPID.cxx:213
 AliHelperPID.cxx:214
 AliHelperPID.cxx:215
 AliHelperPID.cxx:216
 AliHelperPID.cxx:217
 AliHelperPID.cxx:218
 AliHelperPID.cxx:219
 AliHelperPID.cxx:220
 AliHelperPID.cxx:221
 AliHelperPID.cxx:222
 AliHelperPID.cxx:223
 AliHelperPID.cxx:224
 AliHelperPID.cxx:225
 AliHelperPID.cxx:226
 AliHelperPID.cxx:227
 AliHelperPID.cxx:228
 AliHelperPID.cxx:229
 AliHelperPID.cxx:230
 AliHelperPID.cxx:231
 AliHelperPID.cxx:232
 AliHelperPID.cxx:233
 AliHelperPID.cxx:234
 AliHelperPID.cxx:235
 AliHelperPID.cxx:236
 AliHelperPID.cxx:237
 AliHelperPID.cxx:238
 AliHelperPID.cxx:239
 AliHelperPID.cxx:240
 AliHelperPID.cxx:241
 AliHelperPID.cxx:242
 AliHelperPID.cxx:243
 AliHelperPID.cxx:244
 AliHelperPID.cxx:245
 AliHelperPID.cxx:246
 AliHelperPID.cxx:247
 AliHelperPID.cxx:248
 AliHelperPID.cxx:249
 AliHelperPID.cxx:250
 AliHelperPID.cxx:251
 AliHelperPID.cxx:252
 AliHelperPID.cxx:253
 AliHelperPID.cxx:254
 AliHelperPID.cxx:255
 AliHelperPID.cxx:256
 AliHelperPID.cxx:257
 AliHelperPID.cxx:258
 AliHelperPID.cxx:259
 AliHelperPID.cxx:260
 AliHelperPID.cxx:261
 AliHelperPID.cxx:262
 AliHelperPID.cxx:263
 AliHelperPID.cxx:264
 AliHelperPID.cxx:265
 AliHelperPID.cxx:266
 AliHelperPID.cxx:267
 AliHelperPID.cxx:268
 AliHelperPID.cxx:269
 AliHelperPID.cxx:270
 AliHelperPID.cxx:271
 AliHelperPID.cxx:272
 AliHelperPID.cxx:273
 AliHelperPID.cxx:274
 AliHelperPID.cxx:275
 AliHelperPID.cxx:276
 AliHelperPID.cxx:277
 AliHelperPID.cxx:278
 AliHelperPID.cxx:279
 AliHelperPID.cxx:280
 AliHelperPID.cxx:281
 AliHelperPID.cxx:282
 AliHelperPID.cxx:283
 AliHelperPID.cxx:284
 AliHelperPID.cxx:285
 AliHelperPID.cxx:286
 AliHelperPID.cxx:287
 AliHelperPID.cxx:288
 AliHelperPID.cxx:289
 AliHelperPID.cxx:290
 AliHelperPID.cxx:291
 AliHelperPID.cxx:292
 AliHelperPID.cxx:293
 AliHelperPID.cxx:294
 AliHelperPID.cxx:295
 AliHelperPID.cxx:296
 AliHelperPID.cxx:297
 AliHelperPID.cxx:298
 AliHelperPID.cxx:299
 AliHelperPID.cxx:300
 AliHelperPID.cxx:301
 AliHelperPID.cxx:302
 AliHelperPID.cxx:303
 AliHelperPID.cxx:304
 AliHelperPID.cxx:305
 AliHelperPID.cxx:306
 AliHelperPID.cxx:307
 AliHelperPID.cxx:308
 AliHelperPID.cxx:309
 AliHelperPID.cxx:310
 AliHelperPID.cxx:311
 AliHelperPID.cxx:312
 AliHelperPID.cxx:313
 AliHelperPID.cxx:314
 AliHelperPID.cxx:315
 AliHelperPID.cxx:316
 AliHelperPID.cxx:317
 AliHelperPID.cxx:318
 AliHelperPID.cxx:319
 AliHelperPID.cxx:320
 AliHelperPID.cxx:321
 AliHelperPID.cxx:322
 AliHelperPID.cxx:323
 AliHelperPID.cxx:324
 AliHelperPID.cxx:325
 AliHelperPID.cxx:326
 AliHelperPID.cxx:327
 AliHelperPID.cxx:328
 AliHelperPID.cxx:329
 AliHelperPID.cxx:330
 AliHelperPID.cxx:331
 AliHelperPID.cxx:332
 AliHelperPID.cxx:333
 AliHelperPID.cxx:334
 AliHelperPID.cxx:335
 AliHelperPID.cxx:336
 AliHelperPID.cxx:337
 AliHelperPID.cxx:338
 AliHelperPID.cxx:339
 AliHelperPID.cxx:340
 AliHelperPID.cxx:341
 AliHelperPID.cxx:342
 AliHelperPID.cxx:343
 AliHelperPID.cxx:344
 AliHelperPID.cxx:345
 AliHelperPID.cxx:346
 AliHelperPID.cxx:347
 AliHelperPID.cxx:348
 AliHelperPID.cxx:349
 AliHelperPID.cxx:350
 AliHelperPID.cxx:351
 AliHelperPID.cxx:352
 AliHelperPID.cxx:353
 AliHelperPID.cxx:354
 AliHelperPID.cxx:355
 AliHelperPID.cxx:356
 AliHelperPID.cxx:357
 AliHelperPID.cxx:358
 AliHelperPID.cxx:359
 AliHelperPID.cxx:360
 AliHelperPID.cxx:361
 AliHelperPID.cxx:362
 AliHelperPID.cxx:363
 AliHelperPID.cxx:364
 AliHelperPID.cxx:365
 AliHelperPID.cxx:366
 AliHelperPID.cxx:367
 AliHelperPID.cxx:368
 AliHelperPID.cxx:369
 AliHelperPID.cxx:370
 AliHelperPID.cxx:371
 AliHelperPID.cxx:372
 AliHelperPID.cxx:373
 AliHelperPID.cxx:374
 AliHelperPID.cxx:375
 AliHelperPID.cxx:376
 AliHelperPID.cxx:377
 AliHelperPID.cxx:378
 AliHelperPID.cxx:379
 AliHelperPID.cxx:380
 AliHelperPID.cxx:381
 AliHelperPID.cxx:382
 AliHelperPID.cxx:383
 AliHelperPID.cxx:384
 AliHelperPID.cxx:385
 AliHelperPID.cxx:386
 AliHelperPID.cxx:387
 AliHelperPID.cxx:388
 AliHelperPID.cxx:389
 AliHelperPID.cxx:390
 AliHelperPID.cxx:391
 AliHelperPID.cxx:392
 AliHelperPID.cxx:393
 AliHelperPID.cxx:394
 AliHelperPID.cxx:395
 AliHelperPID.cxx:396
 AliHelperPID.cxx:397
 AliHelperPID.cxx:398
 AliHelperPID.cxx:399
 AliHelperPID.cxx:400
 AliHelperPID.cxx:401
 AliHelperPID.cxx:402
 AliHelperPID.cxx:403
 AliHelperPID.cxx:404
 AliHelperPID.cxx:405
 AliHelperPID.cxx:406
 AliHelperPID.cxx:407
 AliHelperPID.cxx:408
 AliHelperPID.cxx:409
 AliHelperPID.cxx:410
 AliHelperPID.cxx:411
 AliHelperPID.cxx:412
 AliHelperPID.cxx:413
 AliHelperPID.cxx:414
 AliHelperPID.cxx:415
 AliHelperPID.cxx:416
 AliHelperPID.cxx:417
 AliHelperPID.cxx:418
 AliHelperPID.cxx:419
 AliHelperPID.cxx:420
 AliHelperPID.cxx:421
 AliHelperPID.cxx:422
 AliHelperPID.cxx:423
 AliHelperPID.cxx:424
 AliHelperPID.cxx:425
 AliHelperPID.cxx:426
 AliHelperPID.cxx:427
 AliHelperPID.cxx:428
 AliHelperPID.cxx:429
 AliHelperPID.cxx:430
 AliHelperPID.cxx:431
 AliHelperPID.cxx:432
 AliHelperPID.cxx:433
 AliHelperPID.cxx:434
 AliHelperPID.cxx:435
 AliHelperPID.cxx:436
 AliHelperPID.cxx:437
 AliHelperPID.cxx:438
 AliHelperPID.cxx:439
 AliHelperPID.cxx:440
 AliHelperPID.cxx:441
 AliHelperPID.cxx:442
 AliHelperPID.cxx:443
 AliHelperPID.cxx:444
 AliHelperPID.cxx:445
 AliHelperPID.cxx:446
 AliHelperPID.cxx:447
 AliHelperPID.cxx:448
 AliHelperPID.cxx:449
 AliHelperPID.cxx:450
 AliHelperPID.cxx:451
 AliHelperPID.cxx:452
 AliHelperPID.cxx:453
 AliHelperPID.cxx:454
 AliHelperPID.cxx:455
 AliHelperPID.cxx:456
 AliHelperPID.cxx:457
 AliHelperPID.cxx:458
 AliHelperPID.cxx:459
 AliHelperPID.cxx:460
 AliHelperPID.cxx:461
 AliHelperPID.cxx:462
 AliHelperPID.cxx:463
 AliHelperPID.cxx:464
 AliHelperPID.cxx:465
 AliHelperPID.cxx:466
 AliHelperPID.cxx:467
 AliHelperPID.cxx:468
 AliHelperPID.cxx:469
 AliHelperPID.cxx:470
 AliHelperPID.cxx:471
 AliHelperPID.cxx:472
 AliHelperPID.cxx:473
 AliHelperPID.cxx:474
 AliHelperPID.cxx:475
 AliHelperPID.cxx:476
 AliHelperPID.cxx:477
 AliHelperPID.cxx:478
 AliHelperPID.cxx:479
 AliHelperPID.cxx:480
 AliHelperPID.cxx:481
 AliHelperPID.cxx:482
 AliHelperPID.cxx:483
 AliHelperPID.cxx:484
 AliHelperPID.cxx:485
 AliHelperPID.cxx:486
 AliHelperPID.cxx:487
 AliHelperPID.cxx:488
 AliHelperPID.cxx:489
 AliHelperPID.cxx:490
 AliHelperPID.cxx:491
 AliHelperPID.cxx:492
 AliHelperPID.cxx:493
 AliHelperPID.cxx:494
 AliHelperPID.cxx:495
 AliHelperPID.cxx:496
 AliHelperPID.cxx:497
 AliHelperPID.cxx:498
 AliHelperPID.cxx:499
 AliHelperPID.cxx:500
 AliHelperPID.cxx:501
 AliHelperPID.cxx:502
 AliHelperPID.cxx:503
 AliHelperPID.cxx:504
 AliHelperPID.cxx:505
 AliHelperPID.cxx:506
 AliHelperPID.cxx:507
 AliHelperPID.cxx:508
 AliHelperPID.cxx:509
 AliHelperPID.cxx:510
 AliHelperPID.cxx:511
 AliHelperPID.cxx:512
 AliHelperPID.cxx:513
 AliHelperPID.cxx:514
 AliHelperPID.cxx:515
 AliHelperPID.cxx:516
 AliHelperPID.cxx:517
 AliHelperPID.cxx:518
 AliHelperPID.cxx:519
 AliHelperPID.cxx:520
 AliHelperPID.cxx:521
 AliHelperPID.cxx:522
 AliHelperPID.cxx:523
 AliHelperPID.cxx:524
 AliHelperPID.cxx:525
 AliHelperPID.cxx:526
 AliHelperPID.cxx:527
 AliHelperPID.cxx:528
 AliHelperPID.cxx:529
 AliHelperPID.cxx:530
 AliHelperPID.cxx:531
 AliHelperPID.cxx:532
 AliHelperPID.cxx:533
 AliHelperPID.cxx:534
 AliHelperPID.cxx:535
 AliHelperPID.cxx:536
 AliHelperPID.cxx:537
 AliHelperPID.cxx:538
 AliHelperPID.cxx:539
 AliHelperPID.cxx:540
 AliHelperPID.cxx:541
 AliHelperPID.cxx:542
 AliHelperPID.cxx:543
 AliHelperPID.cxx:544
 AliHelperPID.cxx:545
 AliHelperPID.cxx:546
 AliHelperPID.cxx:547
 AliHelperPID.cxx:548
 AliHelperPID.cxx:549
 AliHelperPID.cxx:550
 AliHelperPID.cxx:551
 AliHelperPID.cxx:552
 AliHelperPID.cxx:553
 AliHelperPID.cxx:554
 AliHelperPID.cxx:555
 AliHelperPID.cxx:556
 AliHelperPID.cxx:557
 AliHelperPID.cxx:558
 AliHelperPID.cxx:559
 AliHelperPID.cxx:560
 AliHelperPID.cxx:561
 AliHelperPID.cxx:562
 AliHelperPID.cxx:563
 AliHelperPID.cxx:564
 AliHelperPID.cxx:565
 AliHelperPID.cxx:566
 AliHelperPID.cxx:567
 AliHelperPID.cxx:568
 AliHelperPID.cxx:569
 AliHelperPID.cxx:570
 AliHelperPID.cxx:571
 AliHelperPID.cxx:572
 AliHelperPID.cxx:573
 AliHelperPID.cxx:574
 AliHelperPID.cxx:575
 AliHelperPID.cxx:576
 AliHelperPID.cxx:577
 AliHelperPID.cxx:578
 AliHelperPID.cxx:579
 AliHelperPID.cxx:580
 AliHelperPID.cxx:581
 AliHelperPID.cxx:582
 AliHelperPID.cxx:583
 AliHelperPID.cxx:584
 AliHelperPID.cxx:585
 AliHelperPID.cxx:586
 AliHelperPID.cxx:587
 AliHelperPID.cxx:588
 AliHelperPID.cxx:589
 AliHelperPID.cxx:590
 AliHelperPID.cxx:591
 AliHelperPID.cxx:592
 AliHelperPID.cxx:593
 AliHelperPID.cxx:594
 AliHelperPID.cxx:595
 AliHelperPID.cxx:596
 AliHelperPID.cxx:597
 AliHelperPID.cxx:598
 AliHelperPID.cxx:599
 AliHelperPID.cxx:600
 AliHelperPID.cxx:601
 AliHelperPID.cxx:602
 AliHelperPID.cxx:603
 AliHelperPID.cxx:604
 AliHelperPID.cxx:605
 AliHelperPID.cxx:606
 AliHelperPID.cxx:607
 AliHelperPID.cxx:608
 AliHelperPID.cxx:609
 AliHelperPID.cxx:610
 AliHelperPID.cxx:611
 AliHelperPID.cxx:612
 AliHelperPID.cxx:613
 AliHelperPID.cxx:614
 AliHelperPID.cxx:615
 AliHelperPID.cxx:616
 AliHelperPID.cxx:617
 AliHelperPID.cxx:618
 AliHelperPID.cxx:619
 AliHelperPID.cxx:620
 AliHelperPID.cxx:621
 AliHelperPID.cxx:622
 AliHelperPID.cxx:623
 AliHelperPID.cxx:624
 AliHelperPID.cxx:625
 AliHelperPID.cxx:626
 AliHelperPID.cxx:627
 AliHelperPID.cxx:628
 AliHelperPID.cxx:629
 AliHelperPID.cxx:630
 AliHelperPID.cxx:631
 AliHelperPID.cxx:632
 AliHelperPID.cxx:633
 AliHelperPID.cxx:634
 AliHelperPID.cxx:635
 AliHelperPID.cxx:636
 AliHelperPID.cxx:637
 AliHelperPID.cxx:638
 AliHelperPID.cxx:639
 AliHelperPID.cxx:640
 AliHelperPID.cxx:641
 AliHelperPID.cxx:642
 AliHelperPID.cxx:643
 AliHelperPID.cxx:644
 AliHelperPID.cxx:645
 AliHelperPID.cxx:646
 AliHelperPID.cxx:647
 AliHelperPID.cxx:648
 AliHelperPID.cxx:649
 AliHelperPID.cxx:650
 AliHelperPID.cxx:651
 AliHelperPID.cxx:652
 AliHelperPID.cxx:653
 AliHelperPID.cxx:654
 AliHelperPID.cxx:655
 AliHelperPID.cxx:656
 AliHelperPID.cxx:657
 AliHelperPID.cxx:658
 AliHelperPID.cxx:659
 AliHelperPID.cxx:660
 AliHelperPID.cxx:661
 AliHelperPID.cxx:662
 AliHelperPID.cxx:663
 AliHelperPID.cxx:664
 AliHelperPID.cxx:665
 AliHelperPID.cxx:666
 AliHelperPID.cxx:667
 AliHelperPID.cxx:668