1 #include "ESDtrackQualityCuts.h"
5 //____________________________________________________________________
6 ClassImp(ESDtrackQualityCuts);
8 //____________________________________________________________________
9 ESDtrackQualityCuts::ESDtrackQualityCuts() {
11 //##############################################################################
12 // setting default cuts
15 SetMaxChi2PerClusterTPC();
16 SetMaxChi2PerClusterITS();
17 SetMaxCovDiagonalElements();
20 SetAcceptKingDaughters();
21 SetMinNsigmaToVertex();
22 SetRequireSigmaToVertex();
27 fCutNames[0] = "require TPC refit";
28 fCutNames[1] = "require ITS refit";
29 fCutNames[2] = "n clusters TPC";
30 fCutNames[3] = "n clusters ITS";
31 fCutNames[4] = "#Chi^{2}/clusters TPC";
32 fCutNames[5] = "#Chi^{2}/clusters ITS";
33 fCutNames[6] = "cov 11";
34 fCutNames[7] = "cov 22";
35 fCutNames[8] = "cov 33";
36 fCutNames[9] = "cov 44";
37 fCutNames[10] = "cov 55";
38 fCutNames[11] = "trk-to-vtx";
39 fCutNames[12] = "trk-to-vtx failed";
40 fCutNames[13] = "kink daughters";
43 //____________________________________________________________________
45 ESDtrackQualityCuts::AcceptTrack(AliESDtrack* esdTrack, AliESDVertex* esdVtx, Double_t field) {
47 // relate the track to the new vertex
48 esdTrack->RelateToVertex(esdVtx, field, 999999);
50 return AcceptTrack(esdTrack);
53 //____________________________________________________________________
55 ESDtrackQualityCuts::AcceptTrack(AliESDtrack* esdTrack, Double_t* vtx, Double_t* vtx_res, Double_t field) {
57 AliESDVertex* esdVtx = new AliESDVertex(vtx, vtx_res,"new vertex");
58 esdTrack->RelateToVertex(esdVtx, field, 1e99);
59 return AcceptTrack(esdTrack);
62 //____________________________________________________________________
64 ESDtrackQualityCuts::AcceptTrack(AliESDtrack* esdTrack) {
66 UInt_t status = esdTrack->GetStatus();
68 // getting variables from ESD
69 Int_t nClustersITS = esdTrack->GetITSclusters(fIdxInt);
70 Int_t nClustersTPC = esdTrack->GetTPCclusters(fIdxInt);
72 Float_t chi2PerClusterITS = -1;
73 Float_t chi2PerClusterTPC = -1;
75 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
77 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
80 esdTrack->GetExternalCovariance(extCov);
85 esdTrack->GetImpactParameters(b,bCov);
86 if (bCov[0]<=0 || bCov[2]<=0) {
87 AliDebug(1, "Estimated b resolution zero!");
90 bRes[0] = TMath::Sqrt(bCov[0]);
91 bRes[1] = TMath::Sqrt(bCov[2]);
94 // FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
96 // 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));
104 //########################################################################
108 for (Int_t i=0; i<fNCuts; i++) cuts[i]=kFALSE;
110 if (fCut_RequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
112 if (fCut_RequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
114 if (nClustersTPC<fCut_MinNClusterTPC)
116 if (nClustersITS<fCut_MinNClusterITS)
118 if (chi2PerClusterTPC>fCut_MaxChi2PerClusterTPC)
120 if (chi2PerClusterITS>fCut_MaxChi2PerClusterITS)
122 if (extCov[0] > fCut_MaxC11)
124 if (extCov[2] > fCut_MaxC22)
126 if (extCov[5] > fCut_MaxC33)
128 if (extCov[9] > fCut_MaxC44)
130 if (extCov[14] > fCut_MaxC55)
132 if (nSigmaToVertex > fCut_NsigmaToVertex)
134 // if n sigma could not be calculated
135 if (nSigmaToVertex==-1 && fCut_SigmaToVertexRequired)
137 if (!fCut_AcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
141 for (Int_t i=0; i<fNCuts; i++)
142 if (cuts[i]) cut = kTRUE;
144 //########################################################################
145 // filling histograms
147 hCutStatistics->Fill(hCutStatistics->GetBinCenter(hCutStatistics->GetXaxis()->FindBin("n tracks")));
150 hCutStatistics->Fill(hCutStatistics->GetBinCenter(hCutStatistics->GetXaxis()->FindBin("n cut tracks")));
152 for (Int_t i=0; i<fNCuts; i++) {
154 hCutStatistics->Fill(hCutStatistics->GetBinCenter(hCutStatistics->GetXaxis()->FindBin(fCutNames[i])));
156 for (Int_t j=i; j<fNCuts; j++) {
157 if (cuts[i] && cuts[j]) {
158 Float_t x = hCutCorrelation->GetXaxis()->GetBinCenter(hCutCorrelation->GetXaxis()->FindBin(fCutNames[i]));
159 Float_t y = hCutCorrelation->GetYaxis()->GetBinCenter(hCutCorrelation->GetYaxis()->FindBin(fCutNames[j]));
160 hCutCorrelation->Fill(x,y);
166 hNClustersITS[0]->Fill(nClustersITS);
167 hNClustersTPC[0]->Fill(nClustersTPC);
168 hChi2PerClusterITS[0]->Fill(chi2PerClusterITS);
169 hChi2PerClusterTPC[0]->Fill(chi2PerClusterTPC);
171 hC11[0]->Fill(extCov[0]);
172 hC22[0]->Fill(extCov[2]);
173 hC33[0]->Fill(extCov[5]);
174 hC44[0]->Fill(extCov[9]);
175 hC55[0]->Fill(extCov[14]);
179 hDXYvsDZ[0]->Fill(b[1],b[0]);
181 if (bRes[0]!=0 && bRes[1]!=0) {
182 hDZNormalized[0]->Fill(b[1]/bRes[1]);
183 hDXYNormalized[0]->Fill(b[0]/bRes[0]);
184 hDXYvsDZNormalized[0]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
188 //########################################################################
190 if (cut) return kFALSE;
192 //########################################################################
193 // filling histograms after cut
195 hNClustersITS[1]->Fill(nClustersITS);
196 hNClustersTPC[1]->Fill(nClustersTPC);
197 hChi2PerClusterITS[1]->Fill(chi2PerClusterITS);
198 hChi2PerClusterTPC[1]->Fill(chi2PerClusterTPC);
200 hC11[1]->Fill(extCov[0]);
201 hC22[1]->Fill(extCov[2]);
202 hC33[1]->Fill(extCov[5]);
203 hC44[1]->Fill(extCov[9]);
204 hC55[1]->Fill(extCov[14]);
208 hDXYvsDZ[1]->Fill(b[1],b[0]);
210 hDZNormalized[1]->Fill(b[1]/bRes[1]);
211 hDXYNormalized[1]->Fill(b[0]/bRes[0]);
212 hDXYvsDZNormalized[1]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
218 //____________________________________________________________________
220 ESDtrackQualityCuts::DefineHistograms(Int_t color) {
224 //###################################################################################
225 // defining histograms
227 hCutStatistics = new TH1F("cut_statistics","cut statistics",fNCuts+4,-0.5,fNCuts+3.5);
229 hCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
230 hCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
232 hCutCorrelation = new TH2F("cut_correlation","cut correlation",fNCuts,-0.5,fNCuts-0.5,fNCuts,-0.5,fNCuts-0.5);;
234 for (Int_t i=0; i<fNCuts; i++) {
235 hCutStatistics->GetXaxis()->SetBinLabel(i+4,fCutNames[i]);
236 hCutCorrelation->GetXaxis()->SetBinLabel(i+1,fCutNames[i]);
237 hCutCorrelation->GetYaxis()->SetBinLabel(i+1,fCutNames[i]);
240 hCutStatistics ->SetLineColor(color);
241 hCutCorrelation ->SetLineColor(color);
242 hCutStatistics ->SetLineWidth(2);
243 hCutCorrelation ->SetLineWidth(2);
246 hNClustersITS = new TH1F*[2];
247 hNClustersTPC = new TH1F*[2];
248 hChi2PerClusterITS = new TH1F*[2];
249 hChi2PerClusterTPC = new TH1F*[2];
259 hDXYvsDZ = new TH2F*[2];
261 hDXYNormalized = new TH1F*[2];
262 hDZNormalized = new TH1F*[2];
263 hDXYvsDZNormalized = new TH2F*[2];
268 for (Int_t i=0; i<2; i++) {
269 if (i==0) sprintf(str,"");
270 else sprintf(str,"_cut");
272 hNClustersITS[i] = new TH1F(Form("nClustersITS%s",str),"",8,-0.5,7.5);
273 hNClustersTPC[i] = new TH1F(Form("nClustersTPC%s",str),"",165,-0.5,164.5);
274 hChi2PerClusterITS[i] = new TH1F(Form("chi2PerClusterITS%s",str),"",500,0,10);
275 hChi2PerClusterTPC[i] = new TH1F(Form("chi2PerClusterTPC%s",str),"",500,0,10);
277 hC11[i] = new TH1F(Form("covMatrixDiagonal11%s",str),"",1000,0,5);
278 hC22[i] = new TH1F(Form("covMatrixDiagonal22%s",str),"",1000,0,5);
279 hC33[i] = new TH1F(Form("covMatrixDiagonal33%s",str),"",1000,0,0.5);
280 hC44[i] = new TH1F(Form("covMatrixDiagonal44%s",str),"",1000,0,5);
281 hC55[i] = new TH1F(Form("covMatrixDiagonal55%s",str),"",1000,0,5);
283 hDXY[i] = new TH1F(Form("dXY%s",str),"",500,-10,10);
284 hDZ[i] = new TH1F(Form("dZ%s",str),"",500,-10,10);
285 hDXYvsDZ[i] = new TH2F(Form("dXYvsDZ%s",str),"",200,-10,10,200,-10,10);
287 hDXYNormalized[i] = new TH1F(Form("dXYNormalized%s",str),"",500,-10,10);
288 hDZNormalized[i] = new TH1F(Form("dZNormalized%s",str),"",500,-10,10);
289 hDXYvsDZNormalized[i] = new TH2F(Form("dXYvsDZNormalized%s",str),"",200,-10,10,200,-10,10);
292 hNClustersITS[i] ->SetXTitle("n ITS clusters");
293 hNClustersTPC[i] ->SetXTitle("n TPC clusters");
294 hChi2PerClusterITS[i] ->SetXTitle("#Chi^{2} per ITS cluster");
295 hChi2PerClusterTPC[i] ->SetXTitle("#Chi^{2} per TPC cluster");
297 hC11[i] ->SetXTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
298 hC22[i] ->SetXTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
299 hC33[i] ->SetXTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
300 hC44[i] ->SetXTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
301 hC55[i] ->SetXTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
303 hDXY[i] ->SetXTitle("transverse impact parameter");
304 hDZ[i] ->SetXTitle("longitudinal impact parameter");
305 hDXYvsDZ[i] ->SetXTitle("longitudinal impact parameter");
306 hDXYvsDZ[i] ->SetYTitle("transverse impact parameter");
308 hDXYNormalized[i] ->SetXTitle("normalized trans impact par");
309 hDZNormalized[i] ->SetXTitle("normalized long impact par");
310 hDXYvsDZNormalized[i] ->SetXTitle("normalized long impact par");
311 hDXYvsDZNormalized[i] ->SetYTitle("normalized trans impact par");
313 hNClustersITS[i] ->SetLineColor(color); hNClustersITS[i] ->SetLineWidth(2);
314 hNClustersTPC[i] ->SetLineColor(color); hNClustersTPC[i] ->SetLineWidth(2);
315 hChi2PerClusterITS[i] ->SetLineColor(color); hChi2PerClusterITS[i] ->SetLineWidth(2);
316 hChi2PerClusterTPC[i] ->SetLineColor(color); hChi2PerClusterTPC[i] ->SetLineWidth(2);
318 hC11[i] ->SetLineColor(color); hC11[i] ->SetLineWidth(2);
319 hC22[i] ->SetLineColor(color); hC22[i] ->SetLineWidth(2);
320 hC33[i] ->SetLineColor(color); hC33[i] ->SetLineWidth(2);
321 hC44[i] ->SetLineColor(color); hC44[i] ->SetLineWidth(2);
322 hC55[i] ->SetLineColor(color); hC55[i] ->SetLineWidth(2);
324 hDXY[i] ->SetLineColor(color); hDXY[i] ->SetLineWidth(2);
325 hDZ[i] ->SetLineColor(color); hDZ[i] ->SetLineWidth(2);
327 hDXYNormalized[i] ->SetLineColor(color); hDXYNormalized[i] ->SetLineWidth(2);
328 hDZNormalized[i] ->SetLineColor(color); hDZNormalized[i] ->SetLineWidth(2);
333 //____________________________________________________________________
335 ESDtrackQualityCuts::SaveHistograms(Char_t* dir) {
337 if (!fHistogramsOn) {
338 AliDebug(0, "Histograms not on - cannot save histograms!!!");
342 gDirectory->mkdir(dir);
345 gDirectory->mkdir("before_cuts");
346 gDirectory->mkdir("after_cuts");
348 hCutStatistics->Write();
349 hCutCorrelation->Write();
351 for (Int_t i=0; i<2; i++) {
353 gDirectory->cd("before_cuts");
355 gDirectory->cd("after_cuts");
357 hNClustersITS[i] ->Write();
358 hNClustersTPC[i] ->Write();
359 hChi2PerClusterITS[i] ->Write();
360 hChi2PerClusterTPC[i] ->Write();
370 hDXYvsDZ[i] ->Write();
372 hDXYNormalized[i] ->Write();
373 hDZNormalized[i] ->Write();
374 hDXYvsDZNormalized[i] ->Write();
376 gDirectory->cd("../");
379 gDirectory->cd("../");