/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id: $ */ //__________________________________________ // Class for user selections. // Object is created by ConfigJetCorrel.C macro and passed to // AddTaskJetCorrel.C running macro via the main class AliAnalysisTaskJetCorrel //-- Author: Paul Constantin #include "AliJetCorrelSelector.h" using namespace std; ClassImp(AliJetCorrelSelector) AliJetCorrelSelector::AliJetCorrelSelector() : fGenQA(kFALSE), fDPhiNumBins(0), fDEtaNumBins(0), fNumCorrel(0), fNumEvtTriggs(0), fPoolDepth(0), fCorrelType(NULL), fEvtTriggs(NULL), fITSRefit(kFALSE), fTPCRefit(kFALSE), fTRDRefit(kFALSE), fRejectKinkChild(kFALSE), fMaxEta(0), fMaxNsigmaVtx(0), fMaxTrkVtx(0), fMaxITSChi2(0), fMaxTPCChi2(0), fMinNClusITS(0), fMinNClusTPC(0), fTrkMinProx(0), fUseAliKF(kFALSE) { // (default) constructor fNumBins[centr] = 0; fBinning[centr] = NULL; fNumBins[zvert] = 0; fBinning[zvert] = NULL; fNumBins[trigg] = 0; fBinning[trigg] = NULL; fNumBins[assoc] = 0; fBinning[assoc] = NULL; } AliJetCorrelSelector::~AliJetCorrelSelector(){ // destructor if(fCorrelType) delete [] fCorrelType; fNumCorrel = 0; if(fEvtTriggs) delete [] fEvtTriggs; fNumEvtTriggs = 0; if(fBinning[centr]) delete [] fBinning[centr]; fNumBins[centr] = 0; if(fBinning[zvert]) delete [] fBinning[zvert]; fNumBins[zvert] = 0; if(fBinning[trigg]) delete [] fBinning[trigg]; fNumBins[trigg] = 0; if(fBinning[assoc]) delete [] fBinning[assoc]; fNumBins[assoc] = 0; } void AliJetCorrelSelector::SetCorrelTypes(UInt_t s, UInt_t * const v){ // fills the array of correlation types if(s<1){std::cerr<<"AliJetCorrelSelector::SetCorrelTypes - empty array"<kMaxCorrel){std::cerr<<"AliJetCorrelSelector: correlation array too big!"<99){ std::cerr<<"AliJetCorrelSelector::SetCorrelTypes - read error? val["<9){std::cerr<<"AliJetCorrelSelector: event trigger array too big!"<kMaxCent){std::cerr<<"AliJetCorrelSelector: centrality array too big!"<999.){ std::cerr<<"AliJetCorrelSelector::SetBinningCentr - read error? val["<kMaxVert){std::cerr<<"AliJetCorrelSelector: vertex array too big!"<999.){ std::cerr<<"AliJetCorrelSelector::SetBinningZvert - read error? val["<kMaxTrig){std::cerr<<"AliJetCorrelSelector: trigger array too big!"<999.){ std::cerr<<"AliJetCorrelSelector::SetBinningTrigg - read error? val["<kMaxAsso){std::cerr<<"AliJetCorrelSelector: associated array too big!"<999.){ std::cerr<<"AliJetCorrelSelector::SetBinningAssoc - read error? val["<GetFiredTriggerClasses(); if(fNumEvtTriggs==1 && fEvtTriggs[0].Contains("ALL")) return kTRUE; for(UInt_t k=0; kfTrkMinProx) return kFALSE; return kTRUE; } Bool_t AliJetCorrelSelector::LowQualityTrack(AliESDtrack* track) const { // selects low quality tracks if(track->Eta()>fMaxEta) return kTRUE; UInt_t status = track->GetStatus(); if(track->Pt()>5 && fITSRefit && !(status & AliESDtrack::kITSrefit)) return kTRUE; if(fTPCRefit && !(status & AliESDtrack::kTPCrefit)) return kTRUE; // UInt_t nClusITS = track->GetITSclusters(0); // if(nClusITSGetITSchi2()/Float_t(nClusITS); // if(chi2ITS<0 || chi2ITS>fMaxITSChi2) return kTRUE; UInt_t nClusTPC = track->GetTPCclusters(0); // or track->GetTPCNcls() ? if(nClusTPCGetTPCchi2()/Float_t(nClusTPC); if(chi2TPC<0 || chi2TPC>fMaxTPCChi2) return kTRUE; if(fRejectKinkChild && track->GetKinkIndex(0)>0) return kTRUE; // Float_t sigTrkVtx = GetSigmaToVertex(track); // if(sigTrkVtx<0 || sigTrkVtx>fMaxNsigmaVtx) return kTRUE; // instead of track-vertex DCA sigma cut, apply value-cut: Float_t b[2], bCov[3]; track->GetImpactParameters(b,bCov); if((b[0]*b[0]+b[1]*b[1])>(fMaxTrkVtx*fMaxTrkVtx)) return kTRUE; return kFALSE; } Bool_t AliJetCorrelSelector::PassPID(AliESDtrack* track, PartType_t PartType) const { // checks if a track has the required ID Bool_t hasReqPID = kFALSE; Stat_t fPid; Stat_t fWeight; GetPID(track, fPid, fWeight); switch(PartType){ case hadron: // if(fPID!=0) hasReqPID = kTRUE; hasReqPID = kTRUE; break; case electron: // if(fTRDRefit && !(status & AliESDtrack::kTRDrefit)) hasReqPID = kFALSE; // if(fPID!=0) hasReqPID = kFALSE; hasReqPID = kTRUE; break; case pion: // if(fPID!=2) hasReqPID = kFALSE; hasReqPID = kTRUE; break; case kaon: // if(fPID!=3) hasReqPID = kFALSE; hasReqPID = kTRUE; break; case proton: // if(fPID!=4) hasReqPID = kFALSE; hasReqPID = kTRUE; break; default: std::cerr<<"AliJetCorrelSelector::PassPID() - ERROR: wrong type!"<GetImpactParameters(b,bCov); if(bCov[0]<=0 || bCov[2]<=0) return -1.; bRes[0] = TMath::Sqrt(bCov[0]); bRes[1] = TMath::Sqrt(bCov[2]); Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2)); if(TMath::Exp(-d*d/2)<1e-10) return 1000; Float_t nSigma = TMath::ErfInverse(1-TMath::Exp(-d*d/2))*TMath::Sqrt(2); return nSigma; } void AliJetCorrelSelector::GetPID(AliESDtrack* track, Stat_t& fpid, Stat_t& fweight) const { // Finds most probable particle: 0=Electron, 1=Muon, 2=Pion, 3=Kaon, 4=Proton fpid = -1; fweight = -1; Double_t wpart[5], wpartbayes[5]; track->GetESDpid(wpart); // probability of the different particle types Double_t c[5]={1., 1., 1., 1., 1.}; // Tentative particle type "concentrations" // Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05}; //Bayes formula Double_t rcc = 0.; for(Int_t i=0; i<5; i++) {rcc += c[i]*wpart[i];} if(TMath::Abs(rcc)<1e-10) return; for(Int_t i=0; i<5; i++) {wpartbayes[i] = c[i]*wpart[i]/rcc;} Int_t ipid=-1; Float_t max=0.; for(Int_t i=0; i<5; i++) { if(wpartbayes[i]>max) { ipid = i; max = wpartbayes[i]; } } fpid = ipid; fweight = max; }