8 #include <TClonesArray.h>
13 #include <TLorentzVector.h>
15 #include "AliAnalysisManager.h"
16 #include "AliCentrality.h"
17 #include "AliVCluster.h"
18 #include "AliVParticle.h"
19 #include "AliVTrack.h"
20 #include "AliEmcalJet.h"
21 #include "AliVEventHandler.h"
24 #include "AliAnalysisTaskSAQA.h"
26 ClassImp(AliAnalysisTaskSAQA)
28 //________________________________________________________________________
29 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA() :
30 AliAnalysisTaskEmcalJet("AliAnalysisTaskSAQA", kTRUE),
33 fTrgClusName("ClustersL1GAMMAFEE"),
38 fHistMaxL1FastORCent(0),
39 fHistMaxL1ClusCent(0),
44 fHistClusPhiEtaEnergy(0),
49 fHistChVSneCorrCells(0)
51 // Default constructor.
53 for (Int_t i = 0; i < 5; i++) {
58 for (Int_t i = 0; i < 4; i++) {
59 fHistJetsPhiEtaPt[i] = 0;
60 fHistJetsPtNonBias[i] = 0;
61 fHistJetsPtTrack[i] = 0;
62 fHistJetsPtClus[i] = 0;
64 fHistJetsPtArea[i] = 0;
65 fHistJetsPtAreaNonBias[i] = 0;
69 //________________________________________________________________________
70 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA(const char *name) :
71 AliAnalysisTaskEmcalJet(name, kTRUE),
74 fTrgClusName("ClustersL1GAMMAFEE"),
79 fHistMaxL1FastORCent(0),
80 fHistMaxL1ClusCent(0),
85 fHistClusPhiEtaEnergy(0),
90 fHistChVSneCorrCells(0)
92 // Standard constructor.
94 for (Int_t i = 0; i < 5; i++) {
99 for (Int_t i = 0; i < 4; i++) {
100 fHistJetsPhiEtaPt[i] = 0;
101 fHistJetsPtNonBias[i] = 0;
102 fHistJetsPtTrack[i] = 0;
103 fHistJetsPtClus[i] = 0;
105 fHistJetsPtArea[i] = 0;
106 fHistJetsPtAreaNonBias[i] = 0;
110 //________________________________________________________________________
111 AliAnalysisTaskSAQA::~AliAnalysisTaskSAQA()
116 //________________________________________________________________________
117 void AliAnalysisTaskSAQA::UserCreateOutputObjects()
122 fOutput = new TList();
125 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 100, 0, 100);
126 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
127 fHistCentrality->GetYaxis()->SetTitle("counts");
128 fOutput->Add(fHistCentrality);
130 fHistTracksCent = new TH2F("fHistTracksCent","Tracks vs. centrality", 100, 0, 100, fNbins, 0, 4000);
131 fHistTracksCent->GetXaxis()->SetTitle("Centrality (%)");
132 fHistTracksCent->GetYaxis()->SetTitle("No. of tracks");
133 fOutput->Add(fHistTracksCent);
135 if (fAnaType == kEMCAL) {
136 fHistClusCent = new TH2F("fHistClusCent","Clusters vs. centrality", 100, 0, 100, fNbins, 0, 2000);
137 fHistClusCent->GetXaxis()->SetTitle("Centrality (%)");
138 fHistClusCent->GetYaxis()->SetTitle("No. of clusters");
139 fOutput->Add(fHistClusCent);
142 fHistMaxL1FastORCent = new TH2F("fHistMaxL1FastORCent","fHistMaxL1ClusCent", 100, 0, 100, 250, 0, 250);
143 fHistMaxL1FastORCent->GetXaxis()->SetTitle("Centrality [%]");
144 fHistMaxL1FastORCent->GetYaxis()->SetTitle("Maximum L1 FastOR");
145 fOutput->Add(fHistMaxL1FastORCent);
147 fHistMaxL1ClusCent = new TH2F("fHistMaxL1ClusCent","fHistMaxL1ClusCent", 100, 0, 100, 250, 0, 250);
148 fHistMaxL1ClusCent->GetXaxis()->SetTitle("Centrality [%]");
149 fHistMaxL1ClusCent->GetYaxis()->SetTitle("Maximum L1 trigger cluster");
150 fOutput->Add(fHistMaxL1ClusCent);
152 fHistMaxL1ThrCent = new TH2F("fHistMaxL1ThrCent","fHistMaxL1ThrCent", 100, 0, 100, 250, 0, 250);
153 fHistMaxL1ThrCent->GetXaxis()->SetTitle("Centrality [%]");
154 fHistMaxL1ThrCent->GetYaxis()->SetTitle("Maximum L1 threshold");
155 fOutput->Add(fHistMaxL1ThrCent);
159 fHistTracksPt = new TH1F("fHistTracksPt","p_{T} spectrum of reconstructed tracks", fNbins, fMinBinPt, fMaxBinPt);
160 fHistTracksPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
161 fHistTracksPt->GetYaxis()->SetTitle("counts");
162 fOutput->Add(fHistTracksPt);
164 fHistTrPhiEta = new TH2F("fHistTrPhiEta","Phi-Eta distribution of tracks", 80, -2, 2, 128, 0, 6.4);
165 fHistTrPhiEta->GetXaxis()->SetTitle("#eta");
166 fHistTrPhiEta->GetYaxis()->SetTitle("#phi");
167 fOutput->Add(fHistTrPhiEta);
169 fHistTrEmcPhiEta = new TH2F("fHistTrEmcPhiEta","Phi-Eta emcal distribution of tracks", 80, -2, 2, 128, 0, 6.4);
170 fHistTrEmcPhiEta->GetXaxis()->SetTitle("#eta");
171 fHistTrEmcPhiEta->GetYaxis()->SetTitle("#phi");
172 fOutput->Add(fHistTrEmcPhiEta);
174 if (fAnaType == kEMCAL) {
175 fHistClusPhiEtaEnergy = new TH3F("fHistClusPhiEtaEnergy","Phi-Eta-Energy distribution of clusters", fNbins, fMinBinPt, fMaxBinPt, 80, -2, 2, 128, 0, 6.4);
176 fHistClusPhiEtaEnergy->GetXaxis()->SetTitle("E [GeV]");
177 fHistClusPhiEtaEnergy->GetYaxis()->SetTitle("#eta");
178 fHistClusPhiEtaEnergy->GetZaxis()->SetTitle("#phi");
179 fOutput->Add(fHistClusPhiEtaEnergy);
181 fHistNCellsEnergy = new TH2F("fHistNCellsEnergy","Number of cells vs. energy of clusters", fNbins, fMinBinPt, fMaxBinPt, 30, 0, 30);
182 fHistNCellsEnergy->GetXaxis()->SetTitle("E [GeV]");
183 fHistNCellsEnergy->GetYaxis()->SetTitle("N_{cells}");
184 fOutput->Add(fHistNCellsEnergy);
187 if (fAnaType == kEMCAL) {
189 fHistCellsEnergy = new TH1F("fHistCellsEnergy","Energy spectrum of cells", fNbins, fMinBinPt, fMaxBinPt);
190 fHistCellsEnergy->GetXaxis()->SetTitle("E [GeV]");
191 fHistCellsEnergy->GetYaxis()->SetTitle("counts");
192 fOutput->Add(fHistCellsEnergy);
194 fHistChVSneCells = new TH2F("fHistChVSneCells","Charged energy vs. neutral (cells) energy",
195 fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5, fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
196 fHistChVSneCells->GetXaxis()->SetTitle("E [GeV]");
197 fHistChVSneCells->GetYaxis()->SetTitle("P [GeV/c]");
198 fOutput->Add(fHistChVSneCells);
200 fHistChVSneClus = new TH2F("fHistChVSneClus","Charged energy vs. neutral (clusters) energy",
201 fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5, fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
202 fHistChVSneClus->GetXaxis()->SetTitle("E [GeV]");
203 fHistChVSneClus->GetYaxis()->SetTitle("P [GeV/c]");
204 fOutput->Add(fHistChVSneClus);
206 fHistChVSneCorrCells = new TH2F("fHistChVSneCorrCells","Charged energy vs. neutral (corrected cells) energy",
207 fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5, fNbins * 2.5, fMinBinPt , fMaxBinPt * 2.5);
208 fHistChVSneCorrCells->GetXaxis()->SetTitle("E [GeV]");
209 fHistChVSneCorrCells->GetYaxis()->SetTitle("P [GeV/c]");
210 fOutput->Add(fHistChVSneCorrCells);
213 for (Int_t i = 0; i < 5; i++) {
214 TString histnamephi("fHistTrackPhi_");
216 fHistTrackPhi[i] = new TH1F(histnamephi.Data(),histnamephi.Data(), 128, 0, 6.4);
217 fHistTrackPhi[i]->GetXaxis()->SetTitle("Phi");
218 fOutput->Add(fHistTrackPhi[i]);
220 TString histnameeta("fHistTrackEta_");
222 fHistTrackEta[i] = new TH1F(histnameeta.Data(),histnameeta.Data(), 100, -2, 2);
223 fHistTrackEta[i]->GetXaxis()->SetTitle("Eta");
224 fOutput->Add(fHistTrackEta[i]);
227 fHistTrackPhi[0]->SetLineColor(kRed);
228 fHistTrackEta[0]->SetLineColor(kRed);
229 fHistTrackPhi[1]->SetLineColor(kBlue);
230 fHistTrackEta[1]->SetLineColor(kBlue);
231 fHistTrackPhi[2]->SetLineColor(kGreen);
232 fHistTrackEta[2]->SetLineColor(kGreen);
233 fHistTrackPhi[3]->SetLineColor(kOrange);
234 fHistTrackEta[3]->SetLineColor(kOrange);
235 fHistTrackPhi[4]->SetLineColor(kBlack);
236 fHistTrackEta[4]->SetLineColor(kBlack);
238 if (!fJetsName.IsNull()) {
242 for (Int_t i = 0; i < 4; i++) {
243 histname = "fHistJetsPhiEtaPt_";
245 fHistJetsPhiEtaPt[i] = new TH3F(histname.Data(), histname.Data(), 80, -2, 2, 128, 0, 6.4, fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
246 fHistJetsPhiEtaPt[i]->GetXaxis()->SetTitle("#eta");
247 fHistJetsPhiEtaPt[i]->GetYaxis()->SetTitle("#phi");
248 fHistJetsPhiEtaPt[i]->GetZaxis()->SetTitle("p_{T} [GeV/c]");
249 fOutput->Add(fHistJetsPhiEtaPt[i]);
251 histname = "fHistJetsPtNonBias_";
253 fHistJetsPtNonBias[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
254 fHistJetsPtNonBias[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
255 fHistJetsPtNonBias[i]->GetYaxis()->SetTitle("counts");
256 fOutput->Add(fHistJetsPtNonBias[i]);
258 histname = "fHistJetsPtTrack_";
260 fHistJetsPtTrack[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
261 fHistJetsPtTrack[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
262 fHistJetsPtTrack[i]->GetYaxis()->SetTitle("counts");
263 fOutput->Add(fHistJetsPtTrack[i]);
265 if (fAnaType == kEMCAL) {
266 histname = "fHistJetsPtClus_";
268 fHistJetsPtClus[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
269 fHistJetsPtClus[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
270 fHistJetsPtClus[i]->GetYaxis()->SetTitle("counts");
271 fOutput->Add(fHistJetsPtClus[i]);
274 histname = "fHistJetsPt_";
276 fHistJetsPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5);
277 fHistJetsPt[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
278 fHistJetsPt[i]->GetYaxis()->SetTitle("counts");
279 fOutput->Add(fHistJetsPt[i]);
281 histname = "fHistJetsPtAreaNonBias_";
283 fHistJetsPtAreaNonBias[i] = new TH2F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5, 20, 0, fJetRadius * fJetRadius * TMath::Pi() * 1.5);
284 fHistJetsPtAreaNonBias[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
285 fHistJetsPtAreaNonBias[i]->GetYaxis()->SetTitle("area");
286 fOutput->Add(fHistJetsPtAreaNonBias[i]);
288 histname = "fHistJetsPtArea_";
290 fHistJetsPtArea[i] = new TH2F(histname.Data(), histname.Data(), fNbins * 2.5, fMinBinPt, fMaxBinPt * 2.5, 20, 0, fJetRadius * fJetRadius * TMath::Pi() * 1.5);
291 fHistJetsPtArea[i]->GetXaxis()->SetTitle("p_{T} [GeV/c]");
292 fHistJetsPtArea[i]->GetYaxis()->SetTitle("area");
293 fOutput->Add(fHistJetsPtArea[i]);
297 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
300 //________________________________________________________________________
301 Bool_t AliAnalysisTaskSAQA::RetrieveEventObjects()
303 // Retrieve event objects.
305 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
308 if (!fTrgClusName.IsNull() && fDoTrigger && !fTrgClusters) {
309 fTrgClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrgClusName));
311 AliError(Form("%s: Could not retrieve trigger clusters %s!", GetName(), fTrgClusName.Data()));
315 TClass *cl = fTrgClusters->GetClass();
316 if (!cl->GetBaseClass("AliVCluster") && !cl->GetBaseClass("AliEmcalParticle")) {
317 AliError(Form("%s: Collection %s does not contain AliVCluster nor AliEmcalParticle objects!", GetName(), fTrgClusName.Data()));
327 //________________________________________________________________________
328 Bool_t AliAnalysisTaskSAQA::FillHistograms()
332 fHistCentrality->Fill(fCent);
334 fHistTracksCent->Fill(fCent, fTracks->GetEntriesFast());
336 fHistClusCent->Fill(fCent, fCaloClusters->GetEntriesFast());
338 Float_t trackSum = DoTrackLoop();
342 if (fAnaType == kEMCAL) {
343 Float_t clusSum = DoClusterLoop();
345 Float_t cellSum = 0, cellCutSum = 0;
347 DoCellLoop(cellSum, cellCutSum);
349 fHistChVSneCells->Fill(cellSum, trackSum);
350 fHistChVSneClus->Fill(clusSum, trackSum);
351 fHistChVSneCorrCells->Fill(cellCutSum, trackSum);
354 Float_t maxTrgClus = DoTriggerClusLoop();
355 fHistMaxL1ClusCent->Fill(fCent, maxTrgClus);
360 DoTriggerPrimitives(maxL1amp, maxL1thr);
363 fHistMaxL1FastORCent->Fill(fCent, maxL1amp);
366 fHistMaxL1ThrCent->Fill(fCent, maxL1thr);
373 //________________________________________________________________________
374 void AliAnalysisTaskSAQA::DoCellLoop(Float_t &sum, Float_t &sum_cut)
378 AliVCaloCells *cells = InputEvent()->GetEMCALCells();
383 const Int_t ncells = cells->GetNumberOfCells();
385 for (Int_t pos = 0; pos < ncells; pos++) {
386 Float_t amp = cells->GetAmplitude(pos);
387 fHistCellsEnergy->Fill(amp);
389 if (amp < fCellEnergyCut)
395 //________________________________________________________________________
396 Float_t AliAnalysisTaskSAQA::DoClusterLoop()
406 Int_t nclusters = fCaloClusters->GetEntriesFast();
408 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
409 AliVCluster* cluster = static_cast<AliVCluster*>(fCaloClusters->At(iClusters));
411 AliError(Form("Could not receive cluster %d", iClusters));
415 if (!AcceptCluster(cluster, kTRUE))
420 TLorentzVector nPart;
421 cluster->GetMomentum(nPart, fVertex);
423 fHistClusPhiEtaEnergy->Fill(cluster->E(), nPart.Eta(), nPart.Phi());
424 fHistNCellsEnergy->Fill(cluster->E(), cluster->GetNCells());
430 //________________________________________________________________________
431 Float_t AliAnalysisTaskSAQA::DoTrackLoop()
440 Int_t ntracks = fTracks->GetEntriesFast();
443 nclusters = fCaloClusters->GetEntriesFast();
445 for (Int_t i = 0; i < ntracks; i++) {
447 AliVParticle* track = static_cast<AliVParticle*>(fTracks->At(i)); // pointer to reconstructed to track
450 AliError(Form("Could not retrieve track %d",i));
454 AliVTrack* vtrack = dynamic_cast<AliVTrack*>(track);
456 if (vtrack && !AcceptTrack(vtrack, kTRUE))
459 fHistTracksPt->Fill(track->Pt());
463 Int_t label = track->GetLabel();
465 fHistTrPhiEta->Fill(track->Eta(), track->Phi());
467 fHistTrackEta[4]->Fill(track->Eta());
468 fHistTrackPhi[4]->Fill(track->Phi());
470 if (label >= 0 && label < 4) {
471 fHistTrackEta[label]->Fill(track->Eta());
472 fHistTrackPhi[label]->Fill(track->Phi());
478 fHistTrEmcPhiEta->Fill(vtrack->GetTrackEtaOnEMCal(), vtrack->GetTrackPhiOnEMCal());
484 //________________________________________________________________________
485 void AliAnalysisTaskSAQA::DoJetLoop()
492 Int_t njets = fJets->GetEntriesFast();
494 for (Int_t ij = 0; ij < njets; ij++) {
496 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(ij));
499 AliError(Form("Could not receive jet %d", ij));
503 if (!AcceptJet(jet, kFALSE))
506 fHistJetsPtNonBias[fCentBin]->Fill(jet->Pt());
507 fHistJetsPtAreaNonBias[fCentBin]->Fill(jet->Pt(), jet->Area());
509 if (jet->MaxTrackPt() > fPtBiasJetTrack)
510 fHistJetsPtTrack[fCentBin]->Fill(jet->Pt());
512 if (fAnaType == kEMCAL && jet->MaxClusterPt() > fPtBiasJetClus)
513 fHistJetsPtClus[fCentBin]->Fill(jet->Pt());
515 if (!AcceptBiasJet(jet))
518 fHistJetsPt[fCentBin]->Fill(jet->Pt());
519 fHistJetsPtArea[fCentBin]->Fill(jet->Pt(), jet->Area());
521 fHistJetsPhiEtaPt[fCentBin]->Fill(jet->Eta(), jet->Phi(), jet->Pt());
525 //________________________________________________________________________
526 Float_t AliAnalysisTaskSAQA::DoTriggerClusLoop()
528 // Do trigger cluster loop.
533 Int_t ntrgclusters = fTrgClusters->GetEntriesFast();
534 Float_t maxTrgClus = 0;
536 for (Int_t iClusters = 0; iClusters < ntrgclusters; iClusters++) {
537 AliVCluster* cluster = static_cast<AliVCluster*>(fTrgClusters->At(iClusters));
539 AliError(Form("Could not receive cluster %d", iClusters));
543 if (!(cluster->IsEMCAL())) continue;
545 if (cluster->E() > maxTrgClus)
546 maxTrgClus = cluster->E();
552 //________________________________________________________________________
553 void AliAnalysisTaskSAQA::DoTriggerPrimitives(Int_t &maxL1amp, Int_t &maxL1thr)
555 // Do trigger primitives loop.
557 AliVCaloTrigger *triggers = InputEvent()->GetCaloTrigger("EMCAL");
559 if (!triggers || triggers->GetEntries() == 0)
568 while (triggers->Next()) {
569 triggers->GetL1TimeSum(L1amp);
570 if (maxL1amp < L1amp)
573 triggers->GetL1Threshold(L1thr);
574 if (maxL1thr < L1thr)
579 //________________________________________________________________________
580 void AliAnalysisTaskSAQA::Terminate(Option_t *)
582 // Called once at the end of the analysis.