7 #include <TClonesArray.h>
12 #include <TLorentzVector.h>
14 #include "AliVCluster.h"
15 #include "AliVParticle.h"
16 #include "AliVTrack.h"
17 #include "AliEmcalJet.h"
18 #include "AliRhoParameter.h"
21 #include "AliAnalysisTaskSAJF.h"
23 ClassImp(AliAnalysisTaskSAJF)
25 //________________________________________________________________________
26 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF() :
27 AliAnalysisTaskEmcalJet("AliAnalysisTaskSAJF", kTRUE),
31 // Default constructor.
33 for (Int_t i = 0; i < 4; i++) {
35 fHistLeadingJetPt[i] = 0;
36 fHist2LeadingJetPt[i] = 0;
37 fHistLeadingJetCorrPt[i] = 0;
38 fHistRhoVSleadJetPt[i] = 0;
39 fHistJetPhiEta[i] = 0;
40 fHistJetsPtArea[i] = 0;
41 fHistJetsCorrPtArea[i] = 0;
42 fHistJetsNEFvsPt[i] = 0;
43 fHistJetsZvsPt[i] = 0;
44 fHistConstituents[i] = 0;
45 fHistTracksJetPt[i] = 0;
46 fHistClustersJetPt[i] = 0;
47 fHistTracksPtDist[i] = 0;
48 fHistClustersPtDist[i] = 0;
49 fHistJetNconstVsPt[i] = 0;
52 SetMakeGeneralHistograms(kTRUE);
55 //________________________________________________________________________
56 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF(const char *name) :
57 AliAnalysisTaskEmcalJet(name, kTRUE),
60 // Standard constructor.
62 for (Int_t i = 0; i < 4; i++) {
64 fHistLeadingJetPt[i] = 0;
65 fHist2LeadingJetPt[i] = 0;
66 fHistLeadingJetCorrPt[i] = 0;
67 fHistRhoVSleadJetPt[i] = 0;
68 fHistJetPhiEta[i] = 0;
69 fHistJetsPtArea[i] = 0;
70 fHistJetsCorrPtArea[i] = 0;
71 fHistJetsNEFvsPt[i] = 0;
72 fHistJetsZvsPt[i] = 0;
73 fHistConstituents[i] = 0;
74 fHistTracksJetPt[i] = 0;
75 fHistClustersJetPt[i] = 0;
76 fHistTracksPtDist[i] = 0;
77 fHistClustersPtDist[i] = 0;
78 fHistJetNconstVsPt[i] = 0;
81 SetMakeGeneralHistograms(kTRUE);
84 //________________________________________________________________________
85 AliAnalysisTaskSAJF::~AliAnalysisTaskSAJF()
90 //________________________________________________________________________
91 void AliAnalysisTaskSAJF::UserCreateOutputObjects()
93 // Create user output.
95 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
97 fNjetsVsCent = new TH2F("fNjetsVsCent","fNjetsVsCent", 100, 0, 100, 150, -0.5, 149.5);
98 fNjetsVsCent->GetXaxis()->SetTitle("Centrality (%)");
99 fNjetsVsCent->GetYaxis()->SetTitle("# of jets");
100 fOutput->Add(fNjetsVsCent);
102 const Int_t nbinsZ = 12;
103 Float_t binsZ[nbinsZ+1] = {0,1,2,3,4,5,6,7,8,9,10,20,1000};
105 Float_t *binsPt = GenerateFixedBinArray(fNbins, fMinBinPt, fMaxBinPt);
106 Float_t *binsCorrPt = GenerateFixedBinArray(fNbins*2, -fMaxBinPt, fMaxBinPt);
107 Float_t *binsArea = GenerateFixedBinArray(30, 0, fJetRadius * fJetRadius * TMath::Pi() * 3);
108 Float_t *binsEta = GenerateFixedBinArray(50,-1, 1);
109 Float_t *binsPhi = GenerateFixedBinArray(101, 0, TMath::Pi() * 2.02);
110 Float_t *bins120 = GenerateFixedBinArray(120, 0, 1.2);
111 Float_t *bins150 = GenerateFixedBinArray(150, -0.5, 149.5);
115 for (Int_t i = 0; i < 4; i++) {
116 histname = "fHistEvents_";
118 fHistEvents[i] = new TH1F(histname,histname, 6, 0, 6);
119 fHistEvents[i]->GetXaxis()->SetTitle("Event state");
120 fHistEvents[i]->GetYaxis()->SetTitle("counts");
121 fHistEvents[i]->GetXaxis()->SetBinLabel(1, "No jets");
122 fHistEvents[i]->GetXaxis()->SetBinLabel(2, "Max jet not found");
123 fHistEvents[i]->GetXaxis()->SetBinLabel(3, "Rho == 0");
124 fHistEvents[i]->GetXaxis()->SetBinLabel(4, "Max jet <= 0");
125 fHistEvents[i]->GetXaxis()->SetBinLabel(5, "OK");
126 fOutput->Add(fHistEvents[i]);
128 histname = "fHistLeadingJetPt_";
130 fHistLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt);
131 fHistLeadingJetPt[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
132 fHistLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
133 fOutput->Add(fHistLeadingJetPt[i]);
135 histname = "fHist2LeadingJetPt_";
137 fHist2LeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt);
138 fHist2LeadingJetPt[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
139 fHist2LeadingJetPt[i]->GetYaxis()->SetTitle("counts");
140 fOutput->Add(fHist2LeadingJetPt[i]);
142 histname = "fHistLeadingJetCorrPt_";
144 fHistLeadingJetCorrPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxBinPt, fMaxBinPt);
145 fHistLeadingJetCorrPt[i]->GetXaxis()->SetTitle("p_{T}^{corr} (GeV/c)");
146 fHistLeadingJetCorrPt[i]->GetYaxis()->SetTitle("counts");
147 fOutput->Add(fHistLeadingJetCorrPt[i]);
149 histname = "fHistRhoVSleadJetPt_";
151 fHistRhoVSleadJetPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt*2, fNbins, fMinBinPt, fMaxBinPt);
152 fHistRhoVSleadJetPt[i]->GetXaxis()->SetTitle("#rho * area (GeV/c)");
153 fHistRhoVSleadJetPt[i]->GetYaxis()->SetTitle("Leading jet p_{T} (GeV/c)");
154 fOutput->Add(fHistRhoVSleadJetPt[i]);
156 histname = "fHistJetPhiEta_";
158 fHistJetPhiEta[i] = new TH3F(histname.Data(), histname.Data(),
162 fHistJetPhiEta[i]->GetXaxis()->SetTitle("#eta");
163 fHistJetPhiEta[i]->GetYaxis()->SetTitle("#phi");
164 fHistJetPhiEta[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
165 fOutput->Add(fHistJetPhiEta[i]);
167 histname = "fHistJetsPtArea_";
169 fHistJetsPtArea[i] = new TH3F(histname.Data(), histname.Data(),
173 fHistJetsPtArea[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
174 fHistJetsPtArea[i]->GetYaxis()->SetTitle("area");
175 fHistJetsPtArea[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
176 fOutput->Add(fHistJetsPtArea[i]);
178 histname = "fHistJetsZvsPt_";
180 fHistJetsZvsPt[i] = new TH3F(histname.Data(), histname.Data(),
184 fHistJetsZvsPt[i]->GetXaxis()->SetTitle("Z");
185 fHistJetsZvsPt[i]->GetYaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
186 fHistJetsZvsPt[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
187 fOutput->Add(fHistJetsZvsPt[i]);
189 if (!fCaloName.IsNull()) {
190 histname = "fHistJetsNEFvsPt_";
192 fHistJetsNEFvsPt[i] = new TH3F(histname.Data(), histname.Data(),
196 fHistJetsNEFvsPt[i]->GetXaxis()->SetTitle("NEF");
197 fHistJetsNEFvsPt[i]->GetYaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
198 fHistJetsNEFvsPt[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
199 fOutput->Add(fHistJetsNEFvsPt[i]);
202 histname = "fHistJetsCorrPtArea_";
204 fHistJetsCorrPtArea[i] = new TH3F(histname.Data(), histname.Data(),
205 fNbins * 2, binsCorrPt,
208 fHistJetsCorrPtArea[i]->GetXaxis()->SetTitle("p_{T}^{corr} [GeV/c]");
209 fHistJetsCorrPtArea[i]->GetYaxis()->SetTitle("area");
210 fOutput->Add(fHistJetsCorrPtArea[i]);
212 histname = "fHistConstituents_";
214 fHistConstituents[i] = new TH2F(histname.Data(), histname.Data(), 100, 1, 101, 100, -0.5, 99.5);
215 fHistConstituents[i]->GetXaxis()->SetTitle("p_{T,part} (GeV/c)");
216 fHistConstituents[i]->GetYaxis()->SetTitle("no. of particles");
217 fHistConstituents[i]->GetZaxis()->SetTitle("counts");
218 fOutput->Add(fHistConstituents[i]);
220 histname = "fHistTracksJetPt_";
222 fHistTracksJetPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, fNbins, fMinBinPt, fMaxBinPt);
223 fHistTracksJetPt[i]->GetXaxis()->SetTitle("p_{T,track} (GeV/c)");
224 fHistTracksJetPt[i]->GetYaxis()->SetTitle("p_{T,jet} (GeV/c)");
225 fHistTracksJetPt[i]->GetZaxis()->SetTitle("counts");
226 fOutput->Add(fHistTracksJetPt[i]);
228 histname = "fHistTracksPtDist_";
230 fHistTracksPtDist[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, 100, 0, 5);
231 fHistTracksPtDist[i]->GetXaxis()->SetTitle("p_{T,track} (GeV/c)");
232 fHistTracksPtDist[i]->GetYaxis()->SetTitle("d");
233 fHistTracksPtDist[i]->GetZaxis()->SetTitle("counts");
234 fOutput->Add(fHistTracksPtDist[i]);
236 if (!fCaloName.IsNull()) {
237 histname = "fHistClustersJetPt_";
239 fHistClustersJetPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, fNbins, fMinBinPt, fMaxBinPt);
240 fHistClustersJetPt[i]->GetXaxis()->SetTitle("p_{T,clus} (GeV/c)");
241 fHistClustersJetPt[i]->GetYaxis()->SetTitle("p_{T,jet} (GeV/c)");
242 fHistClustersJetPt[i]->GetZaxis()->SetTitle("counts");
243 fOutput->Add(fHistClustersJetPt[i]);
245 histname = "fHistClustersPtDist_";
247 fHistClustersPtDist[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, 100, 0, 5);
248 fHistClustersPtDist[i]->GetXaxis()->SetTitle("p_{T,clus} (GeV/c)");
249 fHistClustersPtDist[i]->GetYaxis()->SetTitle("d");
250 fHistClustersPtDist[i]->GetZaxis()->SetTitle("counts");
251 fOutput->Add(fHistClustersPtDist[i]);
254 histname = "fHistJetNconstVsPt_";
256 fHistJetNconstVsPt[i] = new TH3F(histname.Data(), histname.Data(), 150, bins150, fNbins, binsPt, nbinsZ, binsZ);
257 fHistJetNconstVsPt[i]->GetXaxis()->SetTitle("# of constituents");
258 fHistJetNconstVsPt[i]->GetYaxis()->SetTitle("p_{T,jet} (GeV/c)");
259 fHistJetNconstVsPt[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
260 fOutput->Add(fHistJetNconstVsPt[i]);
263 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
273 //________________________________________________________________________
274 Bool_t AliAnalysisTaskSAJF::FillHistograms()
279 AliError(Form("%s - Jet array not provided, returning...", GetName()));
283 if (fJets->GetEntriesFast() < 1) { // no jets in array, skipping
284 fHistEvents[fCentBin]->Fill("No jets", 1);
288 Int_t *sortedJets = GetSortedArray(fJets);
290 if (!sortedJets || sortedJets[0] < 0) { // no accepted jets, skipping
291 fHistEvents[fCentBin]->Fill("No jets", 1);
295 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(sortedJets[0]));
296 if (!jet) { // error, I cannot get the leading jet from collection (should never happen), skipping
297 fHistEvents[fCentBin]->Fill("Max jet not found", 1);
301 // OK, event accepted
303 Float_t maxJetCorrPt = jet->Pt() - fRhoVal * jet->Area();
306 fHistEvents[fCentBin]->Fill("Rho == 0", 1);
308 else if (maxJetCorrPt <= 0)
309 fHistEvents[fCentBin]->Fill("Max jet <= 0", 1);
312 fHistEvents[fCentBin]->Fill("OK", 1);
315 fHistLeadingJetPt[fCentBin]->Fill(jet->Pt());
316 fHistRhoVSleadJetPt[fCentBin]->Fill(fRhoVal, jet->Pt());
317 fHistLeadingJetCorrPt[fCentBin]->Fill(maxJetCorrPt);
320 AliEmcalJet* jet2 = 0;
321 if (sortedJets[1] >= 0)
322 jet2 = static_cast<AliEmcalJet*>(fJets->At(sortedJets[1]));
325 fHist2LeadingJetPt[fCentBin]->Fill(jet2->Pt());
327 Int_t njets = DoJetLoop();
329 fNjetsVsCent->Fill(fCent, njets);
334 //________________________________________________________________________
335 Int_t AliAnalysisTaskSAJF::DoJetLoop()
342 const Int_t njets = fJets->GetEntriesFast();
345 TH1F constituents("constituents", "constituents",
346 fHistConstituents[0]->GetNbinsX(), fHistConstituents[0]->GetXaxis()->GetXmin(), fHistConstituents[0]->GetXaxis()->GetXmax());
348 for (Int_t ij = 0; ij < njets; ij++) {
350 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(ij));
353 AliError(Form("Could not receive jet %d", ij));
360 Float_t corrPt = jet->Pt() - fRhoVal * jet->Area();
362 Float_t ptLeading = GetLeadingHadronPt(jet);
364 fHistJetPhiEta[fCentBin]->Fill(jet->Eta(), jet->Phi(), ptLeading);
365 fHistJetsPtArea[fCentBin]->Fill(jet->Pt(), jet->Area(), ptLeading);
366 fHistJetsCorrPtArea[fCentBin]->Fill(corrPt, jet->Area(), ptLeading);
367 fHistJetNconstVsPt[fCentBin]->Fill(jet->GetNumberOfConstituents(), jet->Pt(), ptLeading);
370 fHistJetsNEFvsPt[fCentBin]->Fill(jet->NEF(), jet->Pt(), ptLeading);
373 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
374 AliVParticle *track = jet->TrackAt(it, fTracks);
376 fHistJetsZvsPt[fCentBin]->Fill(track->Pt() / jet->Pt(), jet->Pt(), ptLeading);
377 constituents.Fill(track->Pt());
378 fHistTracksJetPt[fCentBin]->Fill(track->Pt(), jet->Pt());
379 Double_t dist = TMath::Sqrt((track->Eta() - jet->Eta()) * (track->Eta() - jet->Eta()) + (track->Phi() - jet->Phi()) * (track->Phi() - jet->Phi()));
380 fHistTracksPtDist[fCentBin]->Fill(track->Pt(), dist);
386 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
387 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
390 TLorentzVector nPart;
391 cluster->GetMomentum(nPart, fVertex);
392 fHistJetsZvsPt[fCentBin]->Fill(nPart.Et() / jet->Pt(), jet->Pt(), ptLeading);
393 constituents.Fill(nPart.Pt());
394 fHistClustersJetPt[fCentBin]->Fill(nPart.Pt(), jet->Pt());
395 Double_t dist = TMath::Sqrt((nPart.Eta() - jet->Eta()) * (nPart.Eta() - jet->Eta()) + (nPart.Phi() - jet->Phi()) * (nPart.Phi() - jet->Phi()));
396 fHistClustersPtDist[fCentBin]->Fill(nPart.Pt(), dist);
401 for (Int_t i = 1; i <= constituents.GetNbinsX(); i++) {
402 fHistConstituents[fCentBin]->Fill(constituents.GetBinCenter(i), constituents.GetBinContent(i));
405 constituents.Reset();
412 //________________________________________________________________________
413 void AliAnalysisTaskSAJF::Terminate(Option_t *)
415 // Called once at the end of the analysis.