1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //__________________________________________
18 // Class for user selections. Object is created by ConfigJetCorrel.C macro
19 // and passed to AddTaskJetCorrel.C running macro.
20 //-- Author: Paul Constantin
22 #include "AliJetCorrelSelector.h"
25 using namespace JetCorrelHD;
27 ClassImp(AliJetCorrelSelector)
29 AliJetCorrelSelector::AliJetCorrelSelector() :
30 fGenQA(kFALSE), fNumCorrel(0), nEvtTriggs(0), fPoolDepth(0), fCorrelType(NULL), fEvtTriggs(NULL),
31 minTriggPt(0), maxTriggPt(0), bwTriggPt(0), minAssocPt(0), maxAssocPt(0), bwAssocPt(0),
32 fITSRefit(kFALSE), fTPCRefit(kFALSE), fTRDRefit(kFALSE), fRejectKinkChild(kFALSE), fMaxEta(0),
33 fMaxNsigmaVtx(0), fMaxTrkVtx(0), fMaxITSChi2(0), fMaxTPCChi2(0), fMinNClusITS(0), fMinNClusTPC(0), trkMinProx(0) {
34 // (default) constructor
35 fNumBins[centr] = 0; fBinning[centr] = NULL;
36 fNumBins[zvert] = 0; fBinning[zvert] = NULL;
39 AliJetCorrelSelector::~AliJetCorrelSelector(){
41 if(fCorrelType) delete [] fCorrelType;
43 if(fEvtTriggs) delete [] fEvtTriggs;
45 if(fBinning[centr]) delete [] fBinning[centr];
47 if(fBinning[zvert]) delete [] fBinning[zvert];
51 void AliJetCorrelSelector::SetCorrelTypes(UInt_t s, UInt_t * const v){
52 // fills the array of correlation types
53 if(s<1){std::cerr<<"AliJetCorrelSelector::SetCorrelTypes - empty array"<<std::endl; exit(-1);}
54 if(s>kMAXNUMCORREL){std::cerr<<"AliJetCorrelSelector: correlation array too big!"<<std::endl; exit(-1);}
56 fCorrelType = new UInt_t[fNumCorrel];
57 for(UInt_t k=0; k<fNumCorrel; k++){
59 std::cerr<<"AliJetCorrelSelector::SetCorrelTypes - read error? val["<<k<<"]="<<v[k]<<std::endl;
62 else fCorrelType[k] = v[k];
66 void AliJetCorrelSelector::SetTriggers(UInt_t s, TString * const v){
67 // fills the array of event triggers
68 if(s<1){std::cerr<<"AliJetCorrelSelector::SetTriggers - empty array"<<std::endl; exit(-1);}
69 if(s>9){std::cerr<<"AliJetCorrelSelector: event trigger array too big!"<<std::endl; exit(-1);}
71 fEvtTriggs = new TString[nEvtTriggs];
72 for(UInt_t k=0; k<nEvtTriggs; k++){
74 std::cerr<<"AliJetCorrelSelector::SetTriggers - read error? val["<<k<<"]="<<v[k]<<std::endl;
77 else fEvtTriggs[k] = ToUpper(v[k]);
82 void AliJetCorrelSelector::SetBinningCentr(UInt_t s, Float_t * const v){
83 // fills array of centrality bins
84 if(s<1){std::cerr<<"AliJetCorrelSelector::SetBinningCentr - empty array"<<std::endl; exit(-1);}
85 if(s>kMAXCENTBIN){std::cerr<<"AliJetCorrelSelector: centrality array too big!"<<std::endl; exit(-1);}
87 fBinning[centr] = new Float_t[fNumBins[centr]];
88 for(UInt_t k=0; k<fNumBins[centr]; k++){
89 if(TMath::Abs(v[k])>999.){
90 std::cerr<<"AliJetCorrelSelector::SetBinningCentr - read error? val["<<k<<"]="<<v[k]<<std::endl;
93 else fBinning[centr][k] = v[k];
97 void AliJetCorrelSelector::SetBinningZvert(UInt_t s, Float_t * const v){
98 // fills array of vertex bins
99 if(s<1){std::cerr<<"AliJetCorrelSelector::SetBinningZvert - empty array"<<std::endl; exit(-1);}
100 if(s>kMAXVERTBIN){std::cerr<<"AliJetCorrelSelector: vertex array too big!"<<std::endl; exit(-1);}
102 fBinning[zvert] = new Float_t[fNumBins[zvert]];
103 for(UInt_t k=0; k<fNumBins[zvert]; k++){
104 if(TMath::Abs(v[k])>999.){
105 std::cerr<<"AliJetCorrelSelector::SetBinningZvert - read error? val["<<k<<"]="<<v[k]<<std::endl;
108 else fBinning[zvert][k] = v[k];
112 void AliJetCorrelSelector::SetBinningTrigg(Float_t min, Float_t max, Float_t bw){
113 // sets trigger Pt binning
119 void AliJetCorrelSelector::SetBinningAssoc(Float_t min, Float_t max, Float_t bw){
120 // sets associated Pt binning
126 void AliJetCorrelSelector::Show(){
127 // print out all user selections
128 std::cout<<"Generic selections: "<<std::endl<<" PoolDepth="<<fPoolDepth;
129 std::cout<<std::endl<<" Correlation Types: ";
130 for(UInt_t k=0; k<fNumCorrel; k++) std::cout<<fCorrelType[k]<<" ";
131 std::cout<<std::endl<<" Event Triggers: ";
132 for(UInt_t k=0; k<nEvtTriggs; k++) std::cout<<fEvtTriggs[k]<<" ";
133 std::cout<<std::endl<<" Centrality/Multiplicity binning: ";
134 for(UInt_t k=0; k<fNumBins[centr]; k++) std::cout<<fBinning[centr][k]<<" ";
135 std::cout<<std::endl<<" Vertex binning: ";
136 for(UInt_t k=0; k<fNumBins[zvert]; k++) std::cout<<fBinning[zvert][k]<<" ";
137 std::cout<<std::endl<<" Trigg binning:"<<minTriggPt<<"->"<<maxTriggPt<<"/"<<bwTriggPt;
138 std::cout<<std::endl<<" Assoc binning:"<<minAssocPt<<"->"<<maxAssocPt<<"/"<<bwAssocPt;
139 std::cout<<std::endl<<"Track selections: "<<std::endl
140 <<" MaxEta="<<fMaxEta<<" MaxTrkVtx="<<fMaxTrkVtx<<" MaxNsigmaVtx="<<fMaxNsigmaVtx<<std::endl
141 <<" MaxITSChi2="<<fMaxITSChi2<<" MaxTPCChi2="<<fMaxTPCChi2<<std::endl
142 <<" MinNClusITS="<<fMinNClusITS<<" MinNClusTPC="<<fMinNClusTPC<<std::endl
143 <<" ITSRefit="<<fITSRefit<<" TPCRefit="<<fTPCRefit<<" TRDRefit="<<fTRDRefit<<std::endl
144 <<" RejectKinkChild="<<fRejectKinkChild<<" minTrackPairTPCDist="<<trkMinProx<<std::endl;
147 Float_t AliJetCorrelSelector::BinBorder(BinType_t cType, UInt_t k){
148 // returns bin margins
149 if(k<=NoOfBins(cType)) return fBinning[cType][k];
150 else {std::cerr<<"BinBorder Error: bin of type "<<cType<<" outside range "<<k<<std::endl; exit(0);}
153 Int_t AliJetCorrelSelector::GetBin(BinType_t cType, Float_t val){
154 // returns bin number
155 Int_t iBin=-1; UInt_t nBins=NoOfBins(cType);
156 for(UInt_t i=0; i<nBins; i++)
157 if(BinBorder(cType,i)<=val && val<BinBorder(cType,i+1)) iBin=i;
161 //////////////////////////////////////////////////////////
163 /////////////////////////////////////////////////////////
165 Bool_t AliJetCorrelSelector::SelectedEvtTrigger(AliVEvent *fEVT){
166 // matches the event trigger classes with the user trigger classes
167 if(fEVT->InheritsFrom("AliESDEvent")){
168 const AliESDEvent *esd = (AliESDEvent*)fEVT;
169 TString trigClass = esd->GetFiredTriggerClasses();
170 if(nEvtTriggs==1 && fEvtTriggs[0].Contains("ALL")) return kTRUE;
171 for(UInt_t k=0; k<nEvtTriggs; k++)
172 if(trigClass.Contains(fEvtTriggs[k])) return kTRUE;
174 } else {std::cerr<<"AliJetCorrelSelector::SelectedEvtTrigger ERROR: not an ESD event!"<<std::endl; exit(0);}
177 Bool_t AliJetCorrelSelector::CloseTrackPair(Float_t dist){
178 // applies two-track cut (dist at TPC entrance); it is possible that single-track cuts,
179 // like fraction of shared TPC clusters, will avoid inclusion of split tracks...
180 if(dist>trkMinProx) return kFALSE;
184 Bool_t AliJetCorrelSelector::LowQualityTrack(AliESDtrack* track){
185 // selects low quality tracks
186 if(track->Eta()>fMaxEta) return kTRUE;
187 UInt_t status = track->GetStatus();
188 if(fITSRefit && !(status & AliESDtrack::kITSrefit)) return kTRUE;
189 if(fTPCRefit && !(status & AliESDtrack::kTPCrefit)) return kTRUE;
191 // UInt_t nClusITS = track->GetITSclusters(0);
192 // if(nClusITS<fMinNClusITS) return kTRUE;
193 // Float_t chi2ITS=-1.;
194 // if(nClusITS!=0) chi2ITS = track->GetITSchi2()/Float_t(nClusITS);
195 // if(chi2ITS<0 || chi2ITS>fMaxITSChi2) return kTRUE;
197 UInt_t nClusTPC = track->GetTPCclusters(0); // or track->GetTPCNcls() ?
198 if(nClusTPC<fMinNClusTPC) return kTRUE;
200 if(nClusTPC!=0) chi2TPC = track->GetTPCchi2()/Float_t(nClusTPC);
201 if(chi2TPC<0 || chi2TPC>fMaxTPCChi2) return kTRUE;
203 if(fRejectKinkChild && track->GetKinkIndex(0)>0) return kTRUE;
204 // Float_t sigTrkVtx = GetSigmaToVertex(track);
205 // if(sigTrkVtx<0 || sigTrkVtx>fMaxNsigmaVtx) return kTRUE;
206 // instead of track-vertex DCA sigma cut, apply value-cut:
207 Float_t b[2], bCov[3];
208 track->GetImpactParameters(b,bCov);
209 if((b[0]*b[0]+b[1]*b[1])>(fMaxTrkVtx*fMaxTrkVtx)) return kTRUE;
214 Bool_t AliJetCorrelSelector::PassPID(AliESDtrack* track, PartType_t PartType){
215 // checks if a track has the required ID
216 Bool_t hasReqPID = kFALSE;
219 GetPID(track, fPid, fWeight);
223 // if(fPID!=0) hasReqPID = kTRUE;
227 // if(fTRDRefit && !(status & AliESDtrack::kTRDrefit)) hasReqPID = kFALSE;
228 // if(fPID!=0) hasReqPID = kFALSE;
232 // if(fPID!=2) hasReqPID = kFALSE;
236 // if(fPID!=3) hasReqPID = kFALSE;
240 // if(fPID!=4) hasReqPID = kFALSE;
244 std::cerr<<"AliJetCorrelSelector::PassPID() - ERROR: wrong type!"<<std::endl;
250 Float_t AliJetCorrelSelector::GetSigmaToVertex(AliESDtrack* track){
251 // Calculates the number of sigma to the vertex; from ANALYSIS/AliESDtrackCuts
252 Float_t b[2], bRes[2], bCov[3];
253 track->GetImpactParameters(b,bCov);
254 if(bCov[0]<=0 || bCov[2]<=0) return -1.;
255 bRes[0] = TMath::Sqrt(bCov[0]);
256 bRes[1] = TMath::Sqrt(bCov[2]);
258 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
260 if(TMath::Exp(-d*d/2)<1e-10) return 1000;
262 Float_t nSigma = TMath::ErfInverse(1-TMath::Exp(-d*d/2))*TMath::Sqrt(2);
266 void AliJetCorrelSelector::GetPID(AliESDtrack* track, Stat_t& fpid, Stat_t& fweight){
267 // Finds most probable particle: 0=Electron, 1=Muon, 2=Pion, 3=Kaon, 4=Proton
271 Double_t wpart[5], wpartbayes[5];
272 track->GetESDpid(wpart); // probability of the different particle types
273 Double_t c[5]={1., 1., 1., 1., 1.}; // Tentative particle type "concentrations"
274 // Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
278 for(Int_t i=0; i<5; i++) {rcc += c[i]*wpart[i];}
279 if(TMath::Abs(rcc)<1e-10) return;
280 for(Int_t i=0; i<5; i++) {wpartbayes[i] = c[i]*wpart[i]/rcc;}
284 for(Int_t i=0; i<5; i++) {
285 if(wpartbayes[i]>max) {