3 // Jet finder analysis task (S.Aiola).
9 #include <TClonesArray.h>
13 #include <TLorentzVector.h>
15 #include <TParameter.h>
17 #include "AliAnalysisManager.h"
18 #include "AliCentrality.h"
19 #include "AliVCluster.h"
20 #include "AliVTrack.h"
21 #include "AliEmcalJet.h"
22 #include "AliVEventHandler.h"
25 #include "AliAnalysisTaskSAJF.h"
27 ClassImp(AliAnalysisTaskSAJF)
29 //________________________________________________________________________
30 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF() :
31 AliAnalysisTaskSE("AliAnalysisTaskSAJF"),
38 fTracksName("Tracks"),
39 fCaloName("CaloClusters"),
41 fEmbJetsName("EmbJets"),
59 fHistEmbPartPhiEta(0),
60 fHistRhoPartVSleadJetPt(0),
61 fHistMedKtVSRhoPart(0),
62 fHistRCPtVSRhoPart(0),
63 fHistMedKtVSEmbBkg(0),
65 fHistRCPtExLJVSDPhiLJ(0),
69 // Default constructor.
71 for (Int_t i = 0; i < 4; i++) {
73 fHistCorrJetsPt[i] = 0;
74 fHistUnfoldedJetsPt[i] = 0;
75 fHistJetsPtNonBias[i] = 0;
76 fHistCorrJetsPtNonBias[i] = 0;
77 fHistJetsNEFvsPt[i] = 0;
78 fHistJetsZvsPt[i] = 0;
79 fHistLeadingJetPt[i] = 0;
80 fHistCorrLeadingJetPt[i] = 0;
81 fHist2LeadingJetPt[i] = 0;
82 fHistTracksPtLJ[i] = 0;
84 fHistTracksPtBkg[i] = 0;
85 fHistClusEtBkg[i] = 0;
86 fHistBkgClusMeanRho[i] = 0;
87 fHistBkgTracksMeanRho[i] = 0;
88 fHistMedianPtKtJet[i] = 0;
89 fHistDeltaPtRC[i] = 0;
90 fHistDeltaPtRCExLJ[i] = 0;
95 fHistDeltaPtMedKtEmb[i] = 0;
98 // Output slot #1 writes into a TH1 container
99 DefineOutput(1, TList::Class());
102 //________________________________________________________________________
103 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF(const char *name) :
104 AliAnalysisTaskSE(name),
111 fTracksName("Tracks"),
112 fCaloName("CaloClusters"),
114 fEmbJetsName("EmbJets"),
131 fHistEmbJetPhiEta(0),
132 fHistEmbPartPhiEta(0),
133 fHistRhoPartVSleadJetPt(0),
134 fHistMedKtVSRhoPart(0),
135 fHistRCPtVSRhoPart(0),
136 fHistMedKtVSEmbBkg(0),
138 fHistRCPtExLJVSDPhiLJ(0),
141 // Standard constructor.
143 for (Int_t i = 0; i < 4; i++) {
145 fHistCorrJetsPt[i] = 0;
146 fHistUnfoldedJetsPt[i] = 0;
147 fHistJetsPtNonBias[i] = 0;
148 fHistCorrJetsPtNonBias[i] = 0;
149 fHistJetsNEFvsPt[i] = 0;
150 fHistJetsZvsPt[i] = 0;
151 fHistLeadingJetPt[i] = 0;
152 fHistCorrLeadingJetPt[i] = 0;
153 fHist2LeadingJetPt[i] = 0;
154 fHistTracksPtLJ[i] = 0;
155 fHistClusEtLJ[i] = 0;
156 fHistTracksPtBkg[i] = 0;
157 fHistClusEtBkg[i] = 0;
158 fHistBkgClusMeanRho[i] = 0;
159 fHistBkgTracksMeanRho[i] = 0;
160 fHistMedianPtKtJet[i] = 0;
161 fHistDeltaPtRC[i] = 0;
162 fHistDeltaPtRCExLJ[i] = 0;
164 fHistRCPtExLJ[i] = 0;
167 fHistDeltaPtMedKtEmb[i] = 0;
170 // Output slot #1 writes into a TH1 container
171 DefineOutput(1, TList::Class());
174 //________________________________________________________________________
175 AliAnalysisTaskSAJF::~AliAnalysisTaskSAJF()
180 //________________________________________________________________________
181 void AliAnalysisTaskSAJF::UserCreateOutputObjects()
185 Float_t binWidth = (fMaxPt - fMinPt) / fNbins;
188 fOutput = new TList();
191 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", fNbins, 0, 100);
192 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
193 fHistCentrality->GetYaxis()->SetTitle("counts");
194 fOutput->Add(fHistCentrality);
196 fHistJetPhiEta = new TH2F("fHistJetPhiEta","Phi-Eta distribution of jets", 20, -2, 2, 32, 0, 6.4);
197 fHistJetPhiEta->GetXaxis()->SetTitle("Eta");
198 fHistJetPhiEta->GetYaxis()->SetTitle("Phi");
199 fOutput->Add(fHistJetPhiEta);
201 fHistEmbJetPhiEta = new TH2F("fHistEmbJetPhiEta","Phi-Eta distribution of embedded jets", 20, -2, 2, 32, 0, 6.4);
202 fHistEmbJetPhiEta->GetXaxis()->SetTitle("Eta");
203 fHistEmbJetPhiEta->GetYaxis()->SetTitle("Phi");
204 fOutput->Add(fHistEmbJetPhiEta);
206 fHistEmbPartPhiEta = new TH2F("fHistEmbPartPhiEta","Phi-Eta distribution of embedded particles", 20, -2, 2, 32, 0, 6.4);
207 fHistEmbPartPhiEta->GetXaxis()->SetTitle("Eta");
208 fHistEmbPartPhiEta->GetYaxis()->SetTitle("Phi");
209 fOutput->Add(fHistEmbPartPhiEta);
211 fHistRhoPartVSleadJetPt = new TH2F("fHistRhoPartVSleadJetPt","fHistRhoPartVSleadJetPt", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
212 fHistRhoPartVSleadJetPt->GetXaxis()->SetTitle("#rho [GeV/c]");
213 fHistRhoPartVSleadJetPt->GetYaxis()->SetTitle("Leading jet P_{T} [GeV/c]");
214 fOutput->Add(fHistRhoPartVSleadJetPt);
216 fHistMedKtVSRhoPart = new TH2F("fHistMedKtVSRhoPart","fHistMedKtVSRhoPart", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
217 fHistMedKtVSRhoPart->GetXaxis()->SetTitle("median kt P_{T} [GeV/c]");
218 fHistMedKtVSRhoPart->GetYaxis()->SetTitle("#rho [GeV/c]");
219 fOutput->Add(fHistMedKtVSRhoPart);
221 fHistRCPtVSRhoPart = new TH2F("fHistRCPtVSRhoPart","fHistRCPtVSRhoPart", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
222 fHistRCPtVSRhoPart->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
223 fHistRCPtVSRhoPart->GetYaxis()->SetTitle("#rho [GeV/c]");
224 fOutput->Add(fHistRCPtVSRhoPart);
226 fHistMedKtVSEmbBkg = new TH2F("fHistMedKtVSEmbBkg","fHistMedKtVSEmbBkg", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
227 fHistMedKtVSEmbBkg->GetXaxis()->SetTitle("median kt P_{T} [GeV/c]");
228 fHistMedKtVSEmbBkg->GetYaxis()->SetTitle("background of embedded track P_{T} [GeV]");
229 fOutput->Add(fHistMedKtVSEmbBkg);
231 fHistMedKtVSRCPt = new TH2F("fHistMedKtVSRCPt","fHistMedKtVSRCPt", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
232 fHistMedKtVSRCPt->GetXaxis()->SetTitle("median kt P_{T} [GeV/c]");
233 fHistMedKtVSRCPt->GetYaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
234 fOutput->Add(fHistMedKtVSRCPt);
236 fHistRCPtExLJVSDPhiLJ = new TH2F("fHistRCPtExLJVSDPhiLJ","fHistRCPtExLJVSDPhiLJ", fNbins, fMinPt, fMaxPt, 128, -1.6, 4.8);
237 fHistRCPtExLJVSDPhiLJ->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
238 fHistRCPtExLJVSDPhiLJ->GetYaxis()->SetTitle("#Delta#phi");
239 fOutput->Add(fHistRCPtExLJVSDPhiLJ);
241 fHistRCPhiEta = new TH2F("fHistRCPhiEta","Phi-Eta distribution of rigid cones", 20, -2, 2, 32, 0, 6.4);
242 fHistRCPhiEta->GetXaxis()->SetTitle("Eta");
243 fHistRCPhiEta->GetYaxis()->SetTitle("Phi");
244 fOutput->Add(fHistRCPhiEta);
248 for (Int_t i = 0; i < 4; i++) {
249 histname = "fHistJetsPt_";
251 fHistJetsPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
252 fHistJetsPt[i]->GetXaxis()->SetTitle("Pt [GeV/c]");
253 fHistJetsPt[i]->GetYaxis()->SetTitle("counts");
254 fOutput->Add(fHistJetsPt[i]);
256 histname = "fHistCorrJetsPt_";
258 fHistCorrJetsPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxPt, fMaxPt);
259 fHistCorrJetsPt[i]->GetXaxis()->SetTitle("Pt [GeV/c]");
260 fHistCorrJetsPt[i]->GetYaxis()->SetTitle("counts");
261 fOutput->Add(fHistCorrJetsPt[i]);
263 histname = "fHistUnfoldedJetsPt_";
265 fHistUnfoldedJetsPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxPt, fMaxPt);
266 fHistUnfoldedJetsPt[i]->GetXaxis()->SetTitle("Pt [GeV/c]");
267 fHistUnfoldedJetsPt[i]->GetYaxis()->SetTitle("counts");
268 fOutput->Add(fHistUnfoldedJetsPt[i]);
270 histname = "fHistJetsPtNonBias_";
272 fHistJetsPtNonBias[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
273 fHistJetsPtNonBias[i]->GetXaxis()->SetTitle("Pt [GeV/c]");
274 fHistJetsPtNonBias[i]->GetYaxis()->SetTitle("counts");
275 fOutput->Add(fHistJetsPtNonBias[i]);
277 histname = "fHistCorrJetsPtNonBias_";
279 fHistCorrJetsPtNonBias[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxPt, fMaxPt);
280 fHistCorrJetsPtNonBias[i]->GetXaxis()->SetTitle("Pt [GeV/c]");
281 fHistCorrJetsPtNonBias[i]->GetYaxis()->SetTitle("counts");
282 fOutput->Add(fHistCorrJetsPtNonBias[i]);
284 histname = "fHistJetsNEFvsPt_";
286 fHistJetsNEFvsPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins, 0, 1.2, fNbins * 1.5, -fMaxPt * 0.75, fMaxPt * 0.75);
287 fHistJetsNEFvsPt[i]->GetXaxis()->SetTitle("NEF");
288 fHistJetsNEFvsPt[i]->GetYaxis()->SetTitle("Pt [GeV/c]");
289 fOutput->Add(fHistJetsNEFvsPt[i]);
291 histname = "fHistJetsZvsPt_";
293 fHistJetsZvsPt[i] = new TH2F(histname.Data(), histname.Data(), fNbins, 0, 1.2, fNbins * 1.5, -fMaxPt * 0.75, fMaxPt * 0.75);
294 fHistJetsZvsPt[i]->GetXaxis()->SetTitle("Z");
295 fHistJetsZvsPt[i]->GetYaxis()->SetTitle("Pt [GeV/c]");
296 fOutput->Add(fHistJetsZvsPt[i]);
298 histname = "fHistLeadingJetPt_";
300 fHistLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
301 fHistLeadingJetPt[i]->GetXaxis()->SetTitle("P_{T} [GeV]");
302 fHistLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
303 fOutput->Add(fHistLeadingJetPt[i]);
305 histname = "fHist2LeadingJetPt_";
307 fHist2LeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
308 fHist2LeadingJetPt[i]->GetXaxis()->SetTitle("P_{T} [GeV]");
309 fHist2LeadingJetPt[i]->GetYaxis()->SetTitle("counts");
310 fOutput->Add(fHist2LeadingJetPt[i]);
312 histname = "fHistCorrLeadingJetPt_";
314 fHistCorrLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins * 2, -fMaxPt, fMaxPt);
315 fHistCorrLeadingJetPt[i]->GetXaxis()->SetTitle("P_{T} [GeV]");
316 fHistCorrLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
317 fOutput->Add(fHistCorrLeadingJetPt[i]);
319 histname = "fHistTracksPtLJ_";
321 fHistTracksPtLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt / 5);
322 fHistTracksPtLJ[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
323 fHistTracksPtLJ[i]->GetYaxis()->SetTitle("counts");
324 fOutput->Add(fHistTracksPtLJ[i]);
326 histname = "fHistClusEtLJ_";
328 fHistClusEtLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt / 5);
329 fHistClusEtLJ[i]->GetXaxis()->SetTitle("E_{T} [GeV]");
330 fHistClusEtLJ[i]->GetYaxis()->SetTitle("counts");
331 fOutput->Add(fHistClusEtLJ[i]);
333 histname = "fHistTracksPtBkg_";
335 fHistTracksPtBkg[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt / 5);
336 fHistTracksPtBkg[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
337 fHistTracksPtBkg[i]->GetYaxis()->SetTitle("counts");
338 fOutput->Add(fHistTracksPtBkg[i]);
340 histname = "fHistClusEtBkg_";
342 fHistClusEtBkg[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt / 5);
343 fHistClusEtBkg[i]->GetXaxis()->SetTitle("E_{T} [GeV]");
344 fHistClusEtBkg[i]->GetYaxis()->SetTitle("counts");
345 fOutput->Add(fHistClusEtBkg[i]);
347 histname = "fHistBkgClusMeanRho_";
349 fHistBkgClusMeanRho[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
350 fHistBkgClusMeanRho[i]->GetXaxis()->SetTitle("#rho [GeV]");
351 fHistBkgClusMeanRho[i]->GetYaxis()->SetTitle("counts");
352 fOutput->Add(fHistBkgClusMeanRho[i]);
354 histname = "fHistBkgTracksMeanRho_";
356 fHistBkgTracksMeanRho[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
357 fHistBkgTracksMeanRho[i]->GetXaxis()->SetTitle("#rho [GeV/c]");
358 fHistBkgTracksMeanRho[i]->GetYaxis()->SetTitle("counts");
359 fOutput->Add(fHistBkgTracksMeanRho[i]);
361 histname = "fHistMedianPtKtJet_";
363 fHistMedianPtKtJet[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
364 fHistMedianPtKtJet[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
365 fHistMedianPtKtJet[i]->GetYaxis()->SetTitle("counts");
366 fOutput->Add(fHistMedianPtKtJet[i]);
368 histname = "fHistDeltaPtRC_";
370 fHistDeltaPtRC[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2 + binWidth / 2, fMinPt + fMaxPt / 2 + binWidth / 2);
371 fHistDeltaPtRC[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
372 fHistDeltaPtRC[i]->GetYaxis()->SetTitle("counts");
373 fOutput->Add(fHistDeltaPtRC[i]);
375 histname = "fHistDeltaPtRCExLJ_";
377 fHistDeltaPtRCExLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2 + binWidth / 2, fMinPt + fMaxPt / 2 + binWidth / 2);
378 fHistDeltaPtRCExLJ[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
379 fHistDeltaPtRCExLJ[i]->GetYaxis()->SetTitle("counts");
380 fOutput->Add(fHistDeltaPtRCExLJ[i]);
382 histname = "fHistRCPt_";
384 fHistRCPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
385 fHistRCPt[i]->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
386 fHistRCPt[i]->GetYaxis()->SetTitle("counts");
387 fOutput->Add(fHistRCPt[i]);
389 histname = "fHistRCPtExLJ_";
391 fHistRCPtExLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
392 fHistRCPtExLJ[i]->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
393 fHistRCPtExLJ[i]->GetYaxis()->SetTitle("counts");
394 fOutput->Add(fHistRCPtExLJ[i]);
396 histname = "fHistEmbJets_";
398 fHistEmbJets[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
399 fHistEmbJets[i]->GetXaxis()->SetTitle("embedded jet P_{T} [GeV/c]");
400 fHistEmbJets[i]->GetYaxis()->SetTitle("counts");
401 fOutput->Add(fHistEmbJets[i]);
403 histname = "fHistEmbPart_";
405 fHistEmbPart[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
406 fHistEmbPart[i]->GetXaxis()->SetTitle("embedded particle P_{T} [GeV/c]");
407 fHistEmbPart[i]->GetYaxis()->SetTitle("counts");
408 fOutput->Add(fHistEmbPart[i]);
410 histname = "fHistDeltaPtMedKtEmb_";
412 fHistDeltaPtMedKtEmb[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2 + binWidth / 2, fMinPt + fMaxPt / 2 + binWidth / 2);
413 fHistDeltaPtMedKtEmb[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
414 fHistDeltaPtMedKtEmb[i]->GetYaxis()->SetTitle("counts");
415 fOutput->Add(fHistDeltaPtMedKtEmb[i]);
418 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
421 //________________________________________________________________________
422 void AliAnalysisTaskSAJF::RetrieveEventObjects()
424 if (strcmp(fCaloName,"") && fAnaType == kEMCAL) {
425 fCaloClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
426 if (!fCaloClusters) {
427 AliWarning(Form("Could not retrieve clusters!"));
431 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
433 AliWarning(Form("Could not retrieve tracks!"));
436 fJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetsName));
438 AliWarning(Form("Could not retrieve jets!"));
441 if (strcmp(fEmbJetsName,"")) {
442 fEmbJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fEmbJetsName));
444 AliWarning(Form("Could not retrieve emb jets!"));
448 AliCentrality *aliCent = InputEvent()->GetCentrality();
450 fCent = aliCent->GetCentralityPercentile("V0M");
451 if (fCent >= 0 && fCent < 10) fCentBin = 0;
452 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
453 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
454 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
456 AliWarning(Form("Negative centrality: %f. Assuming 99", fCent));
461 AliWarning(Form("Could not retrieve centrality information! Assuming 99"));
467 if (strcmp(fRhoName,"")) {
468 TParameter<Double_t> *rho = dynamic_cast<TParameter<Double_t>*>(InputEvent()->FindListObject(fRhoName));
471 fRho = rho->GetVal();
474 AliWarning("Could not retrieve rho information.");
479 //________________________________________________________________________
480 AliVTrack* AliAnalysisTaskSAJF::GetTrack(const Int_t i) const
483 return dynamic_cast<AliVTrack*>(fTracks->At(i));
488 //________________________________________________________________________
489 Int_t AliAnalysisTaskSAJF::GetNumberOfTracks() const
492 return fTracks->GetEntriesFast();
497 //________________________________________________________________________
498 AliVCluster* AliAnalysisTaskSAJF::GetCaloCluster(const Int_t i) const
501 return dynamic_cast<AliVCluster*>(fCaloClusters->At(i));
506 //________________________________________________________________________
507 Int_t AliAnalysisTaskSAJF::GetNumberOfCaloClusters() const
510 return fCaloClusters->GetEntriesFast();
515 //________________________________________________________________________
516 AliEmcalJet* AliAnalysisTaskSAJF::GetJet(const Int_t i) const
519 return dynamic_cast<AliEmcalJet*>(fJets->At(i));
524 //________________________________________________________________________
525 Int_t AliAnalysisTaskSAJF::GetNumberOfJets() const
528 return fJets->GetEntriesFast();
533 //________________________________________________________________________
534 AliEmcalJet* AliAnalysisTaskSAJF::GetEmbJet(const Int_t i) const
537 return dynamic_cast<AliEmcalJet*>(fEmbJets->At(i));
542 //________________________________________________________________________
543 Int_t AliAnalysisTaskSAJF::GetNumberOfEmbJets() const
546 return fEmbJets->GetEntriesFast();
551 //________________________________________________________________________
552 void AliAnalysisTaskSAJF::FillHistograms()
554 Float_t A = fJetRadius * fJetRadius * TMath::Pi();
556 Int_t maxJetIndex = -1;
557 Int_t max2JetIndex = -1;
559 DoJetLoop(maxJetIndex, max2JetIndex);
564 AliEmcalJet* jet = GetJet(maxJetIndex);
568 fHistCentrality->Fill(fCent);
570 fHistLeadingJetPt[fCentBin]->Fill(jet->Pt());
571 jet->SortConstituents();
573 AliEmcalJet* jet2 = 0;
574 if (max2JetIndex >= 0)
575 jet2 = GetJet(max2JetIndex);
578 fHist2LeadingJetPt[fCentBin]->Fill(jet2->Pt());
579 jet2->SortConstituents();
582 fHistMedianPtKtJet[fCentBin]->Fill(fRho);
584 Float_t maxJetCorrPt = jet->Pt() - fRho * jet->Area();
585 if (maxJetCorrPt > 0)
586 fHistCorrLeadingJetPt[fCentBin]->Fill(maxJetCorrPt);
588 Float_t rhoTracksLJex = 0;
589 Float_t rhoTracks = 0;
590 DoTrackLoop(rhoTracksLJex, rhoTracks, maxJetIndex, max2JetIndex);
591 fHistBkgTracksMeanRho[fCentBin]->Fill(rhoTracksLJex);
593 Float_t rhoClusLJex = 0;
595 if (fAnaType == kEMCAL)
596 DoClusterLoop(rhoClusLJex, rhoClus, maxJetIndex, max2JetIndex);
598 Float_t rhoPartLJex = rhoTracksLJex + rhoClusLJex;
600 fHistBkgClusMeanRho[fCentBin]->Fill(rhoClusLJex);
602 fHistRhoPartVSleadJetPt->Fill(jet->Area() * rhoPartLJex, jet->Pt());
604 fHistMedKtVSRhoPart->Fill(fRho, rhoPartLJex);
606 Int_t nRCs = 1; //(Int_t)(GetArea() / A - 1);
608 for (Int_t i = 0; i < nRCs; i++) {
612 GetRigidConePt(RCpt, RCeta, RCphi, 0);
614 Float_t RCptExLJ = 0;
615 Float_t RCetaExLJ = 0;
616 Float_t RCphiExLJ = 0;
617 GetRigidConePt(RCptExLJ, RCetaExLJ, RCphiExLJ, jet);
619 fHistDeltaPtRC[fCentBin]->Fill(RCpt - A * fRho);
620 fHistDeltaPtRCExLJ[fCentBin]->Fill(RCptExLJ - A * fRho);
622 fHistRCPt[fCentBin]->Fill(RCpt / A);
623 fHistRCPtExLJ[fCentBin]->Fill(RCptExLJ / A);
624 fHistRCPtVSRhoPart->Fill(RCptExLJ / A, rhoPartLJex);
626 fHistMedKtVSRCPt->Fill(A * fRho, RCptExLJ);
628 fHistRCPhiEta->Fill(RCeta, RCphiExLJ);
630 Float_t dphi = RCphiExLJ - jet->Phi();
631 if (dphi > 4.8) dphi -= TMath::Pi() * 2;
632 if (dphi < -1.6) dphi += TMath::Pi() * 2;
633 fHistRCPtExLJVSDPhiLJ->Fill(RCptExLJ, dphi);
636 AliEmcalJet *maxJet = 0;
637 TObject *maxPart = 0;
639 Bool_t embOK = DoEmbJetLoop(maxJet, maxPart);
642 AliVCluster *cluster = dynamic_cast<AliVCluster*>(maxPart);
643 AliVTrack *track = dynamic_cast<AliVTrack*>(maxPart);
644 Float_t maxEmbPartPt = 0;
645 Float_t maxEmbPartEta = 0;
646 Float_t maxEmbPartPhi = 0;
648 Double_t vertex[3] = {0, 0, 0};
649 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
650 TLorentzVector nPart;
651 cluster->GetMomentum(nPart, vertex);
653 cluster->GetPosition(pos);
654 TVector3 clusVec(pos);
656 maxEmbPartPt = nPart.Et();
657 maxEmbPartEta = clusVec.Eta();
658 maxEmbPartPhi = clusVec.Phi();
661 maxEmbPartPt = track->Pt();
662 maxEmbPartEta = track->Eta();
663 maxEmbPartPhi = track->Phi();
666 AliWarning(Form("%s - Embedded particle type not recognized (neither AliVCluster nor AliVTrack)!", GetName()));
669 fHistEmbJets[fCentBin]->Fill(maxJet->Pt());
670 fHistEmbPart[fCentBin]->Fill(maxEmbPartPt);
671 fHistDeltaPtMedKtEmb[fCentBin]->Fill(maxJet->Pt() - maxJet->Area() * fRho - maxEmbPartPt);
672 fHistMedKtVSEmbBkg->Fill(maxJet->Area() * fRho, maxJet->Pt() - maxEmbPartPt);
673 fHistEmbJetPhiEta->Fill(maxJet->Eta(), maxJet->Phi());
674 fHistEmbPartPhiEta->Fill(maxEmbPartEta, maxEmbPartPhi);
678 AliWarning(Form("%s - Embedded particle is not the leading particle of the leading jet!", GetName()));
682 //________________________________________________________________________
683 void AliAnalysisTaskSAJF::DoJetLoop(Int_t &maxJetIndex, Int_t &max2JetIndex)
685 Double_t vertex[3] = {0, 0, 0};
686 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
688 Int_t njets = GetNumberOfJets();
690 Float_t maxJetPt = 0;
691 Float_t max2JetPt = 0;
692 for (Int_t ij = 0; ij < njets; ij++) {
694 AliEmcalJet* jet = GetJet(ij);
697 AliError(Form("Could not receive jet %d", ij));
707 Float_t corrPt = jet->Pt() - fRho * jet->Area();
709 fHistJetsPtNonBias[fCentBin]->Fill(jet->Pt());
710 fHistCorrJetsPtNonBias[fCentBin]->Fill(corrPt);
712 if (!AcceptJet(jet, kTRUE))
715 fHistJetsPt[fCentBin]->Fill(jet->Pt());
716 fHistCorrJetsPt[fCentBin]->Fill(corrPt);
718 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi());
719 fHistJetsNEFvsPt[fCentBin]->Fill(jet->NEF(), corrPt);
721 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
722 AliVTrack *track = jet->TrackAt(it, fTracks);
724 fHistJetsZvsPt[fCentBin]->Fill(track->Pt() / jet->Pt(), corrPt);
727 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
728 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
731 TLorentzVector nPart;
732 cluster->GetMomentum(nPart, vertex);
733 fHistJetsZvsPt[fCentBin]->Fill(nPart.Et() / jet->Pt(), corrPt);
737 if (maxJetPt < corrPt) {
738 max2JetPt = maxJetPt;
739 max2JetIndex = maxJetIndex;
743 else if (max2JetPt < corrPt) {
750 //________________________________________________________________________
751 Bool_t AliAnalysisTaskSAJF::DoEmbJetLoop(AliEmcalJet* &maxJet, TObject* &maxPart)
753 Double_t vertex[3] = {0, 0, 0};
754 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
756 Int_t nembjets = GetNumberOfEmbJets();
758 Int_t maxJetIdx = -1;
759 Int_t maxTrackIdx = -1;
760 Int_t maxClusIdx = -1;
762 Float_t maxTrackPt = 0;
763 Float_t maxClusEt = 0;
764 Float_t maxJetPt = 0;
766 for (Int_t ij = 0; ij < nembjets; ij++) {
768 AliEmcalJet* jet = GetEmbJet(ij);
771 AliError(Form("Could not receive jet %d", ij));
778 if (!AcceptJet(jet, kTRUE))
781 if (jet->Pt() > maxJetPt) {
782 maxJetPt = jet->Pt();
790 maxJet = GetEmbJet(maxJetIdx);
792 for (Int_t it = 0; it < maxJet->GetNumberOfTracks(); it++) {
793 AliVTrack *track = maxJet->TrackAt(it, fTracks);
795 if (!track) continue;
797 if (track->Pt() > maxTrackPt) {
798 maxTrackPt = track->Pt();
803 for (Int_t ic = 0; ic < maxJet->GetNumberOfClusters(); ic++) {
804 AliVCluster *cluster = maxJet->ClusterAt(ic, fCaloClusters);
806 if (!cluster) continue;
808 TLorentzVector nPart;
809 cluster->GetMomentum(nPart, vertex);
811 if (nPart.Et() > maxClusEt) {
812 maxClusEt = nPart.Et();
817 if (maxClusEt > maxTrackPt) {
818 AliVCluster *cluster = maxJet->ClusterAt(maxClusIdx, fCaloClusters);
820 return (Bool_t)(cluster->Chi2() == 100);
823 AliVTrack *track = maxJet->TrackAt(maxTrackIdx, fTracks);
825 return (Bool_t)(track->GetLabel() == 100);
829 //________________________________________________________________________
830 void AliAnalysisTaskSAJF::DoTrackLoop(Float_t &rhoTracksLJex, Float_t &rhoTracks, Int_t maxJetIndex, Int_t max2JetIndex)
832 AliEmcalJet* jet = 0;
833 if (max2JetIndex >= 0)
834 jet = GetJet(maxJetIndex);
836 AliEmcalJet* jet2 = 0;
837 if (max2JetIndex >= 0)
838 jet2 = GetJet(max2JetIndex);
840 Float_t area = GetArea();
841 if (jet) area -= jet->Area();
842 if (jet2) area -= jet2->Area();
844 Int_t ntracks = GetNumberOfTracks();
849 for(Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
850 AliVTrack* track = GetTrack(iTracks);
852 AliError(Form("Could not retrieve track %d",iTracks));
856 if (!AcceptTrack(track)) continue;
858 rhoTracks += track->Pt();
860 if (jet && IsJetTrack(jet, iTracks)) {
861 fHistTracksPtLJ[fCentBin]->Fill(track->Pt());
863 else if (!jet2 || !IsJetTrack(jet2, iTracks)) {
864 fHistTracksPtBkg[fCentBin]->Fill(track->Pt());
865 rhoTracksLJex += track->Pt();
868 rhoTracksLJex /= area;
872 //________________________________________________________________________
873 void AliAnalysisTaskSAJF::DoClusterLoop(Float_t &rhoClusLJex, Float_t &rhoClus, Int_t maxJetIndex, Int_t max2JetIndex)
875 Double_t vertex[3] = {0, 0, 0};
876 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
878 AliEmcalJet* jet = 0;
879 if (max2JetIndex >= 0)
880 jet = GetJet(maxJetIndex);
882 AliEmcalJet* jet2 = 0;
883 if (max2JetIndex >= 0)
884 jet2 = GetJet(max2JetIndex);
886 Float_t area = GetArea();
887 if (jet) area -= jet->Area();
888 if (jet2) area -= jet2->Area();
893 Int_t nclusters = GetNumberOfCaloClusters();
894 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
895 AliVCluster* cluster = GetCaloCluster(iClusters);
897 AliError(Form("Could not receive cluster %d", iClusters));
901 if (!(cluster->IsEMCAL())) continue;
903 if (!AcceptCluster(cluster)) continue;
905 TLorentzVector nPart;
906 cluster->GetMomentum(nPart, vertex);
908 rhoClus += nPart.Et();
910 if (jet && IsJetCluster(jet, iClusters)) {
911 fHistClusEtLJ[fCentBin]->Fill(nPart.Et());
913 else if (!jet2 || !IsJetCluster(jet2, iClusters)) {
914 fHistClusEtBkg[fCentBin]->Fill(nPart.Et());
915 rhoClusLJex += nPart.Et();
922 //________________________________________________________________________
923 void AliAnalysisTaskSAJF::Init()
925 if (fAnaType == kTPC) {
931 else if (fAnaType == kEMCAL) {
934 fMinPhi = 80 * TMath::DegToRad();
935 fMaxPhi = 180 * TMath::DegToRad();
938 AliWarning("Analysis type not recognized! Assuming kTPC...");
944 //________________________________________________________________________
945 Bool_t AliAnalysisTaskSAJF::GetRigidConePt(Float_t &pt, Float_t &eta, Float_t &phi, AliEmcalJet *jet, Float_t minD)
947 static TRandom3 random;
949 Double_t vertex[3] = {0, 0, 0};
950 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
963 Float_t maxEta = fMaxEta - fJetRadius;
964 Float_t minEta = fMinEta + fJetRadius;
965 Float_t maxPhi = fMaxPhi - fJetRadius;
966 Float_t minPhi = fMinPhi + fJetRadius;
968 if (maxPhi > TMath::Pi() * 2) maxPhi = TMath::Pi() * 2;
969 if (minPhi < 0) minPhi = 0;
973 eta = random.Rndm() * (maxEta - minEta) + minEta;
974 phi = random.Rndm() * (maxPhi - minPhi) + minPhi;
975 dLJ = TMath::Sqrt((LJeta - eta) * (LJeta - eta) + (LJphi - phi) * (LJphi - phi));
976 } while (dLJ < minD && !AcceptJet(eta, phi));
980 if (fAnaType == kEMCAL) {
981 Int_t nclusters = GetNumberOfCaloClusters();
982 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
983 AliVCluster* cluster = GetCaloCluster(iClusters);
985 AliError(Form("Could not receive cluster %d", iClusters));
989 if (!(cluster->IsEMCAL())) continue;
991 if (!AcceptCluster(cluster)) continue;
993 TLorentzVector nPart;
994 cluster->GetMomentum(nPart, vertex);
997 cluster->GetPosition(pos);
998 TVector3 clusVec(pos);
1000 Float_t d = TMath::Sqrt((clusVec.Eta() - eta) * (clusVec.Eta() - eta) + (clusVec.Phi() - phi) * (clusVec.Phi() - phi));
1002 if (d <= fJetRadius)
1007 Int_t ntracks = GetNumberOfTracks();
1008 for(Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1009 AliVTrack* track = GetTrack(iTracks);
1011 AliError(Form("Could not retrieve track %d",iTracks));
1015 if (!AcceptTrack(track)) continue;
1017 Float_t tracketa = track->Eta();
1018 Float_t trackphi = track->Phi();
1020 if (TMath::Abs(trackphi - phi) > TMath::Abs(trackphi - phi + 2 * TMath::Pi()))
1021 trackphi += 2 * TMath::Pi();
1022 if (TMath::Abs(trackphi - phi) > TMath::Abs(trackphi - phi - 2 * TMath::Pi()))
1023 trackphi -= 2 * TMath::Pi();
1025 Float_t d = TMath::Sqrt((tracketa - eta) * (tracketa - eta) + (trackphi - phi) * (trackphi - phi));
1027 if (d <= fJetRadius)
1034 //________________________________________________________________________
1035 Float_t AliAnalysisTaskSAJF::GetArea() const
1037 Float_t dphi = fMaxPhi - fMinPhi;
1038 if (dphi > TMath::Pi() * 2) dphi = TMath::Pi() * 2;
1039 Float_t deta = fMaxEta - fMinEta;
1043 //________________________________________________________________________
1044 Bool_t AliAnalysisTaskSAJF::IsJetTrack(AliEmcalJet* jet, Int_t itrack, Bool_t sorted) const
1046 for (Int_t i = 0; i < jet->GetNumberOfTracks(); i++) {
1047 Int_t ijettrack = jet->TrackAt(i);
1048 if (sorted && ijettrack > itrack)
1050 if (ijettrack == itrack)
1056 //________________________________________________________________________
1057 Bool_t AliAnalysisTaskSAJF::IsJetCluster(AliEmcalJet* jet, Int_t iclus, Bool_t sorted) const
1059 for (Int_t i = 0; i < jet->GetNumberOfClusters(); i++) {
1060 Int_t ijetclus = jet->ClusterAt(i);
1061 if (sorted && ijetclus > iclus)
1063 if (ijetclus == iclus)
1069 //________________________________________________________________________
1070 Bool_t AliAnalysisTaskSAJF::AcceptJet(Float_t eta, Float_t phi) const
1072 return (Bool_t)(eta > fMinEta + fJetRadius && eta < fMaxEta - fJetRadius && phi > fMinPhi + fJetRadius && phi < fMaxPhi - fJetRadius);
1075 //________________________________________________________________________
1076 Bool_t AliAnalysisTaskSAJF::AcceptJet(AliEmcalJet* jet, Bool_t checkPt) const
1078 if (checkPt && jet->MaxTrackPt() < fPtCutJetPart && jet->MaxClusterPt() < fPtCutJetPart)
1081 return AcceptJet(jet->Eta(), jet->Phi());
1084 //________________________________________________________________________
1085 Bool_t AliAnalysisTaskSAJF::AcceptCluster(AliVCluster* clus, Bool_t acceptMC)
1087 if (!acceptMC && clus->Chi2() == 100)
1090 Double_t vertex[3] = {0, 0, 0};
1091 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1092 TLorentzVector nPart;
1093 clus->GetMomentum(nPart, vertex);
1095 if (nPart.Et() < fPtCut)
1101 //________________________________________________________________________
1102 Bool_t AliAnalysisTaskSAJF::AcceptTrack(AliVTrack* track, Bool_t acceptMC) const
1104 if (!acceptMC && track->GetLabel() == 100)
1107 if (track->Pt() < fPtCut)
1110 return (Bool_t)(track->Eta() > fMinEta && track->Eta() < fMaxEta && track->Phi() > fMinPhi && track->Phi() < fMaxPhi);
1113 //________________________________________________________________________
1114 void AliAnalysisTaskSAJF::UserExec(Option_t *)
1118 RetrieveEventObjects();
1122 // information for this iteration of the UserExec in the container
1123 PostData(1, fOutput);
1126 //________________________________________________________________________
1127 void AliAnalysisTaskSAJF::Terminate(Option_t *)
1129 // Called once at the end of the analysis.