1 // Track QA task (efficiency and pt resolution)
11 #include "AliPicoTrack.h"
12 #include "AliAODMCParticle.h"
13 #include "AliParticleContainer.h"
16 #include "AliEmcalTrackingQATask.h"
18 ClassImp(AliEmcalTrackingQATask)
20 //________________________________________________________________________
21 AliEmcalTrackingQATask::AliEmcalTrackingQATask() :
22 AliAnalysisTaskEmcal("AliEmcalTrackingQA", kTRUE),
28 fParticlesAllPhysPrim(0),
29 fParticlesSelected(0),
30 fParticlesFindable(0),
33 // Default constructor.
35 SetMakeGeneralHistograms(kTRUE);
38 //________________________________________________________________________
39 AliEmcalTrackingQATask::AliEmcalTrackingQATask(const char *name) :
40 AliAnalysisTaskEmcal(name, kTRUE),
46 fParticlesAllPhysPrim(0),
47 fParticlesSelected(0),
48 fParticlesFindable(0),
51 // Standard constructor.
53 SetMakeGeneralHistograms(kTRUE);
56 //________________________________________________________________________
57 AliEmcalTrackingQATask::~AliEmcalTrackingQATask()
62 //________________________________________________________________________
63 void AliEmcalTrackingQATask::UserCreateOutputObjects()
65 // Create my user objects.
67 AliAnalysisTaskEmcal::UserCreateOutputObjects();
69 if (!fCreateHisto) return;
71 fTracksAll = new TH3**[fNcentBins];
72 fTracksSelected = new TH3**[fNcentBins];
73 fParticlesAllPhysPrim = new TH3*[fNcentBins];
74 fParticlesSelected = new TH3*[fNcentBins];
78 for (Int_t i = 0; i < fNcentBins; i++) {
80 fTracksAll[i] = new TH3*[3];
81 fTracksSelected[i] = new TH3*[3];
82 for (Int_t j = 0; j < 3; j++) {
83 histname = Form("fTracksAll_%d_%d",i,j);
84 fTracksAll[i][j] = new TH3F(histname,histname, 100, -1, 1, 101, 0, TMath::Pi() * 2.02, fNbins, fMinBinPt, fMaxBinPt);
85 fTracksAll[i][j]->GetXaxis()->SetTitle("#eta");
86 fTracksAll[i][j]->GetYaxis()->SetTitle("#phi");
87 fTracksAll[i][j]->GetZaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
88 fOutput->Add(fTracksAll[i][j]);
91 histname = Form("fTracksSelected_%d_%d",i,j);
92 fTracksSelected[i][j] = new TH3F(histname,histname, 100, -1, 1, 101, 0, TMath::Pi() * 2.02, fNbins, fMinBinPt, fMaxBinPt);
93 fTracksSelected[i][j]->GetXaxis()->SetTitle("#eta");
94 fTracksSelected[i][j]->GetYaxis()->SetTitle("#phi");
95 fTracksSelected[i][j]->GetZaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
96 fOutput->Add(fTracksSelected[i][j]);
100 histname = Form("fParticlesAllPhysPrim_%d",i);
101 fParticlesAllPhysPrim[i] = new TH3F(histname,histname, 100, -1, 1, 101, 0, TMath::Pi() * 2.02, fNbins, fMinBinPt, fMaxBinPt);
102 fParticlesAllPhysPrim[i]->GetXaxis()->SetTitle("#eta");
103 fParticlesAllPhysPrim[i]->GetYaxis()->SetTitle("#phi");
104 fParticlesAllPhysPrim[i]->GetZaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
105 fOutput->Add(fParticlesAllPhysPrim[i]);
108 histname = Form("fParticlesSelected_%d",i);
109 fParticlesSelected[i] = new TH3F(histname,histname, 100, -1, 1, 101, 0, TMath::Pi() * 2.02, fNbins, fMinBinPt, fMaxBinPt);
110 fParticlesSelected[i]->GetXaxis()->SetTitle("#eta");
111 fParticlesSelected[i]->GetYaxis()->SetTitle("#phi");
112 fParticlesSelected[i]->GetZaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
113 fOutput->Add(fParticlesSelected[i]);
117 AllocateFindableParticlesTHnSparse();
118 AllocateMatchedParticlesTHnSparse();
120 PostData(1, fOutput);
123 //________________________________________________________________________
124 void AliEmcalTrackingQATask::AllocateFindableParticlesTHnSparse()
128 Int_t nbins[20] = {0};
129 Double_t min[20] = {0};
130 Double_t max[20] = {0};
132 if (fForceBeamType != AliAnalysisTaskEmcal::kpp) {
133 title[dim] = "Centrality %";
140 title[dim] = "#it{p}_{T} (GeV/#it{c})";
142 min[dim] = fMinBinPt;
143 max[dim] = fMaxBinPt;
155 max[dim] = TMath::Pi() * 2.02;
158 fParticlesFindable = new THnSparseF("fParticlesFindable","fParticlesFindable",dim,nbins,min,max);
159 for (Int_t i = 0; i < dim; i++)
160 fParticlesFindable->GetAxis(i)->SetTitle(title[i]);
161 fOutput->Add(fParticlesFindable);
164 //________________________________________________________________________
165 void AliEmcalTrackingQATask::AllocateMatchedParticlesTHnSparse()
169 Int_t nbins[20] = {0};
170 Double_t min[20] = {0};
171 Double_t max[20] = {0};
173 if (fForceBeamType != AliAnalysisTaskEmcal::kpp) {
174 title[dim] = "Centrality %";
181 title[dim] = "#it{p}_{T}^{gen} (GeV/#it{c})";
183 min[dim] = fMinBinPt;
184 max[dim] = fMaxBinPt;
187 title[dim] = "#eta^{gen}";
193 title[dim] = "#phi^{gen}";
196 max[dim] = TMath::Pi() * 2.02;
199 title[dim] = "#it{p}_{T}^{det} (GeV/#it{c})";
201 min[dim] = fMinBinPt;
202 max[dim] = fMaxBinPt;
205 title[dim] = "#eta^{det}";
211 title[dim] = "#phi^{det}";
214 max[dim] = TMath::Pi() * 2.02;
217 title[dim] = "(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}";
223 title[dim] = "track type";
229 fParticlesMatched = new THnSparseF("fParticlesMatched","fParticlesMatched",dim,nbins,min,max);
230 for (Int_t i = 0; i < dim; i++)
231 fParticlesMatched->GetAxis(i)->SetTitle(title[i]);
232 fOutput->Add(fParticlesMatched);
235 //________________________________________________________________________
236 void AliEmcalTrackingQATask::SetGeneratorLevelName(const char* name)
238 if (!fGeneratorLevel) { // first check if the generator level array is set
239 fGeneratorLevel = static_cast<AliParticleContainer*>(fParticleCollArray.At(0));
240 if (fGeneratorLevel) { // now check if the first collection array has been added already
241 fGeneratorLevel->SetArrayName(name);
244 fGeneratorLevel = AddParticleContainer(name);
246 fGeneratorLevel->SetClassName("AliAODMCParticle");
247 fGeneratorLevel->SelectPhysicalPrimaries(kTRUE);
249 fGeneratorLevel->SetArrayName(name);
252 //________________________________________________________________________
253 void AliEmcalTrackingQATask::SetDetectorLevelName(const char* name)
255 if (!fGeneratorLevel) {
256 AliError("Please, first set the generatol level array!");
259 if (!fDetectorLevel) { // first check if the detector level array is set
260 fDetectorLevel = static_cast<AliParticleContainer*>(fParticleCollArray.At(1));
261 if (fDetectorLevel) { // now check if the second collection array has been added already
262 fDetectorLevel->SetArrayName(name);
265 fDetectorLevel = AddParticleContainer(name);
267 fDetectorLevel->SetClassName("AliPicoTrack");
269 fDetectorLevel->SetArrayName(name);
272 //________________________________________________________________________
273 void AliEmcalTrackingQATask::ExecOnce()
275 // Init the analysis.
277 if (fParticleCollArray.GetEntriesFast() < 2) {
278 AliFatal("This task needs at least two particle containers!");
281 if (!fGeneratorLevel) {
282 fGeneratorLevel = static_cast<AliParticleContainer*>(fParticleCollArray.At(0));
283 fGeneratorLevel->SetClassName("AliAODMCParticle");
286 if (!fDetectorLevel) {
287 fDetectorLevel = static_cast<AliParticleContainer*>(fParticleCollArray.At(1));
288 fDetectorLevel->SetClassName("AliPicoTrack");
291 AliAnalysisTaskEmcal::ExecOnce();
294 //________________________________________________________________________
295 void AliEmcalTrackingQATask::FillFindableParticlesTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt)
297 Double_t contents[20]={0};
299 for (Int_t i = 0; i < fParticlesFindable->GetNdimensions(); i++) {
300 TString title(fParticlesFindable->GetAxis(i)->GetTitle());
301 if (title=="Centrality %")
303 else if (title=="#it{p}_{T} (GeV/#it{c})")
304 contents[i] = partPt;
305 else if (title=="#eta")
306 contents[i] = partEta;
307 else if (title=="#phi")
308 contents[i] = partPhi;
310 AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesFindable->GetName()));
313 fParticlesFindable->Fill(contents);
316 //________________________________________________________________________
317 void AliEmcalTrackingQATask::FillMatchedParticlesTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt,
318 Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
320 Double_t contents[20]={0};
322 for (Int_t i = 0; i < fParticlesMatched->GetNdimensions(); i++) {
323 TString title(fParticlesMatched->GetAxis(i)->GetTitle());
324 if (title=="Centrality %")
326 else if (title=="#it{p}_{T}^{gen} (GeV/#it{c})")
327 contents[i] = partPt;
328 else if (title=="#eta^{gen}")
329 contents[i] = partEta;
330 else if (title=="#phi^{gen}")
331 contents[i] = partPhi;
332 else if (title=="#it{p}_{T}^{det} (GeV/#it{c})")
333 contents[i] = trackPt;
334 else if (title=="#eta^{det}")
335 contents[i] = trackEta;
336 else if (title=="#phi^{det}")
337 contents[i] = trackPhi;
338 else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
339 contents[i] = (partPt - trackPt) / partPt;
340 else if (title=="track type")
341 contents[i] = (Double_t)trackType;
343 AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesMatched->GetName()));
346 fParticlesMatched->Fill(contents);
349 //________________________________________________________________________
350 Bool_t AliEmcalTrackingQATask::FillHistograms()
352 // Fill the histograms.
354 AliPicoTrack *track = static_cast<AliPicoTrack*>(fDetectorLevel->GetNextAcceptParticle(0));
356 Byte_t type = track->GetTrackType();
357 if (type<= 2 && type >= 0) {
358 fTracksAll[fCentBin][type]->Fill(track->Eta(), track->Phi(), track->Pt());
360 Int_t label = TMath::Abs(track->GetLabel());
362 if (fSelectHIJING && (label==0 || track->GetGeneratorIndex() == 0)) {
363 // reject particles generated from other generators in the cocktail but keep fake tracks (label == 0)
364 fTracksSelected[fCentBin][type]->Fill(track->Eta(), track->Phi(), track->Pt());
368 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fGeneratorLevel->GetAcceptParticleWithLabel(label));
370 if (!fSelectHIJING || part->GetGeneratorIndex() == 0) {
371 Int_t pdg = TMath::Abs(part->PdgCode());
372 // select charged pions, protons, kaons , electrons, muons
373 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
374 FillMatchedParticlesTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), track->Eta(), track->Phi(), track->Pt(), type);
381 AliError(Form("Track %d has type %d not recognized!", fDetectorLevel->GetCurrentID(), type));
384 track = static_cast<AliPicoTrack*>(fDetectorLevel->GetNextAcceptParticle());
387 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fGeneratorLevel->GetNextAcceptParticle(0));
389 fParticlesAllPhysPrim[fCentBin]->Fill(part->Eta(), part->Phi(), part->Pt());
390 if (!fSelectHIJING || part->GetGeneratorIndex() == 0) {
391 if (fSelectHIJING) fParticlesSelected[fCentBin]->Fill(part->Eta(), part->Phi(), part->Pt());
393 Int_t pdg = TMath::Abs(part->PdgCode());
394 // select charged pions, protons, kaons , electrons, muons
395 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
396 FillFindableParticlesTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt());
400 part = static_cast<AliAODMCParticle*>(fGeneratorLevel->GetNextAcceptParticle());