1 #include "AliESDtrackCuts.h"
5 //____________________________________________________________________
6 ClassImp(AliESDtrackCuts)
8 //____________________________________________________________________
9 AliESDtrackCuts::AliESDtrackCuts() {
11 //##############################################################################
12 // setting default cuts
16 SetMaxChi2PerClusterTPC();
17 SetMaxChi2PerClusterITS();
18 SetMaxCovDiagonalElements();
21 SetAcceptKingDaughters();
22 SetMinNsigmaToVertex();
23 SetRequireSigmaToVertex();
35 fCutNames[0] = "require TPC refit";
36 fCutNames[1] = "require ITS refit";
37 fCutNames[2] = "n clusters TPC";
38 fCutNames[3] = "n clusters ITS";
39 fCutNames[4] = "#Chi^{2}/clusters TPC";
40 fCutNames[5] = "#Chi^{2}/clusters ITS";
41 fCutNames[6] = "cov 11";
42 fCutNames[7] = "cov 22";
43 fCutNames[8] = "cov 33";
44 fCutNames[9] = "cov 44";
45 fCutNames[10] = "cov 55";
46 fCutNames[11] = "trk-to-vtx";
47 fCutNames[12] = "trk-to-vtx failed";
48 fCutNames[13] = "kink daughters";
51 fCutNames[15] = "p_{T}";
52 fCutNames[16] = "p_{x}";
53 fCutNames[17] = "p_{y}";
54 fCutNames[18] = "p_{z}";
56 fCutNames[20] = "eta";
60 //____________________________________________________________________
62 AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
64 // figure out if the tracks survives all the track cuts defined
67 UInt_t status = esdTrack->GetStatus();
69 // getting quality parameters from the ESD track
70 Int_t nClustersITS = esdTrack->GetITSclusters(fIdxInt);
71 Int_t nClustersTPC = esdTrack->GetTPCclusters(fIdxInt);
73 Float_t chi2PerClusterITS = -1;
74 Float_t chi2PerClusterTPC = -1;
76 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
78 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
81 esdTrack->GetExternalCovariance(extCov);
83 // getting the track to vertex parameters
87 esdTrack->GetImpactParameters(b,bCov);
88 if (bCov[0]<=0 || bCov[2]<=0) {
89 AliDebug(1, "Estimated b resolution zero!");
92 bRes[0] = TMath::Sqrt(bCov[0]);
93 bRes[1] = TMath::Sqrt(bCov[2]);
95 // FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
97 // this is not correct - it will not give n sigma!!!
99 Float_t nSigmaToVertex = -1;
100 if (bRes[0]!=0 && bRes[1]!=0)
101 nSigmaToVertex = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
103 // getting the kinematic variables of the track
104 // (assuming the mass is known)
106 esdTrack->GetPxPyPz(p);
107 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
108 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
109 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
111 //y-eta related calculations
114 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
115 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
116 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
117 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
120 //########################################################################
124 for (Int_t i=0; i<fNCuts; i++) cuts[i]=kFALSE;
126 // track quality cuts
127 if (fCut_RequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
129 if (fCut_RequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
131 if (nClustersTPC<fCut_MinNClusterTPC)
133 if (nClustersITS<fCut_MinNClusterITS)
135 if (chi2PerClusterTPC>fCut_MaxChi2PerClusterTPC)
137 if (chi2PerClusterITS>fCut_MaxChi2PerClusterITS)
139 if (extCov[0] > fCut_MaxC11)
141 if (extCov[2] > fCut_MaxC22)
143 if (extCov[5] > fCut_MaxC33)
145 if (extCov[9] > fCut_MaxC44)
147 if (extCov[14] > fCut_MaxC55)
149 if (nSigmaToVertex > fCut_NsigmaToVertex)
151 // if n sigma could not be calculated
152 if (nSigmaToVertex<0 && fCut_SigmaToVertexRequired)
154 if (!fCut_AcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
156 // track kinematics cut
157 if((momentum < fPMin) || (momentum > fPMax))
159 if((pt < fPtMin) || (pt > fPtMax))
161 if((p[0] < fPxMin) || (p[0] > fPxMax))
163 if((p[1] < fPyMin) || (p[1] > fPyMax))
165 if((p[2] < fPzMin) || (p[2] > fPzMax))
167 if((eta < fEtaMin) || (eta > fEtaMax))
169 if((y < fRapMin) || (y > fRapMax))
173 for (Int_t i=0; i<fNCuts; i++)
174 if (cuts[i]) cut = kTRUE;
176 //########################################################################
177 // filling histograms
179 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
182 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
184 for (Int_t i=0; i<fNCuts; i++) {
186 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fCutNames[i])));
188 for (Int_t j=i; j<fNCuts; j++) {
189 if (cuts[i] && cuts[j]) {
190 Float_t x = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fCutNames[i]));
191 Float_t y = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fCutNames[j]));
192 fhCutCorrelation->Fill(x,y);
198 fhNClustersITS[0]->Fill(nClustersITS);
199 fhNClustersTPC[0]->Fill(nClustersTPC);
200 fhChi2PerClusterITS[0]->Fill(chi2PerClusterITS);
201 fhChi2PerClusterTPC[0]->Fill(chi2PerClusterTPC);
203 fhC11[0]->Fill(extCov[0]);
204 fhC22[0]->Fill(extCov[2]);
205 fhC33[0]->Fill(extCov[5]);
206 fhC44[0]->Fill(extCov[9]);
207 fhC55[0]->Fill(extCov[14]);
210 fhDXY[0]->Fill(b[0]);
211 fhDXYvsDZ[0]->Fill(b[1],b[0]);
213 if (bRes[0]!=0 && bRes[1]!=0) {
214 fhDZNormalized[0]->Fill(b[1]/bRes[1]);
215 fhDXYNormalized[0]->Fill(b[0]/bRes[0]);
216 fhDXYvsDZNormalized[0]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
220 //########################################################################
222 if (cut) return kFALSE;
224 //########################################################################
225 // filling histograms after cut
227 fhNClustersITS[1]->Fill(nClustersITS);
228 fhNClustersTPC[1]->Fill(nClustersTPC);
229 fhChi2PerClusterITS[1]->Fill(chi2PerClusterITS);
230 fhChi2PerClusterTPC[1]->Fill(chi2PerClusterTPC);
232 fhC11[1]->Fill(extCov[0]);
233 fhC22[1]->Fill(extCov[2]);
234 fhC33[1]->Fill(extCov[5]);
235 fhC44[1]->Fill(extCov[9]);
236 fhC55[1]->Fill(extCov[14]);
239 fhDXY[1]->Fill(b[0]);
240 fhDXYvsDZ[1]->Fill(b[1],b[0]);
242 fhDZNormalized[1]->Fill(b[1]/bRes[1]);
243 fhDXYNormalized[1]->Fill(b[0]/bRes[0]);
244 fhDXYvsDZNormalized[1]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
250 //____________________________________________________________________
252 AliESDtrackCuts::GetAcceptedTracks(AliESD* esd) {
254 // returns an array of all tracks that pass the cuts
255 fAcceptedTracks->Clear();
257 // loop over esd tracks
258 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
259 AliESDtrack* track = esd->GetTrack(iTrack);
261 if(AcceptTrack(track)) fAcceptedTracks->Add(track);
264 return fAcceptedTracks;
267 //____________________________________________________________________
268 void AliESDtrackCuts::DefineHistograms(Int_t color) {
272 // //###################################################################################
273 // defining histograms
275 fhCutStatistics = new TH1F("cut_statistics","cut statistics",fNCuts+4,-0.5,fNCuts+3.5);
277 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
278 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
280 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",fNCuts,-0.5,fNCuts-0.5,fNCuts,-0.5,fNCuts-0.5);;
282 for (Int_t i=0; i<fNCuts; i++) {
283 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fCutNames[i]);
284 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fCutNames[i]);
285 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fCutNames[i]);
288 fhCutStatistics ->SetLineColor(color);
289 fhCutCorrelation ->SetLineColor(color);
290 fhCutStatistics ->SetLineWidth(2);
291 fhCutCorrelation ->SetLineWidth(2);
294 TH1F *fhNClustersITS = new TH1F[2];
295 TH1F *fhNClustersTPC = new TH1F[2];
296 TH1F *fhChi2PerClusterITS = new TH1F[2];
297 TH1F *fhChi2PerClusterTPC = new TH1F[2];
299 TH1F *fhC11 = new TH1F[2];
300 TH1F *fhC22 = new TH1F[2];
301 TH1F *fhC33 = new TH1F[2];
302 TH1F *fhC44 = new TH1F[2];
303 TH1F *fhC55 = new TH1F[2];
305 TH1F *fhDXY = new TH1F[2];
306 TH1F *fhDZ = new TH1F[2];
307 TH2F *fhDXYvsDZ = new TH2F[2];
309 TH1F *fhDXYNormalized = new TH1F[2];
310 TH1F *fhDZNormalized = new TH1F[2];
311 TH2F *fhDXYvsDZNormalized = new TH2F[2];
315 for (Int_t i=0; i<2; i++) {
316 if (i==0) sprintf(str," ");
317 else sprintf(str,"_cut");
319 fhNClustersITS[i] = TH1F(Form("nClustersITS%s",str),"",8,-0.5,7.5);
320 fhNClustersTPC[i] = TH1F(Form("nClustersTPC%s",str),"",165,-0.5,164.5);
321 fhChi2PerClusterITS[i] = TH1F(Form("chi2PerClusterITS%s",str),"",500,0,10);
322 fhChi2PerClusterTPC[i] = TH1F(Form("chi2PerClusterTPC%s",str),"",500,0,10);
324 fhC11[i] = TH1F(Form("covMatrixDiagonal11%s",str),"",1000,0,5);
325 fhC22[i] = TH1F(Form("covMatrixDiagonal22%s",str),"",1000,0,5);
326 fhC33[i] = TH1F(Form("covMatrixDiagonal33%s",str),"",1000,0,0.5);
327 fhC44[i] = TH1F(Form("covMatrixDiagonal44%s",str),"",1000,0,5);
328 fhC55[i] = TH1F(Form("covMatrixDiagonal55%s",str),"",1000,0,5);
330 fhDXY[i] = TH1F(Form("dXY%s",str),"",500,-10,10);
331 fhDZ[i] = TH1F(Form("dZ%s",str),"",500,-10,10);
332 fhDXYvsDZ[i] = TH2F(Form("dXYvsDZ%s",str),"",200,-10,10,200,-10,10);
334 fhDXYNormalized[i] = TH1F(Form("dXYNormalized%s",str),"",500,-10,10);
335 fhDZNormalized[i] = TH1F(Form("dZNormalized%s",str),"",500,-10,10);
336 fhDXYvsDZNormalized[i] = TH2F(Form("dXYvsDZNormalized%s",str),"",200,-10,10,200,-10,10);
339 fhNClustersITS[i].SetXTitle("n ITS clusters");
340 fhNClustersTPC[i].SetXTitle("n TPC clusters");
341 fhChi2PerClusterITS[i].SetXTitle("#Chi^{2} per ITS cluster");
342 fhChi2PerClusterTPC[i].SetXTitle("#Chi^{2} per TPC cluster");
344 fhC11[i].SetXTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
345 fhC22[i].SetXTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
346 fhC33[i].SetXTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
347 fhC44[i].SetXTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
348 fhC55[i].SetXTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
350 fhDXY[i].SetXTitle("transverse impact parameter");
351 fhDZ[i].SetXTitle("longitudinal impact parameter");
352 fhDXYvsDZ[i].SetXTitle("longitudinal impact parameter");
353 fhDXYvsDZ[i].SetYTitle("transverse impact parameter");
355 fhDXYNormalized[i].SetXTitle("normalized trans impact par");
356 fhDZNormalized[i].SetXTitle("normalized long impact par");
357 fhDXYvsDZNormalized[i].SetXTitle("normalized long impact par");
358 fhDXYvsDZNormalized[i].SetYTitle("normalized trans impact par");
360 fhNClustersITS[i].SetLineColor(color); fhNClustersITS[i].SetLineWidth(2);
361 fhNClustersTPC[i].SetLineColor(color); fhNClustersTPC[i].SetLineWidth(2);
362 fhChi2PerClusterITS[i].SetLineColor(color); fhChi2PerClusterITS[i].SetLineWidth(2);
363 fhChi2PerClusterTPC[i].SetLineColor(color); fhChi2PerClusterTPC[i].SetLineWidth(2);
365 fhC11[i].SetLineColor(color); fhC11[i].SetLineWidth(2);
366 fhC22[i].SetLineColor(color); fhC22[i].SetLineWidth(2);
367 fhC33[i].SetLineColor(color); fhC33[i].SetLineWidth(2);
368 fhC44[i].SetLineColor(color); fhC44[i].SetLineWidth(2);
369 fhC55[i].SetLineColor(color); fhC55[i].SetLineWidth(2);
371 fhDXY[i].SetLineColor(color); fhDXY[i].SetLineWidth(2);
372 fhDZ[i].SetLineColor(color); fhDZ[i].SetLineWidth(2);
374 fhDXYNormalized[i].SetLineColor(color); fhDXYNormalized[i].SetLineWidth(2);
375 fhDZNormalized[i].SetLineColor(color); fhDZNormalized[i].SetLineWidth(2);
380 //____________________________________________________________________
382 AliESDtrackCuts::Print(const Option_t*) const {
384 AliInfo("AliESDtrackCuts...");
388 //____________________________________________________________________
389 void AliESDtrackCuts::SaveHistograms(Char_t* dir) {
391 if (!fHistogramsOn) {
392 AliDebug(0, "Histograms not on - cannot save histograms!!!");
396 gDirectory->mkdir(dir);
399 gDirectory->mkdir("before_cuts");
400 gDirectory->mkdir("after_cuts");
402 fhCutStatistics->Write();
403 fhCutCorrelation->Write();
405 for (Int_t i=0; i<2; i++) {
407 gDirectory->cd("before_cuts");
409 gDirectory->cd("after_cuts");
411 fhNClustersITS[i] ->Write();
412 fhNClustersTPC[i] ->Write();
413 fhChi2PerClusterITS[i] ->Write();
414 fhChi2PerClusterTPC[i] ->Write();
424 fhDXYvsDZ[i] ->Write();
426 fhDXYNormalized[i] ->Write();
427 fhDZNormalized[i] ->Write();
428 fhDXYvsDZNormalized[i] ->Write();
430 gDirectory->cd("../");
433 gDirectory->cd("../");