3 // Jet finder analysis task (S.Aiola).
8 #include <TClonesArray.h>
12 #include <TLorentzVector.h>
13 #include <TParticle.h>
16 #include "AliAnalysisManager.h"
17 #include "AliCentrality.h"
18 #include "AliVCluster.h"
19 #include "AliVTrack.h"
20 #include "AliEmcalJet.h"
21 #include "AliVEventHandler.h"
24 #include "AliAnalysisTaskSAJF.h"
26 ClassImp(AliAnalysisTaskSAJF)
28 //________________________________________________________________________
29 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF() :
30 AliAnalysisTaskSE("AliAnalysisTaskSAJF"),
35 fMaxPhi(2 * TMath::Pi()),
38 fTracksName("Tracks"),
39 fCaloName("CaloClusters"),
41 fKtJetsName("KtJets"),
42 fEmbJetsName("EmbJets"),
43 fTrgClusName("ClustersL1GAMMAFEE"),
54 fHistRhoPartVSleadJetPt(0),
55 fHistMedKtVSRhoPart(0),
56 fHistRCPtVSRhoPart(0),
61 // Default constructor.
63 for (Int_t i = 0; i < 4; i++) {
67 fHistLeadingJetPt[i] = 0;
68 fHist2LeadingJetPt[i] = 0;
69 fHistTracksPtLJ[i] = 0;
71 fHistTracksPtBkg[i] = 0;
72 fHistClusEtBkg[i] = 0;
73 fHistBkgClusPhiCorr[i] = 0;
74 fHistBkgTracksPhiCorr[i] = 0;
75 fHistBkgClusMeanRho[i] = 0;
76 fHistBkgTracksMeanRho[i] = 0;
77 fHistBkgLJetPhiCorr[i] = 0;
78 fHistMedianPtKtJet[i] = 0;
79 fHistDeltaPtRC[i] = 0;
80 fHistDeltaPtRCExLJ[i] = 0;
85 fHistDeltaPtMedKtEmb[i] = 0;
88 // Output slot #1 writes into a TH1 container
89 DefineOutput(1, TList::Class());
92 //________________________________________________________________________
93 AliAnalysisTaskSAJF::AliAnalysisTaskSAJF(const char *name) :
94 AliAnalysisTaskSE(name),
99 fMaxPhi(2 * TMath::Pi()),
102 fTracksName("Tracks"),
103 fCaloName("CaloClusters"),
105 fKtJetsName("KtJets"),
106 fEmbJetsName("EmbJets"),
107 fTrgClusName("ClustersL1GAMMAFEE"),
118 fHistRhoPartVSleadJetPt(0),
119 fHistMedKtVSRhoPart(0),
120 fHistRCPtVSRhoPart(0),
125 // Standard constructor.
127 for (Int_t i = 0; i < 4; i++) {
131 fHistLeadingJetPt[i] = 0;
132 fHist2LeadingJetPt[i] = 0;
133 fHistTracksPtLJ[i] = 0;
134 fHistClusEtLJ[i] = 0;
135 fHistTracksPtBkg[i] = 0;
136 fHistClusEtBkg[i] = 0;
137 fHistBkgClusPhiCorr[i] = 0;
138 fHistBkgTracksPhiCorr[i] = 0;
139 fHistBkgClusMeanRho[i] = 0;
140 fHistBkgTracksMeanRho[i] = 0;
141 fHistBkgLJetPhiCorr[i] = 0;
142 fHistMedianPtKtJet[i] = 0;
143 fHistDeltaPtRC[i] = 0;
144 fHistDeltaPtRCExLJ[i] = 0;
146 fHistRCPtExLJ[i] = 0;
149 fHistDeltaPtMedKtEmb[i] = 0;
152 // Output slot #1 writes into a TH1 container
153 DefineOutput(1, TList::Class());
156 //________________________________________________________________________
157 AliAnalysisTaskSAJF::~AliAnalysisTaskSAJF()
162 //________________________________________________________________________
163 void AliAnalysisTaskSAJF::UserCreateOutputObjects()
167 fOutput = new TList();
168 fOutput->SetOwner(); // IMPORTANT!
170 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", fNbins, 0, 100);
171 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
172 fHistCentrality->GetYaxis()->SetTitle("counts");
173 fOutput->Add(fHistCentrality);
175 fHistJetPhiEta = new TH2F("fHistJetPhiEta","Phi-Eta distribution of jets", 20, -2, 2, 32, 0, 6.4);
176 fHistJetPhiEta->GetXaxis()->SetTitle("Eta");
177 fHistJetPhiEta->GetYaxis()->SetTitle("Phi");
178 fOutput->Add(fHistJetPhiEta);
180 fHistRhoPartVSleadJetPt = new TH2F("fHistRhoPartVSleadJetPt","fHistRhoPartVSleadJetPt", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
181 fHistRhoPartVSleadJetPt->GetXaxis()->SetTitle("#rho [GeV]");
182 fHistRhoPartVSleadJetPt->GetYaxis()->SetTitle("Leading jet energy [GeV]");
183 fOutput->Add(fHistRhoPartVSleadJetPt);
185 fHistMedKtVSRhoPart = new TH2F("fHistMedKtVSRhoPart","fHistMedKtVSRhoPart", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
186 fHistMedKtVSRhoPart->GetXaxis()->SetTitle("median kt P_{T} [GeV]");
187 fHistMedKtVSRhoPart->GetYaxis()->SetTitle("#rho [GeV]");
188 fOutput->Add(fHistMedKtVSRhoPart);
190 fHistRCPtVSRhoPart = new TH2F("fHistRCPtVSRhoPart","fHistRCPtVSRhoPart", fNbins, fMinPt, fMaxPt, fNbins, fMinPt, fMaxPt);
191 fHistRCPtVSRhoPart->GetXaxis()->SetTitle("rigid cone P_{T} [GeV]");
192 fHistRCPtVSRhoPart->GetYaxis()->SetTitle("#rho [GeV]");
193 fOutput->Add(fHistRCPtVSRhoPart);
197 for (Int_t i = 0; i < 4; i++) {
198 histname = "fHistJetsPt_";
200 fHistJetsPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
201 fHistJetsPt[i]->GetXaxis()->SetTitle("E [GeV]");
202 fHistJetsPt[i]->GetYaxis()->SetTitle("counts");
203 fOutput->Add(fHistJetsPt[i]);
205 histname = "fHistJetsNEF_";
207 fHistJetsNEF[i] = new TH1F(histname.Data(), histname.Data(), fNbins, 0, 1.2);
208 fHistJetsNEF[i]->GetXaxis()->SetTitle("NEF");
209 fHistJetsNEF[i]->GetYaxis()->SetTitle("counts");
210 fOutput->Add(fHistJetsNEF[i]);
212 histname = "fHistJetsZ_";
214 fHistJetsZ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, 0, 1.2);
215 fHistJetsZ[i]->GetXaxis()->SetTitle("Z");
216 fHistJetsZ[i]->GetYaxis()->SetTitle("counts");
217 fOutput->Add(fHistJetsZ[i]);
219 histname = "fHistLeadingJetPt_";
221 fHistLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
222 fHistLeadingJetPt[i]->GetXaxis()->SetTitle("P_{T} [GeV]");
223 fHistLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
224 fOutput->Add(fHistLeadingJetPt[i]);
226 histname = "fHistTracksPtLJ_";
228 fHistTracksPtLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
229 fHistTracksPtLJ[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
230 fHistTracksPtLJ[i]->GetYaxis()->SetTitle("counts");
231 fOutput->Add(fHistTracksPtLJ[i]);
233 histname = "fHistClusEtLJ_";
235 fHistClusEtLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
236 fHistClusEtLJ[i]->GetXaxis()->SetTitle("E_{T} [GeV]");
237 fHistClusEtLJ[i]->GetYaxis()->SetTitle("counts");
238 fOutput->Add(fHistClusEtLJ[i]);
240 histname = "fHistTracksPtBkg_";
242 fHistTracksPtBkg[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
243 fHistTracksPtBkg[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
244 fHistTracksPtBkg[i]->GetYaxis()->SetTitle("counts");
245 fOutput->Add(fHistTracksPtBkg[i]);
247 histname = "fHistClusEtBkg_";
249 fHistClusEtBkg[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
250 fHistClusEtBkg[i]->GetXaxis()->SetTitle("E_{T} [GeV]");
251 fHistClusEtBkg[i]->GetYaxis()->SetTitle("counts");
252 fOutput->Add(fHistClusEtBkg[i]);
254 histname = "fHistBkgClusPhiCorr_";
256 fHistBkgClusPhiCorr[i] = new TH1F(histname.Data(), histname.Data(), 128, -1.6, 4.8);
257 fHistBkgClusPhiCorr[i]->GetXaxis()->SetTitle("#Delta#phi");
258 fHistBkgClusPhiCorr[i]->GetYaxis()->SetTitle("counts");
259 fOutput->Add(fHistBkgClusPhiCorr[i]);
261 histname = "fHistBkgTracksPhiCorr_";
263 fHistBkgTracksPhiCorr[i] = new TH1F(histname.Data(), histname.Data(), 128, -1.6, 4.8);
264 fHistBkgTracksPhiCorr[i]->GetXaxis()->SetTitle("#Delta#phi");
265 fHistBkgTracksPhiCorr[i]->GetYaxis()->SetTitle("counts");
266 fOutput->Add(fHistBkgTracksPhiCorr[i]);
268 histname = "fHistBkgClusMeanRho_";
270 fHistBkgClusMeanRho[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
271 fHistBkgClusMeanRho[i]->GetXaxis()->SetTitle("#rho [GeV]");
272 fHistBkgClusMeanRho[i]->GetYaxis()->SetTitle("counts");
273 fOutput->Add(fHistBkgClusMeanRho[i]);
275 histname = "fHistBkgTracksMeanRho_";
277 fHistBkgTracksMeanRho[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
278 fHistBkgTracksMeanRho[i]->GetXaxis()->SetTitle("#rho [GeV/c]");
279 fHistBkgTracksMeanRho[i]->GetYaxis()->SetTitle("counts");
280 fOutput->Add(fHistBkgTracksMeanRho[i]);
282 histname = "fHistBkgLJetPhiCorr_";
284 fHistBkgLJetPhiCorr[i] = new TH1F(histname.Data(), histname.Data(), 128, -1.6, 4.8);
285 fHistBkgLJetPhiCorr[i]->GetXaxis()->SetTitle("#Delta#phi");
286 fHistBkgLJetPhiCorr[i]->GetYaxis()->SetTitle("counts");
287 fOutput->Add(fHistBkgLJetPhiCorr[i]);
289 histname = "fHistMedianPtKtJet_";
291 fHistMedianPtKtJet[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
292 fHistMedianPtKtJet[i]->GetXaxis()->SetTitle("P_{T} [GeV/c]");
293 fHistMedianPtKtJet[i]->GetYaxis()->SetTitle("counts");
294 fOutput->Add(fHistMedianPtKtJet[i]);
296 histname = "fHistDeltaPtRC_";
298 fHistDeltaPtRC[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2, fMaxPt / 2);
299 fHistDeltaPtRC[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
300 fHistDeltaPtRC[i]->GetYaxis()->SetTitle("counts");
301 fOutput->Add(fHistDeltaPtRC[i]);
303 histname = "fHistDeltaPtRCExLJ_";
305 fHistDeltaPtRCExLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2, fMaxPt / 2);
306 fHistDeltaPtRCExLJ[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
307 fHistDeltaPtRCExLJ[i]->GetYaxis()->SetTitle("counts");
308 fOutput->Add(fHistDeltaPtRCExLJ[i]);
310 histname = "fHistRCPt_";
312 fHistRCPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
313 fHistRCPt[i]->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
314 fHistRCPt[i]->GetYaxis()->SetTitle("counts");
315 fOutput->Add(fHistRCPt[i]);
317 histname = "fHistRCPtExLJ_";
319 fHistRCPtExLJ[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
320 fHistRCPtExLJ[i]->GetXaxis()->SetTitle("rigid cone P_{T} [GeV/c]");
321 fHistRCPtExLJ[i]->GetYaxis()->SetTitle("counts");
322 fOutput->Add(fHistRCPtExLJ[i]);
324 histname = "fHistEmbJets_";
326 fHistEmbJets[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
327 fHistEmbJets[i]->GetXaxis()->SetTitle("embedded jet P_{T} [GeV/c]");
328 fHistEmbJets[i]->GetYaxis()->SetTitle("counts");
329 fOutput->Add(fHistEmbJets[i]);
331 histname = "fHistEmbPart_";
333 fHistEmbPart[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt, fMaxPt);
334 fHistEmbPart[i]->GetXaxis()->SetTitle("embedded particle P_{T} [GeV/c]");
335 fHistEmbPart[i]->GetYaxis()->SetTitle("counts");
336 fOutput->Add(fHistEmbPart[i]);
338 histname = "fHistDeltaPtMedKtEmb_";
340 fHistDeltaPtMedKtEmb[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinPt - fMaxPt / 2, fMaxPt / 2);
341 fHistDeltaPtMedKtEmb[i]->GetXaxis()->SetTitle("#deltaP_{T} [GeV/c]");
342 fHistDeltaPtMedKtEmb[i]->GetYaxis()->SetTitle("counts");
343 fOutput->Add(fHistDeltaPtMedKtEmb[i]);
346 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
349 //________________________________________________________________________
350 void AliAnalysisTaskSAJF::RetrieveEventObjects()
352 fCaloClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
353 if (!fCaloClusters) {
354 AliWarning(Form("Could not retrieve clusters!"));
357 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
359 AliWarning(Form("Could not retrieve tracks!"));
362 fJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetsName));
364 AliWarning(Form("Could not retrieve jets!"));
367 if (strcmp(fKtJetsName,"")) {
368 fKtJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fKtJetsName));
370 AliWarning(Form("Could not retrieve Kt jets!"));
374 if (strcmp(fEmbJetsName,"")) {
375 fEmbJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fEmbJetsName));
377 AliWarning(Form("Could not retrieve emb jets!"));
381 if (strcmp(fTrgClusName,"")) {
382 fTrgClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrgClusName));
384 AliWarning(Form("Could not retrieve trigger clusters!"));
388 fCent = InputEvent()->GetCentrality();
390 Float_t cent = fCent->GetCentralityPercentile("V0M");
391 if (cent >= 0 && cent < 10) fCentBin = 0;
392 else if (cent >= 10 && cent < 30) fCentBin = 1;
393 else if (cent >= 30 && cent < 50) fCentBin = 2;
394 else if (cent >= 50 && cent <= 100) fCentBin = 3;
396 AliWarning(Form("Negative centrality: %f. Assuming 99", cent));
401 AliWarning(Form("Could not retrieve centrality information! Assuming 99"));
406 //________________________________________________________________________
407 AliVTrack* AliAnalysisTaskSAJF::GetTrack(const Int_t i) const
410 return dynamic_cast<AliVTrack*>(fTracks->At(i));
415 //________________________________________________________________________
416 Int_t AliAnalysisTaskSAJF::GetNumberOfTracks() const
419 return fTracks->GetEntriesFast();
424 //________________________________________________________________________
425 AliVCluster* AliAnalysisTaskSAJF::GetCaloCluster(const Int_t i) const
428 return dynamic_cast<AliVCluster*>(fCaloClusters->At(i));
433 //________________________________________________________________________
434 Int_t AliAnalysisTaskSAJF::GetNumberOfCaloClusters() const
437 return fCaloClusters->GetEntriesFast();
442 //________________________________________________________________________
443 AliEmcalJet* AliAnalysisTaskSAJF::GetJet(const Int_t i) const
446 return dynamic_cast<AliEmcalJet*>(fJets->At(i));
451 //________________________________________________________________________
452 Int_t AliAnalysisTaskSAJF::GetNumberOfJets() const
455 return fJets->GetEntriesFast();
460 //________________________________________________________________________
461 AliEmcalJet* AliAnalysisTaskSAJF::GetKtJet(const Int_t i) const
464 return dynamic_cast<AliEmcalJet*>(fKtJets->At(i));
469 //________________________________________________________________________
470 Int_t AliAnalysisTaskSAJF::GetNumberOfKtJets() const
473 return fKtJets->GetEntriesFast();
478 //________________________________________________________________________
479 AliEmcalJet* AliAnalysisTaskSAJF::GetEmbJet(const Int_t i) const
482 return dynamic_cast<AliEmcalJet*>(fEmbJets->At(i));
487 //________________________________________________________________________
488 Int_t AliAnalysisTaskSAJF::GetNumberOfEmbJets() const
491 return fEmbJets->GetEntriesFast();
496 //________________________________________________________________________
497 AliVCluster* AliAnalysisTaskSAJF::GetTrgCluster(const Int_t i) const
500 return dynamic_cast<AliVCluster*>(fTrgClusters->At(i));
505 //________________________________________________________________________
506 Int_t AliAnalysisTaskSAJF::GetNumberOfTrgClusters() const
509 return fTrgClusters->GetEntriesFast();
514 //________________________________________________________________________
515 void AliAnalysisTaskSAJF::FillHistograms()
517 Float_t A = fJetRadius * fJetRadius * TMath::Pi();
522 cent = fCent->GetCentralityPercentile("V0M");
524 fHistCentrality->Fill(cent);
526 Int_t maxJetIndex = -1;
527 Int_t max2JetIndex = -1;
529 DoJetLoop(maxJetIndex, max2JetIndex);
534 AliEmcalJet* jet = GetJet(maxJetIndex);
538 fHistLeadingJetPt[fCentBin]->Fill(jet->Pt());
539 jet->SortConstituents();
541 AliEmcalJet* jet2 = 0;
542 if (max2JetIndex >= 0)
543 jet2 = GetJet(max2JetIndex);
546 //fHistLeadingJetPt[fCentBin]->Fill(jet2->Pt());
547 jet2->SortConstituents();
550 Float_t rhoKt = DoKtJetLoop();
551 fHistMedianPtKtJet[fCentBin]->Fill(rhoKt);
553 Float_t rhoTracks = DoTrackLoop(maxJetIndex, max2JetIndex);
554 fHistBkgTracksMeanRho[fCentBin]->Fill(rhoTracks);
557 if (fAnaType == kEMCAL || fAnaType == kEMCALFiducial)
558 rhoClus = DoClusterLoop(maxJetIndex, max2JetIndex);
560 fHistBkgClusMeanRho[fCentBin]->Fill(rhoClus);
562 fHistRhoPartVSleadJetPt->Fill(A * (rhoClus + rhoTracks), jet->Pt());
564 fHistMedKtVSRhoPart->Fill(rhoKt, rhoClus + rhoTracks);
566 Int_t nRCs = GetArea() / A - 1;
568 for (Int_t i = 0; i < nRCs; i++) {
569 Float_t RCpt = GetRigidConePt(0);
570 Float_t RCptExLJ = GetRigidConePt(jet);
572 fHistDeltaPtRC[fCentBin]->Fill(RCpt - A * rhoKt);
573 fHistDeltaPtRCExLJ[fCentBin]->Fill(RCptExLJ - A * rhoKt);
575 fHistRCPt[fCentBin]->Fill(RCpt / A);
576 fHistRCPtExLJ[fCentBin]->Fill(RCptExLJ / A);
577 fHistRCPtVSRhoPart->Fill(RCptExLJ / A, rhoClus + rhoTracks);
580 Float_t maxEmbJetPt = 0;
581 Float_t maxEmbPartPt = 0;
583 Bool_t embOK = DoEmbJetLoop(maxEmbJetPt, maxEmbPartPt);
586 fHistEmbJets[fCentBin]->Fill(maxEmbJetPt);
587 fHistEmbPart[fCentBin]->Fill(maxEmbPartPt);
588 fHistDeltaPtMedKtEmb[fCentBin]->Fill(maxEmbJetPt - A * rhoKt - maxEmbPartPt);
591 if (maxEmbPartPt != 0)
592 AliWarning("Embedded particle is not the leading particle of the leading jet!");
596 //________________________________________________________________________
597 void AliAnalysisTaskSAJF::DoJetLoop(Int_t &maxJetIndex, Int_t &max2JetIndex)
599 Double_t vertex[3] = {0, 0, 0};
600 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
602 Int_t njets = GetNumberOfJets();
604 Float_t maxJetPt = 0;
605 Float_t max2JetPt = 0;
606 for (Int_t ij = 0; ij < njets; ij++) {
608 AliEmcalJet* jet = GetJet(ij);
611 AliError(Form("Could not receive jet %d", ij));
621 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi());
622 fHistJetsPt[fCentBin]->Fill(jet->Pt());
623 fHistJetsNEF[fCentBin]->Fill(jet->NEF());
625 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
626 AliVTrack *track = jet->TrackAt(it, fTracks);
628 fHistJetsZ[fCentBin]->Fill(track->Pt() / jet->Pt());
631 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
632 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
635 TLorentzVector nPart;
636 cluster->GetMomentum(nPart, vertex);
637 fHistJetsZ[fCentBin]->Fill(nPart.Et() / jet->Pt());
641 if (maxJetPt < jet->Pt()) {
642 max2JetPt = maxJetPt;
643 max2JetIndex = maxJetIndex;
644 maxJetPt = jet->Pt();
647 else if (max2JetPt < jet->Pt()) {
648 max2JetPt = jet->Pt();
654 //________________________________________________________________________
655 Float_t AliAnalysisTaskSAJF::DoKtJetLoop(Int_t nLJs)
657 Float_t ktJetsMedian = 0;
658 Int_t nktjets = GetNumberOfKtJets();
660 Int_t NoOfZeroJets = 0;
663 TArrayF ktJets(nktjets);
664 for (Int_t ij = 0; ij < nktjets; ij++) {
666 AliEmcalJet* jet = GetKtJet(ij);
669 AliError(Form("Could not receive jet %d", ij));
673 if (jet->Pt() <= 0) {
678 if (!AcceptJet(jet)) {
683 Float_t rho = jet->Pt() / jet->Area();
684 Int_t i = nktjets - 1;
685 while (rho < ktJets[i] && i > 0)
687 memmove(ktJets.GetArray() + nktjets - ij - 1, ktJets.GetArray() + nktjets - ij, (ij + i - nktjets + 1) * sizeof(Float_t));
691 nktjets -= NoOfZeroJets;
693 if (nktjets < 1) return 0;
695 memmove(ktJets.GetArray(), ktJets.GetArray() + NoOfZeroJets, nktjets * sizeof(Float_t));
699 if (nktjets < 1) return 0;
702 ktJetsMedian = ktJets[nktjets / 2];
704 ktJetsMedian = (ktJets[nktjets / 2] + ktJets[nktjets / 2 - 1]) / 2;
710 //________________________________________________________________________
711 Bool_t AliAnalysisTaskSAJF::DoEmbJetLoop(Float_t &maxJetPt, Float_t &maxPartPt)
713 Double_t vertex[3] = {0, 0, 0};
714 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
716 Int_t nembjets = GetNumberOfEmbJets();
718 Int_t maxJetIdx = -1;
719 Int_t maxTrackIdx = -1;
720 Int_t maxClusIdx = -1;
722 Float_t maxTrackPt = 0;
723 Float_t maxClusEt = 0;
725 for (Int_t ij = 0; ij < nembjets; ij++) {
727 AliEmcalJet* jet = GetEmbJet(ij);
730 AliError(Form("Could not receive jet %d", ij));
740 if (jet->Pt() > maxJetPt) {
741 maxJetPt = jet->Pt();
749 AliEmcalJet* jet = GetEmbJet(maxJetIdx);
751 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
752 AliVTrack *track = jet->TrackAt(it, fTracks);
754 if (!track) continue;
756 if (track->Pt() > maxTrackPt) {
757 maxTrackPt = track->Pt();
762 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
763 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
765 if (!cluster) continue;
767 TLorentzVector nPart;
768 cluster->GetMomentum(nPart, vertex);
770 if (nPart.Et() > maxClusEt) {
771 maxClusEt = nPart.Et();
776 if (maxClusEt > maxTrackPt) {
777 AliVCluster *cluster = jet->ClusterAt(maxClusIdx, fCaloClusters);
778 maxPartPt = maxClusEt;
779 return (Bool_t)(cluster->Chi2() == 100);
782 AliVTrack *track = jet->TrackAt(maxTrackIdx, fTracks);
783 maxPartPt = maxTrackPt;
784 return (Bool_t)(track->GetLabel() == 100);
788 //________________________________________________________________________
789 Float_t AliAnalysisTaskSAJF::DoTrackLoop(Int_t maxJetIndex, Int_t max2JetIndex)
791 AliEmcalJet* jet = 0;
792 if (max2JetIndex >= 0)
793 jet = GetJet(maxJetIndex);
795 AliEmcalJet* jet2 = 0;
796 if (max2JetIndex >= 0)
797 jet2 = GetJet(max2JetIndex);
799 Float_t rhoTracks = 0;
800 Int_t ntracks = GetNumberOfTracks();
802 for(Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
803 AliVTrack* track = GetTrack(iTracks);
805 AliError(Form("Could not retrieve track %d",iTracks));
809 if (!AcceptTrack(track)) continue;
811 if (jet && IsJetTrack(jet, iTracks)) {
812 fHistTracksPtLJ[fCentBin]->Fill(track->Pt());
814 else if (!jet2 || !IsJetTrack(jet2, iTracks)) {
815 fHistTracksPtBkg[fCentBin]->Fill(track->Pt());
816 rhoTracks += track->Pt();
819 Float_t dphijet = jet->Phi() - track->Phi();
820 if (dphijet < -1.6) dphijet += TMath::Pi() * 2;
821 if (dphijet > 4.8) dphijet -= TMath::Pi() * 2;
822 fHistBkgLJetPhiCorr[fCentBin]->Fill(dphijet);
825 for(Int_t it2 = iTracks+1; it2 < ntracks; it2++) {
826 AliVTrack* track2 = GetTrack(it2);
828 AliError(Form("Could not retrieve track %d", it2));
832 if (!AcceptTrack(track2)) continue;
834 if (jet && IsJetTrack(jet, it2)) continue;
836 if (jet2 && IsJetTrack(jet2, it2)) continue;
838 Float_t dphi = track->Phi() - track2->Phi();
839 if (dphi < -1.6) dphi += TMath::Pi() * 2;
840 if (dphi > 4.8) dphi -= TMath::Pi() * 2;
841 fHistBkgTracksPhiCorr[fCentBin]->Fill(dphi);
842 } // second track loop
845 rhoTracks /= GetArea();
849 //________________________________________________________________________
850 Float_t AliAnalysisTaskSAJF::DoClusterLoop(Int_t maxJetIndex, Int_t max2JetIndex)
852 Double_t vertex[3] = {0, 0, 0};
853 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
855 AliEmcalJet* jet = 0;
856 if (max2JetIndex >= 0)
857 jet = GetJet(maxJetIndex);
859 AliEmcalJet* jet2 = 0;
860 if (max2JetIndex >= 0)
861 jet2 = GetJet(max2JetIndex);
864 Int_t nclusters = GetNumberOfCaloClusters();
865 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
866 AliVCluster* cluster = GetCaloCluster(iClusters);
868 AliError(Form("Could not receive cluster %d", iClusters));
872 if (!(cluster->IsEMCAL())) continue;
874 if (!AcceptCluster(cluster)) continue;
876 TLorentzVector nPart;
877 cluster->GetMomentum(nPart, vertex);
879 if (jet && IsJetCluster(jet, iClusters)) {
880 fHistClusEtLJ[fCentBin]->Fill(nPart.Et());
882 else if (!jet2 || !IsJetCluster(jet2, iClusters)) {
883 fHistClusEtBkg[fCentBin]->Fill(nPart.Et());
884 rhoClus += nPart.Et();
887 cluster->GetPosition(pos1);
888 TVector3 clusVec1(pos1);
891 Float_t dphijet = jet->Phi() - clusVec1.Phi();
892 if (dphijet < -1.6) dphijet += TMath::Pi() * 2;
893 if (dphijet > 4.8) dphijet -= TMath::Pi() * 2;
894 fHistBkgLJetPhiCorr[fCentBin]->Fill(dphijet);
897 for(Int_t ic2 = iClusters+1; ic2 < nclusters; ic2++) {
898 AliVCluster* cluster2 = GetCaloCluster(ic2);
900 AliError(Form("Could not receive cluster %d", ic2));
904 if (!(cluster2->IsEMCAL())) continue;
906 if (!AcceptCluster(cluster)) continue;
908 if (jet && IsJetCluster(jet, ic2)) continue;
910 if (jet2 && IsJetCluster(jet2, ic2)) continue;
913 cluster2->GetPosition(pos2);
914 TVector3 clusVec2(pos2);
916 Float_t dphi = clusVec1.Phi() - clusVec2.Phi();
917 if (dphi < -1.6) dphi += TMath::Pi() * 2;
918 if (dphi > 4.8) dphi -= TMath::Pi() * 2;
919 fHistBkgClusPhiCorr[fCentBin]->Fill(dphi);
923 rhoClus /= GetArea();
927 //________________________________________________________________________
928 void AliAnalysisTaskSAJF::Init()
930 if (fAnaType == kFullAcceptance) {
934 fMaxPhi = 2 * TMath::Pi();
936 else if (fAnaType == kEMCAL || fAnaType == kEMCALFiducial) {
939 fMinPhi = 80 * TMath::DegToRad();
940 fMaxPhi = 180 * TMath::DegToRad();
943 AliWarning("Analysis type not recognized! Assuming kFullAcceptance...");
947 fMaxPhi = 2 * TMath::Pi();
951 //________________________________________________________________________
952 Float_t AliAnalysisTaskSAJF::GetRigidConePt(AliEmcalJet *jet, Float_t minD)
954 static TRandom3 random;
956 Double_t vertex[3] = {0, 0, 0};
957 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
972 eta = random.Rndm() * (fMaxEta - fMinEta) + fMinEta;
973 phi = random.Rndm() * (fMaxPhi - fMinPhi) + fMinPhi;
974 dLJ = TMath::Sqrt((LJeta - eta) * (LJeta - eta) + (LJphi - phi) * (LJphi - phi));
975 } while (dLJ < minD && !AcceptJet(eta, phi));
979 Int_t nclusters = GetNumberOfCaloClusters();
980 for (Int_t iClusters = 0; iClusters < nclusters; iClusters++) {
981 AliVCluster* cluster = GetCaloCluster(iClusters);
983 AliError(Form("Could not receive cluster %d", iClusters));
987 if (!(cluster->IsEMCAL())) continue;
989 if (!AcceptCluster(cluster)) continue;
991 TLorentzVector nPart;
992 cluster->GetMomentum(nPart, vertex);
995 cluster->GetPosition(pos);
996 TVector3 clusVec(pos);
998 Float_t d = TMath::Sqrt((clusVec.Eta() - eta) * (clusVec.Eta() - eta) + (clusVec.Phi() - phi) * (clusVec.Phi() - phi));
1000 if (d <= fJetRadius)
1004 Int_t ntracks = GetNumberOfTracks();
1005 for(Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1006 AliVTrack* track = GetTrack(iTracks);
1008 AliError(Form("Could not retrieve track %d",iTracks));
1012 if (!AcceptTrack(track)) continue;
1014 Float_t tracketa = track->Eta();
1015 Float_t trackphi = track->Phi();
1017 if (TMath::Abs(trackphi - phi) > TMath::Abs(trackphi - phi + 2 * TMath::Pi()))
1018 trackphi += 2 * TMath::Pi();
1019 if (TMath::Abs(trackphi - phi) > TMath::Abs(trackphi - phi - 2 * TMath::Pi()))
1020 trackphi -= 2 * TMath::Pi();
1022 Float_t d = TMath::Sqrt((tracketa - eta) * (tracketa - eta) + (trackphi - phi) * (trackphi - phi));
1024 if (d <= fJetRadius)
1031 //________________________________________________________________________
1032 Float_t AliAnalysisTaskSAJF::GetArea() const
1034 return (fMaxEta - fMinEta) * (fMaxPhi - fMinPhi);
1037 //________________________________________________________________________
1038 Bool_t AliAnalysisTaskSAJF::IsJetTrack(AliEmcalJet* jet, Int_t itrack, Bool_t sorted) const
1040 for (Int_t i = 0; i < jet->GetNumberOfTracks(); i++) {
1041 Int_t ijettrack = jet->TrackAt(i);
1042 if (sorted && ijettrack > itrack)
1044 if (ijettrack == itrack)
1050 //________________________________________________________________________
1051 Bool_t AliAnalysisTaskSAJF::IsJetCluster(AliEmcalJet* jet, Int_t iclus, Bool_t sorted) const
1053 for (Int_t i = 0; i < jet->GetNumberOfClusters(); i++) {
1054 Int_t ijetclus = jet->ClusterAt(i);
1055 if (sorted && ijetclus > iclus)
1057 if (ijetclus == iclus)
1063 //________________________________________________________________________
1064 Bool_t AliAnalysisTaskSAJF::AcceptJet(Float_t eta, Float_t phi) const
1066 if (fAnaType == kFullAcceptance) {
1069 else if (fAnaType == kEMCAL) {
1070 return (Bool_t)(eta > fMinEta && eta < fMaxEta && phi > fMinPhi && phi < fMaxPhi);
1072 else if (fAnaType == kEMCALFiducial) {
1073 return (Bool_t)(eta > fMinEta + fJetRadius && eta < fMaxEta - fJetRadius && phi > fMinPhi + fJetRadius && phi < fMaxPhi - fJetRadius);
1076 AliWarning("Analysis type not recognized! Assuming kFullAcceptance...");
1081 //________________________________________________________________________
1082 Bool_t AliAnalysisTaskSAJF::AcceptJet(AliEmcalJet* jet) const
1084 return AcceptJet(jet->Eta(), jet->Phi());
1087 //________________________________________________________________________
1088 Bool_t AliAnalysisTaskSAJF::AcceptCluster(AliVCluster* clus, Bool_t acceptMC) const
1090 if (!acceptMC && clus->Chi2() == 100)
1097 //________________________________________________________________________
1098 Bool_t AliAnalysisTaskSAJF::AcceptTrack(AliVTrack* track, Bool_t acceptMC) const
1100 if (!acceptMC && track->GetLabel() == 100)
1103 if (fAnaType == kFullAcceptance) {
1106 else if (fAnaType == kEMCAL || fAnaType == kEMCALFiducial) {
1107 return (Bool_t)(track->Eta() > fMinEta && track->Eta() < fMaxEta && track->Phi() > fMinPhi && track->Phi() < fMaxPhi);
1110 AliWarning("Analysis type not recognized! Assuming kFullAcceptance...");
1115 //________________________________________________________________________
1116 void AliAnalysisTaskSAJF::UserExec(Option_t *)
1120 RetrieveEventObjects();
1124 // information for this iteration of the UserExec in the container
1125 PostData(1, fOutput);
1128 //________________________________________________________________________
1129 void AliAnalysisTaskSAJF::Terminate(Option_t *)
1131 // Called once at the end of the analysis.