7 #include <TClonesArray.h>
12 #include <TLorentzVector.h>
14 #include "AliAnalysisManager.h"
15 #include "AliCentrality.h"
16 #include "AliVCluster.h"
17 #include "AliVParticle.h"
18 #include "AliVTrack.h"
19 #include "AliEmcalJet.h"
20 #include "AliVEventHandler.h"
21 #include "AliAODEvent.h"
22 #include "AliExternalTrackParam.h"
23 #include "AliTrackerBase.h"
25 #include "AliEMCALGeometry.h"
26 #include "AliEMCALGeoParams.h"
27 #include "AliPicoTrack.h"
29 #include "AliAnalysisTaskSAQA.h"
31 ClassImp(AliAnalysisTaskSAQA)
33 //________________________________________________________________________
34 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA() :
35 AliAnalysisTaskEmcalJet("AliAnalysisTaskSAQA", kTRUE),
37 fParticleLevel(kFALSE),
49 fHistTrNegativeLabels(0),
52 fHistTrPhiEtaNonProp(0),
57 fHistClusTimeEnergy(0),
58 fHistCellsAbsIdEnergy(0),
61 fHistChVSneCorrCells(0)
63 // Default constructor.
65 for (Int_t i = 0; i < 4; i++) {
66 for (Int_t j = 0; j < 4; j++) fHistTrPhiEtaPt[i][j] = 0;
67 fHistTrPhiEtaPtZeroLab[i] = 0;
68 fHistClusPhiEtaEnergy[i] = 0;
69 fHistJetsPhiEtaPt[i] = 0;
70 fHistJetsPtArea[i] = 0;
73 SetMakeGeneralHistograms(kTRUE);
76 //________________________________________________________________________
77 AliAnalysisTaskSAQA::AliAnalysisTaskSAQA(const char *name) :
78 AliAnalysisTaskEmcalJet(name, kTRUE),
80 fParticleLevel(kFALSE),
92 fHistTrNegativeLabels(0),
95 fHistTrPhiEtaNonProp(0),
100 fHistClusTimeEnergy(0),
101 fHistCellsAbsIdEnergy(0),
104 fHistChVSneCorrCells(0)
106 // Standard constructor.
108 for (Int_t i = 0; i < 4; i++) {
109 for (Int_t j = 0; j < 4; j++) fHistTrPhiEtaPt[i][j] = 0;
110 fHistTrPhiEtaPtZeroLab[i] = 0;
111 fHistClusPhiEtaEnergy[i] = 0;
112 fHistJetsPhiEtaPt[i] = 0;
113 fHistJetsPtArea[i] = 0;
116 SetMakeGeneralHistograms(kTRUE);
119 //________________________________________________________________________
120 AliAnalysisTaskSAQA::~AliAnalysisTaskSAQA()
125 //________________________________________________________________________
126 void AliAnalysisTaskSAQA::UserCreateOutputObjects()
130 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
132 if (!fTracksName.IsNull()) {
133 if (!fParticleLevel && fIsMC) {
134 fHistTrNegativeLabels = new TH1F("fHistTrNegativeLabels","fHistTrNegativeLabels", 500, 0, 1);
135 fHistTrNegativeLabels->GetXaxis()->SetTitle("% of negative labels");
136 fHistTrNegativeLabels->GetYaxis()->SetTitle("counts");
137 fOutput->Add(fHistTrNegativeLabels);
139 fHistTrZeroLabels = new TH1F("fHistTrZeroLabels","fHistTrZeroLabels", 500, 0, 1);
140 fHistTrZeroLabels->GetXaxis()->SetTitle("% of negative labels");
141 fHistTrZeroLabels->GetYaxis()->SetTitle("counts");
142 fOutput->Add(fHistTrZeroLabels);
145 fHistTracksCent = new TH2F("fHistTracksCent","Tracks vs. centrality", 100, 0, 100, fNbins, 0, 4000);
146 fHistTracksCent->GetXaxis()->SetTitle("Centrality (%)");
147 fHistTracksCent->GetYaxis()->SetTitle("No. of tracks");
148 fOutput->Add(fHistTracksCent);
156 for (Int_t i = 0; i < fNcentBins; i++) {
157 for (Int_t j = 0; j < nlabels; j++) {
158 histname = Form("fHistTrPhiEtaPt_%d_%d",i,j);
159 fHistTrPhiEtaPt[i][j] = new TH3F(histname,histname, 100, -1, 1, 201, 0, TMath::Pi() * 2.01, fNbins, fMinBinPt, fMaxBinPt);
160 fHistTrPhiEtaPt[i][j]->GetXaxis()->SetTitle("#eta");
161 fHistTrPhiEtaPt[i][j]->GetYaxis()->SetTitle("#phi");
162 fHistTrPhiEtaPt[i][j]->GetZaxis()->SetTitle("p_{T} (GeV/c)");
163 fOutput->Add(fHistTrPhiEtaPt[i][j]);
165 if (!fParticleLevel && fIsMC) {
166 histname = Form("fHistTrPhiEtaPtZeroLab_%d",i);
167 fHistTrPhiEtaPtZeroLab[i] = new TH3F(histname,histname, 100, -1, 1, 201, 0, TMath::Pi() * 2.01, fNbins, fMinBinPt, fMaxBinPt);
168 fHistTrPhiEtaPtZeroLab[i]->GetXaxis()->SetTitle("#eta");
169 fHistTrPhiEtaPtZeroLab[i]->GetYaxis()->SetTitle("#phi");
170 fHistTrPhiEtaPtZeroLab[i]->GetZaxis()->SetTitle("p_{T} (GeV/c)");
171 fOutput->Add(fHistTrPhiEtaPtZeroLab[i]);
175 if (!fParticleLevel) {
176 fHistTrEmcPhiEta = new TH2F("fHistTrEmcPhiEta","Phi-Eta emcal distribution of tracks", 100, -1, 1, 201, 0, TMath::Pi() * 2.01);
177 fHistTrEmcPhiEta->GetXaxis()->SetTitle("#eta");
178 fHistTrEmcPhiEta->GetYaxis()->SetTitle("#phi");
179 fOutput->Add(fHistTrEmcPhiEta);
181 fHistTrPhiEtaNonProp = new TH2F("fHistTrPhiEtaNonProp","fHistTrPhiEtaNonProp", 100, -1, 1, 201, 0, TMath::Pi() * 2.01);
182 fHistTrPhiEtaNonProp->GetXaxis()->SetTitle("#eta");
183 fHistTrPhiEtaNonProp->GetYaxis()->SetTitle("#phi");
184 fOutput->Add(fHistTrPhiEtaNonProp);
186 fHistDeltaEtaPt = new TH2F("fHistDeltaEtaPt","fHistDeltaEtaPt", fNbins, fMinBinPt, fMaxBinPt, 80, -0.5, 0.5);
187 fHistDeltaEtaPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
188 fHistDeltaEtaPt->GetYaxis()->SetTitle("#delta#eta");
189 fOutput->Add(fHistDeltaEtaPt);
191 fHistDeltaPhiPt = new TH2F("fHistDeltaPhiPt","fHistDeltaPhiPt", fNbins, fMinBinPt, fMaxBinPt, 256, -1.6, 4.8);
192 fHistDeltaPhiPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
193 fHistDeltaPhiPt->GetYaxis()->SetTitle("#delta#phi");
194 fOutput->Add(fHistDeltaPhiPt);
198 if (!fCaloName.IsNull()) {
199 fHistClusCent = new TH2F("fHistClusCent","Clusters vs. centrality", 100, 0, 100, fNbins, 0, 2000);
200 fHistClusCent->GetXaxis()->SetTitle("Centrality (%)");
201 fHistClusCent->GetYaxis()->SetTitle("No. of clusters");
202 fOutput->Add(fHistClusCent);
204 fHistClusTracks = new TH2F("fHistClusTracks","Clusters vs. tracks", fNbins, 0, 4000, fNbins, 0, 2000);
205 fHistClusTracks->GetXaxis()->SetTitle("No. of tracks");
206 fHistClusTracks->GetYaxis()->SetTitle("No. of clusters");
207 fOutput->Add(fHistClusTracks);
209 fHistCellsCent = new TH2F("fHistCellsCent","Cells vs. centrality", 100, 0, 100, fNbins, 0, 6000);
210 fHistCellsCent->GetXaxis()->SetTitle("Centrality (%)");
211 fHistCellsCent->GetYaxis()->SetTitle("No. of EMCal cells");
212 fOutput->Add(fHistCellsCent);
214 fHistCellsTracks = new TH2F("fHistCellsTracks","Cells vs. tracks", fNbins, 0, 4000, fNbins, 0, 6000);
215 fHistCellsTracks->GetXaxis()->SetTitle("No. of tracks");
216 fHistCellsTracks->GetYaxis()->SetTitle("No. of EMCal cells");
217 fOutput->Add(fHistCellsTracks);
221 for (Int_t i = 0; i < fNcentBins; i++) {
222 histname = "fHistClusPhiEtaEnergy_";
224 fHistClusPhiEtaEnergy[i] = new TH3F(histname, histname, 100, -1.2, 1.2, 201, 0, TMath::Pi() * 2.01, fNbins, fMinBinPt, fMaxBinPt);
225 fHistClusPhiEtaEnergy[i]->GetXaxis()->SetTitle("#eta");
226 fHistClusPhiEtaEnergy[i]->GetYaxis()->SetTitle("#phi");
227 fHistClusPhiEtaEnergy[i]->GetZaxis()->SetTitle("E_{cluster} (GeV)");
228 fOutput->Add(fHistClusPhiEtaEnergy[i]);
231 fHistClusTimeEnergy = new TH2F("fHistClusTimeEnergy","Time vs. energy of clusters", fNbins, fMinBinPt, fMaxBinPt, fNbins, -1e-6, 1e-6);
232 fHistClusTimeEnergy->GetXaxis()->SetTitle("E_{cluster} (GeV)");
233 fHistClusTimeEnergy->GetYaxis()->SetTitle("Time");
234 fOutput->Add(fHistClusTimeEnergy);
236 fHistNCellsEnergy = new TH2F("fHistNCellsEnergy","Number of cells vs. energy of clusters", fNbins, fMinBinPt, fMaxBinPt, 30, 0, 30);
237 fHistNCellsEnergy->GetXaxis()->SetTitle("E_{cluster} (GeV)");
238 fHistNCellsEnergy->GetYaxis()->SetTitle("N_{cells}");
239 fOutput->Add(fHistNCellsEnergy);
241 fHistFcrossEnergy = new TH2F("fHistFcrossEnergy","fHistFcrossEnergy", fNbins, fMinBinPt, fMaxBinPt, 200, -3.5, 1.5);
242 fHistFcrossEnergy->GetXaxis()->SetTitle("E_{cluster} (GeV)");
243 fHistFcrossEnergy->GetYaxis()->SetTitle("F_{cross}");
244 fOutput->Add(fHistFcrossEnergy);
246 fHistCellsAbsIdEnergy = new TH2F("fHistCellsAbsIdEnergy","fHistCellsAbsIdEnergy", 11600,0,11599,(Int_t)(fNbins / 2), fMinBinPt, fMaxBinPt / 2);
247 fHistCellsAbsIdEnergy->GetXaxis()->SetTitle("cell abs. Id");
248 fHistCellsAbsIdEnergy->GetYaxis()->SetTitle("E_{cluster} (GeV)");
249 fHistCellsAbsIdEnergy->GetZaxis()->SetTitle("counts");
250 fOutput->Add(fHistCellsAbsIdEnergy);
252 fHistChVSneCells = new TH2F("fHistChVSneCells","Charged energy vs. neutral (cells) energy",
253 (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5, (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5);
254 fHistChVSneCells->GetXaxis()->SetTitle("Energy (GeV)");
255 fHistChVSneCells->GetYaxis()->SetTitle("Momentum (GeV/c)");
256 fOutput->Add(fHistChVSneCells);
258 fHistChVSneClus = new TH2F("fHistChVSneClus","Charged energy vs. neutral (clusters) energy",
259 (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5, (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5);
260 fHistChVSneClus->GetXaxis()->SetTitle("Energy (GeV)");
261 fHistChVSneClus->GetYaxis()->SetTitle("Momentum (GeV/c)");
262 fOutput->Add(fHistChVSneClus);
264 fHistChVSneCorrCells = new TH2F("fHistChVSneCorrCells","Charged energy vs. neutral (corrected cells) energy",
265 (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5, (Int_t)(fNbins * 2.5), fMinBinPt , fMaxBinPt * 2.5);
266 fHistChVSneCorrCells->GetXaxis()->SetTitle("Energy (GeV)");
267 fHistChVSneCorrCells->GetYaxis()->SetTitle("Momentum (GeV/c)");
268 fOutput->Add(fHistChVSneCorrCells);
271 if (!fJetsName.IsNull()) {
272 fHistJetsCent = new TH2F("fHistJetsCent","Jets vs. centrality", 100, 0, 100, 150, -0.5, 149.5);
273 fHistJetsCent->GetXaxis()->SetTitle("Centrality (%)");
274 fHistJetsCent->GetYaxis()->SetTitle("No. of jets");
275 fOutput->Add(fHistJetsCent);
277 fHistJetsParts = new TH2F("fHistJetsParts","Jets vs. centrality", fNbins, 0, 6000, 150, -0.5, 149.5);
278 fHistJetsParts->GetXaxis()->SetTitle("No. of particles");
279 fHistJetsParts->GetYaxis()->SetTitle("No. of jets");
280 fOutput->Add(fHistJetsParts);
284 for (Int_t i = 0; i < fNcentBins; i++) {
285 histname = "fHistJetsPhiEtaPt_";
287 fHistJetsPhiEtaPt[i] = new TH3F(histname.Data(), histname.Data(), 100, -1.2, 1.2, 201, 0, TMath::Pi() * 2.01, (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5);
288 fHistJetsPhiEtaPt[i]->GetXaxis()->SetTitle("#eta");
289 fHistJetsPhiEtaPt[i]->GetYaxis()->SetTitle("#phi");
290 fHistJetsPhiEtaPt[i]->GetZaxis()->SetTitle("p_{T} (GeV/c)");
291 fOutput->Add(fHistJetsPhiEtaPt[i]);
293 histname = "fHistJetsPtArea_";
295 fHistJetsPtArea[i] = new TH2F(histname.Data(), histname.Data(), (Int_t)(fNbins * 2.5), fMinBinPt, fMaxBinPt * 2.5, 30, 0, fJetRadius * fJetRadius * TMath::Pi() * 3);
296 fHistJetsPtArea[i]->GetXaxis()->SetTitle("p_{T} (GeV/c)");
297 fHistJetsPtArea[i]->GetYaxis()->SetTitle("area");
298 fOutput->Add(fHistJetsPtArea[i]);
302 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
305 //________________________________________________________________________
306 Bool_t AliAnalysisTaskSAQA::RetrieveEventObjects()
308 // Retrieve event objects.
310 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
321 //________________________________________________________________________
322 Bool_t AliAnalysisTaskSAQA::FillHistograms()
327 Float_t trackSum = 0;
330 trackSum = DoTrackLoop();
331 AliDebug(2,Form("%d tracks found in the event", fTracks->GetEntriesFast()));
332 fHistTracksCent->Fill(fCent, fNtracks);
336 clusSum = DoClusterLoop();
338 fHistClusCent->Fill(fCent, fNclusters);
339 fHistClusTracks->Fill(fNtracks, fNclusters);
341 Float_t cellSum = 0, cellCutSum = 0;
343 Int_t ncells = DoCellLoop(cellSum, cellCutSum);
346 fHistCellsTracks->Fill(fNtracks, ncells);
348 fHistCellsCent->Fill(fCent, ncells);
350 fHistChVSneCells->Fill(cellSum, trackSum);
351 fHistChVSneClus->Fill(clusSum, trackSum);
352 fHistChVSneCorrCells->Fill(cellCutSum, trackSum);
358 fHistJetsCent->Fill(fCent, fNjets);
359 fHistJetsParts->Fill(fNtracks + fNclusters, fNjets);
365 //________________________________________________________________________
366 Int_t AliAnalysisTaskSAQA::DoCellLoop(Float_t &sum, Float_t &sum_cut)
370 AliVCaloCells *cells = InputEvent()->GetEMCALCells();
375 const Int_t ncells = cells->GetNumberOfCells();
377 for (Int_t pos = 0; pos < ncells; pos++) {
378 Float_t amp = cells->GetAmplitude(pos);
379 Int_t absId = cells->GetCellNumber(pos);
380 fHistCellsAbsIdEnergy->Fill(absId,amp);
382 if (amp < fCellEnergyCut)
390 //________________________________________________________________________
391 Double_t AliAnalysisTaskSAQA::GetFcross(AliVCluster *cluster, AliVCaloCells *cells)
393 Int_t AbsIdseed = -1;
395 for (Int_t i = 0; i < cluster->GetNCells(); i++) {
396 if (cells->GetCellAmplitude(cluster->GetCellAbsId(i)) > AbsIdseed) {
397 Eseed = cells->GetCellAmplitude(cluster->GetCellAbsId(i));
398 AbsIdseed = cluster->GetCellAbsId(i);
405 Int_t imod = -1, iphi =-1, ieta=-1,iTower = -1, iIphi = -1, iIeta = -1;
406 fGeom->GetCellIndex(AbsIdseed,imod,iTower,iIphi,iIeta);
407 fGeom->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi,iIeta,iphi,ieta);
409 //Get close cells index and energy, not in corners
414 if (iphi < AliEMCALGeoParams::fgkEMCALRows-1) absID1 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi+1, ieta);
415 if (iphi > 0) absID2 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi-1, ieta);
417 // In case of cell in eta = 0 border, depending on SM shift the cross cell index
422 if (ieta == AliEMCALGeoParams::fgkEMCALCols-1 && !(imod%2)) {
423 absID3 = fGeom->GetAbsCellIdFromCellIndexes(imod+1, iphi, 0);
424 absID4 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi, ieta-1);
426 else if (ieta == 0 && imod%2) {
427 absID3 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi, ieta+1);
428 absID4 = fGeom->GetAbsCellIdFromCellIndexes(imod-1, iphi, AliEMCALGeoParams::fgkEMCALCols-1);
431 if (ieta < AliEMCALGeoParams::fgkEMCALCols-1)
432 absID3 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi, ieta+1);
434 absID4 = fGeom->GetAbsCellIdFromCellIndexes(imod, iphi, ieta-1);
437 Double_t ecell1 = cells->GetCellAmplitude(absID1);
438 Double_t ecell2 = cells->GetCellAmplitude(absID2);
439 Double_t ecell3 = cells->GetCellAmplitude(absID3);
440 Double_t ecell4 = cells->GetCellAmplitude(absID4);
442 Double_t Ecross = ecell1 + ecell2 + ecell3 + ecell4;
444 Double_t Fcross = 1 - Ecross/Eseed;
449 //________________________________________________________________________
450 Float_t AliAnalysisTaskSAQA::DoClusterLoop()
457 AliVCaloCells *cells = InputEvent()->GetEMCALCells();
462 Int_t nclusters = fCaloClusters->GetEntriesFast();
464 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
465 AliVCluster* cluster = static_cast<AliVCluster*>(fCaloClusters->At(iClusters));
467 AliError(Form("Could not receive cluster %d", iClusters));
471 if (!AcceptCluster(cluster))
476 TLorentzVector nPart;
477 cluster->GetMomentum(nPart, fVertex);
479 fHistClusPhiEtaEnergy[fCentBin]->Fill(nPart.Eta(), nPart.Phi(), cluster->E());
480 fHistNCellsEnergy->Fill(cluster->E(), cluster->GetNCells());
482 fHistClusTimeEnergy->Fill(cluster->E(), cluster->GetTOF());
485 fHistFcrossEnergy->Fill(cluster->E(), GetFcross(cluster, cells));
493 //________________________________________________________________________
494 Float_t AliAnalysisTaskSAQA::DoTrackLoop()
503 Int_t ntracks = fTracks->GetEntriesFast();
507 for (Int_t i = 0; i < ntracks; i++) {
509 AliVParticle* track = static_cast<AliVParticle*>(fTracks->At(i)); // pointer to reconstructed to track
512 AliError(Form("Could not retrieve track %d",i));
516 if (!AcceptTrack(track))
523 if (fParticleLevel) {
524 fHistTrPhiEtaPt[fCentBin][0]->Fill(track->Eta(), track->Phi(), track->Pt());
527 fHistTrPhiEtaPt[fCentBin][3]->Fill(track->Eta(), track->Phi(), track->Pt());
528 if (track->GetLabel() == 0) {
530 if (fHistTrPhiEtaPtZeroLab[fCentBin])
531 fHistTrPhiEtaPtZeroLab[fCentBin]->Fill(track->Eta(), track->Phi(), track->Pt());
534 if (track->GetLabel() < 0)
539 AliPicoTrack* ptrack = dynamic_cast<AliPicoTrack*>(track);
541 type = ptrack->GetTrackType();
543 if (type >= 0 && type < 3)
544 fHistTrPhiEtaPt[fCentBin][type]->Fill(track->Eta(), track->Phi(), track->Pt());
546 AliDebug(2,Form("%s: track type %d not recognized!", GetName(), type));
549 AliVTrack* vtrack = dynamic_cast<AliVTrack*>(track);
554 if ((vtrack->GetTrackEtaOnEMCal() == -999 || vtrack->GetTrackPhiOnEMCal() == -999) && fHistTrPhiEtaNonProp)
555 fHistTrPhiEtaNonProp->Fill(vtrack->Eta(), vtrack->Phi());
557 if (fHistTrEmcPhiEta)
558 fHistTrEmcPhiEta->Fill(vtrack->GetTrackEtaOnEMCal(), vtrack->GetTrackPhiOnEMCal());
560 fHistDeltaEtaPt->Fill(vtrack->Pt(), vtrack->Eta() - vtrack->GetTrackEtaOnEMCal());
562 fHistDeltaPhiPt->Fill(vtrack->Pt(), vtrack->Phi() - vtrack->GetTrackPhiOnEMCal());
565 if (fHistTrNegativeLabels)
566 fHistTrNegativeLabels->Fill(1. * neg / ntracks);
568 if (fHistTrZeroLabels)
569 fHistTrZeroLabels->Fill(1. * zero / ntracks);
574 //________________________________________________________________________
575 void AliAnalysisTaskSAQA::DoJetLoop()
582 Int_t njets = fJets->GetEntriesFast();
584 for (Int_t ij = 0; ij < njets; ij++) {
586 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(ij));
589 AliError(Form("Could not receive jet %d", ij));
598 fHistJetsPhiEtaPt[fCentBin]->Fill(jet->Eta(), jet->Phi(), jet->Pt());
599 fHistJetsPtArea[fCentBin]->Fill(jet->Pt(), jet->Area());
604 //________________________________________________________________________
605 void AliAnalysisTaskSAQA::Terminate(Option_t *)
607 // Called once at the end of the analysis.