/************************************************************************* * 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. * **************************************************************************/ /////////////////////////////////////////////////////////////////////////// // Dielectron PID // // // // // /* Detailed description */ // // /////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include "AliDielectronVarManager.h" #include "AliDielectronPID.h" ClassImp(AliDielectronPID) TGraph *AliDielectronPID::fgFitCorr=0x0; Double_t AliDielectronPID::fgCorr=0.0; AliDielectronPID::AliDielectronPID() : AliAnalysisCuts(), fNcuts(0), fESDpid(0x0), fAODpidUtil(0x0) { // // Default Constructor // for (Int_t icut=0; icut(track); //TODO: Which momentum to use? // Different momenta for different detectors? Double_t mom=part->P(); Bool_t selected=kFALSE; fESDpid=AliDielectronVarManager::GetESDpid(); fAODpidUtil=AliDielectronVarManager::GetAODpidUtil(); for (UChar_t icut=0; icut1e-20) && (mom<=pMin || mom>pMax) ) continue; switch (fDetType[icut]){ case kITS: selected = IsSelectedITS(part,icut); break; case kTPC: selected = IsSelectedTPC(part,icut); break; case kTRD: selected = IsSelectedTRD(part,icut); break; case kTOF: selected = IsSelectedTOF(part,icut); break; } if (!selected) return kFALSE; } return selected; } //______________________________________________ Bool_t AliDielectronPID::IsSelectedITS(AliVTrack * const part, Int_t icut) { // // ITS part of the PID check // Don't accept the track if there was no pid bit set // Float_t numberOfSigmas=-1000.; if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!(part->GetStatus()&AliESDtrack::kITSpid)) return kFALSE; if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!(part->GetStatus()&AliESDtrack::kITSpid)) return kTRUE; Double_t mom=part->P(); if (part->IsA()==AliESDtrack::Class()){ // ESD case in case the PID bit is not set, don't use this track! AliESDtrack *track=static_cast(part); numberOfSigmas=fESDpid->NumberOfSigmasITS(track, fPartType[icut]); }else if(part->IsA()==AliAODTrack::Class()){ // AOD case // FIXME: Is there a place to check whether the PID is was set in ESD??? AliAODTrack *track=static_cast(part); numberOfSigmas=fAODpidUtil->NumberOfSigmasITS(track, fPartType[icut]); } // test if we are supposed to use a function for the cut if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom); if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom); Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut]; return selected; } //______________________________________________ Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut) { // // TPC part of the PID check // Don't accept the track if there was no pid bit set // Float_t numberOfSigmas=-1000.; if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!(part->GetStatus()&AliESDtrack::kTPCpid)) return kFALSE; if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!(part->GetStatus()&AliESDtrack::kTPCpid)) return kTRUE; Double_t mom=part->P(); if (part->IsA()==AliESDtrack::Class()){ // ESD case in case the PID bit is not set, don't use this track! AliESDtrack *track=static_cast(part); const AliExternalTrackParam *in = track->GetInnerParam(); if (in) mom = in->GetP(); numberOfSigmas=fESDpid->NumberOfSigmasTPC(track, fPartType[icut]); }else if(part->IsA()==AliAODTrack::Class()){ // AOD case // FIXME: Is there a place to check whether the PID is was set in ESD??? AliAODTrack *track=static_cast(part); const AliAODPid *pidObj = track->GetDetPid(); if (pidObj) mom = pidObj->GetTPCmomentum(); numberOfSigmas=fAODpidUtil->NumberOfSigmasTPC(track, fPartType[icut]); } if (fPartType[icut]==AliPID::kElectron){ numberOfSigmas-=fgCorr; } // test if we are supposed to use a function for the cut if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom); if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom); Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut]; return selected; } //______________________________________________ Bool_t AliDielectronPID::IsSelectedTRD(AliVTrack * const /*part*/, Int_t /*icut*/) { // // TRD part of the pid check // return kFALSE; } //______________________________________________ Bool_t AliDielectronPID::IsSelectedTOF(AliVTrack * const part, Int_t icut) { // // TOF part of the PID check // Don't accept the track if there was no pid bit set // Float_t numberOfSigmas=-1000.; if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!(part->GetStatus()&AliESDtrack::kTOFpid)) return kFALSE; if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!(part->GetStatus()&AliESDtrack::kTOFpid)) return kTRUE; if (part->IsA()==AliESDtrack::Class()){ // ESD case in case the PID bit is not set, don't use this track! AliESDtrack *track=static_cast(part); numberOfSigmas=fESDpid->NumberOfSigmasTOF(track, fPartType[icut], fESDpid->GetTOFResponse().GetTimeZero()); }else if(part->IsA()==AliAODTrack::Class()){ // AOD case // FIXME: Is there a place to check whether the PID is was set in ESD??? AliAODTrack *track=static_cast(part); numberOfSigmas=fAODpidUtil->NumberOfSigmasTOF(track, fPartType[icut]); } Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut]; return selected; } //______________________________________________ void AliDielectronPID::SetDefaults(Int_t def){ // // initialise default pid strategies // if (def==0){ // 2sigma bands TPC: // - include e // - exclude mu,K,pi,p // -complete p range AddCut(kTPC,AliPID::kElectron,2); AddCut(kTPC,AliPID::kMuon,-2.,2.,0.,0.,kTRUE); AddCut(kTPC,AliPID::kPion,-2.,2.,0.,0.,kTRUE); AddCut(kTPC,AliPID::kKaon,-2.,2.,0.,0.,kTRUE); AddCut(kTPC,AliPID::kProton,-2.,2.,0.,0.,kTRUE); } else if (def==1) { // 2sigma bands TPC: // - include e 0SetParameters(-2.7,-0.4357); AddCut(kTPC,AliPID::kElectron,lowerCut,3.); AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5); } else if (def==7) { // wide TPC cut // TOF ele band 3sigma 0SetParameters(-2.65,-0.6757); AddCut(kTPC,AliPID::kElectron,lowerCut,4.); AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable); } else if (def==10) { AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable); AddCut(kTPC,AliPID::kElectron,3.); AddCut(kTPC,AliPID::kPion,-3.,3.,0.,0.,kTRUE); AddCut(kTPC,AliPID::kProton,-3.,3.,0.,0.,kTRUE); } } //______________________________________________ void AliDielectronPID::SetCorrVal(Double_t run) { // // set correction value for run // fgCorr=0; if (!fgFitCorr) return; fgCorr=fgFitCorr->Eval(run); if (runGetX()[0]) fgCorr=fgFitCorr->GetY()[0]; if (run>fgFitCorr->GetX()[fgFitCorr->GetN()-1]) fgCorr=fgFitCorr->GetY()[fgFitCorr->GetN()-1]; // printf("Corr: %f\n",fgCorr); }