2 #if !defined(__CINT__) || defined(__MAKECINT__)
13 #include <TClonesArray.h>
18 #include "AliRunLoader.h"
20 #include "AliESDEvent.h"
21 #include "AliESDtrack.h"
22 #include "AliTrackReference.h"
23 #include "AliITSsegmentationUpgrade.h"
27 Bool_t IsTrackable(TClonesArray *trackRef);
30 void efficiency(char *title="",Bool_t isPrimary=kTRUE){
32 gSystem->Load("libITSUpgradeBase");
33 gSystem->Load("libITSUpgradeRec");
34 gSystem->Load("libITSUpgradeSim");
36 // setting up the configuration to be considered
37 AliITSsegmentationUpgrade *seg = new AliITSsegmentationUpgrade();
39 printf("no segmentation info available... Exiting");
42 radii.Set(seg->GetNLayers());
43 for(Int_t l=0; l<seg->GetNLayers(); l++){
44 radii.AddAt(seg->GetRadius(l),l);
48 TString titlet(title);
49 titlet.ReplaceAll(" ","");
51 gROOT->SetStyle("Plain");
52 gStyle->SetPalette(1);
53 gStyle->SetOptStat(0);
54 gStyle->SetOptTitle(0);
62 TH1F *hPtRec = new TH1F("hPtRec"," p_{T} distribution of reconstructed tracks",nbins,0,ptmax);
63 hPtRec->SetXTitle("p_{T}");
64 hPtRec->SetYTitle(Form("entries / %3.0f MeV/c",1000*(ptmax/nbins)));
66 TH1F *hPtRecMc = new TH1F("hPtRecMc"," MC p_{T} distribution of reconstructed tracks",nbins,0,ptmax);
67 hPtRecMc->SetXTitle("p_{T} GeV/c");
68 hPtRecMc->SetYTitle(Form("entries / %3.0f MeV/c",1000*(ptmax/nbins)));
70 TH1F *hPtRecGood = new TH1F("hPtRecGood"," P_{t} distribution of reconstructed tracks [positive labels]",nbins,0,ptmax);
71 hPtRecGood->SetXTitle("p_{T} GeV/c");
72 hPtRecGood->SetYTitle(Form("entries / %3.0f MeV/c",1000*(ptmax/nbins)));
74 TH1F *hPtMc = new TH1F("hPtMc", " p_{T} distribution of MC tracks",nbins,0,ptmax);
75 hPtMc->SetXTitle("p_{T} GeV/c");
76 hPtMc->SetYTitle(Form("entries / %3.0f MeV/c",1000*(ptmax/nbins)));
80 Double_t eta[2]={-1.2,1.2};
82 TH1F *hEtaRec = new TH1F("hEtaRec"," #eta distribution of reconstructed tracks",nbinsEta,eta[0],eta[1]);
83 hEtaRec->SetXTitle("#eta");
84 hEtaRec->SetYTitle(Form("entries / %3.3f ",((eta[1]-eta[0])/nbinsEta)));
86 TH1F *hEtaRecMc = new TH1F("hEtaRecMc"," #eta Mc distribution of reconstructed tracks",nbinsEta,eta[0],eta[1]);
87 hEtaRecMc->SetXTitle("#eta");
88 hEtaRecMc->SetYTitle(Form("entries / %3.3f ",((eta[1]-eta[0])/nbinsEta)));
90 TH1F *hEtaRecGood = new TH1F("hEtaRecGood"," #eta distribution of Good reconstructed tracks",nbinsEta,eta[0],eta[1]);
91 hEtaRecGood->SetXTitle("#eta");
92 hEtaRecGood->SetYTitle(Form("entries / %3.3f ",((eta[1]-eta[0])/nbinsEta)));
94 TH1F *hEtaMc = new TH1F("hEtaMc", " #eta distribution of MC tracks",nbinsEta,eta[0],eta[1]);
95 hEtaMc->SetXTitle("#eta");
96 hEtaMc->SetYTitle(Form("entries / %3.3f ",((eta[1]-eta[0])/nbinsEta)));
106 AliRunLoader* runLoader = AliRunLoader::Open("galice.root");
108 Error("OpengAlice", "no files, please check the path");
111 runLoader->LoadgAlice();
112 gAlice = runLoader->GetAliRun();
113 runLoader->LoadHeader();
114 runLoader->LoadKinematics();
115 runLoader->LoadTrackRefs();
118 TTree *trackRefTree = 0x0;
119 TClonesArray *trackRef = new TClonesArray("AliTrackReference",1000);
122 TFile* esdFile = TFile::Open("AliESDs.root");
123 if (!esdFile || !esdFile->IsOpen()) {
124 Error("CheckESD", "opening ESD file %s failed", "AliESDs.root");
127 AliESDEvent * esd = new AliESDEvent;
128 TTree* tree = (TTree*) esdFile->Get("esdTree");
130 Error("CheckESD", "no ESD tree found");
133 esd->ReadFromTree(tree);
135 printf("setting the low pt value to %f \n",ptlimit);
138 for(Int_t i=0; i<runLoader->GetNumberOfEvents(); i++){
139 //for(Int_t i=0; i< 1; i++){
140 cout << "Event "<< i << endl;
141 runLoader->GetEvent(i);
143 AliStack *stack = runLoader->Stack();
144 trackRefTree=runLoader->TreeTR();
145 TBranch *br = trackRefTree->GetBranch("TrackReferences");
147 printf("no TR branch available , exiting \n");
150 br->SetAddress(&trackRef);
152 Int_t nParticles = stack->GetNtrack();
153 trackRefTree=runLoader->TreeTR();
154 trackRefTree->SetBranchAddress("TrackReferences",&trackRef);
155 for(Int_t p=0; p<nParticles; p++){
156 if(stack->Particle(p)->Pt()<ptlimit) continue;
157 if(isPrimary && !stack->IsPhysicalPrimary(p)) continue;
158 trackRefTree->GetEntry(stack->TreeKEntry(p));
160 if(IsTrackable(trackRef)) {
162 hPtMc->Fill((stack->Particle(p))->Pt());
163 hEtaMc->Fill((stack->Particle(p))->Eta());
165 }//loop on kine particle
166 cout << " # trackable "<< cont;
170 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
171 AliESDtrack* track = esd->GetTrack(iTrack);
172 if(track->Pt()<ptlimit) continue;
173 if(isPrimary && !stack->IsPhysicalPrimary(TMath::Abs(track->GetLabel()))) continue;
174 if(track->GetNcls(0)<minNpoints) continue; // selection compatible with IsSelected
176 hPtRec->Fill(track->Pt());
177 hEtaRec->Fill(track->Eta());
178 if(track->GetLabel()>=0) {
179 hPtRecGood->Fill(stack->Particle(track->GetLabel())->Pt());
180 hEtaRecGood->Fill(stack->Particle(track->GetLabel())->Eta());
182 hPtRecMc->Fill(stack->Particle(TMath::Abs(track->GetLabel()))->Pt());
183 hEtaRecMc->Fill(stack->Particle(TMath::Abs(track->GetLabel()))->Eta());
185 cout << " tracks " << ntrack << endl;
189 cout << "Global Efficiency "<< ntrack/cont << endl;
191 TCanvas *c = new TCanvas();
196 c->cd()->SetObjectStat(0);
197 hPtMc->SetMarkerStyle(20);
199 hPtRec->SetLineColor(kRed);
200 hPtRec->SetMarkerStyle(20);
201 hPtRec->SetMarkerColor(kRed);
203 hPtRec->Draw("sameerr");
204 hPtRecMc->SetLineColor(kBlue);
205 hPtRecMc->SetMarkerStyle(20);
206 hPtRecMc->SetMarkerColor(kBlue);
208 hPtRecMc->Draw("sameerr");
209 hPtRecGood->SetLineColor(kGreen);
210 hPtRecGood->SetMarkerStyle(20);
211 hPtRecGood->SetMarkerColor(kGreen);
213 hPtRecGood->Draw("sameerr");
215 TLegend *leg = new TLegend(0.5,0.7,0.99,0.95);
216 leg->SetHeader(Form("%s",title));
217 leg->AddEntry(hPtRecGood,"Good tracks (positive labels)","p");
218 leg->AddEntry(hPtRec,"Reconstructed tracks (Rec p_{T})","p");
219 leg->AddEntry(hPtRecMc,"Reconstructed tracks ","p");
220 leg->AddEntry(hPtMc,"MC trackable particles","p");
222 c->SaveAs(Form("ptdist_%s.png",titlet.Data()));
224 TCanvas *cc = new TCanvas();
226 cc->cd()->SetGridy();
227 cc->cd()->SetGridx();
231 TH1F *effrec=new TH1F("hEffRec","tracking efficiency of reconstructed tracks",nbins,0,ptmax);
232 effrec->Divide(hPtRecMc,hPtMc,1,1,"b");
233 effrec->SetXTitle("p_{T} GeV/c");
234 effrec->SetLineColor(kBlue);
235 effrec->SetMarkerStyle(20);
236 effrec->SetMarkerColor(kBlue);
237 effrec->SetMaximum(max);
238 effrec->SetMinimum(0);
239 effrec->DrawCopy("err");
242 TH1F *effrecgood=new TH1F("hEffRecGood","tracking efficiency of reconstructed tracks [positive labels]",nbins,0,ptmax);
243 effrecgood->SetXTitle("P_{T}");
244 effrecgood->Divide(hPtRecGood,hPtMc,1,1,"b");
245 effrecgood->SetLineColor(kGreen);
246 effrecgood->SetMarkerStyle(20);
247 effrecgood->SetMarkerColor(kGreen);
248 effrecgood->SetMaximum(max);
249 effrecgood->SetMinimum(0);
250 effrecgood->DrawCopy("sameerr");
252 TH1F *purity=new TH1F("purity","track purity [positive labels / all tracks]",nbins,0,ptmax);
253 purity->Divide(hPtRecGood,hPtRecMc,1,1,"b");
254 purity->SetLineColor(kGray);
255 purity->SetMarkerStyle(28);
256 purity->SetMarkerColor(kOrange);
257 purity->SetMaximum(max);
258 purity->SetMinimum(0);
259 purity->DrawCopy("sameerr");
261 TH1F *fakes=new TH1F("fakes","fake ratio [negative labels / reconstructable]",nbins,0,ptmax);
263 fakes->Add(hPtRecMc,hPtRecGood,1,-1);
264 fakes->Divide(hPtMc);
265 fakes->SetLineColor(kViolet);
266 fakes->SetLineStyle(3);
267 fakes->SetLineWidth(3);
268 fakes->SetMarkerColor(kViolet);
269 fakes->SetMaximum(max);
270 fakes->SetMinimum(0);
271 fakes->DrawCopy("samehist");
273 TLegend *legEff = new TLegend(0.1,0.83,0.65,0.99);
274 legEff->SetHeader(Form("%s",title));
275 legEff->AddEntry(effrec,"Overall Efficiency ","p");
276 legEff->AddEntry(effrecgood,"Efficiency good tracks (positive labels)","p");
277 legEff->AddEntry(purity,"Purity (positive labels / All tracks)","p");
278 legEff->AddEntry(fakes,"Fakes","l");
281 cc->SaveAs(Form("efficiency_%s.png",titlet.Data()));
284 TCanvas *cEta = new TCanvas();
286 cEta->cd()->SetGridy();
287 cEta->cd()->SetGridx();
288 cEta->cd()->SetObjectStat(0);
289 hEtaMc->SetMarkerStyle(20);
291 hEtaMc->SetMinimum(0);
292 hEtaRec->SetLineColor(kRed);
293 hEtaRec->SetMarkerStyle(20);
294 hEtaRec->SetMarkerColor(kRed);
296 hEtaRec->Draw("sameerr");
297 hEtaRecMc->SetLineColor(kBlue);
298 hEtaRecMc->SetMarkerStyle(20);
299 hEtaRecMc->SetMarkerColor(kBlue);
301 hEtaRecMc->Draw("sameerr");
302 hEtaRecGood->SetLineColor(kGreen);
303 hEtaRecGood->SetMarkerStyle(20);
304 hEtaRecGood->SetMarkerColor(kGreen);
305 hEtaRecGood->Sumw2();
306 hEtaRecGood->Draw("sameerr");
308 TLegend *legEta = new TLegend(0.2,0.3,0.59,0.55);
309 legEta->SetHeader(Form("%s",title));
310 legEta->AddEntry(hEtaRecGood,"Good tracks (positive labels)","p");
311 legEta->AddEntry(hEtaRec,"Reconstructed tracks (Rec p_{T})","p");
312 legEta->AddEntry(hEtaRecMc,"Reconstructed tracks ","p");
313 legEta->AddEntry(hEtaMc,"MC trackable particles","p");
315 cEta->SaveAs(Form("etadist_%s.png",title));
317 TCanvas *ccEta = new TCanvas();
319 ccEta->cd()->SetGridy();
320 ccEta->cd()->SetGridx();
322 TH1F *effrecEta=new TH1F("hEffRecEta","#eta tracking efficiency of reconstructed tracks",nbinsEta,eta[0],eta[1]);
323 effrecEta->Divide(hEtaRecMc,hEtaMc,1,1,"b");
324 effrecEta->SetXTitle("#eta");
325 effrecEta->SetLineColor(kBlue);
326 effrecEta->SetMarkerStyle(20);
327 effrecEta->SetMarkerColor(kBlue);
328 effrecEta->SetMaximum(max);
329 effrecEta->SetMinimum(0);
330 effrecEta->DrawCopy("err");
333 TH1F *effrecgoodEta=new TH1F("hEffRecGoodEta","#eta tracking efficiency of reconstructed tracks [positive labels]",nbinsEta,eta[0],eta[1]);
334 effrecgoodEta->SetXTitle("eta");
335 effrecgoodEta->Divide(hEtaRecGood,hEtaMc,1,1,"b");
336 effrecgoodEta->SetLineColor(kGreen);
337 effrecgoodEta->SetMarkerStyle(20);
338 effrecgoodEta->SetMarkerColor(kGreen);
339 effrecgoodEta->SetMaximum(max);
340 effrecgoodEta->SetMinimum(0);
341 effrecgoodEta->DrawCopy("sameerr");
343 TH1F *purityEta=new TH1F("purityEta","#eta track purity [positive labels / all tracks]",nbinsEta,eta[0],eta[1]);
344 purityEta->Divide(hEtaRecGood,hEtaRecMc,1,1,"b");
345 purityEta->SetLineColor(kGray);
346 purityEta->SetMarkerStyle(28);
347 purityEta->SetMarkerColor(kOrange);
348 purityEta->SetMaximum(max);
349 purityEta->SetMinimum(0);
350 purityEta->DrawCopy("sameerr");
352 TH1F *fakesEta=new TH1F("fakesEta","#eta fake ratio [negative labels / reconstructable]",nbinsEta,eta[0],eta[1]);
353 fakesEta->Add(hEtaRecMc,hEtaRecGood,1,-1);
354 fakesEta->Divide(hEtaMc);
355 fakesEta->SetLineColor(kViolet);
356 fakesEta->SetLineStyle(3);
357 fakesEta->SetLineWidth(3);
358 fakesEta->SetMarkerColor(kViolet);
359 fakesEta->SetMaximum(max);
360 fakesEta->SetMinimum(0);
361 fakesEta->DrawCopy("samehist");
363 TLegend *legEffEta = new TLegend(0.3,0.3,0.75,0.55);
364 legEffEta->SetHeader(Form("%s",title));
365 legEffEta->AddEntry(effrecEta,"Overall Efficiency ","p");
366 legEffEta->AddEntry(effrecgoodEta,"Efficiency good tracks (positive labels)","p");
367 legEffEta->AddEntry(purityEta,"Purity (positive labels / All tracks)","p");
368 legEffEta->AddEntry(fakesEta,"Fakes","l");
371 ccEta->SaveAs(Form("efficiencyEta_%s.png",titlet.Data()));
376 //___________________________________________________
377 Bool_t IsTrackable(TClonesArray *trackRef){
382 TArrayF isInLayer(radii.GetSize());
383 for(Int_t l=0; l<radii.GetSize(); l++ ) isInLayer.AddAt(0,l);
384 for(Int_t nT =0; nT<trackRef->GetEntries(); nT++){
385 AliTrackReference *trR = (AliTrackReference*)trackRef->At(nT);
387 if(trR->DetectorId()!=0)continue;
388 Double_t rPart = TMath::Sqrt(trR->X()*trR->X()+trR->Y()*trR->Y());
389 for(Int_t iLay=0;iLay<radii.GetSize();iLay++){
390 if(TMath::Abs(rPart-radii.At(iLay))<0.01) isInLayer.AddAt(1,iLay);
394 for(Int_t iLayer=0;iLayer<radii.GetSize();iLayer++){
395 if(isInLayer.At(iLayer)) nTrackRef++;
398 if(nTrackRef>=minNpoints) isOk=kTRUE;