1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /////////////////////////////////////////////////////
\r
18 // Check basic detector results at ESD level
\r
19 // - Geometrical efficiency
\r
20 // - Tracking efficiency
\r
21 // - PID efficiency
\r
22 // - Refit efficiency
\r
25 // Alex Bercuci <A.Bercuci@gsi.de>
\r
27 //////////////////////////////////////////////////////
\r
29 #include <TClonesArray.h>
\r
30 #include <TCanvas.h>
\r
31 #include <TObjArray.h>
\r
33 #include <TLegend.h>
\r
41 #include <TProfile2D.h>
\r
42 #include <TProfile.h>
\r
43 #include <TGraphErrors.h>
\r
44 #include <TGraphAsymmErrors.h>
\r
49 #include <TParticle.h>
\r
50 #include <TTimeStamp.h>
\r
53 #include "AliAnalysisManager.h"
\r
54 #include "AliESDEvent.h"
\r
55 #include "AliESDkink.h"
\r
56 #include "AliMCEvent.h"
\r
57 #include "AliESDInputHandler.h"
\r
58 #include "AliMCEventHandler.h"
\r
60 #include "AliESDtrack.h"
\r
61 #include "AliMCParticle.h"
\r
63 #include "AliStack.h"
\r
64 #include "AliTrackReference.h"
\r
66 #include "AliTRDcheckESD.h"
\r
68 ClassImp(AliTRDcheckESD)
\r
70 const Float_t AliTRDcheckESD::fgkxTPC = 290.;
\r
71 const Float_t AliTRDcheckESD::fgkxTOF = 365.;
\r
72 const UChar_t AliTRDcheckESD::fgkNgraph[AliTRDcheckESD::kNrefs] ={
\r
74 FILE* AliTRDcheckESD::fgFile = NULL;
\r
76 const Float_t AliTRDcheckESD::fgkEvVertexZ = 15.;
\r
77 const Int_t AliTRDcheckESD::fgkEvVertexN = 1;
\r
78 const Float_t AliTRDcheckESD::fgkTrkDCAxy = 40.;
\r
79 const Float_t AliTRDcheckESD::fgkTrkDCAz = 15.;
\r
80 const Int_t AliTRDcheckESD::fgkNclTPC = 100;
\r
81 const Float_t AliTRDcheckESD::fgkPt = 0.2;
\r
82 const Float_t AliTRDcheckESD::fgkEta = 0.9;
\r
83 const Float_t AliTRDcheckESD::fgkQs = 0.002;
\r
85 //____________________________________________________________________
\r
86 AliTRDcheckESD::AliTRDcheckESD():
\r
96 // Default constructor
\r
98 SetNameTitle("TRDcheckESD", "Check TRD @ ESD level");
\r
102 //____________________________________________________________________
\r
103 AliTRDcheckESD::AliTRDcheckESD(char* name):
\r
104 AliAnalysisTaskSE(name)
\r
113 // Default constructor
\r
116 SetTitle("Check TRD @ ESD level");
\r
117 DefineOutput(1, TObjArray::Class());
\r
120 //____________________________________________________________________
\r
121 AliTRDcheckESD::~AliTRDcheckESD()
\r
125 //fHistos->Delete();
\r
129 fResults->Delete();
\r
134 //____________________________________________________________________
\r
135 void AliTRDcheckESD::UserCreateOutputObjects()
\r
138 // Create Output Containers (TObjectArray containing 1D histograms)
\r
141 PostData(1, fHistos);
\r
144 //____________________________________________________________________
\r
145 void AliTRDcheckESD::MakeSummary(){
\r
146 TCanvas *cOut = new TCanvas(Form("summary%s1", GetName()), Form("Summary 1 for task %s", GetName()), 1024, 768);
\r
149 cOut->SaveAs(Form("TRDsummary%s1.gif", GetName()));
\r
151 cOut = new TCanvas(Form("summary%s2", GetName()), Form("Summary 2 for task %s", GetName()), 1024, 768);
\r
154 cOut->SaveAs(Form("TRDsummary%s2.gif", GetName()));
\r
157 //____________________________________________________________________
\r
158 Bool_t AliTRDcheckESD::GetRefFigure(Int_t ifig)
\r
160 if(ifig>=fNRefFigures){
\r
161 AliWarning(Form("Ref plot %d not available. Valid only up to %d", ifig, fNRefFigures));
\r
165 AliWarning("Please provide a canvas to draw results.");
\r
168 gPad->SetLogx(0);gPad->SetLogy(0);
\r
169 gPad->SetMargin(0.125, 0.015, 0.1, 0.015);
\r
172 const Char_t *title[20];
\r
175 TH1 *hFeffP(NULL); TH1 *hFeffN(NULL);
\r
176 TH2 *h2F(NULL); TH2 *h2Feff(NULL);
\r
177 TH2 *h2FtpcP(NULL); TH2 *h2FtpcN(NULL);
\r
178 TH2 *h2FtrdP(NULL); TH2 *h2FtrdN(NULL);
\r
180 if((hF=(TH1S*)gROOT->FindObject("hFcheckESD"))) delete hF;
\r
181 TLegend *leg(NULL);
\r
182 TList *l(NULL); TVirtualPad *pad(NULL);
\r
183 TGraphErrors *g(NULL);TGraphAsymmErrors *ga(NULL);
\r
184 TObjArray *arr(NULL);
\r
185 TProfile2D *hProf2D(NULL);
\r
186 TProfile *hProf(NULL);
\r
187 TLatex *lat=new TLatex();
\r
188 lat->SetTextSize(0.07);
\r
189 lat->SetTextColor(2);
\r
192 TF1* fitFunc(NULL);
\r
194 case kNCl: // number of clusters/track
\r
195 if(!(arr = (TObjArray*)fResults->At(kNCl))) return kFALSE;
\r
197 leg = new TLegend(.83, .7, .99, .96);
\r
198 leg->SetHeader("Species");
\r
199 leg->SetBorderSize(0); leg->SetFillStyle(0);
\r
200 for(Int_t ig(0); ig<fgkNgraph[kNCl]; ig++){
\r
201 if(!(g = (TGraphErrors*)arr->At(ig))) return kFALSE;
\r
202 if(!g->GetN()) continue;
\r
203 g->Draw(ig?"pc":"apc"); leg->AddEntry(g, g->GetTitle(), "pl");
\r
205 hF=g->GetHistogram();
\r
206 hF->SetXTitle("no of clusters");
\r
207 hF->SetYTitle("entries");
\r
208 hF->GetYaxis()->CenterTitle(1);
\r
209 hF->GetYaxis()->SetTitleOffset(1.2);
\r
212 leg->Draw(); gPad->SetLogy();
\r
214 case kTRDstat: // Efficiency
\r
215 if(!(arr = (TObjArray*)fResults->At(kTRDstat))) return kFALSE;
\r
216 leg = new TLegend(.62, .77, .98, .98);
\r
217 leg->SetHeader("TRD Efficiency");
\r
218 leg->SetBorderSize(0); leg->SetFillStyle(0);
\r
219 title[0] = "Geometrical (TRDin/TPCout)";
\r
220 title[1] = "Tracking (TRDout/TRDin)";
\r
221 title[2] = "PID (TRDpid/TRDin)";
\r
222 title[3] = "Refit (TRDrefit/TRDin)";
\r
223 hF = new TH1S("hFcheckESD", ";p [GeV/c];Efficiency", 10, 0.1, 10.);
\r
224 hF->SetMaximum(1.4);
\r
225 hF->GetXaxis()->SetMoreLogLabels();
\r
226 hF->GetYaxis()->CenterTitle(1);
\r
228 for(Int_t ig(0); ig<fgkNgraph[kTRDstat]; ig++){
\r
229 if(!(g = (TGraphErrors*)arr->At(ig))) return kFALSE;
\r
230 g->Draw("pl"); leg->AddEntry(g, title[ig], "pl");
\r
231 //PutTrendValue(name[id], g->GetMean(2));
\r
232 //PutTrendValue(Form("%sRMS", name[id]), g->GetRMS(2));
\r
234 leg->Draw(); gPad->SetLogx();
\r
236 case kTRDmom: // Energy loss
\r
237 if(!(arr = (TObjArray*)fResults->At(kTRDmom))) return kFALSE;
\r
238 leg = new TLegend(.65, .7, .95, .99);
\r
239 leg->SetHeader("Energy Loss");
\r
240 leg->SetBorderSize(1); leg->SetFillColor(0);
\r
241 title[0] = "Max & 90% quantile";
\r
242 title[1] = "Mean & 60% quantile";
\r
243 hF = new TH1S("hFcheckESD", ";layer;#Delta E", 6, -0.5, 5.5);
\r
244 hF->SetMaximum(1.3);hF->SetMinimum(-.3);
\r
246 for(Int_t ig(0); ig<fgkNgraph[kTRDmom]; ig++){
\r
247 if(!(ga = (TGraphAsymmErrors*)arr->At(ig))) return kFALSE;
\r
248 ga->Draw("pl"); leg->AddEntry(ga, title[ig], "pl");
\r
249 //PutTrendValue(name[id], g->GetMean(2));
\r
250 //PutTrendValue(Form("%sRMS", name[id]), g->GetRMS(2));
\r
252 leg->Draw();gPad->SetLogx(kFALSE);
\r
254 case kPtRes: // Pt resolution @ vertex
\r
255 if(!(arr = (TObjArray*)fResults->At(kPtRes))) return kFALSE;
\r
256 gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives();
\r
257 pad = ((TVirtualPad*)l->At(0)); pad->cd(); pad->SetLogx();
\r
258 pad->SetMargin(0.1, 0.022, 0.1, 0.023);
\r
259 hF = new TH1S("hFcheckESD", "ITS+TPC+TRD;p_{t} [GeV/c];#Delta p_{t} / p_{t} [%]", 10, 0.2, 10.);
\r
260 hF->SetMaximum(10.);hF->SetMinimum(-3.);
\r
261 hF->GetXaxis()->SetMoreLogLabels();
\r
262 hF->GetXaxis()->SetTitleOffset(1.2);
\r
263 hF->GetYaxis()->CenterTitle();
\r
265 //for(Int_t ig(0); ig<fgkNgraph[kPtRes]/2; ig++){
\r
266 for(Int_t ig(2); ig<6; ig++){
\r
267 if(!(g = (TGraphErrors*)arr->At(ig))) continue;
\r
268 if(!g->GetN()) continue;
\r
270 //PutTrendValue(name[id], g->GetMean(2));
\r
271 //PutTrendValue(Form("%sRMS", name[id]), g->GetRMS(2));
\r
273 pad = ((TVirtualPad*)l->At(1)); pad->cd(); pad->SetLogx();
\r
274 pad->SetMargin(0.1, 0.22, 0.1, 0.023);
\r
275 hF = (TH1*)hF->Clone("hFcheckESD1");
\r
276 hF->SetTitle("ITS+TPC");
\r
277 hF->SetMaximum(10.);hF->SetMinimum(-3.);
\r
279 leg = new TLegend(.78, .1, .99, .98);
\r
280 leg->SetHeader("P_{t} @ DCA");
\r
281 leg->SetBorderSize(1); leg->SetFillColor(0);
\r
282 leg->SetTextAlign(22);
\r
283 leg->SetTextFont(12);
\r
284 leg->SetTextSize(0.03813559);
\r
287 //for(Int_t ig(fgkNgraph[kPtRes]/2); ig<fgkNgraph[kPtRes]; ig++){
\r
288 for(Int_t ig(12); ig<16; ig++){
\r
289 if(!(g = (TGraphErrors*)arr->At(ig))) continue;
\r
290 if(!g->GetN()) continue;
\r
292 g->Draw("pl"); leg->AddEntry(g, g->GetTitle(), "pl");
\r
293 //PutTrendValue(name[id], g->GetMean(2));
\r
294 //PutTrendValue(Form("%sRMS", name[id]), g->GetRMS(2));
\r
296 if(nPlots) leg->Draw();
\r
299 case 4: // plot a 3x3 canvas with tracking related histograms
\r
300 gPad->SetTopMargin(0.05); gPad->SetBottomMargin(0.001);
\r
301 gPad->SetLeftMargin(0.001); gPad->SetRightMargin(0.001);
\r
302 gPad->Divide(3,3,0.,0.);
\r
303 l=gPad->GetListOfPrimitives();
\r
304 // eta-phi distr. for positive TPC tracks
\r
305 pad = ((TVirtualPad*)l->At(0)); pad->cd();
\r
306 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
307 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
308 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
309 h3F = dynamic_cast<TH3F*>(fHistos->At(kTPCRefTracksPos));
\r
310 h2FtpcP = (TH2F*)Proj3D((TH3F*)h3F, 0x0, 1, h3F->GetZaxis()->GetNbins(), nada)->Clone();
\r
311 h2FtpcP->GetXaxis()->SetTitle("#eta");
\r
312 h2FtpcP->GetXaxis()->CenterTitle();
\r
313 h2FtpcP->GetXaxis()->SetTitleSize(0.07);
\r
314 h2FtpcP->GetXaxis()->SetTitleOffset(0.8);
\r
315 h2FtpcP->GetXaxis()->SetLabelSize(0.05);
\r
316 h2FtpcP->GetYaxis()->SetTitle("detector #varphi");
\r
317 h2FtpcP->GetYaxis()->CenterTitle();
\r
318 h2FtpcP->GetYaxis()->SetTitleSize(0.07);
\r
319 h2FtpcP->GetYaxis()->SetTitleOffset(0.8);
\r
320 h2FtpcP->GetYaxis()->SetLabelSize(0.05);
\r
321 h2FtpcP->SetTitle("");
\r
322 h2FtpcP->Draw("colz");
\r
323 lat->DrawLatex(-0.9, 3.6, "TPC positive ref. tracks");
\r
324 //-----------------
\r
325 // eta-phi distr. for negative TPC tracks
\r
326 pad = ((TVirtualPad*)l->At(1)); pad->cd();
\r
327 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
328 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
329 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
330 h3F = dynamic_cast<TH3F*>(fHistos->At(kTPCRefTracksNeg));
\r
331 h2FtpcN = (TH2F*)Proj3D((TH3F*)h3F, 0x0, 1, h3F->GetZaxis()->GetNbins(), nada)->Clone();
\r
332 h2FtpcN->GetXaxis()->SetTitle("#eta");
\r
333 h2FtpcN->GetXaxis()->CenterTitle();
\r
334 h2FtpcN->GetXaxis()->SetTitleSize(0.07);
\r
335 h2FtpcN->GetXaxis()->SetTitleOffset(0.8);
\r
336 h2FtpcN->GetXaxis()->SetLabelSize(0.05);
\r
337 h2FtpcN->GetYaxis()->SetTitle("detector #varphi");
\r
338 h2FtpcN->GetYaxis()->CenterTitle();
\r
339 h2FtpcN->GetYaxis()->SetTitleSize(0.07);
\r
340 h2FtpcN->GetYaxis()->SetTitleOffset(0.8);
\r
341 h2FtpcN->GetYaxis()->SetLabelSize(0.05);
\r
342 h2FtpcN->SetTitle("");
\r
343 h2FtpcN->Draw("colz");
\r
344 lat->DrawLatex(-0.9, 3.6, "TPC negative ref. tracks");
\r
345 // eta-phi distr. for positive TRD tracks
\r
346 pad = ((TVirtualPad*)l->At(3)); pad->cd();
\r
347 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
348 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
349 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
350 h3F = dynamic_cast<TH3F*>(fHistos->At(kTRDRefTracksPos));
\r
351 h2FtrdP = (TH2F*)Proj3D((TH3F*)h3F, 0x0, 1, h3F->GetZaxis()->GetNbins(), nada)->Clone();
\r
352 h2FtrdP->GetXaxis()->SetTitle("#eta");
\r
353 h2FtrdP->GetXaxis()->CenterTitle();
\r
354 h2FtrdP->GetXaxis()->SetTitleSize(0.07);
\r
355 h2FtrdP->GetXaxis()->SetTitleOffset(0.8);
\r
356 h2FtrdP->GetXaxis()->SetLabelSize(0.05);
\r
357 h2FtrdP->GetYaxis()->SetTitle("detector #varphi");
\r
358 h2FtrdP->GetYaxis()->CenterTitle();
\r
359 h2FtrdP->GetYaxis()->SetTitleSize(0.07);
\r
360 h2FtrdP->GetYaxis()->SetTitleOffset(0.8);
\r
361 h2FtrdP->GetYaxis()->SetLabelSize(0.05);
\r
362 h2FtrdP->SetMaximum(h2FtpcP->GetMaximum());
\r
363 h2FtrdP->SetTitle("");
\r
364 h2FtrdP->Draw("colz");
\r
365 lat->DrawLatex(-0.9, 3.6, "TRD positive ref. tracks");
\r
366 //-----------------
\r
367 // eta-phi distr. for negative TRD tracks
\r
368 pad = ((TVirtualPad*)l->At(4)); pad->cd();
\r
369 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
370 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
371 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
372 h3F = dynamic_cast<TH3F*>(fHistos->At(kTRDRefTracksNeg));
\r
373 h2FtrdN = (TH2F*)Proj3D((TH3F*)h3F, 0x0, 1, h3F->GetZaxis()->GetNbins(), nada)->Clone();
\r
374 h2FtrdN->GetXaxis()->SetTitle("#eta");
\r
375 h2FtrdN->GetXaxis()->CenterTitle();
\r
376 h2FtrdN->GetXaxis()->SetTitleSize(0.07);
\r
377 h2FtrdN->GetXaxis()->SetTitleOffset(0.8);
\r
378 h2FtrdN->GetXaxis()->SetLabelSize(0.05);
\r
379 h2FtrdN->GetYaxis()->SetTitle("detector #varphi");
\r
380 h2FtrdN->GetYaxis()->CenterTitle();
\r
381 h2FtrdN->GetYaxis()->SetTitleSize(0.07);
\r
382 h2FtrdN->GetYaxis()->SetTitleOffset(0.8);
\r
383 h2FtrdN->GetYaxis()->SetLabelSize(0.05);
\r
384 h2FtrdN->SetMaximum(h2FtpcN->GetMaximum());
\r
385 h2FtrdN->SetTitle("");
\r
386 h2FtrdN->Draw("colz");
\r
387 lat->DrawLatex(-0.9, 3.6, "TRD negative ref. tracks");
\r
388 // eta-phi efficiency for positive TRD tracks
\r
389 pad = ((TVirtualPad*)l->At(6)); pad->cd();
\r
390 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
391 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
392 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
393 h2Feff = (TH2F*)h2FtrdP->Clone();
\r
395 h2Feff->Divide(h2FtrdP, h2FtpcP);
\r
396 h2Feff->GetXaxis()->SetTitle("#eta");
\r
397 h2Feff->GetXaxis()->CenterTitle();
\r
398 h2Feff->GetXaxis()->SetTitleSize(0.07);
\r
399 h2Feff->GetXaxis()->SetTitleOffset(0.8);
\r
400 h2Feff->GetXaxis()->SetLabelSize(0.05);
\r
401 h2Feff->GetYaxis()->SetTitle("detector #varphi");
\r
402 h2Feff->GetYaxis()->CenterTitle();
\r
403 h2Feff->GetYaxis()->SetTitleSize(0.07);
\r
404 h2Feff->GetYaxis()->SetTitleOffset(0.8);
\r
405 h2Feff->GetYaxis()->SetLabelSize(0.05);
\r
406 h2Feff->SetMaximum(1.0);
\r
407 h2Feff->SetTitle("");
\r
408 h2Feff->Draw("colz");
\r
409 lat->DrawLatex(-0.9, 3.6, "Efficiency positive tracks");
\r
410 // eta-phi efficiency for negative TRD tracks
\r
411 pad = ((TVirtualPad*)l->At(7)); pad->cd();
\r
412 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
413 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
414 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
415 h2Feff = (TH2F*)h2FtrdN->Clone();
\r
417 h2Feff->Divide(h2FtrdN, h2FtpcN);
\r
418 h2Feff->GetXaxis()->SetTitle("#eta");
\r
419 h2Feff->GetXaxis()->CenterTitle();
\r
420 h2Feff->GetXaxis()->SetTitleSize(0.07);
\r
421 h2Feff->GetXaxis()->SetTitleOffset(0.8);
\r
422 h2Feff->GetXaxis()->SetLabelSize(0.05);
\r
423 h2Feff->GetYaxis()->SetTitle("detector #varphi");
\r
424 h2Feff->GetYaxis()->CenterTitle();
\r
425 h2Feff->GetYaxis()->SetTitleSize(0.07);
\r
426 h2Feff->GetYaxis()->SetTitleOffset(0.8);
\r
427 h2Feff->GetYaxis()->SetLabelSize(0.05);
\r
428 h2Feff->SetMaximum(1.0);
\r
429 h2Feff->SetTitle("");
\r
430 h2Feff->Draw("colz");
\r
431 lat->DrawLatex(-0.9, 3.6, "Efficiency negative tracks");
\r
433 // <ntracklets> vs (phi,eta)
\r
434 pad = ((TVirtualPad*)l->At(2)); pad->cd();
\r
435 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
436 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
437 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
438 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvNtrkl));
\r
439 hProf2D->SetStats(kFALSE);
\r
440 hProf2D->SetTitle("");
\r
441 hProf2D->GetXaxis()->SetTitle("#eta");
\r
442 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
443 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
444 hProf2D->GetXaxis()->CenterTitle();
\r
445 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
446 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
447 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
448 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
449 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
450 hProf2D->GetYaxis()->CenterTitle();
\r
451 hProf2D->SetMinimum(0.);
\r
452 hProf2D->SetMaximum(6.);
\r
453 hProf2D->Draw("colz");
\r
454 lat->DrawLatex(-0.9, 3.6, "TRD <N_{tracklets}>");
\r
455 // TPC-TRD matching efficiency vs pt
\r
456 pad = ((TVirtualPad*)l->At(5)); pad->cd();
\r
457 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.02);
\r
458 pad->SetTopMargin(0.02); pad->SetBottomMargin(0.15);
\r
459 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
460 hFeffP = TRDEfficiency(+1);
\r
461 hFeffN = TRDEfficiency(-1);
\r
462 h2F=new TH2F("rangeEffPt", "",10,0.,10.,10,0.,1.1);
\r
463 h2F->SetStats(kFALSE);
\r
464 h2F->GetXaxis()->SetTitle("p_{T} [GeV/c]");
\r
465 h2F->GetXaxis()->SetTitleOffset(0.8);
\r
466 h2F->GetXaxis()->SetTitleSize(0.07);
\r
467 h2F->GetXaxis()->CenterTitle();
\r
468 h2F->GetXaxis()->SetLabelSize(0.05);
\r
469 h2F->GetYaxis()->SetTitle("TRD-TPC matching efficiency");
\r
470 h2F->GetYaxis()->SetTitleOffset(0.8);
\r
471 h2F->GetYaxis()->SetTitleSize(0.07);
\r
472 h2F->GetYaxis()->SetLabelSize(0.05);
\r
473 h2F->GetYaxis()->CenterTitle();
\r
475 line.SetLineStyle(2);
\r
476 line.SetLineWidth(2);
\r
477 line.DrawLine(h2F->GetXaxis()->GetXmin(), 0.7, h2F->GetXaxis()->GetXmax(), 0.7);
\r
478 line.DrawLine(h2F->GetXaxis()->GetXmin(), 0.9, h2F->GetXaxis()->GetXmax(), 0.9);
\r
479 hFeffP->SetMarkerStyle(20);
\r
480 hFeffP->SetMarkerColor(2);
\r
481 hFeffN->SetMarkerStyle(22);
\r
482 hFeffN->SetMarkerColor(4);
\r
483 hFeffP->Draw("same");
\r
484 hFeffN->Draw("same");
\r
485 leg=new TLegend(0.65, 0.2, 0.95, 0.4);
\r
486 leg->SetFillColor(0);
\r
487 leg->AddEntry(hFeffP, "positives", "p");
\r
488 leg->AddEntry(hFeffN, "negatives", "p");
\r
490 // create trending values for the TPC-TRD matching efficiency
\r
491 // fit the efficiency histos with a constant in the range [1.0,1.5] GeV/c
\r
492 fitFunc = new TF1("constantFunc","[0]",1.0,1.5);
\r
493 hFeffP->Fit(fitFunc,"Q0","",1.0,1.5);
\r
494 PutTrendValue("TrackingEffPos1GeV", fitFunc->GetParameter(0));
\r
495 PutTrendValue("TrackingEffPos1GeVErr", fitFunc->GetParError(0));
\r
496 hFeffN->Fit(fitFunc,"Q0","",1.0,1.5);
\r
497 PutTrendValue("TrackingEffNeg1GeV", fitFunc->GetParameter(0));
\r
498 PutTrendValue("TrackingEffNeg1GeVErr", fitFunc->GetParError(0));
\r
500 // Nclusters per TRD track
\r
501 pad = ((TVirtualPad*)l->At(8)); pad->cd();
\r
502 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.12);
\r
503 pad->SetTopMargin(0.02); pad->SetBottomMargin(0.15);
\r
504 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
506 h2F = dynamic_cast<TH2F*>(fHistos->At(kNClsTrackTRD));
\r
507 h2F->SetStats(kFALSE);
\r
509 h2F->GetXaxis()->SetTitle("p [GeV/c]");
\r
510 h2F->GetXaxis()->SetTitleOffset(0.8);
\r
511 h2F->GetXaxis()->SetTitleSize(0.07);
\r
512 h2F->GetXaxis()->CenterTitle();
\r
513 h2F->GetXaxis()->SetLabelSize(0.05);
\r
514 h2F->GetYaxis()->SetTitle("#clusters per TRD track");
\r
515 h2F->GetYaxis()->SetTitleOffset(0.8);
\r
516 h2F->GetYaxis()->SetTitleSize(0.07);
\r
517 h2F->GetYaxis()->CenterTitle();
\r
518 h2F->GetYaxis()->SetLabelSize(0.05);
\r
521 case 5: // plot a 3x3 canvas with PID related histograms
\r
522 gPad->SetTopMargin(0.05); gPad->SetBottomMargin(0.001);
\r
523 gPad->SetLeftMargin(0.001); gPad->SetRightMargin(0.001);
\r
524 gPad->Divide(3,3,0.,0.);
\r
525 l=gPad->GetListOfPrimitives();
\r
526 // eta-phi distr. for <Qtot> in layer 0
\r
527 pad = ((TVirtualPad*)l->At(0)); pad->cd();
\r
528 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
529 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
530 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
531 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+0));
\r
532 hProf2D->SetStats(kFALSE);
\r
533 hProf2D->SetTitle("");
\r
534 hProf2D->GetXaxis()->SetTitle("#eta");
\r
535 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
536 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
537 hProf2D->GetXaxis()->CenterTitle();
\r
538 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
539 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
540 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
541 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
542 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
543 hProf2D->GetYaxis()->CenterTitle();
\r
544 hProf2D->SetMinimum(0.);
\r
545 hProf2D->SetMaximum(25.);
\r
546 hProf2D->Draw("colz");
\r
547 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 0");
\r
548 // eta-phi distr. for <Qtot> in layer 1
\r
549 pad = ((TVirtualPad*)l->At(3)); pad->cd();
\r
550 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
551 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
552 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
553 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+1));
\r
554 hProf2D->SetStats(kFALSE);
\r
555 hProf2D->SetTitle("");
\r
556 hProf2D->GetXaxis()->SetTitle("#eta");
\r
557 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
558 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
559 hProf2D->GetXaxis()->CenterTitle();
\r
560 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
561 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
562 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
563 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
564 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
565 hProf2D->GetYaxis()->CenterTitle();
\r
566 hProf2D->SetMinimum(0.);
\r
567 hProf2D->SetMaximum(25.);
\r
568 hProf2D->Draw("colz");
\r
569 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 1");
\r
570 // eta-phi distr. for <Qtot> in layer 2
\r
571 pad = ((TVirtualPad*)l->At(6)); pad->cd();
\r
572 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
573 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
574 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
575 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+2));
\r
576 hProf2D->SetStats(kFALSE);
\r
577 hProf2D->SetTitle("");
\r
578 hProf2D->GetXaxis()->SetTitle("#eta");
\r
579 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
580 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
581 hProf2D->GetXaxis()->CenterTitle();
\r
582 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
583 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
584 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
585 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
586 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
587 hProf2D->GetYaxis()->CenterTitle();
\r
588 hProf2D->SetMinimum(0.);
\r
589 hProf2D->SetMaximum(25.);
\r
590 hProf2D->Draw("colz");
\r
591 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 2");
\r
592 // eta-phi distr. for <Qtot> in layer 3
\r
593 pad = ((TVirtualPad*)l->At(1)); pad->cd();
\r
594 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
595 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
596 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
597 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+3));
\r
598 hProf2D->SetStats(kFALSE);
\r
599 hProf2D->SetTitle("");
\r
600 hProf2D->GetXaxis()->SetTitle("#eta");
\r
601 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
602 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
603 hProf2D->GetXaxis()->CenterTitle();
\r
604 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
605 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
606 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
607 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
608 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
609 hProf2D->GetYaxis()->CenterTitle();
\r
610 hProf2D->SetMinimum(0.);
\r
611 hProf2D->SetMaximum(25.);
\r
612 hProf2D->Draw("colz");
\r
613 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 3");
\r
614 // eta-phi distr. for <Qtot> in layer 4
\r
615 pad = ((TVirtualPad*)l->At(4)); pad->cd();
\r
616 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
617 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
618 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
619 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+4));
\r
620 hProf2D->SetStats(kFALSE);
\r
621 hProf2D->SetTitle("");
\r
622 hProf2D->GetXaxis()->SetTitle("#eta");
\r
623 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
624 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
625 hProf2D->GetXaxis()->CenterTitle();
\r
626 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
627 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
628 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
629 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
630 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
631 hProf2D->GetYaxis()->CenterTitle();
\r
632 hProf2D->SetMinimum(0.);
\r
633 hProf2D->SetMaximum(25.);
\r
634 hProf2D->Draw("colz");
\r
635 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 4");
\r
636 // eta-phi distr. for <Qtot> in layer 5
\r
637 pad = ((TVirtualPad*)l->At(7)); pad->cd();
\r
638 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
639 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
640 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
641 hProf2D = dynamic_cast<TProfile2D*>(fHistos->At(kTRDEtaPhiAvQtot+5));
\r
642 hProf2D->SetStats(kFALSE);
\r
643 hProf2D->SetTitle("");
\r
644 hProf2D->GetXaxis()->SetTitle("#eta");
\r
645 hProf2D->GetXaxis()->SetTitleOffset(0.8);
\r
646 hProf2D->GetXaxis()->SetTitleSize(0.07);
\r
647 hProf2D->GetXaxis()->CenterTitle();
\r
648 hProf2D->GetXaxis()->SetLabelSize(0.05);
\r
649 hProf2D->GetYaxis()->SetTitle("detector #varphi");
\r
650 hProf2D->GetYaxis()->SetTitleOffset(0.8);
\r
651 hProf2D->GetYaxis()->SetTitleSize(0.07);
\r
652 hProf2D->GetYaxis()->SetLabelSize(0.05);
\r
653 hProf2D->GetYaxis()->CenterTitle();
\r
654 hProf2D->SetMinimum(0.);
\r
655 hProf2D->SetMaximum(25.);
\r
656 hProf2D->Draw("colz");
\r
657 lat->DrawLatex(-0.9, 3.6, "TRD <Q_{tot}> Layer 5");
\r
658 // PH versus slice number
\r
659 pad = ((TVirtualPad*)l->At(2)); pad->cd();
\r
660 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
661 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
662 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
663 h2F = dynamic_cast<TH2F*>(fHistos->At(kPHSlice));
\r
664 h2F->SetStats(kFALSE);
\r
666 h2F->GetXaxis()->SetTitle("slice");
\r
667 h2F->GetXaxis()->SetTitleOffset(0.8);
\r
668 h2F->GetXaxis()->SetTitleSize(0.07);
\r
669 h2F->GetXaxis()->CenterTitle();
\r
670 h2F->GetXaxis()->SetLabelSize(0.05);
\r
671 h2F->GetYaxis()->SetTitle("PH");
\r
672 h2F->GetYaxis()->SetTitleOffset(0.8);
\r
673 h2F->GetYaxis()->SetTitleSize(0.07);
\r
674 h2F->GetYaxis()->SetLabelSize(0.05);
\r
675 h2F->GetYaxis()->CenterTitle();
\r
677 //hProf = h2F->ProfileX("profileX");
\r
678 //hProf->SetLineWidth(2);
\r
679 //hProf->Draw("same");
\r
681 pad = ((TVirtualPad*)l->At(5)); pad->cd();
\r
682 pad->SetLeftMargin(0.15); pad->SetRightMargin(0.1);
\r
683 pad->SetTopMargin(0.1); pad->SetBottomMargin(0.15);
\r
684 pad->SetGridx(kFALSE); pad->SetGridy(kFALSE);
\r
686 h2F = dynamic_cast<TH2F*>(fHistos->At(kQtotP));
\r
687 h2F->SetStats(kFALSE);
\r
689 h2F->GetXaxis()->SetTitle("P [GeV/c]");
\r
690 h2F->GetXaxis()->SetTitleOffset(0.8);
\r
691 h2F->GetXaxis()->SetTitleSize(0.07);
\r
692 h2F->GetXaxis()->CenterTitle();
\r
693 h2F->GetXaxis()->SetLabelSize(0.05);
\r
694 h2F->GetYaxis()->SetRangeUser(0.0,100.0);
\r
695 h2F->GetYaxis()->SetTitle("Q_{tot}");
\r
696 h2F->GetYaxis()->SetTitleOffset(0.8);
\r
697 h2F->GetYaxis()->SetTitleSize(0.07);
\r
698 h2F->GetYaxis()->SetLabelSize(0.05);
\r
699 h2F->GetYaxis()->CenterTitle();
\r
701 // create trending value for the average Qtot at 1 GeV/c
\r
702 hProf = h2F->ProfileX("profileQtot",1,h2F->GetYaxis()->FindBin(40.));
\r
703 PutTrendValue("AvQtot1GeV", hProf->GetBinContent(hProf->GetXaxis()->FindBin(1.)));
\r
704 PutTrendValue("AvQtot1GeVErr", hProf->GetBinError(hProf->GetXaxis()->FindBin(1.)));
\r
710 //____________________________________________________________________
\r
711 void AliTRDcheckESD::UserExec(Option_t *){
\r
713 // Run the Analysis
\r
715 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
\r
719 AliError("ESD event missing.");
\r
723 // Get MC information if available
\r
724 AliStack * fStack = NULL;
\r
727 AliWarning("MC event missing");
\r
730 if(!(fStack = fMC->Stack())){
\r
731 AliWarning("MC stack missing");
\r
738 // fill event vertex histos
\r
739 h = (TH1F*)fHistos->At(kTPCVertex);
\r
740 if(fESD->GetPrimaryVertexTPC()) h->Fill(fESD->GetPrimaryVertexTPC()->GetZv());
\r
741 h = (TH1F*)fHistos->At(kEventVertex);
\r
742 if(fESD->GetPrimaryVertex()) h->Fill(fESD->GetPrimaryVertex()->GetZv());
\r
743 // fill the uncutted number of tracks
\r
744 h = (TH1I*)fHistos->At(kNTracksAll);
\r
745 h->Fill(fESD->GetNumberOfTracks());
\r
747 // counters for number of tracks in acceptance&DCA and for those with a minimum of TPC clusters
\r
748 Int_t nTracksAcc=0;
\r
749 Int_t nTracksTPC=0;
\r
751 AliESDtrack *esdTrack(NULL);
\r
752 for(Int_t itrk = 0; itrk < fESD->GetNumberOfTracks(); itrk++){
\r
753 esdTrack = fESD->GetTrack(itrk);
\r
756 ULong_t status = esdTrack->GetStatus(); //PrintStatus(status);
\r
759 Bool_t selected(kTRUE);
\r
760 if(esdTrack->Pt() < fgkPt){
\r
761 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Pt[%5.2f]", fESD->GetEventNumberInFile(), itrk, esdTrack->Pt()));
\r
764 if(TMath::Abs(esdTrack->Eta()) > fgkEta){
\r
765 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Eta[%5.2f]", fESD->GetEventNumberInFile(), itrk, TMath::Abs(esdTrack->Eta())));
\r
768 if(!Bool_t(status & AliESDtrack::kTPCout)){
\r
769 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] !TPCout", fESD->GetEventNumberInFile(), itrk));
\r
772 if(esdTrack->GetKinkIndex(0) > 0){
\r
773 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Kink", fESD->GetEventNumberInFile(), itrk));
\r
777 Float_t par[2], cov[3];
\r
778 esdTrack->GetImpactParameters(par, cov);
\r
779 if(selected && esdTrack->GetTPCNcls()>=10) {
\r
780 // fill DCA histograms
\r
781 h = (TH1F*)fHistos->At(kDCAxy); h->Fill(par[0]);
\r
782 h = (TH1F*)fHistos->At(kDCAz); h->Fill(par[1]);
\r
783 // fill pt distribution at this stage
\r
784 h = (TH1F*)fHistos->At(kPt1); h->Fill(esdTrack->Pt());
\r
786 if(IsCollision()){ // cuts on DCA
\r
787 if(TMath::Abs(par[0]) > fgkTrkDCAxy){
\r
788 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAxy[%f]", fESD->GetEventNumberInFile(), itrk, TMath::Abs(par[0])));
\r
791 if(TMath::Abs(par[1]) > fgkTrkDCAz){
\r
792 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAz[%f]", fESD->GetEventNumberInFile(), itrk, TMath::Abs(par[1])));
\r
796 Float_t theta=esdTrack->Theta();
\r
797 Float_t phi=esdTrack->Phi();
\r
798 Int_t nClustersTPC = esdTrack->GetTPCNcls();
\r
799 Float_t eta=-TMath::Log(TMath::Tan(theta/2.));
\r
801 nTracksAcc++; // number of tracks in acceptance and DCA cut
\r
802 // fill pt distribution at this stage
\r
803 h = (TH1F*)fHistos->At(kPt2); h->Fill(esdTrack->Pt());
\r
804 // TPC nclusters distribution
\r
805 h = (TH1I*)fHistos->At(kNTPCCl); h->Fill(nClustersTPC);
\r
806 if(esdTrack->Pt()>1.0) {
\r
807 h = (TH1I*)fHistos->At(kNTPCCl2); h->Fill(nClustersTPC);
\r
809 // (eta,nclustersTPC) distrib of TPC ref. tracks
\r
810 h = (TH2F*)fHistos->At(kEtaNclsTPC); h->Fill(eta, nClustersTPC);
\r
811 // (phi,nclustersTPC) distrib of TPC ref. tracks
\r
812 h = (TH2F*)fHistos->At(kPhiNclsTPC); h->Fill(phi, nClustersTPC);
\r
816 if(nClustersTPC < fgkNclTPC){
\r
817 AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] NclTPC[%d]", fESD->GetEventNumberInFile(), itrk, nClustersTPC));
\r
820 if(!selected) continue;
\r
822 // number of TPC reference tracks
\r
825 Int_t nTRD(esdTrack->GetNcls(2));
\r
826 Double_t pt(esdTrack->Pt());
\r
827 Double_t p[AliPID::kSPECIES]; esdTrack->GetTRDpid(p);
\r
829 Bool_t kBarrel = Bool_t(status & AliESDtrack::kTRDin);
\r
832 // find position and momentum of the track at entrance in TRD
\r
833 Double_t localCoord[3] = {0., 0., 0.};
\r
834 Bool_t localCoordGood = esdTrack->GetXYZAt(298., fESD->GetMagneticField(), localCoord);
\r
835 if(localCoordGood) {
\r
836 hhh = (TH3F*)fHistos->At(kPropagXYvsP); hhh->Fill(localCoord[0], localCoord[1], esdTrack->GetP());
\r
837 hhh = (TH3F*)fHistos->At(kPropagRZvsP); hhh->Fill(localCoord[2], TMath::Sqrt(localCoord[0]*localCoord[0]+localCoord[1]*localCoord[1]), esdTrack->GetP());
\r
839 Double_t localMom[3] = {0., 0., 0.};
\r
840 Bool_t localMomGood = esdTrack->GetPxPyPzAt(298., fESD->GetMagneticField(), localMom);
\r
841 Double_t localPhi = (localMomGood ? TMath::ATan2(localMom[1], localMom[0]) : 0.0);
\r
842 Double_t localSagitaPhi = (localCoordGood ? TMath::ATan2(localCoord[1], localCoord[0]) : 0.0);
\r
844 // fill pt distribution at this stage
\r
845 if(esdTrack->Charge()>0) {
\r
846 h = (TH1F*)fHistos->At(kPt3pos); h->Fill(pt);
\r
847 // fill eta-phi map of TPC positive ref. tracks
\r
848 if(localCoordGood && localMomGood) {
\r
849 hhh = (TH3F*)fHistos->At(kTPCRefTracksPos); hhh->Fill(eta, localSagitaPhi, pt);
\r
852 if(esdTrack->Charge()<0) {
\r
853 h = (TH1F*)fHistos->At(kPt3neg); h->Fill(pt);
\r
854 // fill eta-phi map of TPC negative ref. tracks
\r
855 if(localCoordGood && localMomGood) {
\r
856 hhh = (TH3F*)fHistos->At(kTPCRefTracksNeg); hhh->Fill(eta, localSagitaPhi, pt);
\r
860 h = (TH2F*)fHistos->At(kTPCDedx); h->Fill(esdTrack->GetP(), esdTrack->GetTPCsignal());
\r
861 // (eta,phi) distrib of TPC ref. tracks
\r
862 h = (TH2F*)fHistos->At(kEtaPhi); h->Fill(eta, phi);
\r
864 Int_t nTRDtrkl = esdTrack->GetTRDntracklets();
\r
865 // TRD reference tracks
\r
867 // fill pt distribution at this stage
\r
868 if(esdTrack->Charge()>0) {
\r
869 h = (TH1F*)fHistos->At(kPt4pos); h->Fill(pt);
\r
870 // fill eta-phi map of TRD positive ref. tracks
\r
871 if(localCoordGood && localMomGood) {
\r
872 hhh = (TH3F*)fHistos->At(kTRDRefTracksPos); hhh->Fill(eta, localSagitaPhi, pt);
\r
875 if(esdTrack->Charge()<0) {
\r
876 h = (TH1F*)fHistos->At(kPt4neg); h->Fill(pt);
\r
877 // fill eta-phi map of TRD negative ref. tracks
\r
878 if(localCoordGood && localMomGood) {
\r
879 hhh = (TH3F*)fHistos->At(kTRDRefTracksNeg); hhh->Fill(eta, localSagitaPhi, pt);
\r
883 // fill eta-phi map of TRD negative ref. tracks
\r
884 if(localCoordGood && localMomGood) {
\r
885 h2d = (TProfile2D*)fHistos->At(kTRDEtaPhiAvNtrkl); h2d->Fill(eta, localSagitaPhi, (Float_t)nTRDtrkl);
\r
886 h2d = (TProfile2D*)fHistos->At(kTRDEtaDeltaPhiAvNtrkl); h2d->Fill(eta, localPhi-localSagitaPhi, (Float_t)nTRDtrkl);
\r
888 // ntracklets/track vs P
\r
889 h = (TH2F*)fHistos->At(kNTrackletsTRD); h->Fill(esdTrack->GetP(), nTRDtrkl);
\r
890 // ntracklets/track vs P
\r
891 h = (TH2F*)fHistos->At(kNClsTrackTRD); h->Fill(esdTrack->GetP(), esdTrack->GetTRDncls());
\r
892 // (slicePH,sliceNo) distribution and Qtot from slices
\r
893 for(Int_t iPlane=0; iPlane<6; iPlane++) {
\r
895 for(Int_t iSlice=0; iSlice<8; iSlice++) {
\r
896 if(esdTrack->GetTRDslice(iPlane, iSlice)>20.) {
\r
897 h = (TH2F*)fHistos->At(kPHSlice); h->Fill(iSlice, esdTrack->GetTRDslice(iPlane, iSlice));
\r
898 Qtot += esdTrack->GetTRDslice(iPlane, iSlice);
\r
901 // Qtot>100 to avoid noise
\r
903 h = (TH2F*)fHistos->At(kQtotP); h->Fill(esdTrack->GetTRDmomentum(iPlane), fgkQs*Qtot);
\r
905 // Qtot>100 to avoid noise
\r
906 // fgkQs*Qtot<40. so that the average will give a value close to the peak
\r
907 if(localCoordGood && localMomGood && Qtot>100. && fgkQs*Qtot<40.) {
\r
908 h2d = (TProfile2D*)fHistos->At(kTRDEtaPhiAvQtot+iPlane);
\r
909 h2d->Fill(eta, localSagitaPhi, fgkQs*Qtot);
\r
912 // theta distribution
\r
913 h = (TH1F*)fHistos->At(kTheta); h->Fill(theta);
\r
914 h = (TH1F*)fHistos->At(kPhi); h->Fill(phi);
\r
915 } // end if nTRDtrkl>=1
\r
917 // look at external track param
\r
918 const AliExternalTrackParam *op = esdTrack->GetOuterParam();
\r
919 const AliExternalTrackParam *ip = esdTrack->GetInnerParam();
\r
921 Double_t pt0(0.), eta0(0.), phi0(0.), ptTRD(0.);
\r
922 // read MC info if available
\r
923 Bool_t kFOUND(kFALSE), kPhysPrim(kFALSE);
\r
924 AliMCParticle *mcParticle(NULL);
\r
926 AliTrackReference *ref(NULL);
\r
927 Int_t fLabel(esdTrack->GetLabel());
\r
928 Int_t fIdx(TMath::Abs(fLabel));
\r
929 if(fIdx > fStack->GetNtrack()) continue;
\r
931 // read MC particle
\r
932 if(!(mcParticle = (AliMCParticle*) fMC->GetTrack(fIdx))) {
\r
933 AliWarning(Form("MC particle missing. Label[ %d].", fLabel));
\r
936 pt0 = mcParticle->Pt();
\r
937 eta0 = mcParticle->Eta();
\r
938 phi0 = mcParticle->Phi();
\r
939 kPhysPrim = fMC->IsPhysicalPrimary(fIdx);
\r
941 // read track references
\r
942 Int_t nRefs = mcParticle->GetNumberOfTrackReferences();
\r
944 AliWarning(Form("No TR found for track @ Label[%d].", fLabel));
\r
949 ref = mcParticle->GetTrackReference(iref);
\r
950 if(ref->LocalX() > fgkxTPC) break;
\r
954 if(ref->LocalX() > fgkxTOF){ // track skipping TRD fiducial volume
\r
955 ref = mcParticle->GetTrackReference(TMath::Max(iref-1, 0));
\r
957 } else { // track stopped in TPC
\r
958 ref = mcParticle->GetTrackReference(TMath::Max(iref-1, 0));
\r
960 ptTRD = ref->Pt();kFOUND=kTRUE;
\r
961 } else { // use reconstructed values
\r
963 Double_t x(op->GetX());
\r
964 if(x<fgkxTOF && x>fgkxTPC){
\r
974 } // end if(HasMC())
\r
977 h = (TH2I*)fHistos->At(kTRDstat);
\r
978 if(status & AliESDtrack::kTPCout) h->Fill(ptTRD, kTPCout);
\r
979 if(status & AliESDtrack::kTRDin) h->Fill(ptTRD, kTRDin);
\r
980 if(kBarrel && (status & AliESDtrack::kTRDout)) h->Fill(ptTRD, kTRDout);
\r
981 if(kBarrel && (status & AliESDtrack::kTRDpid)) h->Fill(ptTRD, kTRDpid);
\r
982 if(kBarrel && (status & AliESDtrack::kTRDrefit)) h->Fill(ptTRD, kTRDref);
\r
984 Int_t idx(HasMC() ? Pdg2Idx(TMath::Abs(mcParticle->PdgCode())): 0)
\r
985 ,sgn(esdTrack->Charge()<0?0:1);
\r
986 if(kBarrel && kPhysPrim) {
\r
987 TH3 *h3 = (TH3S*)fHistos->At(kPtRes);
\r
988 Int_t offset = (status & AliESDtrack::kTRDrefit) ? 0 : 10;
\r
989 h3->Fill(pt0, 1.e2*(pt/pt0-1.),
\r
990 offset + 2*idx + sgn);
\r
992 ((TH1*)fHistos->At(kNCl))->Fill(nTRD, 2*idx + sgn);
\r
994 h = (TH2I*)fHistos->At(kTRDmom);
\r
996 for(Int_t ily=6; ily--;){
\r
997 if((pTRD=esdTrack->GetTRDmomentum(ily))<0.) continue;
\r
998 h->Fill(ip->GetP()-pTRD, ily);
\r
1001 } // end loop over tracks
\r
1003 // fill the number of tracks histograms
\r
1004 h = (TH1I*)fHistos->At(kNTracksAcc);
\r
1005 h->Fill(nTracksAcc);
\r
1006 h = (TH1I*)fHistos->At(kNTracksTPC);
\r
1007 h->Fill(nTracksTPC);
\r
1010 //____________________________________________________________________
\r
1011 TObjArray* AliTRDcheckESD::Histos()
\r
1013 // Retrieve histograms array if already build or build it
\r
1015 if(fHistos) return fHistos;
\r
1017 fHistos = new TObjArray(kNhistos);
\r
1018 //fHistos->SetOwner(kTRUE);
\r
1022 // clusters per track
\r
1023 const Int_t kNpt(30);
\r
1025 Float_t binsPt[kNpt+1];
\r
1026 for(Int_t i=0;i<kNpt+1; i++,Pt+=(TMath::Exp(i*i*.001)-1.)) binsPt[i]=Pt;
\r
1027 if(!(h = (TH2S*)gROOT->FindObject("hNCl"))){
\r
1028 h = new TH2S("hNCl", "Clusters per TRD track;N_{cl}^{TRD};SPECIES;entries", 60, 0., 180., 10, -0.5, 9.5);
\r
1029 TAxis *ay(h->GetYaxis());
\r
1030 ay->SetLabelOffset(0.015);
\r
1031 for(Int_t i(0); i<AliPID::kSPECIES; i++){
\r
1032 ay->SetBinLabel(2*i+1, Form("%s^{-}", AliPID::ParticleLatexName(i)));
\r
1033 ay->SetBinLabel(2*i+2, Form("%s^{+}", AliPID::ParticleLatexName(i)));
\r
1035 } else h->Reset();
\r
1036 fHistos->AddAt(h, kNCl); fNRefFigures++;
\r
1038 // status bits histogram
\r
1039 const Int_t kNbits(5);
\r
1041 Float_t binsBits[kNbits+1];
\r
1042 for(Int_t i=0; i<kNbits+1; i++,Bits+=1.) binsBits[i]=Bits;
\r
1043 if(!(h = (TH2I*)gROOT->FindObject("hTRDstat"))){
\r
1044 h = new TH2I("hTRDstat", "TRD status bits;p_{t} @ TRD [GeV/c];status;entries", kNpt, binsPt, kNbits, binsBits);
\r
1045 TAxis *ay(h->GetYaxis());
\r
1046 ay->SetBinLabel(1, "kTPCout");
\r
1047 ay->SetBinLabel(2, "kTRDin");
\r
1048 ay->SetBinLabel(3, "kTRDout");
\r
1049 ay->SetBinLabel(4, "kTRDpid");
\r
1050 ay->SetBinLabel(5, "kTRDrefit");
\r
1051 } else h->Reset();
\r
1052 fHistos->AddAt(h, kTRDstat);
\r
1055 if(!(h = (TH2I*)gROOT->FindObject("hTRDmom"))){
\r
1056 h = new TH2I("hTRDmom", "TRD energy loss;p_{inner} - p_{ly} [GeV/c];ly;entries", 100, -1., 2., 6, -0.5, 5.5);
\r
1057 } else h->Reset();
\r
1058 fHistos->AddAt(h, kTRDmom);
\r
1059 //if(!HasMC()) return fHistos;
\r
1062 const Int_t kNdpt(100), kNspec(4*AliPID::kSPECIES);
\r
1063 Float_t DPt(-3.), Spec(-0.5);
\r
1064 Float_t binsDPt[kNdpt+1], binsSpec[kNspec+1];
\r
1065 for(Int_t i=0; i<kNdpt+1; i++,DPt+=6.e-2) binsDPt[i]=DPt;
\r
1066 for(Int_t i=0; i<kNspec+1; i++,Spec+=1.) binsSpec[i]=Spec;
\r
1067 if(!(h = (TH3S*)gROOT->FindObject("hPtRes"))){
\r
1068 h = new TH3S("hPtRes", "P_{t} resolution @ DCA;p_{t}^{MC} [GeV/c];#Delta p_{t}/p_{t}^{MC} [%];SPECIES", kNpt, binsPt, kNdpt, binsDPt, kNspec, binsSpec);
\r
1069 TAxis *az(h->GetZaxis());
\r
1070 az->SetLabelOffset(0.015);
\r
1071 for(Int_t i(0); i<AliPID::kSPECIES; i++){
\r
1072 az->SetBinLabel(2*i+1, Form("%s^{-}", AliPID::ParticleLatexName(i)));
\r
1073 az->SetBinLabel(2*i+2, Form("%s^{+}", AliPID::ParticleLatexName(i)));
\r
1074 az->SetBinLabel(10+2*i+1, Form("%s^{-}", AliPID::ParticleLatexName(i)));
\r
1075 az->SetBinLabel(10+2*i+2, Form("%s^{+}", AliPID::ParticleLatexName(i)));
\r
1077 } else h->Reset();
\r
1078 fHistos->AddAt(h, kPtRes);
\r
1080 // TPC event vertex distribution
\r
1081 if(!(h = (TH1F*)gROOT->FindObject("hTPCVertex"))){
\r
1082 h = new TH1F("hTPCVertex", "Event vertex Z coord. from TPC tracks", 100, -25., 25.);
\r
1083 } else h->Reset();
\r
1084 fHistos->AddAt(h, kTPCVertex);
\r
1087 if(!(h = (TH1F*)gROOT->FindObject("hEventVertex"))){
\r
1088 h = new TH1F("hEventVertex", "Event vertex Z coord.", 100, -25., 25.);
\r
1089 } else h->Reset();
\r
1090 fHistos->AddAt(h, kEventVertex);
\r
1092 // Number of all tracks
\r
1093 if(!(h = (TH1I*)gROOT->FindObject("hNTracksAll"))){
\r
1094 h = new TH1I("hNTracksAll", "Number of tracks per event, event vertex cuts", 5000, 0, 5000);
\r
1095 } else h->Reset();
\r
1096 fHistos->AddAt(h, kNTracksAll);
\r
1098 // Number of tracks in acceptance and DCA cut
\r
1099 if(!(h = (TH1I*)gROOT->FindObject("hNTracksAcc"))){
\r
1100 h = new TH1I("hNTracksAcc", Form("Number of tracks per event, |#eta|<%.1f, |DCAxy|<%.1f, |DCAz|<%.1f",
\r
1101 fgkEta, fgkTrkDCAxy, fgkTrkDCAz), 5000, 0, 5000);
\r
1102 } else h->Reset();
\r
1103 fHistos->AddAt(h, kNTracksAcc);
\r
1105 // Number of tracks in TPC (Ncls>10)
\r
1106 if(!(h = (TH1I*)gROOT->FindObject("hNTracksTPC"))){
\r
1107 h = new TH1I("hNTracksTPC", Form("Number of tracks per event, |#eta|<%.1f, pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1108 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 5000, 0, 5000);
\r
1109 } else h->Reset();
\r
1110 fHistos->AddAt(h, kNTracksTPC);
\r
1112 // Distribution of DCA-xy
\r
1113 if(!(h = (TH1F*)gROOT->FindObject("hDCAxy"))){
\r
1114 h = new TH1F("hDCAxy", "Distribution of transverse DCA", 100, -100., 100.);
\r
1115 } else h->Reset();
\r
1116 fHistos->AddAt(h, kDCAxy);
\r
1118 // Distribution of DCA-z
\r
1119 if(!(h = (TH1F*)gROOT->FindObject("hDCAz"))){
\r
1120 h = new TH1F("hDCAz", "Distribution of longitudinal DCA", 100, -100., 100.);
\r
1121 } else h->Reset();
\r
1122 fHistos->AddAt(h, kDCAz);
\r
1124 Float_t binPtLimits[33] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,
\r
1125 1.0, 1.1, 1.2, 1.3, 1.4,
\r
1126 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0,
\r
1127 3.4, 3.8, 4.2, 4.6, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
\r
1128 // Pt distributions
\r
1129 if(!(h = (TH1F*)gROOT->FindObject("hPt1"))){
\r
1130 h = new TH1F("hPt1", Form("dN/dpt, |#eta|<%.1f and pt>%.1f", fgkEta, fgkPt), 32, binPtLimits);
\r
1131 } else h->Reset();
\r
1132 fHistos->AddAt(h, kPt1);
\r
1134 if(!(h = (TH1F*)gROOT->FindObject("hPt2"))){
\r
1135 h = new TH1F("hPt2", Form("dN/dpt, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f",
\r
1136 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz), 32, binPtLimits);
\r
1137 } else h->Reset();
\r
1138 fHistos->AddAt(h, kPt2);
\r
1140 if(!(h = (TH1F*)gROOT->FindObject("hPt3pos"))){
\r
1141 h = new TH1F("hPt3pos", Form("dN/dpt (positives), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1142 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 32, binPtLimits);
\r
1143 } else h->Reset();
\r
1144 fHistos->AddAt(h, kPt3pos);
\r
1146 if(!(h = (TH1F*)gROOT->FindObject("hPt3neg"))){
\r
1147 h = new TH1F("hPt3neg", Form("dN/dpt (negatives), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1148 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 32, binPtLimits);
\r
1149 } else h->Reset();
\r
1150 fHistos->AddAt(h, kPt3neg);
\r
1152 if(!(h = (TH1F*)gROOT->FindObject("hPt4pos"))){
\r
1153 h = new TH1F("hPt4pos", Form("dN/dpt (positives), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq 1",
\r
1154 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 32, binPtLimits);
\r
1155 } else h->Reset();
\r
1156 fHistos->AddAt(h, kPt4pos);
\r
1158 if(!(h = (TH1F*)gROOT->FindObject("hPt4neg"))){
\r
1159 h = new TH1F("hPt4pos", Form("dN/dpt (negatives), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq 1",
\r
1160 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 32, binPtLimits);
\r
1161 } else h->Reset();
\r
1162 fHistos->AddAt(h, kPt4neg);
\r
1164 // theta distribution of TRD tracks
\r
1165 if(!(h = (TH1F*)gROOT->FindObject("hTheta"))){
\r
1166 h = new TH1F("hTheta", Form("dN/d#theta, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq 1",
\r
1167 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 220,.5,2.7);
\r
1168 } else h->Reset();
\r
1169 fHistos->AddAt(h, kTheta);
\r
1171 // phi distribution of TRD tracks
\r
1172 if(!(h = (TH1F*)gROOT->FindObject("hPhi"))){
\r
1173 h = new TH1F("hPhi", Form("dN/d#varphi, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq 1",
\r
1174 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 157,0,6.28);
\r
1175 } else h->Reset();
\r
1176 fHistos->AddAt(h, kPhi);
\r
1178 // TPC cluster distribution
\r
1179 if(!(h = (TH1F*)gROOT->FindObject("hNTPCCl"))){
\r
1180 h = new TH1I("hNTPCCl", Form("Number of TPC clusters/track, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f",
\r
1181 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz), 160, 0, 160);
\r
1182 } else h->Reset();
\r
1183 fHistos->AddAt(h, kNTPCCl);
\r
1185 if(!(h = (TH1I*)gROOT->FindObject("hNTPCCl2"))){
\r
1186 h = new TH1F("hNTPCCl2", Form("Number of TPC clusters/track, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, pt>1.0 GeV/c",
\r
1187 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz), 160, 0, 160);
\r
1188 } else h->Reset();
\r
1189 fHistos->AddAt(h, kNTPCCl2);
\r
1191 // dE/dx vs P for TPC reference tracks
\r
1192 if(!(h = (TH2F*)gROOT->FindObject("hTPCDedx"))){
\r
1193 h = new TH2F("hTPCDedx", Form("TPC dE/dx vs P, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1194 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, 0.1,10.1, 120, 0,600.);
\r
1195 } else h->Reset();
\r
1196 fHistos->AddAt(h, kTPCDedx);
\r
1198 // eta,phi distribution of TPC reference tracks
\r
1199 if(!(h = (TH2F*)gROOT->FindObject("hEtaPhi"))){
\r
1200 h = new TH2F("hEtaPhi", Form("TPC (#eta,#varphi), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1201 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 50, -1, 1, 157, 0, 6.28);
\r
1202 } else h->Reset();
\r
1203 fHistos->AddAt(h, kEtaPhi);
\r
1205 // Nclusters vs eta distribution for TPC tracks
\r
1206 if(!(h = (TH2F*)gROOT->FindObject("hEtaNclsTPC"))){
\r
1207 h = new TH2F("hEtaNclsTPC", Form("TPC Nclusters vs. #eta, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f",
\r
1208 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz), 50, -1, 1, 160, 0, 160.);
\r
1209 } else h->Reset();
\r
1210 fHistos->AddAt(h, kEtaNclsTPC);
\r
1212 // Nclusters vs phi distribution for TPC reference tracks
\r
1213 if(!(h = (TH2F*)gROOT->FindObject("hPhiNclsTPC"))){
\r
1214 h = new TH2F("hPhiNclsTPC", Form("TPC Nclusters vs. #varphi, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f",
\r
1215 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz), 157, 0, 6.28, 160, 0, 160.);
\r
1216 } else h->Reset();
\r
1217 fHistos->AddAt(h, kPhiNclsTPC);
\r
1219 // Ntracklets/track vs P for TRD reference tracks
\r
1220 Double_t binsP[19] = {0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.7, 2.0,
\r
1221 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 7.0, 9.0, 12.0};
\r
1222 if(!(h = (TH2F*)gROOT->FindObject("hNTrackletsTRD"))){
\r
1223 h = new TH2F("hNTrackletsTRD", Form("TRD Ntracklets/track vs. P, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1224 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 18, binsP, 7, -0.5, 6.5);
\r
1225 } else h->Reset();
\r
1226 fHistos->AddAt(h, kNTrackletsTRD);
\r
1228 // Nclusters/track vs P for TRD reference tracks
\r
1229 if(!(h = (TH2F*)gROOT->FindObject("hNClsTrackTRD"))){
\r
1230 h = new TH2F("hNClsTrackTRD", Form("TRD Nclusters/track vs. P, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1231 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 18, binsP, 180, 0., 180.);
\r
1232 } else h->Reset();
\r
1233 fHistos->AddAt(h, kNClsTrackTRD);
\r
1235 // <PH> vs slice number for TRD reference tracklets
\r
1236 if(!(h = (TH2F*)gROOT->FindObject("hPHSlice"))){
\r
1237 h = new TH2F("hPHSlice", Form("<PH> vs sliceNo, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1238 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 8, -0.5, 7.5, 2000, 0., 2000.);
\r
1239 } else h->Reset();
\r
1240 fHistos->AddAt(h, kPHSlice);
\r
1242 // Qtot vs P for TRD reference tracklets
\r
1243 if(!(h = (TH2F*)gROOT->FindObject("hQtotP"))){
\r
1244 h = new TH2F("hQtotP", Form("Qtot(from slices) vs P, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1245 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 18, binsP, 400, 0., 200);
\r
1246 } else h->Reset();
\r
1247 fHistos->AddAt(h, kQtotP);
\r
1249 // (X,Y,momentum) distribution after AliESDtrack::PropagateTo(r=300.)
\r
1250 if(!(h = (TH3F*)gROOT->FindObject("hPropagXYvsP"))){
\r
1251 h = new TH3F("hPropagXYvsP", Form("(x,y) vs P after AliESDtrack::PropagateTo(r=300.), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1252 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100,-500,500, 100,-500,500, 10, 0.,10.);
\r
1253 } else h->Reset();
\r
1254 fHistos->AddAt(h, kPropagXYvsP);
\r
1256 // (R,Z,momentum) distribution after AliESDtrack::PropagateTo(r=300.)
\r
1257 if(!(h = (TH3F*)gROOT->FindObject("hPropagRZvsP"))){
\r
1258 h = new TH3F("hPropagRZvsP", Form("(r,z) vs P after AliESDtrack::PropagateTo(r=300.), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1259 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100,-350., 350., 100,0.,500., 10, 0.,10.);
\r
1260 } else h->Reset();
\r
1261 fHistos->AddAt(h, kPropagRZvsP);
\r
1263 Float_t etaBinLimits[101];
\r
1264 for(Int_t i=0; i<101; i++) etaBinLimits[i] = -1.0 + i*2.0/100.;
\r
1265 Float_t phiBinLimits[151];
\r
1266 for(Int_t i=0; i<151; i++) phiBinLimits[i] = -1.1*TMath::Pi() + i*2.2*TMath::Pi()/150.;
\r
1267 // (eta,detector phi,P) distribution of reference TPC positive tracks
\r
1268 if(!(h = (TH3F*)gROOT->FindObject("hTPCRefTracksPos"))){
\r
1269 h = new TH3F("hTPCRefTracksPos", Form("(#eta,detector #varphi,p) for TPC positive reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1270 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, etaBinLimits, 150, phiBinLimits, 32, binPtLimits);
\r
1271 } else h->Reset();
\r
1272 fHistos->AddAt(h, kTPCRefTracksPos);
\r
1274 // (eta,detector phi,P) distribution of reference TPC negative tracks
\r
1275 if(!(h = (TH3F*)gROOT->FindObject("hTPCRefTracksNeg"))){
\r
1276 h = new TH3F("hTPCRefTracksNeg", Form("(#eta,detector #varphi,p) for TPC negative reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d",
\r
1277 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, etaBinLimits, 150, phiBinLimits, 32, binPtLimits);
\r
1278 } else h->Reset();
\r
1279 fHistos->AddAt(h, kTPCRefTracksNeg);
\r
1281 // (eta,detector phi,P) distribution of reference TRD positive tracks
\r
1282 if(!(h = (TH3F*)gROOT->FindObject("hTRDRefTracksPos"))){
\r
1283 h = new TH3F("hTRDRefTracksPos", Form("(#eta,detector #varphi,p) for TRD positive reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq1",
\r
1284 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, etaBinLimits, 150, phiBinLimits, 32, binPtLimits);
\r
1285 } else h->Reset();
\r
1286 fHistos->AddAt(h, kTRDRefTracksPos);
\r
1288 // (eta,detector phi,P) distribution of reference TRD negative tracks
\r
1289 if(!(h = (TH3F*)gROOT->FindObject("hTRDRefTracksNeg"))){
\r
1290 h = new TH3F("hTRDRefTracksNeg", Form("(#eta,detector #varphi,p) for TRD negative reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq1",
\r
1291 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, etaBinLimits, 150, phiBinLimits, 32, binPtLimits);
\r
1292 } else h->Reset();
\r
1293 fHistos->AddAt(h, kTRDRefTracksNeg);
\r
1295 // (eta,detector phi) profile of average number of TRD tracklets/track
\r
1296 if(!(h = (TProfile2D*)gROOT->FindObject("hTRDEtaPhiAvNtrkl"))){
\r
1297 h = new TProfile2D("hTRDEtaPhiAvNtrkl", Form("<Ntracklets/track> vs (#eta,detector #varphi) for TRD reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq1",
\r
1298 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, -1.0, 1.0, 150, -1.1*TMath::Pi(), 1.1*TMath::Pi());
\r
1299 } else h->Reset();
\r
1300 fHistos->AddAt(h, kTRDEtaPhiAvNtrkl);
\r
1302 // (eta,delta phi) profile of average number of TRD tracklets/track
\r
1303 if(!(h = (TProfile2D*)gROOT->FindObject("hTRDEtaDeltaPhiAvNtrkl"))){
\r
1304 h = new TProfile2D("hTRDEtaDeltaPhiAvNtrkl", Form("<Ntracklets/track> vs (#eta, #Delta#varphi) for TRD reference tracks, |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq1",
\r
1305 fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, -1.0, 1.0, 50, -0.4*TMath::Pi(), 0.4*TMath::Pi());
\r
1306 } else h->Reset();
\r
1307 fHistos->AddAt(h, kTRDEtaDeltaPhiAvNtrkl);
\r
1309 // (eta, detector phi) profile of average tracklet Qtot from slices
\r
1310 for(Int_t iLayer=0;iLayer<6;iLayer++) {
\r
1311 if(!(h = (TProfile2D*)gROOT->FindObject(Form("hTRDEtaPhiAvQtot_Layer%d",iLayer)))) {
\r
1312 h = new TProfile2D(Form("hTRDEtaPhiAvQtot_Layer%d",iLayer),
\r
1313 Form("<Q_{tot}> vs (#eta, detector #varphi) for TRD reference tracks (layer %d), |#eta|<%.1f and pt>%.1f, |DCAxy|<%.1f, |DCAz|<%.1f, TPC nclusters>%d, nTRDtracklets#geq1",
\r
1314 iLayer, fgkEta, fgkPt, fgkTrkDCAxy, fgkTrkDCAz, fgkNclTPC), 100, -1.0, 1.0, 50, -1.1*TMath::Pi(), 1.1*TMath::Pi());
\r
1315 } else h->Reset();
\r
1316 fHistos->AddAt(h, kTRDEtaPhiAvQtot+iLayer);
\r
1322 //____________________________________________________________________
\r
1323 Bool_t AliTRDcheckESD::Load(const Char_t *file, const Char_t *dir, const Char_t *name)
\r
1325 // Load data from performance file
\r
1327 if(!TFile::Open(file)){
\r
1328 AliWarning(Form("Couldn't open file %s.", file));
\r
1332 if(!gFile->cd(dir)){
\r
1333 AliWarning(Form("Couldn't cd to %s in %s.", dir, file));
\r
1337 TObjArray *o(NULL);
\r
1338 const Char_t *tn=(name ? name : GetName());
\r
1339 if(!(o = (TObjArray*)gDirectory->Get(tn))){
\r
1340 AliWarning(Form("Missing histogram container %s.", tn));
\r
1343 fHistos = (TObjArray*)o->Clone(GetName());
\r
1348 //_______________________________________________________
\r
1349 Bool_t AliTRDcheckESD::PutTrendValue(const Char_t *name, Double_t val)
\r
1351 // Dump trending value to default file
\r
1354 fgFile = fopen("TRD.Performance.txt", "at");
\r
1356 fprintf(fgFile, "%s_%s %f\n", GetName(), name, val);
\r
1360 //____________________________________________________________________
\r
1361 void AliTRDcheckESD::Terminate(Option_t *)
\r
1363 // Steer post-processing
\r
1365 fHistos = dynamic_cast<TObjArray *>(GetOutputData(1));
\r
1367 AliError("Histogram container not found in output");
\r
1372 const Char_t *name[kNrefs] = {
\r
1373 "Ncl", "Eff", "Eloss", "PtResDCA"
\r
1375 TObjArray *arr(NULL); TGraph *g(NULL);
\r
1377 fResults = new TObjArray(kNrefs);
\r
1378 fResults->SetOwner();
\r
1379 fResults->SetName("results");
\r
1380 for(Int_t iref(0); iref<kNrefs; iref++){
\r
1381 fResults->AddAt(arr = new TObjArray(fgkNgraph[iref]), iref);
\r
1382 arr->SetName(name[iref]); arr->SetOwner();
\r
1385 for(Int_t ig(0); ig<fgkNgraph[iref]; ig++){
\r
1386 arr->AddAt(g = new TGraphErrors(), ig);
\r
1387 g->SetLineColor(ig+1);
\r
1388 g->SetMarkerColor(ig+1);
\r
1389 g->SetMarkerStyle(ig+20);
\r
1390 g->SetName(Form("s%d", ig));
\r
1392 case 0: g->SetTitle("ALL"); break;
\r
1393 case 1: g->SetTitle("NEG"); break;
\r
1394 case 2: g->SetTitle("POS"); break;
\r
1395 default: g->SetTitle(AliPID::ParticleLatexName(ig-3)); break;
\r
1400 for(Int_t ig(0); ig<fgkNgraph[iref]; ig++){
\r
1401 arr->AddAt(g = new TGraphAsymmErrors(), ig);
\r
1402 g->SetLineColor(ig+1);
\r
1403 g->SetMarkerColor(ig+1);
\r
1404 g->SetMarkerStyle(ig+20);
\r
1408 for(Int_t idx(0); idx<AliPID::kSPECIES; idx++){
\r
1410 arr->AddAt(g = new TGraphErrors(), ig);
\r
1411 g->SetLineColor(kRed-idx);
\r
1412 g->SetMarkerColor(kRed-idx);
\r
1413 g->SetMarkerStyle(20+idx);
\r
1414 g->SetNameTitle(Form("s%d", ig), Form("res %s", AliPID::ParticleLatexName(idx)));
\r
1415 arr->AddAt(g = new TGraphErrors(), ig+1);
\r
1416 g->SetLineColor(kBlue-idx);
\r
1417 g->SetMarkerColor(kBlue-idx);
\r
1418 g->SetMarkerStyle(20+idx);
\r
1419 g->SetNameTitle(Form("m%d", ig+1), Form("sys %s", AliPID::ParticleLatexName(idx)));
\r
1422 arr->AddAt(g = new TGraphErrors(), ig);
\r
1423 g->SetLineColor(kRed-idx);
\r
1424 g->SetMarkerColor(kRed-idx);
\r
1425 g->SetMarkerStyle(20+idx);
\r
1426 g->SetNameTitle(Form("s%d", ig), Form("sigma %s", AliPID::ParticleLatexName(idx)));
\r
1427 arr->AddAt(g = new TGraphErrors(), ig+1);
\r
1428 g->SetLineColor(kBlue-idx);
\r
1429 g->SetMarkerColor(kBlue-idx);
\r
1430 g->SetMarkerStyle(20+idx);
\r
1431 g->SetNameTitle(Form("m%d", ig+1), Form("mean %s", AliPID::ParticleLatexName(idx)));
\r
1435 for(Int_t ig(0); ig<fgkNgraph[iref]; ig++){
\r
1436 arr->AddAt(g = new TGraphErrors(), ig);
\r
1437 g->SetLineColor(ig+1);
\r
1438 g->SetMarkerColor(ig+1);
\r
1439 g->SetMarkerStyle(ig+20);
\r
1445 TH1 *h1[2] = {NULL, NULL};
\r
1450 if(!(h2 = (TH2I*)fHistos->At(kNCl))) return;
\r
1451 ax = h2->GetXaxis();
\r
1452 arr = (TObjArray*)fResults->At(kNCl);
\r
1454 h1[0] = h2->ProjectionX("Ncl_px");
\r
1455 TGraphErrors *ge=(TGraphErrors*)arr->At(0);
\r
1456 for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
\r
1457 ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
\r
1459 // All charged tracks
\r
1460 TH1 *hNclCh[2] = {(TH1D*)h1[0]->Clone("NEG"), (TH1D*)h1[0]->Clone("POS")};
\r
1461 hNclCh[0]->Reset();hNclCh[1]->Reset();
\r
1462 for(Int_t is(1); is<=AliPID::kSPECIES; is++){
\r
1463 hNclCh[0]->Add(h2->ProjectionX("Ncl_px", 2*is-1, 2*is-1)); // neg
\r
1464 hNclCh[1]->Add(h2->ProjectionX("Ncl_px", 2*is, 2*is)); // pos
\r
1466 if(Int_t(hNclCh[0]->GetEntries())){
\r
1467 ge=(TGraphErrors*)arr->At(1);
\r
1468 for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
\r
1469 ge->SetPoint(ib-2, ax->GetBinCenter(ib), hNclCh[0]->GetBinContent(ib));
\r
1472 if(Int_t(hNclCh[1]->GetEntries())){
\r
1473 ge=(TGraphErrors*)arr->At(2);
\r
1474 for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
\r
1475 ge->SetPoint(ib-2, ax->GetBinCenter(ib), hNclCh[1]->GetBinContent(ib));
\r
1479 for(Int_t is(1); is<=AliPID::kSPECIES; is++){
\r
1480 h1[0] = h2->ProjectionX("Ncl_px", 2*is-1, 2*is);
\r
1481 if(!Int_t(h1[0]->GetEntries())) continue;
\r
1482 ge=(TGraphErrors*)arr->At(2+is);
\r
1483 for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
\r
1484 ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
\r
1490 // geometrical efficiency
\r
1491 if(!(h2 = (TH2I*)fHistos->At(kTRDstat))) return;
\r
1492 arr = (TObjArray*)fResults->At(kTRDstat);
\r
1493 h1[0] = h2->ProjectionX("checkESDx0", kTPCout, kTPCout);
\r
1494 h1[1] = h2->ProjectionX("checkESDx1", kTRDin, kTRDin);
\r
1495 Process(h1, (TGraphErrors*)arr->At(0));
\r
1496 delete h1[0];delete h1[1];
\r
1497 // tracking efficiency
\r
1498 h1[0] = h2->ProjectionX("checkESDx0", kTRDin, kTRDin);
\r
1499 h1[1] = h2->ProjectionX("checkESDx1", kTRDout, kTRDout);
\r
1500 Process(h1, (TGraphErrors*)arr->At(1));
\r
1503 h1[1] = h2->ProjectionX("checkESDx1", kTRDpid, kTRDpid);
\r
1504 Process(h1, (TGraphErrors*)arr->At(2));
\r
1506 // Refit efficiency
\r
1507 h1[1] = h2->ProjectionX("checkESDx1", kTRDref, kTRDref);
\r
1508 Process(h1, (TGraphErrors*)arr->At(3));
\r
1513 if(!(h2 = dynamic_cast<TH2I*>(fHistos->At(kTRDmom)))) return;
\r
1514 arr = (TObjArray*)fResults->At(kTRDmom);
\r
1515 TGraphAsymmErrors *g06 = (TGraphAsymmErrors*)arr->At(0), *g09 = (TGraphAsymmErrors*)arr->At(1);
\r
1516 ax=h2->GetXaxis();
\r
1517 const Int_t nq(4);
\r
1518 const Double_t xq[nq] = {0.05, 0.2, 0.8, 0.95};
\r
1520 for(Int_t ily=6; ily--;){
\r
1521 h1[0] = h2->ProjectionX("checkESDp0", ily+1, ily+1);
\r
1522 h1[0]->GetQuantiles(nq,yq,xq);
\r
1523 g06->SetPoint(ily, Float_t(ily), ax->GetBinCenter(h1[0]->GetMaximumBin()));
\r
1524 g06->SetPointError(ily, 0., 0., TMath::Abs(yq[0]), yq[3]);
\r
1525 g09->SetPoint(ily, Float_t(ily), h1[0]->GetMean());
\r
1526 g09->SetPointError(ily, 0., 0., TMath::Abs(yq[1]), yq[2]);
\r
1528 //printf(" max[%f] mean[%f] q[%f %f %f %f]\n", ax->GetBinCenter(h1[0]->GetMaximumBin()), h1[0]->GetMean(), yq[0], yq[1], yq[2], yq[3]);
\r
1532 // if(!HasMC()) return;
\r
1534 // Pt RESOLUTION @ DCA
\r
1535 TH3S* h3(NULL); TGraphErrors *gg[2] = {NULL,NULL};
\r
1536 if(!(h3 = dynamic_cast<TH3S*>(fHistos->At(kPtRes)))) return;
\r
1537 arr = (TObjArray*)fResults->At(kPtRes);
\r
1538 TAxis *az(h3->GetZaxis());
\r
1539 for(Int_t i(0); i<AliPID::kSPECIES; i++){
\r
1541 az->SetRange(idx+1, idx+2);
\r
1542 gg[1] = (TGraphErrors*)arr->At(idx);
\r
1543 gg[0] = (TGraphErrors*)arr->At(idx+1);
\r
1544 Process2D((TH2*)h3->Project3D("yx"), gg);
\r
1547 az->SetRange(idx+1, idx+2);
\r
1548 gg[1] = (TGraphErrors*)arr->At(idx);
\r
1549 gg[0] = (TGraphErrors*)arr->At(idx+1);
\r
1550 Process2D((TH2*)h3->Project3D("yx"), gg);
\r
1554 // 3x3 tracking summary canvas
\r
1556 // 3x3 PID summary canvas
\r
1560 //____________________________________________________________________
\r
1561 Int_t AliTRDcheckESD::Pdg2Idx(Int_t pdg)
\r
1565 case kPositron: return AliPID::kElectron;
\r
1567 case kMuonMinus: return AliPID::kMuon;
\r
1569 case kPiMinus: return AliPID::kPion;
\r
1571 case kKMinus: return AliPID::kKaon;
\r
1573 case kProtonBar: return AliPID::kProton;
\r
1578 //____________________________________________________________________
\r
1579 void AliTRDcheckESD::Process(TH1 **h1, TGraphErrors *g)
\r
1581 // Generic function to process one reference plot
\r
1583 Int_t n1 = 0, n2 = 0, ip=0;
\r
1584 Double_t eff = 0.;
\r
1586 TAxis *ax = h1[0]->GetXaxis();
\r
1587 for(Int_t ib=1; ib<=ax->GetNbins(); ib++){
\r
1588 if(!(n1 = (Int_t)h1[0]->GetBinContent(ib))) continue;
\r
1589 n2 = (Int_t)h1[1]->GetBinContent(ib);
\r
1590 eff = n2/Float_t(n1);
\r
1593 g->SetPoint(ip, ax->GetBinCenter(ib), eff);
\r
1594 g->SetPointError(ip, 0., n2 ? eff*TMath::Sqrt(1./n1+1./n2) : 0.);
\r
1597 //________________________________________________________
\r
1598 void AliTRDcheckESD::Process2D(TH2 * const h2, TGraphErrors **g)
\r
1601 // Do the processing
\r
1605 if((n=g[0]->GetN())) for(;n--;) g[0]->RemovePoint(n);
\r
1606 if((n=g[1]->GetN())) for(;n--;) g[1]->RemovePoint(n);
\r
1607 TF1 f("fg", "gaus", -3.,3.);
\r
1608 for(Int_t ibin = 1; ibin <= h2->GetNbinsX(); ibin++){
\r
1609 Double_t x = h2->GetXaxis()->GetBinCenter(ibin);
\r
1610 TH1D *h = h2->ProjectionY("py", ibin, ibin);
\r
1611 if(h->GetEntries()<100) continue;
\r
1615 Int_t ip = g[0]->GetN();
\r
1616 g[0]->SetPoint(ip, x, f.GetParameter(1));
\r
1617 g[0]->SetPointError(ip, 0., f.GetParError(1));
\r
1618 g[1]->SetPoint(ip, x, f.GetParameter(2));
\r
1619 g[1]->SetPointError(ip, 0., f.GetParError(2));
\r
1623 //____________________________________________________________________
\r
1624 void AliTRDcheckESD::PrintStatus(ULong_t status)
\r
1626 // Dump track status to stdout
\r
1628 printf("ITS[i(%d) o(%d) r(%d)] TPC[i(%d) o(%d) r(%d) p(%d)] TRD[i(%d) o(%d) r(%d) p(%d) s(%d)] HMPID[o(%d) p(%d)]\n"
\r
1629 ,Bool_t(status & AliESDtrack::kITSin)
\r
1630 ,Bool_t(status & AliESDtrack::kITSout)
\r
1631 ,Bool_t(status & AliESDtrack::kITSrefit)
\r
1632 ,Bool_t(status & AliESDtrack::kTPCin)
\r
1633 ,Bool_t(status & AliESDtrack::kTPCout)
\r
1634 ,Bool_t(status & AliESDtrack::kTPCrefit)
\r
1635 ,Bool_t(status & AliESDtrack::kTPCpid)
\r
1636 ,Bool_t(status & AliESDtrack::kTRDin)
\r
1637 ,Bool_t(status & AliESDtrack::kTRDout)
\r
1638 ,Bool_t(status & AliESDtrack::kTRDrefit)
\r
1639 ,Bool_t(status & AliESDtrack::kTRDpid)
\r
1640 ,Bool_t(status & AliESDtrack::kTRDStop)
\r
1641 ,Bool_t(status & AliESDtrack::kHMPIDout)
\r
1642 ,Bool_t(status & AliESDtrack::kHMPIDpid)
\r
1645 //____________________________________________________________________
\r
1646 TH2F* AliTRDcheckESD::Proj3D(TH3F* hist, TH2F* accMap, Int_t zbinLow, Int_t zbinHigh, Float_t &entries) {
\r
1648 // Project a 3D histogram to a 2D histogram in the Z axis interval [zbinLow,zbinHigh]
\r
1649 // Return the 2D histogram and also the number of entries into this projection (entries)
\r
1651 Int_t nBinsX = hist->GetXaxis()->GetNbins(); // X and Y axis bins are assumed to be all equal
\r
1652 Float_t minX = hist->GetXaxis()->GetXmin();
\r
1653 Float_t maxX = hist->GetXaxis()->GetXmax();
\r
1654 Int_t nBinsY = hist->GetYaxis()->GetNbins();
\r
1655 Float_t minY = hist->GetYaxis()->GetXmin();
\r
1656 Float_t maxY = hist->GetYaxis()->GetXmax();
\r
1657 Int_t nBinsZ = hist->GetZaxis()->GetNbins(); // Z axis bins (pt) might have different widths
\r
1658 //Float_t minZ = hist->GetZaxis()->GetXmin();
\r
1659 //Float_t maxZ = hist->GetZaxis()->GetXmax();
\r
1661 TH2F* projHisto = (TH2F*)gROOT->FindObject("projHisto");
\r
1663 projHisto->Reset();
\r
1665 projHisto = new TH2F("projHisto", "projection", nBinsX, minX, maxX, nBinsY, minY, maxY);
\r
1667 const Double_t kMinAccFraction = 0.1;
\r
1669 Double_t maxAcc = (accMap ? accMap->GetMaximum() : -1);
\r
1671 for(Int_t iZ=1; iZ<=nBinsZ; iZ++) {
\r
1672 if(iZ<zbinLow) continue;
\r
1673 if(iZ>zbinHigh) continue;
\r
1674 for(Int_t iX=1; iX<=nBinsX; iX++) {
\r
1675 for(Int_t iY=1; iY<=nBinsY; iY++) {
\r
1676 if(accMap && maxAcc>0) {
\r
1677 if(accMap->GetBinContent(iX,iY)/maxAcc>kMinAccFraction)
\r
1678 projHisto->SetBinContent(iX, iY, projHisto->GetBinContent(iX, iY)+hist->GetBinContent(iX,iY,iZ));
\r
1680 else // no acc. cut
\r
1681 projHisto->SetBinContent(iX, iY, projHisto->GetBinContent(iX, iY)+hist->GetBinContent(iX,iY,iZ));
\r
1682 // count only the entries which are inside the acceptance map
\r
1683 if(accMap && maxAcc>0) {
\r
1684 if(accMap->GetBinContent(iX,iY)/maxAcc>kMinAccFraction)
\r
1685 entries+=hist->GetBinContent(iX,iY,iZ);
\r
1687 else // no acc. cut
\r
1688 entries+=hist->GetBinContent(iX,iY,iZ);
\r
1694 //____________________________________________________________________
\r
1695 TH1F* AliTRDcheckESD::TRDEfficiency(Short_t positives) {
\r
1697 // Calculate the TRD-TPC matching efficiency as function of pt
\r
1699 TH3F* tpc3D(NULL); TH3F* trd3D(NULL);
\r
1700 if(positives>0) { // get the histos for positive tracks
\r
1701 if(!(tpc3D = dynamic_cast<TH3F*>(fHistos->At(kTPCRefTracksPos)))) return 0x0;
\r
1702 if(!(trd3D = dynamic_cast<TH3F*>(fHistos->At(kTRDRefTracksPos)))) return 0x0;
\r
1704 else { // get the histos for positive tracks
\r
1705 if(!(tpc3D = dynamic_cast<TH3F*>(fHistos->At(kTPCRefTracksNeg)))) return 0x0;
\r
1706 if(!(trd3D = dynamic_cast<TH3F*>(fHistos->At(kTRDRefTracksNeg)))) return 0x0;
\r
1709 Int_t nBinsZ = trd3D->GetZaxis()->GetNbins();
\r
1710 // project everything on the eta-phi map to obtain an acceptance map (make sure there is enough statistics)
\r
1711 Float_t nada = 0.;
\r
1712 TH2F *trdAcc = (TH2F*)Proj3D(trd3D, 0x0, 1, nBinsZ, nada)->Clone();
\r
1713 // get the bin limits from the Z axis of 3D histos
\r
1714 Float_t *ptBinLimits = new Float_t[nBinsZ+1];
\r
1715 for(Int_t i=1; i<=nBinsZ; i++) {
\r
1716 ptBinLimits[i-1] = trd3D->GetZaxis()->GetBinLowEdge(i);
\r
1718 ptBinLimits[nBinsZ] = trd3D->GetZaxis()->GetBinUpEdge(nBinsZ);
\r
1719 TH1F *efficiency = new TH1F("eff", "TRD-TPC matching efficiency", nBinsZ, ptBinLimits);
\r
1720 // loop over Z bins
\r
1721 for(Int_t i=1; i<=nBinsZ; i++) {
\r
1722 Float_t tpcEntries = 0.0; Float_t trdEntries = 0.0;
\r
1723 Proj3D(tpc3D, trdAcc, i, i, tpcEntries);
\r
1724 Proj3D(trd3D, trdAcc, i, i, trdEntries);
\r
1725 Float_t ratio = 0;
\r
1726 if(tpcEntries>0) ratio = trdEntries/tpcEntries;
\r
1727 Float_t error = 0;
\r
1728 if(tpcEntries>0 && trdEntries>0)
\r
1729 error = ratio*TMath::Sqrt((1.0/tpcEntries)+(1.0/trdEntries));
\r
1731 efficiency->SetBinContent(i,ratio);
\r
1732 efficiency->SetBinError(i,error);
\r
1734 } // end loop over Z bins
\r
1736 efficiency->SetLineColor((positives>0 ? 2 : 4));
\r
1737 return efficiency;
\r