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"),
34 fEventWeightHist(kFALSE),
40 fSelectPtHardBin(-999),
52 fHistMCJetPhiEtaFiducial(0),
53 fHistMCJetsPtFiducial(0),
54 fHistMCJetsNEFvsPt(0),
60 fHistClosestDistance(0),
61 fHistClosestDeltaPhi(0),
62 fHistClosestDeltaEta(0),
63 fHistClosestDeltaPt(0),
64 fHistNonMatchedMCJetPt(0),
65 fHistNonMatchedJetPt(0),
66 fHistPartvsDetecPt(0),
69 // Default constructor.
71 for (Int_t i = 0; i < 11; i++) {
72 fHistEventWeight[i] = 0;
75 SetMakeGeneralHistograms(kTRUE);
78 //________________________________________________________________________
79 AliJetResponseMaker::AliJetResponseMaker(const char *name) :
80 AliAnalysisTaskEmcalJet(name, kTRUE),
81 fMCTracksName("MCParticles"),
82 fMCJetsName("MCJets"),
85 fEventWeightHist(kFALSE),
91 fSelectPtHardBin(-999),
103 fHistMCJetPhiEtaFiducial(0),
104 fHistMCJetsPtFiducial(0),
105 fHistMCJetsNEFvsPt(0),
111 fHistClosestDistance(0),
112 fHistClosestDeltaPhi(0),
113 fHistClosestDeltaEta(0),
114 fHistClosestDeltaPt(0),
115 fHistNonMatchedMCJetPt(0),
116 fHistNonMatchedJetPt(0),
117 fHistPartvsDetecPt(0),
120 // Standard constructor.
122 for (Int_t i = 0; i < 11; i++) {
123 fHistEventWeight[i] = 0;
126 SetMakeGeneralHistograms(kTRUE);
129 //________________________________________________________________________
130 AliJetResponseMaker::~AliJetResponseMaker()
135 //________________________________________________________________________
136 void AliJetResponseMaker::UserCreateOutputObjects()
138 // Create user objects.
140 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
142 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
143 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
145 fHistNTrials = new TH1F("fHistNTrials", "fHistNTrials", 11, 0, 11);
146 fHistNTrials->GetXaxis()->SetTitle("p_{T} hard bin");
147 fHistNTrials->GetYaxis()->SetTitle("trials");
148 fOutput->Add(fHistNTrials);
150 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
151 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
152 fHistEvents->GetYaxis()->SetTitle("total events");
153 fOutput->Add(fHistEvents);
155 if (fEventWeightHist) {
156 for (Int_t i = 0; i < 11; i++) {
157 TString name(Form("fHistEventWeight_%d", i+1));
158 fHistEventWeight[i] = new TH1F(name, name, 10, 0, 10);
159 fOutput->Add(fHistEventWeight[i]);
163 for (Int_t i = 1; i < 12; i++) {
164 fHistNTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
165 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
168 fHistJetPhiEta = new TH2F("fHistJetPhiEta", "fHistJetPhiEta", 20, -2, 2, 32, 0, 6.4);
169 fHistJetPhiEta->GetXaxis()->SetTitle("#eta");
170 fHistJetPhiEta->GetYaxis()->SetTitle("#phi");
171 fOutput->Add(fHistJetPhiEta);
173 fHistJetsPt = new TH1F("fHistJetsPt", "fHistJetsPt", fNbins, fMinBinPt, fMaxBinPt);
174 fHistJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
175 fHistJetsPt->GetYaxis()->SetTitle("counts");
176 fOutput->Add(fHistJetsPt);
178 fHistJetsZvsPt = new TH2F("fHistJetsZvsPt", "fHistJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
179 fHistJetsZvsPt->GetXaxis()->SetTitle("Z");
180 fHistJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
181 fOutput->Add(fHistJetsZvsPt);
183 fHistJetsNEFvsPt = new TH2F("fHistJetsNEFvsPt", "fHistJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
184 fHistJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
185 fHistJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
186 fOutput->Add(fHistJetsNEFvsPt);
188 fHistMCJetPhiEta = new TH2F("fHistMCJetPhiEta", "fHistMCJetPhiEta", 20, -2, 2, 32, 0, 6.4);
189 fHistMCJetPhiEta->GetXaxis()->SetTitle("#eta");
190 fHistMCJetPhiEta->GetYaxis()->SetTitle("#phi");
191 fOutput->Add(fHistMCJetPhiEta);
193 fHistMCJetsPt = new TH1F("fHistMCJetsPt", "fHistMCJetsPt", fNbins, fMinBinPt, fMaxBinPt);
194 fHistMCJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
195 fHistMCJetsPt->GetYaxis()->SetTitle("counts");
196 fOutput->Add(fHistMCJetsPt);
198 fHistMCJetPhiEtaFiducial = new TH2F("fHistMCJetPhiEtaFiducial", "fHistMCJetPhiEtaFiducial", 20, -2, 2, 32, 0, 6.4);
199 fHistMCJetPhiEtaFiducial->GetXaxis()->SetTitle("#eta");
200 fHistMCJetPhiEtaFiducial->GetYaxis()->SetTitle("#phi");
201 fOutput->Add(fHistMCJetPhiEtaFiducial);
203 fHistMCJetsPtFiducial = new TH1F("fHistMCJetsPtFiducial", "fHistMCJetsPtFiducial", fNbins, fMinBinPt, fMaxBinPt);
204 fHistMCJetsPtFiducial->GetXaxis()->SetTitle("p_{T} [GeV/c]");
205 fHistMCJetsPtFiducial->GetYaxis()->SetTitle("counts");
206 fOutput->Add(fHistMCJetsPtFiducial);
208 fHistMCJetsZvsPt = new TH2F("fHistMCJetsZvsPt", "fHistMCJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
209 fHistMCJetsZvsPt->GetXaxis()->SetTitle("Z");
210 fHistMCJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
211 fOutput->Add(fHistMCJetsZvsPt);
213 fHistMCJetsNEFvsPt = new TH2F("fHistMCJetsNEFvsPt", "fHistMCJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
214 fHistMCJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
215 fHistMCJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
216 fOutput->Add(fHistMCJetsNEFvsPt);
218 fHistClosestDistance = new TH1F("fHistClosestDistance", "fHistClosestDistance", 50, 0, fMaxDistance * 1.2);
219 fHistClosestDistance->GetXaxis()->SetTitle("d");
220 fHistClosestDistance->GetYaxis()->SetTitle("counts");
221 fOutput->Add(fHistClosestDistance);
223 fHistClosestDeltaPhi = new TH1F("fHistClosestDeltaPhi", "fHistClosestDeltaPhi", 64, -1.6, 4.8);
224 fHistClosestDeltaPhi->GetXaxis()->SetTitle("#Delta#phi");
225 fHistClosestDeltaPhi->GetYaxis()->SetTitle("counts");
226 fOutput->Add(fHistClosestDeltaPhi);
228 fHistClosestDeltaEta = new TH1F("fHistClosestDeltaEta", "fHistClosestDeltaEta", TMath::CeilNint(fJetMaxEta - fJetMinEta) * 20, fJetMinEta * 2, fJetMaxEta * 2);
229 fHistClosestDeltaEta->GetXaxis()->SetTitle("#Delta#eta");
230 fHistClosestDeltaEta->GetYaxis()->SetTitle("counts");
231 fOutput->Add(fHistClosestDeltaEta);
233 fHistClosestDeltaPt = new TH1F("fHistClosestDeltaPt", "fHistClosestDeltaPt", fNbins, -fMaxBinPt / 2, fMaxBinPt / 2);
234 fHistClosestDeltaPt->GetXaxis()->SetTitle("#Delta p_{T}");
235 fHistClosestDeltaPt->GetYaxis()->SetTitle("counts");
236 fOutput->Add(fHistClosestDeltaPt);
238 fHistNonMatchedMCJetPt = new TH1F("fHistNonMatchedMCJetPt", "fHistNonMatchedMCJetPt", fNbins, fMinBinPt, fMaxBinPt);
239 fHistNonMatchedMCJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
240 fHistNonMatchedMCJetPt->GetYaxis()->SetTitle("counts");
241 fOutput->Add(fHistNonMatchedMCJetPt);
243 fHistNonMatchedJetPt = new TH1F("fHistNonMatchedJetPt", "fHistNonMatchedJetPt", fNbins, fMinBinPt, fMaxBinPt);
244 fHistNonMatchedJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
245 fHistNonMatchedJetPt->GetYaxis()->SetTitle("counts");
246 fOutput->Add(fHistNonMatchedJetPt);
248 fHistPartvsDetecPt = new TH2F("fHistPartvsDetecPt", "fHistPartvsDetecPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
249 fHistPartvsDetecPt->GetXaxis()->SetTitle("p_{T}^{rec}");
250 fHistPartvsDetecPt->GetYaxis()->SetTitle("p_{T}^{gen}");
251 fOutput->Add(fHistPartvsDetecPt);
253 fHistMissedMCJets = new TH1F("fHistMissedMCJets", "fHistMissedMCJets", fNbins, fMinBinPt, fMaxBinPt);
254 fHistMissedMCJets->GetXaxis()->SetTitle("p_{T} [GeV/c]");
255 fHistMissedMCJets->GetYaxis()->SetTitle("counts");
256 fOutput->Add(fHistMissedMCJets);
258 PostData(1, fOutput); // Post data for ALL output slots > 0 here, to get at least an empty histogram
261 //________________________________________________________________________
262 Bool_t AliJetResponseMaker::AcceptJet(AliEmcalJet *jet) const
264 // Return true if jet is accepted.
266 if (jet->Pt() <= fJetPtCut)
268 if (jet->Area() <= fJetAreaCut)
274 //________________________________________________________________________
275 void AliJetResponseMaker::ExecOnce()
279 if (!fMCJetsName.IsNull() && !fMCJets) {
280 fMCJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCJetsName));
282 AliError(Form("%s: Could not retrieve mc jets %s!", GetName(), fMCJetsName.Data()));
285 else if (!fMCJets->GetClass()->GetBaseClass("AliEmcalJet")) {
286 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fMCJetsName.Data()));
292 if (!fMCTracksName.IsNull() && !fMCTracks) {
293 fMCTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCTracksName));
295 AliError(Form("%s: Could not retrieve mc tracks %s!", GetName(), fMCTracksName.Data()));
299 TClass *cl = fMCTracks->GetClass();
300 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
301 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fMCTracksName.Data()));
308 AliAnalysisTaskEmcalJet::ExecOnce();
311 fMCminEta = fJetMinEta;
312 fMCmaxEta = fJetMaxEta;
313 fMCminPhi = fJetMinPhi;
314 fMCmaxPhi = fJetMaxPhi;
317 fMCminEta = fJetMinEta - fJetRadius;
318 fMCmaxEta = fJetMaxEta + fJetRadius;
319 fMCminPhi = fJetMinPhi - fJetRadius;
320 fMCmaxPhi = fJetMaxPhi + fJetRadius;
324 //________________________________________________________________________
325 Bool_t AliJetResponseMaker::IsEventSelected()
327 // Check if event is selected
329 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin)
332 return AliAnalysisTaskEmcalJet::IsEventSelected();
335 //________________________________________________________________________
336 Bool_t AliJetResponseMaker::RetrieveEventObjects()
338 // Retrieve event objects.
340 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
343 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
349 fEventWeight = fPythiaHeader->EventWeight();
353 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
354 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
356 Double_t pthard = fPythiaHeader->GetPtHard();
358 for (fPtHardBin = 0; fPtHardBin <= 11; fPtHardBin++) {
359 if (pthard >= ptHardLo[fPtHardBin] && pthard < ptHardHi[fPtHardBin])
363 fNTrials = fPythiaHeader->Trials();
368 //________________________________________________________________________
369 Bool_t AliJetResponseMaker::Run()
371 // Find the closest jets
376 DoJetLoop(fJets, fMCJets, kFALSE);
377 DoJetLoop(fMCJets, fJets, kTRUE);
379 const Int_t nMCJets = fMCJets->GetEntriesFast();
381 for (Int_t i = 0; i < nMCJets; i++) {
383 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
386 AliError(Form("Could not receive jet %d", i));
393 if (jet->Eta() < fMCminEta || jet->Eta() > fMCmaxEta || jet->Phi() < fMCminPhi || jet->Phi() > fMCmaxPhi)
396 if (jet->Pt() > fMaxBinPt)
399 if (jet->ClosestJet() && jet->ClosestJet()->ClosestJet() == jet &&
400 jet->ClosestJetDistance() < fMaxDistance) { // Matched jet found
401 jet->SetMatchedToClosest();
402 jet->ClosestJet()->SetMatchedToClosest();
409 //________________________________________________________________________
410 void AliJetResponseMaker::DoJetLoop(TClonesArray *jets1, TClonesArray *jets2, Bool_t mc)
414 Int_t nJets1 = jets1->GetEntriesFast();
415 Int_t nJets2 = jets2->GetEntriesFast();
417 for (Int_t i = 0; i < nJets1; i++) {
419 AliEmcalJet* jet1 = static_cast<AliEmcalJet*>(jets1->At(i));
422 AliError(Form("Could not receive jet %d", i));
426 if (!AcceptJet(jet1))
430 if (jet1->Eta() < fJetMinEta || jet1->Eta() > fJetMaxEta || jet1->Phi() < fJetMinPhi || jet1->Phi() > fJetMaxPhi)
434 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
438 for (Int_t j = 0; j < nJets2; j++) {
440 AliEmcalJet* jet2 = static_cast<AliEmcalJet*>(jets2->At(j));
443 AliError(Form("Could not receive jet %d", j));
447 if (!AcceptJet(jet2))
451 if (jet2->Eta() < fJetMinEta || jet2->Eta() > fJetMaxEta || jet2->Phi() < fJetMinPhi || jet2->Phi() > fJetMaxPhi)
455 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
459 Double_t deta = jet2->Eta() - jet1->Eta();
460 Double_t dphi = jet2->Phi() - jet1->Phi();
461 Double_t d = TMath::Sqrt(deta * deta + dphi * dphi);
463 if (d < jet1->ClosestJetDistance()) {
464 jet1->SetSecondClosestJet(jet1->ClosestJet(), jet1->ClosestJetDistance());
465 jet1->SetClosestJet(jet2, d);
467 else if (d < jet1->SecondClosestJetDistance()) {
468 jet1->SetSecondClosestJet(jet2, d);
474 //________________________________________________________________________
475 Bool_t AliJetResponseMaker::FillHistograms()
479 fHistEvents->SetBinContent(fPtHardBin + 1, fHistEvents->GetBinContent(fPtHardBin + 1) + 1);
480 fHistNTrials->SetBinContent(fPtHardBin + 1, fHistNTrials->GetBinContent(fPtHardBin + 1) + fNTrials);
481 if (fEventWeightHist)
482 fHistEventWeight[fPtHardBin]->Fill(fPythiaHeader->EventWeight());
484 const Int_t nMCJets = fMCJets->GetEntriesFast();
486 for (Int_t i = 0; i < nMCJets; i++) {
488 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
491 AliError(Form("Could not receive jet %d", i));
498 if (jet->Eta() < fMCminEta || jet->Eta() > fMCmaxEta || jet->Phi() < fMCminPhi || jet->Phi() > fMCmaxPhi)
501 if (jet->Pt() > fMaxBinPt)
504 if (jet->MatchedJet()) {
506 if (!AcceptBiasJet(jet->MatchedJet()) ||
507 jet->MatchedJet()->MaxTrackPt() > fMaxTrackPt || jet->MatchedJet()->MaxClusterPt() > fMaxClusterPt ||
508 jet->MatchedJet()->Pt() > fMaxBinPt) {
509 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
512 fHistClosestDistance->Fill(jet->ClosestJetDistance(), fEventWeight);
514 Double_t deta = jet->MatchedJet()->Eta() - jet->Eta();
515 fHistClosestDeltaEta->Fill(deta, fEventWeight);
517 Double_t dphi = jet->MatchedJet()->Phi() - jet->Phi();
518 fHistClosestDeltaPhi->Fill(dphi, fEventWeight);
520 Double_t dpt = jet->MatchedJet()->Pt() - jet->Pt();
521 fHistClosestDeltaPt->Fill(dpt, fEventWeight);
523 fHistPartvsDetecPt->Fill(jet->MatchedJet()->Pt(), jet->Pt(), fEventWeight);
527 fHistNonMatchedMCJetPt->Fill(jet->Pt(), fEventWeight);
528 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
531 fHistMCJetsPt->Fill(jet->Pt(), fEventWeight);
532 fHistMCJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
534 fHistMCJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
536 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
537 AliVParticle *track = jet->TrackAt(it, fMCTracks);
539 fHistMCJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
542 if (!AcceptBiasJet(jet))
544 if (jet->Eta() < fJetMinEta || jet->Eta() > fJetMaxEta || jet->Phi() < fJetMinPhi || jet->Phi() > fJetMaxPhi)
547 fHistMCJetsPtFiducial->Fill(jet->Pt(), fEventWeight);
548 fHistMCJetPhiEtaFiducial->Fill(jet->Eta(), jet->Phi(), fEventWeight);
551 const Int_t nJets = fJets->GetEntriesFast();
553 for (Int_t i = 0; i < nJets; i++) {
555 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(i));
558 AliError(Form("Could not receive mc jet %d", i));
564 if (!AcceptBiasJet(jet))
566 if (jet->MaxTrackPt() > fMaxTrackPt || jet->MaxClusterPt() > fMaxClusterPt)
568 if (jet->Eta() < fJetMinEta || jet->Eta() > fJetMaxEta || jet->Phi() < fJetMinPhi || jet->Phi() > fJetMaxPhi)
571 if (!jet->MatchedJet()) {
572 fHistNonMatchedJetPt->Fill(jet->Pt(), fEventWeight);
575 fHistJetsPt->Fill(jet->Pt(), fEventWeight);
577 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
579 fHistJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
581 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
582 AliVParticle *track = jet->TrackAt(it, fTracks);
584 fHistJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
587 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
588 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
591 cluster->GetMomentum(nP, fVertex);
592 fHistJetsZvsPt->Fill(nP.Pt() / jet->Pt(), jet->Pt(), fEventWeight);