/************************************************************************** * 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. * **************************************************************************/ //----------------------------------------------------------------- // Base class for combining PID of different detectors // // (user selected) and compute Bayesian probabilities // // // // // // Origin: Pietro Antonioli, INFN-BO Pietro.Antonioli@cern.ch // // // //----------------------------------------------------------------- #include #include #include #include #include #include "AliPIDCombined.h" #include "TMath.h" #include "TFile.h" #include "AliOADBContainer.h" // initialize static members TH2F* AliPIDCombined::fDefaultPriorsTPC[]={0x0}; ClassImp(AliPIDCombined); AliPIDCombined::AliPIDCombined(): TNamed("CombinedPID","CombinedPID"), fDetectorMask(0), fRejectMismatchMask(0x7F), fEnablePriors(kTRUE), fSelectedSpecies(AliPID::kSPECIES), fUseDefaultTPCPriors(kFALSE) { // // default constructor // for (Int_t i=0;i= ((AliPID::EParticleType)AliPID::kSPECIESC) ) ){ AliError(Form("Invalid EParticleType setting prior (offending type: %d)",type)); return; } if(prior) { Int_t i = (Int_t)type; if (fPriorsDistributions[i]) { delete fPriorsDistributions[i]; } fPriorsDistributions[i]=new TH1F(*prior); } } //------------------------------------------------------------------------------------------------- UInt_t AliPIDCombined::ComputeProbabilities(const AliVTrack *track, const AliPIDResponse *response, Double_t* bayesProbabilities) const { Double_t pITS[fSelectedSpecies]; Double_t pTPC[fSelectedSpecies]; Double_t pTRD[fSelectedSpecies]; Double_t pTOF[fSelectedSpecies]; Double_t pHMPID[fSelectedSpecies]; Double_t pEMCAL[fSelectedSpecies]; Double_t pPHOS[fSelectedSpecies]; for (Int_t i=0;iComputeITSProbability(track, fSelectedSpecies, pITS); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetITS,pITS); } if (fDetectorMask & AliPIDResponse::kDetTPC) { status = response->ComputeTPCProbability(track, fSelectedSpecies, pTPC); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetTPC,pTPC); } if (fDetectorMask & AliPIDResponse::kDetTRD) { status = response->ComputeTRDProbability(track, fSelectedSpecies, pTRD); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetTRD,pTRD); } if (fDetectorMask & AliPIDResponse::kDetTOF) { status = response->ComputeTOFProbability(track, fSelectedSpecies, pTOF); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetTOF,pTOF); } if (fDetectorMask & AliPIDResponse::kDetHMPID) { status = response->ComputeHMPIDProbability(track, fSelectedSpecies, pHMPID); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetHMPID,pHMPID); } if (fDetectorMask & AliPIDResponse::kDetEMCAL) { status = response->ComputeEMCALProbability(track, fSelectedSpecies, pEMCAL); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetEMCAL,pEMCAL); } if (fDetectorMask & AliPIDResponse::kDetPHOS) { status = response->ComputePHOSProbability(track, fSelectedSpecies, pPHOS); SetCombinedStatus(status,&usedMask,AliPIDResponse::kDetPHOS,pPHOS); } for (Int_t i =0; iGetCurrentCentrality()); // for the moment we have three cases // TPC+TRD --> apply TRD propagation factors // TPC+TOF --> apply TOF propagation factors // TPC+TRD+TOF --> apply TOF propagation factors // apply tof matching efficiency to priors if TOF joined PID for this track if(fUseDefaultTPCPriors) { Double_t pt=TMath::Abs(track->Pt()); if ( (usedMask & AliPIDResponse::kDetTOF) == AliPIDResponse::kDetTOF ){ // TOF is the outer having prop. factors for the moment Float_t kaonTOFfactor = 0.1; if(pt > 0.35) kaonTOFfactor = 1 - TMath::Exp(-TMath::Power(pt,4.19618E-07)/5.68017E-01)*TMath::Power(pt,-1.50705); Float_t protonTOFfactor = 0.1; if(pt > 0.4) protonTOFfactor = 1 - TMath::Exp(-TMath::Power(pt,3.30978)/8.57396E-02)*TMath::Power(pt,-4.42661E-01); if(track->Charge() < 0){ // for negative tracks kaonTOFfactor *= 1 - TMath::Exp(-TMath::Power(pt,4.87912E-07)/3.26431E-01)*TMath::Power(pt,-1.22893); protonTOFfactor *= 1 - TMath::Exp(-TMath::Power(pt,2.00575E-07)/4.95605E-01)*TMath::Power(pt,-6.71305E-01); } p[3] *= kaonTOFfactor; p[4] *= protonTOFfactor; } else { if ( (usedMask & AliPIDResponse::kDetTRD)==AliPIDResponse::kDetTRD ) { Float_t electronTRDfactor=0.1; Float_t kaonTRDfactor = 0.1; Float_t protonTRDfactor = 0.1; if(track->Charge() > 0){ // positiv charge if(pt > 0.25) electronTRDfactor = 1 - TMath::Exp(-TMath::Power(pt,5.13315e-03)/2.11145e-01)*TMath::Power(pt,-2.97659e+00); if(pt > 0.35) kaonTRDfactor = 1 - TMath::Exp(-TMath::Power(pt,-4.29549e-02)/4.87989e-01)*TMath::Power(pt,-1.54270e+00); if(pt > 0.35) protonTRDfactor = 1 - TMath::Exp(-TMath::Power(pt,2.81238e+00)/7.57082e-02)*TMath::Power(pt,-8.12595e-01); } if(track->Charge() < 0){ // negative charge if(pt > 0.25) electronTRDfactor = 1 - TMath::Exp(-TMath::Power(pt,2.45537e-02)/1.90397e-01)*TMath::Power(pt,-3.33121e+00); if(pt > 0.35) kaonTRDfactor = 1 - TMath::Exp(-TMath::Power(pt, -3.42831e-03)/5.57013e-01)*TMath::Power(pt,-1.39202e+00); if(pt > 0.35) protonTRDfactor = 1 - TMath::Exp(-TMath::Power(pt,3.36631e+00)/7.18819e-02)*TMath::Power(pt,-2.00577e-01); } // what about electrons p[0] *= electronTRDfactor; p[3] *= kaonTRDfactor; p[4] *= protonTRDfactor; } // end of TRD case } // end of detectors inner than TOF } // end of fUseDefaultTPCPriors } // end of use priors else { for (Int_t i=0;iPt()); if(fUseDefaultTPCPriors){ // use default priors if requested Float_t usedCentr = centrality+5*(centrality>0); if(usedCentr < -0.99) usedCentr = -0.99; else if(usedCentr > 99) usedCentr = 99; if(pt > 9.99) pt = 9.99; else if(pt < 0.01) pt = 0.01; for(Int_t i=0;i<5;i++) p[i] = fDefaultPriorsTPC[i]->Interpolate(usedCentr,pt); return; } Double_t sumPriors = 0; for (Int_t i=0;iInterpolate(pt); } else { p[i]=0.; } sumPriors+=p[i]; } // normalizing priors if (sumPriors == 0) return; for (Int_t i=0;iPt()); if(fUseDefaultTPCPriors){ // use default priors if requested Float_t usedCentr = response->GetCurrentCentrality()+5*(response->GetCurrentCentrality()>0); if(usedCentr < -0.99) usedCentr = -0.99; else if(usedCentr > 99) usedCentr = 99; if(pt > 9.99) pt = 9.99; else if(pt < 0.01) pt = 0.01; for(Int_t i=0;i<5;i++) p[i] = fDefaultPriorsTPC[i]->Interpolate(usedCentr,pt); // Extra factor if TOF matching was required if(detUsed & AliPIDResponse::kDetTOF){ Float_t kaonTOFfactor = 0.1; if(pt > 0.35) kaonTOFfactor = 1 - TMath::Exp(-TMath::Power(pt,4.19618E-07)/5.68017E-01)*TMath::Power(pt,-1.50705); Float_t protonTOFfactor = 0.1; if(pt > 0.4) protonTOFfactor = 1 - TMath::Exp(-TMath::Power(pt,3.30978)/8.57396E-02)*TMath::Power(pt,-4.42661E-01); if(track->Charge() < 0){ // for negative tracks kaonTOFfactor *= 1 - TMath::Exp(-TMath::Power(pt,4.87912E-07)/3.26431E-01)*TMath::Power(pt,-1.22893); protonTOFfactor *= 1 - TMath::Exp(-TMath::Power(pt,2.00575E-07)/4.95605E-01)*TMath::Power(pt,-6.71305E-01); } p[3] *= kaonTOFfactor; p[4] *= protonTOFfactor; } return; } Double_t sumPriors = 0; for (Int_t i=0;iInterpolate(pt); } else { p[i]=0.; } sumPriors+=p[i]; } // normalizing priors if (sumPriors == 0) return; for (Int_t i=0;iIsOpen()) { delete foadb; AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data())); return; } AliOADBContainer * priorsContainer = (AliOADBContainer*) foadb->Get("priorsTPC"); if (!priorsContainer) AliFatal("Cannot fetch OADB container for Priors"); const char *namespecies[AliPID::kSPECIES] = {"El","Mu","Pi","Ka","Pr"}; char name[100]; for(Int_t i=0;i < AliPID::kSPECIES;i++){ snprintf(name,99,"hDefault%sPriors",namespecies[i]); fDefaultPriorsTPC[i] = (TH2F*) priorsContainer->GetDefaultObject(name); if (!fDefaultPriorsTPC[i]) AliFatal(Form("Cannot find priors for %s", namespecies[i])); } delete foadb; }