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.                  *
 **************************************************************************/

//This class is intended to provide a selection on
//the PID for single charged particles as electrons, muons
//pions, kaons and protons. The user is supposed to set only one particle 
//to look at. The class at the moment uses one single ESD track.
//The identification is done in Identify(), whereas the GetID() checks 
//the track status or if the combined PID should be applied.
//The Correction Framework follows the Annalysis framework. 
//The main method of this class is the IsSelected function which returns 
//true (false) if the ESD track is (not) identified as the previously 
//setted particle.
//
//
//usage:
//
// -----ID by one detector------
//AliCFTrackCutPid *pCut = new AliCFTrackCutPid("pion_sel","pion_sel");
//Double_t priors[5]={...};
//pCut->SetPartycleType(AliPID::kPion,kFALSE)  
//pCut->SetDetectors("DET");          ^^^^^^
//pCut->SetPriors(priors);
//
// -----ID combining more detectors----
//AliCFTrackCutPid *pCut = new AliCFTrackCutPid("pion_sel","pion_sel");
//Double_t priors[5]={...};
//pCut->SetPartycleType(AliPID::kPion,kTRUE)
//pCut->SetDetectors("DET1 DET2 .."); ^^^^^
//pCut->SetPriors(priors)
//
//Comments: 
//The user can choose not to identify a track if one residual beteween 
//the identified particle probability and one among all the other 
//probabilties is smaller than a predefined value. 
//The same can be done for the detector responses. 
//This happens by setting:
// 
//pCut->SetMinDiffProb(0.005,kTRUE) //for probabilities
//
//pCut->SetMinDiffResp(0.005,kTRUE) //for det responses
//
//Annalisa.Mastroserio@ba.infn.it
//



#include "AliCFTrackCutPid.h"
#include "AliLog.h"
#include <TMath.h>
#include <TList.h>

ClassImp(AliCFTrackCutPid) 

