9 #include <TClonesArray.h>
14 #include <TLorentzVector.h>
16 #include <TParameter.h>
18 #include "AliAnalysisManager.h"
19 #include "AliCentrality.h"
20 #include "AliVCluster.h"
21 #include "AliVParticle.h"
22 #include "AliVTrack.h"
23 #include "AliEmcalJet.h"
24 #include "AliVEventHandler.h"
25 #include "AliRhoParameter.h"
28 #include "AliAnalysisTaskSAJF.h"
30 ClassImp(AliAnalysisTaskSAJF)
32 //________________________________________________________________________
33 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF() :
34 AliAnalysisTaskEmcalJet("AliAnalysisTaskSAJF", kTRUE),
35 fLeadingHadronType(0),
36 fHistRhoVSleadJetPt(0)
39 // Default constructor.
41 for (Int_t i = 0; i < 4; i++) {
43 fHistLeadingJetPt[i] = 0;
44 fHist2LeadingJetPt[i] = 0;
45 fHistLeadingJetCorrPt[i] = 0;
46 fHistJetPhiEta[i] = 0;
47 fHistJetsPtArea[i] = 0;
48 fHistJetsCorrPtArea[i] = 0;
49 fHistJetsNEFvsPt[i] = 0;
50 fHistJetsZvsPt[i] = 0;
51 fHistConstituents[i] = 0;
52 fHistTracksJetPt[i] = 0;
53 fHistClustersJetPt[i] = 0;
56 SetMakeGeneralHistograms(kTRUE);
59 //________________________________________________________________________
60 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF(const char *name) :
61 AliAnalysisTaskEmcalJet(name, kTRUE),
62 fLeadingHadronType(0),
63 fHistRhoVSleadJetPt(0)
65 // Standard constructor.
67 for (Int_t i = 0; i < 4; i++) {
69 fHistLeadingJetPt[i] = 0;
70 fHist2LeadingJetPt[i] = 0;
71 fHistLeadingJetCorrPt[i] = 0;
72 fHistJetPhiEta[i] = 0;
73 fHistJetsPtArea[i] = 0;
74 fHistJetsCorrPtArea[i] = 0;
75 fHistJetsNEFvsPt[i] = 0;
76 fHistJetsZvsPt[i] = 0;
77 fHistConstituents[i] = 0;
78 fHistTracksJetPt[i] = 0;
79 fHistClustersJetPt[i] = 0;
82 SetMakeGeneralHistograms(kTRUE);
85 //________________________________________________________________________
86 AliAnalysisTaskSAJF::~AliAnalysisTaskSAJF()
91 //________________________________________________________________________
92 Float_t* AliAnalysisTaskSAJF::GenerateFixedBinArray(Int_t n, Float_t min, Float_t max) const
94 Float_t *bins = new Float_t[n+1];
96 Float_t binWidth = (max-min)/n;
98 for (Int_t i = 1; i <= n; i++) {
99 bins[i] = bins[i-1]+binWidth;
105 //________________________________________________________________________
106 void AliAnalysisTaskSAJF::UserCreateOutputObjects()
108 // Create user output.
110 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
112 fHistRhoVSleadJetPt = new TH2F("fHistRhoVSleadJetPt","fHistRhoVSleadJetPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
113 fHistRhoVSleadJetPt->GetXaxis()->SetTitle("#rho * area [GeV/c]");
114 fHistRhoVSleadJetPt->GetYaxis()->SetTitle("Leading jet p_{T} [GeV/c]");
115 fOutput->Add(fHistRhoVSleadJetPt);
117 const Int_t nbinsZ = 12;
118 Float_t binsZ[nbinsZ+1] = {0,1,2,3,4,5,6,7,8,9,10,20,1000};
120 Float_t *binsPt = GenerateFixedBinArray(fNbins, fMinBinPt, fMaxBinPt);
121 Float_t *binsCorrPt = GenerateFixedBinArray(fNbins*2, -fMaxBinPt, fMaxBinPt);
122 Float_t *binsArea = GenerateFixedBinArray(30, 0, fJetRadius * fJetRadius * TMath::Pi() * 3);
123 Float_t *binsEta = GenerateFixedBinArray(50,-1, 1);
124 Float_t *binsPhi = GenerateFixedBinArray(101, 0, TMath::Pi() * 2.02);
125 Float_t *bins120 = GenerateFixedBinArray(120, 0, 1.2);
129 for (Int_t i = 0; i < 4; i++) {
130 histname = "fHistEvents_";
132 fHistEvents[i] = new TH1F(histname,histname, 6, 0, 6);
133 fHistEvents[i]->GetXaxis()->SetTitle("Event state");
134 fHistEvents[i]->GetYaxis()->SetTitle("counts");
135 fHistEvents[i]->GetXaxis()->SetBinLabel(1, "No jets");
136 fHistEvents[i]->GetXaxis()->SetBinLabel(2, "Max jet not found");
137 fHistEvents[i]->GetXaxis()->SetBinLabel(3, "Rho == 0");
138 fHistEvents[i]->GetXaxis()->SetBinLabel(4, "Max jet <= 0");
139 fHistEvents[i]->GetXaxis()->SetBinLabel(5, "OK");
140 fOutput->Add(fHistEvents[i]);
142 histname = "fHistLeadingJetPt_";
144 fHistLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt);
145 fHistLeadingJetPt[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
146 fHistLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
147 fOutput->Add(fHistLeadingJetPt[i]);
149 histname = "fHist2LeadingJetPt_";
151 fHist2LeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt);
152 fHist2LeadingJetPt[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
153 fHist2LeadingJetPt[i]->GetYaxis()->SetTitle("counts");
154 fOutput->Add(fHist2LeadingJetPt[i]);
156 histname = "fHistLeadingJetCorrPt_";
158 fHistLeadingJetCorrPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxBinPt, fMaxBinPt);
159 fHistLeadingJetCorrPt[i]->GetXaxis()->SetTitle("p_{T}^{corr} (GeV/c)");
160 fHistLeadingJetCorrPt[i]->GetYaxis()->SetTitle("counts");
161 fOutput->Add(fHistLeadingJetCorrPt[i]);
163 histname = "fHistJetPhiEta_";
165 fHistJetPhiEta[i] = new TH3F(histname.Data(), histname.Data(),
169 fHistJetPhiEta[i]->GetXaxis()->SetTitle("#eta");
170 fHistJetPhiEta[i]->GetYaxis()->SetTitle("#phi");
171 fHistJetPhiEta[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
172 fOutput->Add(fHistJetPhiEta[i]);
174 histname = "fHistJetsPtArea_";
176 fHistJetsPtArea[i] = new TH3F(histname.Data(), histname.Data(),
180 fHistJetsPtArea[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
181 fHistJetsPtArea[i]->GetYaxis()->SetTitle("area");
182 fHistJetsPtArea[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
183 fOutput->Add(fHistJetsPtArea[i]);
185 histname = "fHistJetsZvsPt_";
187 fHistJetsZvsPt[i] = new TH3F(histname.Data(), histname.Data(),
191 fHistJetsZvsPt[i]->GetXaxis()->SetTitle("Z");
192 fHistJetsZvsPt[i]->GetYaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
193 fHistJetsZvsPt[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
194 fOutput->Add(fHistJetsZvsPt[i]);
196 if (!fCaloName.IsNull()) {
197 histname = "fHistJetsNEFvsPt_";
199 fHistJetsNEFvsPt[i] = new TH3F(histname.Data(), histname.Data(),
203 fHistJetsNEFvsPt[i]->GetXaxis()->SetTitle("NEF");
204 fHistJetsNEFvsPt[i]->GetYaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
205 fHistJetsNEFvsPt[i]->GetZaxis()->SetTitle("p_{T,lead} (GeV/c)");
206 fOutput->Add(fHistJetsNEFvsPt[i]);
209 histname = "fHistJetsCorrPtArea_";
211 fHistJetsCorrPtArea[i] = new TH3F(histname.Data(), histname.Data(),
212 fNbins * 2, binsCorrPt,
215 fHistJetsCorrPtArea[i]->GetXaxis()->SetTitle("p_{T}^{corr} [GeV/c]");
216 fHistJetsCorrPtArea[i]->GetYaxis()->SetTitle("area");
217 fOutput->Add(fHistJetsCorrPtArea[i]);
219 histname = "fHistConstituents_";
221 fHistConstituents[i] = new TH3F(histname.Data(), histname.Data(), 100, 1, 101, 100, -0.5, 99.5, fNbins, fMinBinPt, fMaxBinPt);
222 fHistConstituents[i]->GetXaxis()->SetTitle("p_{T,part} (GeV/c)");
223 fHistConstituents[i]->GetYaxis()->SetTitle("no. of particles");
224 fHistConstituents[i]->GetZaxis()->SetTitle("p_{T,jet} (GeV/c)");
225 fOutput->Add(fHistConstituents[i]);
227 histname = "fHistTracksJetPt_";
229 fHistTracksJetPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, fNbins, fMinBinPt, fMaxBinPt);
230 fHistTracksJetPt[i]->GetXaxis()->SetTitle("p_{T,track} (GeV/c)");
231 fHistTracksJetPt[i]->GetYaxis()->SetTitle("p_{T,jet} (GeV/c)");
232 fHistTracksJetPt[i]->GetZaxis()->SetTitle("counts");
233 fOutput->Add(fHistTracksJetPt[i]);
235 if (!fCaloName.IsNull()) {
236 histname = "fHistClustersJetPt_";
238 fHistClustersJetPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2, fNbins, fMinBinPt, fMaxBinPt);
239 fHistClustersJetPt[i]->GetXaxis()->SetTitle("p_{T,clus} (GeV/c)");
240 fHistClustersJetPt[i]->GetYaxis()->SetTitle("p_{T,jet} (GeV/c)");
241 fHistClustersJetPt[i]->GetZaxis()->SetTitle("counts");
242 fOutput->Add(fHistClustersJetPt[i]);
246 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
256 //________________________________________________________________________
257 Bool_t AliAnalysisTaskSAJF::FillHistograms()
262 AliError(Form("%s - Jet array not provided, returning...", GetName()));
266 if (fJets->GetEntriesFast() < 1) { // no jets in array, skipping
267 fHistEvents[fCentBin]->Fill("No jets", 1);
271 Int_t *sortedJets = GetSortedArray(fJets);
273 if (!sortedJets || sortedJets[0] < 0) { // no accepted jets, skipping
274 fHistEvents[fCentBin]->Fill("No jets", 1);
278 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(sortedJets[0]));
279 if (!jet) { // error, I cannot get the leading jet from collection (should never happen), skipping
280 fHistEvents[fCentBin]->Fill("Max jet not found", 1);
284 // OK, event accepted
286 Float_t maxJetCorrPt = jet->Pt() - fRhoVal * jet->Area();
289 fHistEvents[fCentBin]->Fill("Rho == 0", 1);
291 else if (maxJetCorrPt <= 0)
292 fHistEvents[fCentBin]->Fill("Max jet <= 0", 1);
295 fHistEvents[fCentBin]->Fill("OK", 1);
298 fHistLeadingJetPt[fCentBin]->Fill(jet->Pt());
299 fHistRhoVSleadJetPt->Fill(fRhoVal * jet->Area(), jet->Pt());
300 fHistLeadingJetCorrPt[fCentBin]->Fill(maxJetCorrPt);
303 AliEmcalJet* jet2 = 0;
304 if (sortedJets[1] >= 0)
305 jet2 = static_cast<AliEmcalJet*>(fJets->At(sortedJets[1]));
308 fHist2LeadingJetPt[fCentBin]->Fill(jet2->Pt());
315 //________________________________________________________________________
316 void AliAnalysisTaskSAJF::DoJetLoop()
323 const Int_t njets = fJets->GetEntriesFast();
325 TH1F constituents("constituents", "constituents",
326 fHistConstituents[0]->GetNbinsX(), fHistConstituents[0]->GetXaxis()->GetXmin(), fHistConstituents[0]->GetXaxis()->GetXmax());
328 for (Int_t ij = 0; ij < njets; ij++) {
330 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(ij));
333 AliError(Form("Could not receive jet %d", ij));
340 Float_t corrPt = jet->Pt() - fRhoVal * jet->Area();
342 Float_t ptLeading = 0;
344 if (fLeadingHadronType == 0) // charged leading hadron
345 ptLeading = jet->MaxTrackPt();
346 else if (fLeadingHadronType == 1) // neutral leading hadron
347 ptLeading = jet->MaxClusterPt();
348 else // charged or neutral
349 ptLeading = jet->MaxPartPt();
351 fHistJetPhiEta[fCentBin]->Fill(jet->Eta(), jet->Phi(), ptLeading);
352 fHistJetsPtArea[fCentBin]->Fill(jet->Pt(), jet->Area(), ptLeading);
353 fHistJetsCorrPtArea[fCentBin]->Fill(corrPt, jet->Area(), ptLeading);
356 fHistJetsNEFvsPt[fCentBin]->Fill(jet->NEF(), jet->Pt(), ptLeading);
359 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
360 AliVParticle *track = jet->TrackAt(it, fTracks);
362 fHistJetsZvsPt[fCentBin]->Fill(track->Pt() / jet->Pt(), jet->Pt(), ptLeading);
363 constituents.Fill(track->Pt());
364 fHistTracksJetPt[fCentBin]->Fill(track->Pt(), jet->Pt());
370 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
371 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
374 TLorentzVector nPart;
375 cluster->GetMomentum(nPart, fVertex);
376 fHistJetsZvsPt[fCentBin]->Fill(nPart.Et() / jet->Pt(), jet->Pt(), ptLeading);
377 constituents.Fill(nPart.Pt());
378 fHistClustersJetPt[fCentBin]->Fill(nPart.Pt(), jet->Pt());
383 for (Int_t i = 1; i <= constituents.GetNbinsX(); i++) {
384 fHistConstituents[fCentBin]->Fill(constituents.GetBinCenter(i), constituents.GetBinContent(i), jet->Pt());
387 constituents.Reset();
391 //________________________________________________________________________
392 void AliAnalysisTaskSAJF::Terminate(Option_t *)
394 // Called once at the end of the analysis.