3 // Emcal jet response matrix maker task.
7 #include "AliJetResponseMaker.h"
10 #include <TClonesArray.h>
14 #include <TLorentzVector.h>
16 #include "AliAnalysisManager.h"
17 #include "AliCentrality.h"
18 #include "AliFJWrapper.h"
19 #include "AliVCluster.h"
20 #include "AliVTrack.h"
21 #include "AliEmcalJet.h"
22 #include "AliGenPythiaEventHeader.h"
23 #include "AliMCEvent.h"
25 ClassImp(AliJetResponseMaker)
27 //________________________________________________________________________
28 AliJetResponseMaker::AliJetResponseMaker() :
29 AliAnalysisTaskEmcalJet("AliJetResponseMaker", kTRUE),
30 fMCTracksName("MCParticles"),
31 fMCJetsName("MCJets"),
47 fHistAcceptedEvents(0),
51 fHistMCJetPhiEtaFiducial(0),
52 fHistMCJetsPtFiducial(0),
53 fHistMCJetsNEFvsPt(0),
59 fHistClosestDistance(0),
60 fHistClosestDeltaPhi(0),
61 fHistClosestDeltaEta(0),
62 fHistClosestDeltaPt(0),
63 fHistNonMatchedMCJetPt(0),
64 fHistNonMatchedJetPt(0),
65 fHistPartvsDetecPt(0),
68 // Default constructor.
71 //________________________________________________________________________
72 AliJetResponseMaker::AliJetResponseMaker(const char *name) :
73 AliAnalysisTaskEmcalJet(name, kTRUE),
74 fMCTracksName("MCParticles"),
75 fMCJetsName("MCJets"),
91 fHistAcceptedEvents(0),
95 fHistMCJetPhiEtaFiducial(0),
96 fHistMCJetsPtFiducial(0),
97 fHistMCJetsNEFvsPt(0),
103 fHistClosestDistance(0),
104 fHistClosestDeltaPhi(0),
105 fHistClosestDeltaEta(0),
106 fHistClosestDeltaPt(0),
107 fHistNonMatchedMCJetPt(0),
108 fHistNonMatchedJetPt(0),
109 fHistPartvsDetecPt(0),
112 // Standard constructor.
115 //________________________________________________________________________
116 AliJetResponseMaker::~AliJetResponseMaker()
121 //________________________________________________________________________
122 void AliJetResponseMaker::UserCreateOutputObjects()
124 // Create user objects.
127 fOutput = new TList();
130 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
131 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
133 fHistNTrials = new TH1F("fHistNTrials", "fHistNTrials", 11, 0, 11);
134 fHistNTrials->GetXaxis()->SetTitle("p_{T} hard bin");
135 fHistNTrials->GetYaxis()->SetTitle("trials");
136 fOutput->Add(fHistNTrials);
138 fHistAcceptedEvents = new TH1F("fHistAcceptedEvents", "fHistAcceptedEvents", 11, 0, 11);
139 fHistAcceptedEvents->GetXaxis()->SetTitle("p_{T} hard bin");
140 fHistAcceptedEvents->GetYaxis()->SetTitle("accepted events");
141 fOutput->Add(fHistAcceptedEvents);
143 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
144 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
145 fHistEvents->GetYaxis()->SetTitle("total events");
146 fOutput->Add(fHistEvents);
148 for (Int_t i = 1; i < 12; i++) {
149 fHistNTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
150 fHistAcceptedEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
151 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
154 fHistJetPhiEta = new TH2F("fHistJetPhiEta", "fHistJetPhiEta", 20, -2, 2, 32, 0, 6.4);
155 fHistJetPhiEta->GetXaxis()->SetTitle("#eta");
156 fHistJetPhiEta->GetYaxis()->SetTitle("#phi");
157 fOutput->Add(fHistJetPhiEta);
159 fHistJetsPt = new TH1F("fHistJetsPt", "fHistJetsPt", fNbins, fMinBinPt, fMaxBinPt);
160 fHistJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
161 fHistJetsPt->GetYaxis()->SetTitle("counts");
162 fOutput->Add(fHistJetsPt);
164 fHistJetsZvsPt = new TH2F("fHistJetsZvsPt", "fHistJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
165 fHistJetsZvsPt->GetXaxis()->SetTitle("Z");
166 fHistJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
167 fOutput->Add(fHistJetsZvsPt);
169 if (fAnaType == kEMCAL) {
170 fHistJetsNEFvsPt = new TH2F("fHistJetsNEFvsPt", "fHistJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
171 fHistJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
172 fHistJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
173 fOutput->Add(fHistJetsNEFvsPt);
176 fHistMCJetPhiEta = new TH2F("fHistMCJetPhiEta", "fHistMCJetPhiEta", 20, -2, 2, 32, 0, 6.4);
177 fHistMCJetPhiEta->GetXaxis()->SetTitle("#eta");
178 fHistMCJetPhiEta->GetYaxis()->SetTitle("#phi");
179 fOutput->Add(fHistMCJetPhiEta);
181 fHistMCJetsPt = new TH1F("fHistMCJetsPt", "fHistMCJetsPt", fNbins, fMinBinPt, fMaxBinPt);
182 fHistMCJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
183 fHistMCJetsPt->GetYaxis()->SetTitle("counts");
184 fOutput->Add(fHistMCJetsPt);
186 fHistMCJetPhiEtaFiducial = new TH2F("fHistMCJetPhiEtaFiducial", "fHistMCJetPhiEtaFiducial", 20, -2, 2, 32, 0, 6.4);
187 fHistMCJetPhiEtaFiducial->GetXaxis()->SetTitle("#eta");
188 fHistMCJetPhiEtaFiducial->GetYaxis()->SetTitle("#phi");
189 fOutput->Add(fHistMCJetPhiEtaFiducial);
191 fHistMCJetsPtFiducial = new TH1F("fHistMCJetsPtFiducial", "fHistMCJetsPtFiducial", fNbins, fMinBinPt, fMaxBinPt);
192 fHistMCJetsPtFiducial->GetXaxis()->SetTitle("p_{T} [GeV/c]");
193 fHistMCJetsPtFiducial->GetYaxis()->SetTitle("counts");
194 fOutput->Add(fHistMCJetsPtFiducial);
196 fHistMCJetsZvsPt = new TH2F("fHistMCJetsZvsPt", "fHistMCJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
197 fHistMCJetsZvsPt->GetXaxis()->SetTitle("Z");
198 fHistMCJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
199 fOutput->Add(fHistMCJetsZvsPt);
201 if (fAnaType == kEMCAL) {
202 fHistMCJetsNEFvsPt = new TH2F("fHistMCJetsNEFvsPt", "fHistMCJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
203 fHistMCJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
204 fHistMCJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
205 fOutput->Add(fHistMCJetsNEFvsPt);
208 fHistClosestDistance = new TH1F("fHistClosestDistance", "fHistClosestDistance", 50, 0, fMaxDistance * 1.2);
209 fHistClosestDistance->GetXaxis()->SetTitle("d");
210 fHistClosestDistance->GetYaxis()->SetTitle("counts");
211 fOutput->Add(fHistClosestDistance);
213 fHistClosestDeltaPhi = new TH1F("fHistClosestDeltaPhi", "fHistClosestDeltaPhi", 64, -1.6, 4.8);
214 fHistClosestDeltaPhi->GetXaxis()->SetTitle("#Delta#phi");
215 fHistClosestDeltaPhi->GetYaxis()->SetTitle("counts");
216 fOutput->Add(fHistClosestDeltaPhi);
218 fHistClosestDeltaEta = new TH1F("fHistClosestDeltaEta", "fHistClosestDeltaEta", TMath::CeilNint(fMaxEta - fMinEta) * 20, fMinEta * 2, fMaxEta * 2);
219 fHistClosestDeltaEta->GetXaxis()->SetTitle("#Delta#eta");
220 fHistClosestDeltaEta->GetYaxis()->SetTitle("counts");
221 fOutput->Add(fHistClosestDeltaEta);
223 fHistClosestDeltaPt = new TH1F("fHistClosestDeltaPt", "fHistClosestDeltaPt", fNbins, -fMaxBinPt / 2, fMaxBinPt / 2);
224 fHistClosestDeltaPt->GetXaxis()->SetTitle("#Delta p_{T}");
225 fHistClosestDeltaPt->GetYaxis()->SetTitle("counts");
226 fOutput->Add(fHistClosestDeltaPt);
228 fHistNonMatchedMCJetPt = new TH1F("fHistNonMatchedMCJetPt", "fHistNonMatchedMCJetPt", fNbins, fMinBinPt, fMaxBinPt);
229 fHistNonMatchedMCJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
230 fHistNonMatchedMCJetPt->GetYaxis()->SetTitle("counts");
231 fOutput->Add(fHistNonMatchedMCJetPt);
233 fHistNonMatchedJetPt = new TH1F("fHistNonMatchedJetPt", "fHistNonMatchedJetPt", fNbins, fMinBinPt, fMaxBinPt);
234 fHistNonMatchedJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
235 fHistNonMatchedJetPt->GetYaxis()->SetTitle("counts");
236 fOutput->Add(fHistNonMatchedJetPt);
238 fHistPartvsDetecPt = new TH2F("fHistPartvsDetecPt", "fHistPartvsDetecPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
239 fHistPartvsDetecPt->GetXaxis()->SetTitle("p_{T}^{rec}");
240 fHistPartvsDetecPt->GetYaxis()->SetTitle("p_{T}^{gen}");
241 fOutput->Add(fHistPartvsDetecPt);
243 fHistMissedMCJets = new TH1F("fHistMissedMCJets", "fHistMissedMCJets", fNbins, fMinBinPt, fMaxBinPt);
244 fHistMissedMCJets->GetXaxis()->SetTitle("p_{T} [GeV/c]");
245 fHistMissedMCJets->GetYaxis()->SetTitle("counts");
246 fOutput->Add(fHistMissedMCJets);
248 PostData(1, fOutput); // Post data for ALL output slots > 0 here, to get at least an empty histogram
251 //________________________________________________________________________
252 Bool_t AliJetResponseMaker::AcceptJet(AliEmcalJet *jet, Bool_t /*bias*/, Bool_t /*upCut*/) const
254 // Return true if jet is accepted.
256 if (jet->Pt() <= fJetPtCut)
258 if (jet->Area() <= fJetAreaCut)
264 //________________________________________________________________________
265 void AliJetResponseMaker::ExecOnce()
269 if (!fMCJetsName.IsNull() && !fMCJets) {
270 fMCJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCJetsName));
272 AliError(Form("%s: Could not retrieve mc jets %s!", GetName(), fMCJetsName.Data()));
275 else if (!fMCJets->GetClass()->GetBaseClass("AliEmcalJet")) {
276 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fMCJetsName.Data()));
282 if (!fMCTracksName.IsNull() && !fMCTracks) {
283 fMCTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCTracksName));
285 AliError(Form("%s: Could not retrieve mc tracks %s!", GetName(), fMCTracksName.Data()));
289 TClass *cl = fMCTracks->GetClass();
290 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
291 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fMCTracksName.Data()));
298 AliAnalysisTaskEmcalJet::ExecOnce();
307 fMCminEta = fMinEta - fJetRadius;
308 fMCmaxEta = fMaxEta + fJetRadius;
309 fMCminPhi = fMinPhi - fJetRadius;
310 fMCmaxPhi = fMaxPhi + fJetRadius;
314 //________________________________________________________________________
315 Bool_t AliJetResponseMaker::RetrieveEventObjects()
317 // Retrieve event objects.
319 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
322 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
328 fEventWeight = fPythiaHeader->EventWeight();
332 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
333 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
335 Double_t pthard = fPythiaHeader->GetPtHard();
337 for (fPtHardBin = 0; fPtHardBin <= 11; fPtHardBin++) {
338 if (pthard >= ptHardLo[fPtHardBin] && pthard < ptHardHi[fPtHardBin])
342 fNTrials = fPythiaHeader->Trials();
347 //________________________________________________________________________
348 Bool_t AliJetResponseMaker::Run()
350 // Find the closest jets
352 fHistEvents->SetBinContent(fPtHardBin + 1, fHistEvents->GetBinContent(fPtHardBin + 1) + 1);
354 if (TMath::Abs(fVertex[2]) > fVertexCut)
357 fHistAcceptedEvents->SetBinContent(fPtHardBin + 1, fHistEvents->GetBinContent(fPtHardBin + 1) + 1);
358 fHistNTrials->SetBinContent(fPtHardBin + 1, fHistNTrials->GetBinContent(fPtHardBin + 1) + fNTrials);
360 DoJetLoop(fJets, fMCJets, kFALSE);
361 DoJetLoop(fMCJets, fJets, kTRUE);
366 //________________________________________________________________________
367 void AliJetResponseMaker::DoJetLoop(TClonesArray *jets1, TClonesArray *jets2, Bool_t mc)
371 Int_t nJets1 = jets1->GetEntriesFast();
372 Int_t nJets2 = jets2->GetEntriesFast();
374 for (Int_t i = 0; i < nJets1; i++) {
376 AliEmcalJet* jet1 = static_cast<AliEmcalJet*>(jets1->At(i));
379 AliError(Form("Could not receive jet %d", i));
383 if (!AcceptJet(jet1))
387 if (!AcceptBiasJet(jet1))
389 if (jet1->MaxTrackPt() > fMaxTrackPt || jet1->MaxClusterPt() > fMaxClusterPt)
391 if (jet1->Eta() < fMinEta || jet1->Eta() > fMaxEta || jet1->Phi() < fMinPhi || jet1->Phi() > fMaxPhi)
395 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
399 for (Int_t j = 0; j < nJets2; j++) {
401 AliEmcalJet* jet2 = static_cast<AliEmcalJet*>(jets2->At(j));
404 AliError(Form("Could not receive jet %d", j));
408 if (!AcceptJet(jet2))
412 if (!AcceptBiasJet(jet2))
414 if (jet2->MaxTrackPt() > fMaxTrackPt || jet2->MaxClusterPt() > fMaxClusterPt)
416 if (jet2->Eta() < fMinEta || jet2->Eta() > fMaxEta || jet2->Phi() < fMinPhi || jet2->Phi() > fMaxPhi)
420 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
424 Double_t deta = jet2->Eta() - jet1->Eta();
425 Double_t dphi = jet2->Phi() - jet1->Phi();
426 Double_t d = TMath::Sqrt(deta * deta + dphi * dphi);
428 if (d < jet1->ClosestJetDistance()) {
429 jet1->SetSecondClosestJet(jet1->ClosestJet(), jet1->ClosestJetDistance());
430 jet1->SetClosestJet(jet2, d);
432 else if (d < jet1->SecondClosestJetDistance()) {
433 jet1->SetSecondClosestJet(jet2, d);
440 //________________________________________________________________________
441 Bool_t AliJetResponseMaker::FillHistograms()
445 const Int_t nMCJets = fMCJets->GetEntriesFast();
447 for (Int_t i = 0; i < nMCJets; i++) {
449 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
452 AliError(Form("Could not receive jet %d", i));
459 if (jet->Eta() < fMCminEta || jet->Eta() > fMCmaxEta || jet->Phi() < fMCminPhi || jet->Phi() > fMCmaxPhi)
462 if (jet->Pt() > fMaxBinPt)
465 if (jet->ClosestJet() && jet->ClosestJet()->ClosestJet() == jet &&
466 jet->ClosestJetDistance() < fMaxDistance) { // Matched jet found
467 jet->SetMatchedToClosest();
468 jet->ClosestJet()->SetMatchedToClosest();
469 if (jet->MatchedJet()->Pt() > fMaxBinPt) {
470 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
473 fHistClosestDistance->Fill(jet->ClosestJetDistance(), fEventWeight);
475 Double_t deta = jet->MatchedJet()->Eta() - jet->Eta();
476 fHistClosestDeltaEta->Fill(deta, fEventWeight);
478 Double_t dphi = jet->MatchedJet()->Phi() - jet->Phi();
479 fHistClosestDeltaPhi->Fill(dphi, fEventWeight);
481 Double_t dpt = jet->MatchedJet()->Pt() - jet->Pt();
482 fHistClosestDeltaPt->Fill(dpt, fEventWeight);
484 fHistPartvsDetecPt->Fill(jet->MatchedJet()->Pt(), jet->Pt(), fEventWeight);
488 fHistNonMatchedMCJetPt->Fill(jet->Pt(), fEventWeight);
489 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
492 fHistMCJetsPt->Fill(jet->Pt(), fEventWeight);
493 fHistMCJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
495 if (fAnaType == kEMCAL)
496 fHistMCJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
498 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
499 AliVParticle *track = jet->TrackAt(it, fMCTracks);
501 fHistMCJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
504 if (!AcceptBiasJet(jet))
506 if (jet->Eta() < fMinEta || jet->Eta() > fMaxEta || jet->Phi() < fMinPhi || jet->Phi() > fMaxPhi)
509 fHistMCJetsPtFiducial->Fill(jet->Pt(), fEventWeight);
510 fHistMCJetPhiEtaFiducial->Fill(jet->Eta(), jet->Phi(), fEventWeight);
513 const Int_t nJets = fJets->GetEntriesFast();
515 for (Int_t i = 0; i < nJets; i++) {
517 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(i));
520 AliError(Form("Could not receive mc jet %d", i));
526 if (!AcceptBiasJet(jet))
528 if (jet->MaxTrackPt() > fMaxTrackPt || jet->MaxClusterPt() > fMaxClusterPt)
530 if (jet->Eta() < fMinEta || jet->Eta() > fMaxEta || jet->Phi() < fMinPhi || jet->Phi() > fMaxPhi)
533 if (!jet->MatchedJet()) {
534 fHistNonMatchedJetPt->Fill(jet->Pt(), fEventWeight);
537 fHistJetsPt->Fill(jet->Pt(), fEventWeight);
539 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
541 if (fAnaType == kEMCAL)
542 fHistJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
544 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
545 AliVParticle *track = jet->TrackAt(it, fTracks);
547 fHistJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
550 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
551 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
554 cluster->GetMomentum(nP, fVertex);
555 fHistJetsZvsPt->Fill(nP.Pt() / jet->Pt(), jet->Pt(), fEventWeight);