3 // General QA task (S.Aiola).
8 #include <TClonesArray.h>
12 #include <TLorentzVector.h>
13 #include <TParticle.h>
15 #include "AliAnalysisManager.h"
16 #include "AliCentrality.h"
17 #include "AliVCluster.h"
18 #include "AliESDtrack.h"
19 #include "AliEmcalJet.h"
20 #include "AliAODTrack.h"
21 #include "AliESDtrack.h"
22 #include "AliVEventHandler.h"
23 #include "AliPicoTrack.h"
25 #include "AliAnalysisTaskSAQA.h"
27 ClassImp(AliAnalysisTaskSAQA)
29 //________________________________________________________________________
30 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA() :
31 AliAnalysisTaskSE("AliAnalysisTaskSAQA"),
34 fTracksName("Tracks"),
35 fCaloName("CaloClusters"),
36 fTrgClusName("ClustersL1GAMMAFEE"),
45 fHistMaxL1FastORCent(0),
46 fHistMaxL1ClusCent(0),
50 fHistClustersEnergy(0),
56 fHistChVSneCorrCells(0),
61 // Default constructor.
63 for (Int_t i = 0; i < 5; i++) {
68 // Output slot #1 writes into a TH1 container
69 DefineOutput(1, TList::Class());
72 //________________________________________________________________________
73 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA(const char *name) :
74 AliAnalysisTaskSE(name),
77 fTracksName("Tracks"),
78 fCaloName("CaloClusters"),
79 fTrgClusName("ClustersL1GAMMAFEE"),
88 fHistMaxL1FastORCent(0),
89 fHistMaxL1ClusCent(0),
93 fHistClustersEnergy(0),
99 fHistChVSneCorrCells(0),
104 // Standard constructor.
106 for (Int_t i = 0; i < 5; i++) {
107 fHistTrackPhi[i] = 0;
108 fHistTrackEta[i] = 0;
111 // Output slot #1 writes into a TH1 container
112 DefineOutput(1, TList::Class());
115 //________________________________________________________________________
116 AliAnalysisTaskSAQA::~AliAnalysisTaskSAQA()
121 //________________________________________________________________________
122 void AliAnalysisTaskSAQA::UserCreateOutputObjects()
126 fOutput = new TList();
127 fOutput->SetOwner(); // IMPORTANT!
129 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", fNbins, 0, 100);
130 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
131 fHistCentrality->GetYaxis()->SetTitle("counts");
132 fOutput->Add(fHistCentrality);
134 fHistTracksCent = new TH2F("fHistTracksCent","Tracks vs. centrality", fNbins, 0, 100, fNbins, 0, 4000);
135 fHistTracksCent->GetXaxis()->SetTitle("Centrality (%)");
136 fHistTracksCent->GetYaxis()->SetTitle("No. of tracks");
137 fOutput->Add(fHistTracksCent);
139 fHistClusCent = new TH2F("fHistClusCent","Clusters vs. centrality", fNbins, 0, 100, fNbins, 0, 2000);
140 fHistClusCent->GetXaxis()->SetTitle("Centrality (%)");
141 fHistClusCent->GetYaxis()->SetTitle("No. of clusters");
142 fOutput->Add(fHistClusCent);
144 fHistMaxL1FastORCent = new TH2F("fHistMaxL1FastORCent","fHistMaxL1ClusCent", 100, 0, 100, 250, 0, 250);
145 fHistMaxL1FastORCent->GetXaxis()->SetTitle("Centrality [%]");
146 fHistMaxL1FastORCent->GetYaxis()->SetTitle("Maximum L1 FastOR");
147 fOutput->Add(fHistMaxL1FastORCent);
149 fHistMaxL1ClusCent = new TH2F("fHistMaxL1ClusCent","fHistMaxL1ClusCent", 100, 0, 100, 250, 0, 250);
150 fHistMaxL1ClusCent->GetXaxis()->SetTitle("Centrality [%]");
151 fHistMaxL1ClusCent->GetYaxis()->SetTitle("Maximum L1 trigger cluster");
152 fOutput->Add(fHistMaxL1ClusCent);
154 fHistMaxL1ThrCent = new TH2F("fHistMaxL1ThrCent","fHistMaxL1ThrCent", 100, 0, 100, 250, 0, 250);
155 fHistMaxL1ThrCent->GetXaxis()->SetTitle("Centrality [%]");
156 fHistMaxL1ThrCent->GetYaxis()->SetTitle("Maximum L1 threshold");
157 fOutput->Add(fHistMaxL1ThrCent);
159 fHistTracksPt = new TH1F("fHistTracksPt","P_{T} spectrum of reconstructed tracks", fNbins, fMinPt, fMaxPt);
160 fHistTracksPt->GetXaxis()->SetTitle("P_{T} [GeV/c]");
161 fHistTracksPt->GetYaxis()->SetTitle("counts");
162 fOutput->Add(fHistTracksPt);
164 fHistCellsEnergy = new TH1F("fHistCellsEnergy","Energy spectrum of cells", fNbins, fMinPt, fMaxPt);
165 fHistCellsEnergy->GetXaxis()->SetTitle("E [GeV]");
166 fHistCellsEnergy->GetYaxis()->SetTitle("counts");
167 fOutput->Add(fHistCellsEnergy);
169 fHistClustersEnergy = new TH1F("fHistClustersEnergy","Energy spectrum of clusters", fNbins, fMinPt, fMaxPt);
170 fHistClustersEnergy->GetXaxis()->SetTitle("E [GeV]");
171 fHistClustersEnergy->GetYaxis()->SetTitle("counts");
172 fOutput->Add(fHistClustersEnergy);
174 fHistEoverP = new TH2F("fHistEoverP","E/P vs. E", fNbins, fMinPt, fMaxPt, fNbins, 0, 10);
175 fHistEoverP->GetXaxis()->SetTitle("E [GeV]");
176 fHistEoverP->GetYaxis()->SetTitle("E/P [c]");
177 fOutput->Add(fHistEoverP);
179 fHistTrPhiEta = new TH2F("fHistTrPhiEta","Phi-Eta distribution of tracks", 20, -2, 2, 32, 0, 6.4);
180 fHistTrPhiEta->GetXaxis()->SetTitle("Eta");
181 fHistTrPhiEta->GetYaxis()->SetTitle("Phi");
182 fOutput->Add(fHistTrPhiEta);
184 fHistClusPhiEta = new TH2F("fHistClusPhiEta","Phi-Eta distribution of clusters", 20, -2, 2, 32, 0, 6.4);
185 fHistClusPhiEta->GetXaxis()->SetTitle("Eta");
186 fHistClusPhiEta->GetYaxis()->SetTitle("Phi");
187 fOutput->Add(fHistClusPhiEta);
189 fHistChVSneCells = new TH2F("fHistChVSneCells","Charged energy vs. neutral (cells) energy", fNbins, fMinPt * 10, fMaxPt * 10, fNbins, fMinPt * 10, fMaxPt * 10);
190 fHistChVSneCells->GetXaxis()->SetTitle("E [GeV]");
191 fHistChVSneCells->GetYaxis()->SetTitle("P [GeV/c]");
192 fOutput->Add(fHistChVSneCells);
194 fHistChVSneClus = new TH2F("fHistChVSneClus","Charged energy vs. neutral (clusters) energy", fNbins, fMinPt * 10, fMaxPt * 10, fNbins, fMinPt * 10, fMaxPt * 10);
195 fHistChVSneClus->GetXaxis()->SetTitle("E [GeV]");
196 fHistChVSneClus->GetYaxis()->SetTitle("P [GeV/c]");
197 fOutput->Add(fHistChVSneClus);
199 fHistChVSneCorrCells = new TH2F("fHistChVSneCorrCells","Charged energy vs. neutral (corrected cells) energy", fNbins, fMinPt * 10, fMaxPt * 10, fNbins, fMinPt * 10, fMaxPt * 10);
200 fHistChVSneCorrCells->GetXaxis()->SetTitle("E [GeV]");
201 fHistChVSneCorrCells->GetYaxis()->SetTitle("P [GeV/c]");
202 fOutput->Add(fHistChVSneCorrCells);
204 for (Int_t i = 0; i < 5; i++) {
205 TString histnamephi("fHistTrackPhi_");
207 fHistTrackPhi[i] = new TH1F(histnamephi.Data(),histnamephi.Data(), 128, 0, 6.4);
208 fHistTrackPhi[i]->GetXaxis()->SetTitle("Phi");
209 fOutput->Add(fHistTrackPhi[i]);
211 TString histnameeta("fHistTrackEta_");
213 fHistTrackEta[i] = new TH1F(histnameeta.Data(),histnameeta.Data(), 100, -2, 2);
214 fHistTrackEta[i]->GetXaxis()->SetTitle("Eta");
215 fOutput->Add(fHistTrackEta[i]);
218 fHistTrackPhi[0]->SetLineColor(kRed);
219 fHistTrackEta[0]->SetLineColor(kRed);
220 fHistTrackPhi[1]->SetLineColor(kBlue);
221 fHistTrackEta[1]->SetLineColor(kBlue);
222 fHistTrackPhi[2]->SetLineColor(kGreen);
223 fHistTrackEta[2]->SetLineColor(kGreen);
224 fHistTrackPhi[3]->SetLineColor(kOrange);
225 fHistTrackEta[3]->SetLineColor(kOrange);
226 fHistTrackPhi[4]->SetLineColor(kBlack);
227 fHistTrackEta[4]->SetLineColor(kBlack);
229 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
232 void AliAnalysisTaskSAQA::RetrieveEventObjects()
234 fCaloClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
235 if (!fCaloClusters) {
236 AliWarning(Form("Could not retrieve clusters!"));
239 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
241 AliWarning(Form("Could not retrieve tracks!"));
244 if (strcmp(fTrgClusName,"")) {
245 fTrgClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrgClusName));
247 AliWarning(Form("Could not retrieve trigger clusters!"));
251 fCent = InputEvent()->GetCentrality();
254 AliVTrack* AliAnalysisTaskSAQA::GetTrack(const Int_t i) const
257 return dynamic_cast<AliVTrack*>(fTracks->At(i));
262 Int_t AliAnalysisTaskSAQA::GetNumberOfTracks() const
265 return fTracks->GetEntriesFast();
270 AliVCluster* AliAnalysisTaskSAQA::GetCaloCluster(const Int_t i) const
273 return dynamic_cast<AliVCluster*>(fCaloClusters->At(i));
278 Int_t AliAnalysisTaskSAQA::GetNumberOfCaloClusters() const
281 return fCaloClusters->GetEntriesFast();
286 AliVCluster* AliAnalysisTaskSAQA::GetTrgCluster(const Int_t i) const
289 return dynamic_cast<AliVCluster*>(fTrgClusters->At(i));
294 Int_t AliAnalysisTaskSAQA::GetNumberOfTrgClusters() const
297 return fTrgClusters->GetEntriesFast();
302 //________________________________________________________________________
303 Float_t AliAnalysisTaskSAQA::GetAcceptanceNormFactor() const
305 const Float_t EmcalEtaMin = -0.7;
306 const Float_t EmcalEtaMax = 0.7;
307 const Float_t EmcalPhiMin = 80 * TMath::DegToRad();
308 const Float_t EmcalPhiMax = 180 * TMath::DegToRad();
310 const Float_t TpcEtaMin = -0.9;
311 const Float_t TpcEtaMax = 0.9;
312 const Float_t TpcPhiMin = 0;
313 const Float_t TpcPhiMax = 2 * TMath::Pi();
315 Float_t emcalArea = (EmcalEtaMax - EmcalEtaMin) * (EmcalPhiMax - EmcalPhiMin);
316 Float_t tpcArea = (TpcEtaMax - TpcEtaMin) * (TpcPhiMax - TpcPhiMin);
318 return emcalArea / tpcArea;
321 void AliAnalysisTaskSAQA::FillHistograms()
326 cent = fCent->GetCentralityPercentile("V0M");
328 AliWarning("Centrality not available!");
330 fHistCentrality->Fill(cent);
331 fHistTracksCent->Fill(cent, GetNumberOfTracks());
332 fHistClusCent->Fill(cent, GetNumberOfCaloClusters());
334 Float_t clusSum = DoClusterLoop();
336 Float_t trackSum = DoTrackLoop();
338 //Normalization to EMCal acceptance
339 trackSum *= GetAcceptanceNormFactor();
341 Float_t cellSum = 0, cellCutSum = 0;
342 DoCellLoop(cellSum, cellCutSum);
344 fHistChVSneCells->Fill(cellSum, trackSum);
345 fHistChVSneClus->Fill(clusSum, trackSum);
346 fHistChVSneCorrCells->Fill(cellCutSum, trackSum);
348 Float_t maxTrgClus = DoTriggerClusLoop();
349 fHistMaxL1ClusCent->Fill(cent, maxTrgClus);
354 DoTriggerPrimitives(maxL1amp, maxL1thr);
357 fHistMaxL1FastORCent->Fill(cent, maxL1amp);
360 fHistMaxL1ThrCent->Fill(cent, maxL1thr);
363 //________________________________________________________________________
364 void AliAnalysisTaskSAQA::DoCellLoop(Float_t &sum, Float_t &sum_cut)
366 AliVCaloCells *cells = InputEvent()->GetEMCALCells();
371 Int_t ncells = cells->GetNumberOfCells();
373 for (Int_t pos = 0; pos < ncells; pos++) {
375 Float_t amp = cells->GetAmplitude(pos);
377 fHistCellsEnergy->Fill(amp);
381 if (amp < fCellEnergyCut)
389 //________________________________________________________________________
390 Float_t AliAnalysisTaskSAQA::DoClusterLoop()
394 // get primary vertex
395 //Double_t vertex[3] = {0, 0, 0};
396 //InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
399 Int_t nclusters = GetNumberOfCaloClusters();
401 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
402 AliVCluster* cluster = GetCaloCluster(iClusters);
404 AliError(Form("Could not receive cluster %d", iClusters));
408 if (!(cluster->IsEMCAL())) continue;
410 fHistClustersEnergy->Fill(cluster->E());
412 //TLorentzVector nPart;
413 //cluster->GetMomentum(nPart, vertex);
417 cluster->GetPosition(pos);
418 TVector3 clusVec(pos);
419 fHistClusPhiEta->Fill(clusVec.Eta(), clusVec.Phi());
426 //________________________________________________________________________
427 Float_t AliAnalysisTaskSAQA::DoTrackLoop()
432 Int_t nclusters = GetNumberOfCaloClusters();
433 Int_t ntracks = GetNumberOfTracks();
435 for(Int_t i = 0; i < ntracks; i++) {
437 AliVTrack* track = GetTrack(i); // pointer to reconstructed to track
439 AliError(Form("Could not retrieve esdtrack %d",i));
443 if (!AcceptTrack(track)) continue;
445 fHistTracksPt->Fill(track->Pt());
449 Int_t clId = track->GetEMCALcluster();
450 if (clId > -1 && clId < nclusters) {
451 AliVCluster* cluster = GetCaloCluster(clId);
453 fHistEoverP->Fill(cluster->E(), cluster->E() / track->P());
457 Int_t label = track->GetLabel();
459 fHistTrPhiEta->Fill(track->Eta(), track->Phi());
461 fHistTrackEta[4]->Fill(track->Eta());
462 fHistTrackPhi[4]->Fill(track->Phi());
464 if (label >= 0 && label < 4) {
465 fHistTrackEta[label]->Fill(track->Eta());
466 fHistTrackPhi[label]->Fill(track->Phi());
473 //________________________________________________________________________
474 Float_t AliAnalysisTaskSAQA::DoTriggerClusLoop()
476 Int_t ntrgclusters = GetNumberOfTrgClusters();
477 Float_t maxTrgClus = 0;
479 for (Int_t iClusters = 0; iClusters < ntrgclusters; iClusters++) {
480 AliVCluster* cluster = GetTrgCluster(iClusters);
482 AliError(Form("Could not receive cluster %d", iClusters));
486 if (!(cluster->IsEMCAL())) continue;
488 if (cluster->E() > maxTrgClus)
489 maxTrgClus = cluster->E();
495 //________________________________________________________________________
496 void AliAnalysisTaskSAQA::DoTriggerPrimitives(Int_t &maxL1amp, Int_t &maxL1thr)
498 AliVCaloTrigger *triggers = InputEvent()->GetCaloTrigger("EMCAL");
500 if (!triggers || triggers->GetEntries() == 0)
504 //Float_t L0FastORamp = 0;
510 while (triggers->Next()) {
512 triggers->GetAmplitude(L0FastORamp);
519 triggers->GetNL0Times(ntimes);
523 triggers->GetL0Times(trgtimes);
525 Int_t mintime = trgtimes[0];
526 Int_t maxtime = trgtimes[0];
528 for (Int_t i = 0; i < ntimes; ++i) {
529 if (trgtimes[i] < mintime)
530 mintime = trgtimes[i];
531 if (maxtime < trgtimes[i])
532 maxtime = trgtimes[i];
536 Int_t gCol = 0, gRow = 0;
537 triggers->GetPosition(gCol, gRow);
540 fGeom->GetAbsFastORIndexFromPositionInEMCAL(gCol, gRow, find);
545 Int_t cidx[4] = {-1};
546 Bool_t ret = fGeom->GetCellIndexFromFastORIndex(find, cidx);
552 triggers->GetL1TimeSum(L1amp);
553 if (maxL1amp < L1amp)
556 triggers->GetL1Threshold(L1thr);
557 if (maxL1thr < L1thr)
562 //________________________________________________________________________
563 Bool_t AliAnalysisTaskSAQA::AcceptTrack(AliVTrack* /*track*/) const
568 //________________________________________________________________________
569 void AliAnalysisTaskSAQA::UserExec(Option_t *)
571 // Main loop, called for each event.
572 // Add jets to event if not yet there
574 RetrieveEventObjects();
578 // information for this iteration of the UserExec in the container
579 PostData(1, fOutput);
582 //________________________________________________________________________
583 void AliAnalysisTaskSAQA::Terminate(Option_t *)
585 // Called once at the end of the analysis.