//__________________________________________________________________________________
// CUT ON TRACK PID
//__________________________________________________________________________________
AliCFTrackCutPid::AliCFTrackCutPid() :
  AliCFCutBase(),
  fCut(0.2),
  fMinDiffResponse(0.0001),
  fMinDiffProbability(0.001),
  fgParticleType(10),
  fgIsComb(kTRUE),
  fgIsAOD(kFALSE),
  fCheckResponse(kFALSE),
  fCheckSelection(kTRUE),
  fIsPpriors(kFALSE),
  fIsDetAND(kFALSE),
  fXmin(-0.005),
  fXmax(1.005),
  fNbins(101),
  fDetRestr(-1),
  fiPartRestr(-1),
  fDetProbRestr(1),
  fProbThreshold(0.)
{ 
  //
  //Default constructor 
  //
  for(Int_t j=0; j< AliPID::kSPECIES; j++) {
    fPriors[j]=0.2;
  }
  for(Int_t j=0; j< AliPID::kSPECIES; j++) {
    fPriorsFunc[j]=0x0;
  }
  for(Int_t jDet=0; jDet< kNdets; jDet++)  {
    fDets[jDet]=kFALSE;
    fDetsInAnd[jDet]=kFALSE;
  }
  
  InitialiseHisto();
}
//______________________________
AliCFTrackCutPid::AliCFTrackCutPid(const Char_t* name, const Char_t* title) :
  AliCFCutBase(name,title),
  fCut(0.2),
  fMinDiffResponse(0.0001),
  fMinDiffProbability(0.001),
  fgParticleType(10),
  fgIsComb(kTRUE),
  fgIsAOD(kFALSE),
  fCheckResponse(kFALSE),
  fCheckSelection(kTRUE),
  fIsPpriors(kFALSE),
  fIsDetAND(kFALSE),
  fXmin(-0.005),
  fXmax(1.005),
  fNbins(101),
  fDetRestr(-1),
  fiPartRestr(-1),
  fDetProbRestr(1),
  fProbThreshold(0.)
{
  //
  //Constructor
  // 
  for(Int_t j=0; j< AliPID::kSPECIES; j++) {
    fPriors[j]=0.2;
  }
  for(Int_t j=0; j< AliPID::kSPECIES; j++) {
    fPriorsFunc[j]=0x0;
  }
  for(Int_t jDet=0; jDet< kNdets; jDet++)  {
    fDets[jDet]=kFALSE;
    fDetsInAnd[jDet]=kFALSE;
  }
  
  InitialiseHisto();
}
//______________________________
AliCFTrackCutPid::AliCFTrackCutPid(const AliCFTrackCutPid& c) :
  AliCFCutBase(c),
  fCut(c.fCut),
  fMinDiffResponse(c.fMinDiffResponse),
  fMinDiffProbability(c.fMinDiffProbability),
  fgParticleType(c.fgParticleType),
  fgIsComb(c.fgIsComb),
  fgIsAOD(c.fgIsAOD),
  fCheckResponse(c.fCheckResponse),
  fCheckSelection(c.fCheckSelection),
  fIsPpriors(c.fIsPpriors),
  fIsDetAND(c.fIsDetAND),
  fXmin(c.fXmin),
  fXmax(c.fXmax),
  fNbins(c.fNbins),
  fDetRestr(c.fDetRestr),
  fiPartRestr(c.fiPartRestr),
  fDetProbRestr(c.fDetProbRestr),
  fProbThreshold(c.fProbThreshold)
{
  //
  //Copy constructor
  //
  for(Int_t i=0; i< kNdets ; i++ ) { 
    fDets[i]=c.fDets[i]; 
    fDetsInAnd[i]=c.fDetsInAnd[i];
    for(Int_t iP =0; iP<AliPID::kSPECIES; iP++){
      fhResp[i][iP]=c.fhResp[i][iP];
      fhProb[i][iP]=c.fhProb[i][iP];
    }
  }
  for(Int_t j=0; j< AliPID::kSPECIES; j++){
    fPriors[j]=c.fPriors[j];
  }
  for(Int_t j=0; j< AliPID::kSPECIES; j++){
    fPriorsFunc[j]=c.fPriorsFunc[j];
    fhCombResp[j]=c.fhCombResp[j];
    fhCombProb[j]=c.fhCombProb[j];
  }
}
//______________________________
AliCFTrackCutPid& AliCFTrackCutPid::operator=(const AliCFTrackCutPid& c)
{  
  //
  // Assignment operator
  //
  if (this != &c) {
    AliCFCutBase::operator=(c) ;
    this->fCut=c.fCut;
    this->fMinDiffResponse=c.fMinDiffResponse;
    this->fMinDiffProbability=c.fMinDiffProbability;
    this->fgParticleType=c.fgParticleType;  
    this->fgIsComb=c.fgIsComb;
    this->fgIsAOD=c.fgIsAOD;
    this->fCheckResponse=c.fCheckResponse;
    this->fCheckSelection=c.fCheckSelection;
    this->fIsPpriors=c.fIsPpriors;
    this->fIsDetAND=c.fIsDetAND;
    this->fXmin=c.fXmin;
    this->fXmax=c.fXmax;
    this->fNbins=c.fNbins;
    this->fDetRestr=c.fDetRestr;
    this->fiPartRestr=c.fiPartRestr;
    this->fDetProbRestr=c.fDetProbRestr;
    this->fProbThreshold=c.fProbThreshold;
  
    for(Int_t i=0; i< kNdets ; i++ )   {
      this->fDets[i]=c.fDets[i];
      for(Int_t iP =0; iP<AliPID::kSPECIES; iP++){
	this->fhResp[i][iP]=c.fhResp[i][iP];
	this->fhProb[i][iP]=c.fhProb[i][iP];
      }  
    }

    for(Int_t j=0; j< AliPID::kSPECIES; j++){
      this->fPriors[j]=c.fPriors[j];
    }
    for(Int_t j=0; j< AliPID::kSPECIES; j++){
      this->fhCombResp[j]=c.fhCombResp[j];
      this->fhCombProb[j]=c.fhCombProb[j];
      this-> fPriorsFunc[j]=c.fPriorsFunc[j];

    }
  }
  return *this ;
}
//__________________________________________________________________________________
AliCFTrackCutPid::~AliCFTrackCutPid() {
  //
  //dtor
  //

  for(Int_t i=0; i< kNdets ; i++ )   {
    for(Int_t iP =0; iP<AliPID::kSPECIES; iP++){
      if(fhResp[i][iP])delete fhResp[i][iP];
      if(fhProb[i][iP])delete fhProb[i][iP];
    }  
  }
  
  for(Int_t j=0; j< AliPID::kSPECIES; j++){
    if(fhCombResp[j])delete fhCombResp[j];
    if(fhCombProb[j])delete fhCombProb[j];
    
  }
}
//__________________________________
void AliCFTrackCutPid::SetDetectors(TString dets)
{
  //
  // The string of detectors is translated into 
  // the respective booelan data members

  if(dets.Contains("ITS")) {fDets[kITS]=kTRUE;}
  if(dets.Contains("TPC")) {fDets[kTPC]=kTRUE;}
  if(dets.Contains("TRD")) {fDets[kTRD]=kTRUE;}
  if(dets.Contains("TOF")) {fDets[kTOF]=kTRUE;}
  if(dets.Contains("HMPID")) {fDets[kHMPID]=kTRUE;}

  if(dets.Contains("ALL")) for(Int_t i=0; i< kNdets ; i++) fDets[i]=kTRUE;
}
//__________________________________
void AliCFTrackCutPid::SetPriors(Double_t r[AliPID::kSPECIES])
{
  //
  // Sets the a priori concentrations
  // 
  for(Int_t i=0; i<AliPID::kSPECIES; i++) fPriors[i]=r[i];
}
//__________________________________
void AliCFTrackCutPid::SetPriorFunctions(TF1 *func[AliPID::kSPECIES])
{
  //
  // Sets the momentu dependent a priori concentrations
  //
  
  for(Int_t i=0; i<AliPID::kSPECIES; i++) fPriorsFunc[i]=func[i];
  fIsPpriors = kTRUE;
}
//____________________________________________
void AliCFTrackCutPid::SetANDstatus(TString dets)
{
  //
  //Sets the detectors to be in AND for the combined PID
  //
  if(dets.Contains("ITS") && fDets[kITS])     {fDetsInAnd[kITS]=kTRUE;}
  if(dets.Contains("TPC") && fDets[kTPC])     {fDetsInAnd[kTPC]=kTRUE;}
  if(dets.Contains("TRD") && fDets[kTRD])     {fDetsInAnd[kTRD]=kTRUE;}
  if(dets.Contains("TOF") && fDets[kTOF])     {fDetsInAnd[kTOF]=kTRUE;}
  if(dets.Contains("HMPID") && fDets[kHMPID]) {fDetsInAnd[kHMPID]=kTRUE;}
  
  fIsDetAND = kTRUE;
}
//
void AliCFTrackCutPid::SetDetectorProbabilityRestriction(TString det, Int_t iPart, Double_t upperprob)
{
  //
  // Sets the detector, the particle and the probability
  // limit.
  //
  
  if(det.Contains("ITS")) fDetRestr = kITS;
  if(det.Contains("TPC")) fDetRestr = kTPC;
  if(det.Contains("TRD")) fDetRestr = kTRD;
  if(det.Contains("TOF")) fDetRestr = kTOF;
  if(det.Contains("HMPID")) fDetRestr = kHMPID;
  fiPartRestr = iPart; 
  fDetProbRestr = upperprob;
}
//__________________________________
void AliCFTrackCutPid::TrackInfo(const AliESDtrack *pTrk, ULong_t status[kNdets+1],Double_t pid[kNdets+1][AliPID::kSPECIES]) const
{
  //
  // Loads the responses of the XXX chosen detectors for the pTrk
  // and the corresponding trk status. The final trk status is also loaded.
  // 
  if(fDets[kITS]) {
    pTrk->GetITSpid(pid[kITS]);
    status[kITS]=AliESDtrack::kITSpid;
  }
  if(fDets[kTPC]) {
    pTrk->GetTPCpid(pid[kTPC]);
    status[kTPC]=AliESDtrack::kTPCpid;
  }
  if(fDets[kTRD]) {
    pTrk->GetTRDpid(pid[kTRD]);
    status[kTRD]=AliESDtrack::kTRDpid;
  }
  if(fDets[kTOF]) {
    pTrk->GetTOFpid(pid[kTOF]);
    status[kTOF]=AliESDtrack::kTOFpid;
  }
  if(fDets[kHMPID]) {
    pTrk->GetHMPIDpid(pid[kHMPID]);
    status[kHMPID]=AliESDtrack::kHMPIDpid;
  }
  if(fDetRestr>=0){
    if(fDetRestr == kITS) pTrk->GetITSpid(pid[kITS]);
    if(fDetRestr == kTPC) pTrk->GetITSpid(pid[kTPC]);
    if(fDetRestr == kTRD) pTrk->GetITSpid(pid[kTRD]);
    if(fDetRestr == kTOF) pTrk->GetITSpid(pid[kTOF]);
    if(fDetRestr == kHMPID) pTrk->GetITSpid(pid[kHMPID]);
  }
  
  status[kNdets]=pTrk->GetStatus();
  pTrk->GetESDpid(pid[kNdets]);
}
//__________________________________
void AliCFTrackCutPid::SetPPriors(AliESDtrack *pTrk)
{
  //
  //sets the mommentum dependent a priori concentrations
  //
  
  for(Int_t i=0; i< AliPID::kSPECIES; i++) {
    if(pTrk->P()>fPriorsFunc[i]->GetXmin() && pTrk->P() < fPriorsFunc[i]->GetXmax()) fPriors[i]=fPriorsFunc[i]->Eval(pTrk->P());
    else {AliInfo("the track momentum is not in the function range. Priors are equal"); fPriors[i] = 0.2;}   
  }
}   
//______________________________________
ULong_t AliCFTrackCutPid::StatusForAND(ULong_t status[kNdets+1]) const
{
  //
  //In case of AND of more detectors the AND-detector status combination. 
  //is calculated and also returned
  //

  ULong_t andstatus=0;
  for(Int_t i=0; i< kNdets; i++) {
    if(!fDetsInAnd[i]) continue;
    andstatus = andstatus | status[i];
    AliDebug(1,Form("trk status %lu  %i AND-status  combination: %lu",status[i],i,andstatus));
  }
  return andstatus;
}
//_______________________________________
Int_t AliCFTrackCutPid::GetID(ULong_t status[kNdets+1],Double_t pid[kNdets+1][AliPID::kSPECIES]) const
{
  // Identifies the track if its probability is higher than the cut
  // value. The default value is fCut=0.2, therefore the most probable
  // one is identified by default. Here all the checks on how to identify
  // the track are performed (single detector or combined PID,..., detector
  // restriction probability
  // Returns:   integer corresponding to the identified particle
  
  Int_t iPart=-1;
  
  if(!fgIsComb){  
    Bool_t isDet=kFALSE;
    for(Int_t i=0; i<kNdets; i++){
      if(!fDets[i]) continue;
      isDet=kTRUE;
      AliDebug(1,Form("trk status %lu  %i-det-pid status %lu   -> combination: %lu",status[kNdets],i,status[i],status[kNdets]&status[i]));
      if(!(status[kNdets]&status[i])){
	iPart=-10;
	AliDebug(1,Form("detector %i -> pid trk status not ok",i));
      }
      else {
        AliDebug(1,Form("resp   : %f  %f  %f  %f  %f",pid[i][0],pid[i][1],pid[i][2],pid[i][3],pid[i][4]));
	if(fIsQAOn) iPart = IdentifyQA(pid[i],i);
	else iPart = Identify(pid[i]);
      } 
    }  
    if(!isDet){
      AliDebug(1,Form("  !!!        No detector selected, the ESD-pid response is considered"));
      iPart = Identify(pid[kNdets]);
    }
  }else{
    Double_t calcprob[5];
    CombPID(status,pid,calcprob); 
    iPart = Identify(calcprob);
    
  }
  
  
  AliDebug(1,Form("selected particle: %i",iPart));
  
  if(iPart >=0 && fiPartRestr>=0) {
    AliPID restr(pid[fDetRestr]);
    restr.SetPriors(fPriors);
    AliDebug(1,Form("setted upper limit: %f  det %i : probability %f ",fDetProbRestr,fDetRestr,restr.GetProbability((AliPID::EParticleType)fiPartRestr)));
    if(restr.GetProbability((AliPID::EParticleType)fiPartRestr) > fDetProbRestr) {
      iPart = kDetRestr;
      AliDebug(1,"\n\n the detector restrictions refused the ID \n\n");
    }
  }//cross checks with one detector probability
  
  AliDebug(1,Form("after the check the selected particle is %i",iPart));
  
  return iPart;
}
//_________________________________________________________________________________
Int_t AliCFTrackCutPid::GetAODID(AliAODTrack *aodtrack) const
{
//
// Identifies the AOD Track using the combined pid responses
//

  Double_t combpid[AliPID::kSPECIES];
  for(Int_t i=0; i< AliPID::kSPECIES; i++) {
    combpid[i]= aodtrack->PID()[i];
     if(!fhCombResp[i]) AliDebug(1,Form("\n no fhCombResp[%i], check if pidcut->Init() was called",i));
     else fhCombResp[i]->Fill(combpid[i]);
  }
  return Identify(combpid);
}
//__________________________________
Bool_t AliCFTrackCutPid::Check(const Double_t *p, Int_t iPsel, Double_t minDiff) const
{
  // Checks if there are no equal values and if the valus
  // difference between the selected particle and the others i
  // is higher than  a lower limit.
  // Returns:  kTRUE= is acceptable
  
  AliDebug(2,Form("input particle: %i",iPsel));
  Bool_t ck=kTRUE;
  
  if(iPsel<0) ck=kFALSE;
  
  else {
    for(Int_t j=0; j< AliPID::kSPECIES; j++) {
      if(j!=iPsel && TMath::Abs(p[j]-p[iPsel])<minDiff) ck=kFALSE;
    }
    if(!ck) AliDebug(1,"the values are too close ");
  }
  return ck;
}
//___________________________________________
Int_t AliCFTrackCutPid::Identify(Double_t pid[AliPID::kSPECIES]) const
{
  //
  // The identification is actually performed here with possible
  // checks on the det responses and/or probabilities
  //

  Int_t iPart = -1;
 
  AliDebug(2,Form("calc response bef: %f  %f  %f  %f  %f",pid[0],pid[1],pid[2],pid[3],pid[4]));
  AliDebug(2,Form("priors           : %f  %f  %f  %f  %f",fPriors[0],fPriors[1],fPriors[2],fPriors[3],fPriors[4]));

  AliPID getpid(pid,kTRUE);
  getpid.SetPriors(fPriors); 
  
  Double_t probability[AliPID::kSPECIES]={0.,0.,0.,0.,0.};
  for(Int_t iP=0; iP<AliPID::kSPECIES; iP++) {
    probability[iP] = getpid.GetProbability((AliPID::EParticleType)iP);
    AliDebug(2,Form("prob %i %f",iP, probability[iP]));
    if(fIsQAOn) fhCombProb[iP]->Fill(probability[iP]);
  }
  

  if (fProbThreshold > 0.) {
    if (probability[fgParticleType] >= fProbThreshold) iPart=fgParticleType;
  }
  else {
    AliPID::EParticleType sel = getpid.GetMostProbable();
    if(getpid.GetProbability(sel,fPriors)>fCut) iPart= (Int_t)sel;
    AliDebug(2,Form("probabilities   : %f  %f  %f  %f  %f",probability[0],probability[1],probability[2],probability[3],probability[4]));
  }

  if(fCheckResponse && !Check(pid,iPart, fMinDiffResponse)) iPart=kCheckResp;
  if(fCheckSelection && !Check(probability,iPart,fMinDiffProbability)) iPart=kCheckProb;

  return iPart;
}
//___________________________________________
Int_t AliCFTrackCutPid::IdentifyQA(const Double_t pid[AliPID::kSPECIES], Int_t idets) const
{
  //
  // The same as Identify, but with the QA histo filling 
  //
  //
  
  Int_t iPart = -1;
  AliDebug(1,Form("resp   : %f  %f  %f  %f  %f",pid[0],pid[1],pid[2],pid[3],pid[4]));
  
  AliPID getpid(pid,kTRUE);
  getpid.SetPriors(fPriors);
      
  AliPID::EParticleType sel = getpid.GetMostProbable();
  Double_t probability[AliPID::kSPECIES];
  for(Int_t iP=0; iP<AliPID::kSPECIES; iP++) {
    probability[iP] = getpid.GetProbability((AliPID::EParticleType)iP);
    fhProb[idets][iP]->Fill(probability[iP]);
  }
  
  AliPID toresp(pid,kTRUE); 
  Double_t qapriors[10]={0.2,0.2,0.2,0.2,0.2,0,0,0,0,0};
  toresp.SetPriors(qapriors);
  for(Int_t iPr=0; iPr<AliPID::kSPECIES; iPr++) fhResp[idets][iPr]->Fill(toresp.GetProbability((AliPID::EParticleType)iPr));
  
  if(getpid.GetProbability(sel,fPriors)>fCut) iPart= (Int_t)sel;
  AliDebug(1,Form("resp   : %f  %f  %f  %f  %f",pid[0],pid[1],pid[2],pid[3],pid[4]));
  AliDebug(1,Form("probab : %f  %f  %f  %f  %f",probability[0],probability[1],probability[2],probability[3],probability[4]));
  if(fCheckResponse && !Check(pid,iPart, fMinDiffResponse)) iPart=kCheckResp;
  if(fCheckSelection && !Check(probability,iPart,fMinDiffProbability)) iPart=kCheckProb;
  return iPart;
}
//___________________________________________
Bool_t AliCFTrackCutPid::IsSelected(TObject *track){
  //
  //  method for the pid-cut selction
  //
  Bool_t sel = kFALSE;
  
  if (!track) return kFALSE ;
  TString className(track->ClassName());
  if (className.CompareTo("AliESDtrack") == 0) {
  AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track); 
  if (!esdTrack) return kFALSE;
  ULong_t status[kNdets+1]={0,0,0,0,0,0};
  Double_t pid[kNdets+1][AliPID::kSPECIES];
  TrackInfo(esdTrack,status,pid);
  if(fIsPpriors) SetPPriors(esdTrack);
  if(GetID(status,pid)==fgParticleType) sel = kTRUE;
  }

  if (className.CompareTo("AliAODTrack") == 0) {
  AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
  if (!aodtrack) return kFALSE ;
  if(GetAODID(aodtrack) == fgParticleType) sel = kTRUE;
  }

 return sel;

}
//__________________________________
void  AliCFTrackCutPid::CombPID(ULong_t status[kNdets+1],Double_t pid[kNdets+1][AliPID::kSPECIES],Double_t *combpid) const
{
  //
  // Calculates the combined PID according to the chosen detectors.
  // and provides the array of probabilities
  //
  
  Bool_t isdet=kFALSE;
  Double_t prod[AliPID::kSPECIES]={1.,1.,1.,1.,1.};
  
  ULong_t andstatus =0;
  if(fIsDetAND) {
    andstatus = StatusForAND(status);
    AliDebug(1,Form("AND combination %lu",andstatus));
  } 
  
  //Products of single detector responses
  for(Int_t j=0; j<AliPID::kSPECIES; j++){
    for(Int_t i=0; i< kNdets; i++){
      if(!fDets[i]) continue;
      if(status[kNdets]&status[i]) {
        if(fIsDetAND) {
	  ULong_t checkstatus = status[kNdets]&andstatus;
	  if(checkstatus != andstatus) continue; 
	  else {
	    prod[j]*=pid[i][j];
	    isdet = kTRUE;
	    AliDebug(1,Form("-----> trk status %lu   and status %lu -> trk-ANDdetector status combination %lu",status[kNdets],andstatus,status[kNdets]&andstatus));
	    AliDebug(1,Form("In det %i ->  particle %i response is %f",i,j,pid[i][j]));
	  }
        } else {
	  prod[j]*=pid[i][j];
	  isdet=kTRUE;
	  AliDebug(2,Form("In det %i ->  particle %i response is %f",i,j,pid[i][j]));
          
           if(fIsQAOn){
             if(!fhResp[i][j]) {AliDebug(1,Form("no pointer to the histo fhResp%i%i, check if pidcut->Init() was called",i,j));}
	     else fhResp[i][j]->Fill(pid[i][j]);    
             
             if(!fhProb[i][j]) {AliDebug(1,Form("no pointer to the histo fhProb%i%i, check if pidcut->Init() was called",i,j));}
	     else {
               AliPID detprob(pid[i],kTRUE); 
               detprob.SetPriors(fPriors);
               fhProb[i][j]->Fill(detprob.GetProbability((AliPID::EParticleType)j));    
             }       
           }
	}
      }//combined mode
    }//loop on dets
  }//loop on species

  
   //no detectors found, then go to ESD pid...
  if(!isdet) {
    AliWarning("\n !! No detector found for the combined pid --> responses are from the ESDpid !! \n");
    Double_t sumesdpid=0;
     for(Int_t nn=0; nn<AliPID::kSPECIES; nn++) sumesdpid+=pid[kNdets][nn];
     if(sumesdpid<=0) {
        AliDebug(1,"priors or ESDpid are inconsistent, please check them");
        return;
      } else {
        for(Int_t k=0; k<AliPID::kSPECIES; k++){
         combpid[k] = pid[kNdets][k]/sumesdpid;
          if(fIsQAOn) {
           if(!fhCombResp[k]) AliDebug(1,Form("\n no fhCombResp[%i], check if pidcut->Init() was called",k));
           else fhCombResp[k]->Fill(combpid[k]);
          }
         }//loop on species
       }
      return;   
    }   
    
  Double_t add = 0; for(Int_t isumm=0; isumm<5; isumm++) add+=prod[isumm];
  if(add>0) {
    for(Int_t ip =0; ip < AliPID::kSPECIES; ip++) {
      combpid[ip] =  prod[ip]/add;
     if(fIsQAOn) {
           if(!fhCombResp[ip]) AliDebug(1,Form("\n no fhCombResp[%i], check if pidcut->Init() was called",ip));
           else fhCombResp[ip]->Fill(combpid[ip]); 
           
         }
   }
   AliDebug(1,Form("calculated comb response: %f %f %f %f %f",combpid[0],combpid[1],combpid[2],combpid[3],combpid[4]));
 } else {
    AliDebug(1,"single detector responses are inconsistent, please check them....");
    return; 
   }
  AliDebug(1,Form("the ESDpid response:      %f %f %f %f %f",pid[kNdets][0],pid[kNdets][1],pid[kNdets][2],pid[kNdets][3],pid[kNdets][4]));
 
}
//__________________________________________
//
//QA part
//_________________________________________
void AliCFTrackCutPid::InitialiseHisto()
{
  //
  //QA histo initialization
  //
  for(Int_t iP=0; iP<AliPID::kSPECIES; iP++){
    fhCombResp[iP]=0x0;
    fhCombProb[iP]=0x0;
    for(Int_t iDet =0; iDet<kNdets; iDet++){
      fhResp[iDet][iP]=0x0;
      fhProb[iDet][iP]=0x0;
    }
  } 
}
//______________________________________________
void AliCFTrackCutPid::DefineHistograms()
{
  //
  //QA histo booking
  //

  if(fgIsAOD){
     const char *partic[AliPID::kSPECIES]={"electron","muon","pion","kaon","proton"}; 

     for(Int_t iPart =0; iPart < AliPID::kSPECIES; iPart++)
      {
       fhCombResp[iPart] = new TH1F(Form("%s_rCombPart%i",GetName(),iPart),Form(" %s combined response  (AODTrack)  ",partic[iPart]),fNbins,fXmin,fXmax);
       fhCombResp[iPart]->SetXTitle(Form(" %s combined response ",partic[iPart]));
       fhCombResp[iPart]->SetYTitle("entries");
       AliDebug(1,Form(  "%s is booked!!",fhCombResp[iPart]->GetName()));
       fhCombProb[iPart] = new TH1F(Form("%s_pCombPart%i",GetName(),iPart),Form("%s combined probability (AODTrack) ",partic[iPart]),fNbins,fXmin,fXmax);
       fhCombProb[iPart]->SetXTitle(Form(" %s combined probability ",partic[iPart]));
       fhCombProb[iPart]->SetYTitle("entries");
       AliDebug(1,Form(  "%s is booked!!",fhCombProb[iPart]->GetName()));
     }
   }


  else {
   const char *detect[kNdets]={"ITS","TPC","TRD","TOF","HMPID"};
   const char *partic[AliPID::kSPECIES]={"electron","muon","pion","kaon","proton"};
  
    for(Int_t iDet =0; iDet< kNdets; iDet++)
     {
       if(!fDets[iDet]) continue;
       for(Int_t iP =0; iP < AliPID::kSPECIES; iP++){
 	fhResp[iDet][iP] = new TH1F(Form("%s_rDet%iPart%i",GetName(),iDet,iP),Form("%s response for %s  ",detect[iDet],partic[iP]),fNbins,fXmin,fXmax);
        fhResp[iDet][iP]->SetXTitle(Form(" %s response ",partic[iP]));
        fhResp[iDet][iP]->SetYTitle("entries");
 	fhProb[iDet][iP] = new TH1F(Form("%s_pDet%iPart%i",GetName(),iDet,iP),Form("%s calculated probability for %s",detect[iDet],partic[iP]),fNbins,fXmin,fXmax);
        fhProb[iDet][iP]->SetXTitle(Form(" %s probability ",partic[iP]));
        fhProb[iDet][iP]->SetYTitle("entries");
       }
     }
    

  if(fgIsComb)
     { 
      for(Int_t iPart =0; iPart < AliPID::kSPECIES; iPart++)
        {
	  fhCombResp[iPart] = new TH1F(Form("%s_rCombPart%i",GetName(),iPart),Form(" %s combined response    ",partic[iPart]),fNbins,fXmin,fXmax);
          fhCombResp[iPart]->SetXTitle(Form(" %s response ",partic[iPart]));
          fhCombResp[iPart]->SetYTitle("entries");
          AliDebug(1,Form(  "%s is booked!!",fhCombResp[iPart]->GetName()));
	  fhCombProb[iPart] = new TH1F(Form("%s_pCombPart%i",GetName(),iPart),Form("%s combined probability ",partic[iPart]),fNbins,fXmin,fXmax);
          fhCombProb[iPart]->SetXTitle(Form(" %s response ",partic[iPart]));
          fhCombProb[iPart]->SetYTitle("entries");
          AliDebug(1,Form(  "%s is booked!!",fhCombProb[iPart]->GetName()));
        }
     }
   }

}
//___________________________________________________

void AliCFTrackCutPid::AddQAHistograms(TList *qalist) 
{
  //
  // adds QA histograms in a TList
  //
  if(!fIsQAOn) return;
  DefineHistograms();
  
  if(fgIsComb || fgIsAOD){
    for(Int_t iPart =0; iPart<AliPID::kSPECIES; iPart++){
      qalist->Add(fhCombResp[iPart]);
      qalist->Add(fhCombProb[iPart]);
    }
  }
  
  for(Int_t iDet=0; iDet<kNdets; iDet++){
    if(!fDets[iDet]) continue;
    for(Int_t iP =0; iP<AliPID::kSPECIES; iP++){
      qalist->Add(fhResp[iDet][iP]);
      qalist->Add(fhProb[iDet][iP]);
    }
  }  

}

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