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),
53 fHistMCJetPhiEtaFiducial(0),
54 fHistMCJetsPtFiducial(0),
55 fHistMCJetsNEFvsPt(0),
61 fHistClosestDistance(0),
62 fHistClosestDeltaPhi(0),
63 fHistClosestDeltaEta(0),
64 fHistClosestDeltaPt(0),
65 fHistNonMatchedMCJetPt(0),
66 fHistNonMatchedJetPt(0),
67 fHistPartvsDetecPt(0),
70 // Default constructor.
72 for (Int_t i = 0; i < 11; i++) {
73 fHistEventWeight[i] = 0;
77 //________________________________________________________________________
78 AliJetResponseMaker::AliJetResponseMaker(const char *name) :
79 AliAnalysisTaskEmcalJet(name, kTRUE),
80 fMCTracksName("MCParticles"),
81 fMCJetsName("MCJets"),
84 fEventWeightHist(kFALSE),
90 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;
127 //________________________________________________________________________
128 AliJetResponseMaker::~AliJetResponseMaker()
133 //________________________________________________________________________
134 void AliJetResponseMaker::UserCreateOutputObjects()
136 // Create user objects.
139 fOutput = new TList();
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 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
146 fHistZVertex->GetXaxis()->SetTitle("z");
147 fHistZVertex->GetYaxis()->SetTitle("counts");
148 fOutput->Add(fHistZVertex);
150 fHistNTrials = new TH1F("fHistNTrials", "fHistNTrials", 11, 0, 11);
151 fHistNTrials->GetXaxis()->SetTitle("p_{T} hard bin");
152 fHistNTrials->GetYaxis()->SetTitle("trials");
153 fOutput->Add(fHistNTrials);
155 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
156 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
157 fHistEvents->GetYaxis()->SetTitle("total events");
158 fOutput->Add(fHistEvents);
160 if (fEventWeightHist) {
161 for (Int_t i = 0; i < 11; i++) {
162 TString name(Form("fHistEventWeight_%d", i+1));
163 fHistEventWeight[i] = new TH1F(name, name, 10, 0, 10);
164 fOutput->Add(fHistEventWeight[i]);
168 for (Int_t i = 1; i < 12; i++) {
169 fHistNTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
170 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
173 fHistJetPhiEta = new TH2F("fHistJetPhiEta", "fHistJetPhiEta", 20, -2, 2, 32, 0, 6.4);
174 fHistJetPhiEta->GetXaxis()->SetTitle("#eta");
175 fHistJetPhiEta->GetYaxis()->SetTitle("#phi");
176 fOutput->Add(fHistJetPhiEta);
178 fHistJetsPt = new TH1F("fHistJetsPt", "fHistJetsPt", fNbins, fMinBinPt, fMaxBinPt);
179 fHistJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
180 fHistJetsPt->GetYaxis()->SetTitle("counts");
181 fOutput->Add(fHistJetsPt);
183 fHistJetsZvsPt = new TH2F("fHistJetsZvsPt", "fHistJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
184 fHistJetsZvsPt->GetXaxis()->SetTitle("Z");
185 fHistJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
186 fOutput->Add(fHistJetsZvsPt);
188 if (fAnaType == kEMCAL) {
189 fHistJetsNEFvsPt = new TH2F("fHistJetsNEFvsPt", "fHistJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
190 fHistJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
191 fHistJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
192 fOutput->Add(fHistJetsNEFvsPt);
195 fHistMCJetPhiEta = new TH2F("fHistMCJetPhiEta", "fHistMCJetPhiEta", 20, -2, 2, 32, 0, 6.4);
196 fHistMCJetPhiEta->GetXaxis()->SetTitle("#eta");
197 fHistMCJetPhiEta->GetYaxis()->SetTitle("#phi");
198 fOutput->Add(fHistMCJetPhiEta);
200 fHistMCJetsPt = new TH1F("fHistMCJetsPt", "fHistMCJetsPt", fNbins, fMinBinPt, fMaxBinPt);
201 fHistMCJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
202 fHistMCJetsPt->GetYaxis()->SetTitle("counts");
203 fOutput->Add(fHistMCJetsPt);
205 fHistMCJetPhiEtaFiducial = new TH2F("fHistMCJetPhiEtaFiducial", "fHistMCJetPhiEtaFiducial", 20, -2, 2, 32, 0, 6.4);
206 fHistMCJetPhiEtaFiducial->GetXaxis()->SetTitle("#eta");
207 fHistMCJetPhiEtaFiducial->GetYaxis()->SetTitle("#phi");
208 fOutput->Add(fHistMCJetPhiEtaFiducial);
210 fHistMCJetsPtFiducial = new TH1F("fHistMCJetsPtFiducial", "fHistMCJetsPtFiducial", fNbins, fMinBinPt, fMaxBinPt);
211 fHistMCJetsPtFiducial->GetXaxis()->SetTitle("p_{T} [GeV/c]");
212 fHistMCJetsPtFiducial->GetYaxis()->SetTitle("counts");
213 fOutput->Add(fHistMCJetsPtFiducial);
215 fHistMCJetsZvsPt = new TH2F("fHistMCJetsZvsPt", "fHistMCJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
216 fHistMCJetsZvsPt->GetXaxis()->SetTitle("Z");
217 fHistMCJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
218 fOutput->Add(fHistMCJetsZvsPt);
220 if (fAnaType == kEMCAL) {
221 fHistMCJetsNEFvsPt = new TH2F("fHistMCJetsNEFvsPt", "fHistMCJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
222 fHistMCJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
223 fHistMCJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
224 fOutput->Add(fHistMCJetsNEFvsPt);
227 fHistClosestDistance = new TH1F("fHistClosestDistance", "fHistClosestDistance", 50, 0, fMaxDistance * 1.2);
228 fHistClosestDistance->GetXaxis()->SetTitle("d");
229 fHistClosestDistance->GetYaxis()->SetTitle("counts");
230 fOutput->Add(fHistClosestDistance);
232 fHistClosestDeltaPhi = new TH1F("fHistClosestDeltaPhi", "fHistClosestDeltaPhi", 64, -1.6, 4.8);
233 fHistClosestDeltaPhi->GetXaxis()->SetTitle("#Delta#phi");
234 fHistClosestDeltaPhi->GetYaxis()->SetTitle("counts");
235 fOutput->Add(fHistClosestDeltaPhi);
237 fHistClosestDeltaEta = new TH1F("fHistClosestDeltaEta", "fHistClosestDeltaEta", TMath::CeilNint(fMaxEta - fMinEta) * 20, fMinEta * 2, fMaxEta * 2);
238 fHistClosestDeltaEta->GetXaxis()->SetTitle("#Delta#eta");
239 fHistClosestDeltaEta->GetYaxis()->SetTitle("counts");
240 fOutput->Add(fHistClosestDeltaEta);
242 fHistClosestDeltaPt = new TH1F("fHistClosestDeltaPt", "fHistClosestDeltaPt", fNbins, -fMaxBinPt / 2, fMaxBinPt / 2);
243 fHistClosestDeltaPt->GetXaxis()->SetTitle("#Delta p_{T}");
244 fHistClosestDeltaPt->GetYaxis()->SetTitle("counts");
245 fOutput->Add(fHistClosestDeltaPt);
247 fHistNonMatchedMCJetPt = new TH1F("fHistNonMatchedMCJetPt", "fHistNonMatchedMCJetPt", fNbins, fMinBinPt, fMaxBinPt);
248 fHistNonMatchedMCJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
249 fHistNonMatchedMCJetPt->GetYaxis()->SetTitle("counts");
250 fOutput->Add(fHistNonMatchedMCJetPt);
252 fHistNonMatchedJetPt = new TH1F("fHistNonMatchedJetPt", "fHistNonMatchedJetPt", fNbins, fMinBinPt, fMaxBinPt);
253 fHistNonMatchedJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
254 fHistNonMatchedJetPt->GetYaxis()->SetTitle("counts");
255 fOutput->Add(fHistNonMatchedJetPt);
257 fHistPartvsDetecPt = new TH2F("fHistPartvsDetecPt", "fHistPartvsDetecPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
258 fHistPartvsDetecPt->GetXaxis()->SetTitle("p_{T}^{rec}");
259 fHistPartvsDetecPt->GetYaxis()->SetTitle("p_{T}^{gen}");
260 fOutput->Add(fHistPartvsDetecPt);
262 fHistMissedMCJets = new TH1F("fHistMissedMCJets", "fHistMissedMCJets", fNbins, fMinBinPt, fMaxBinPt);
263 fHistMissedMCJets->GetXaxis()->SetTitle("p_{T} [GeV/c]");
264 fHistMissedMCJets->GetYaxis()->SetTitle("counts");
265 fOutput->Add(fHistMissedMCJets);
267 PostData(1, fOutput); // Post data for ALL output slots > 0 here, to get at least an empty histogram
270 //________________________________________________________________________
271 Bool_t AliJetResponseMaker::AcceptJet(AliEmcalJet *jet, Bool_t /*bias*/, Bool_t /*upCut*/) const
273 // Return true if jet is accepted.
275 if (jet->Pt() <= fJetPtCut)
277 if (jet->Area() <= fJetAreaCut)
283 //________________________________________________________________________
284 void AliJetResponseMaker::ExecOnce()
288 if (!fMCJetsName.IsNull() && !fMCJets) {
289 fMCJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCJetsName));
291 AliError(Form("%s: Could not retrieve mc jets %s!", GetName(), fMCJetsName.Data()));
294 else if (!fMCJets->GetClass()->GetBaseClass("AliEmcalJet")) {
295 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fMCJetsName.Data()));
301 if (!fMCTracksName.IsNull() && !fMCTracks) {
302 fMCTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCTracksName));
304 AliError(Form("%s: Could not retrieve mc tracks %s!", GetName(), fMCTracksName.Data()));
308 TClass *cl = fMCTracks->GetClass();
309 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
310 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fMCTracksName.Data()));
317 AliAnalysisTaskEmcalJet::ExecOnce();
326 fMCminEta = fMinEta - fJetRadius;
327 fMCmaxEta = fMaxEta + fJetRadius;
328 fMCminPhi = fMinPhi - fJetRadius;
329 fMCmaxPhi = fMaxPhi + fJetRadius;
333 //________________________________________________________________________
334 Bool_t AliJetResponseMaker::IsEventSelected()
336 // Check if event is selected
338 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin)
341 return AliAnalysisTaskEmcalJet::IsEventSelected();
344 //________________________________________________________________________
345 Bool_t AliJetResponseMaker::RetrieveEventObjects()
347 // Retrieve event objects.
349 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
352 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
358 fEventWeight = fPythiaHeader->EventWeight();
362 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
363 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
365 Double_t pthard = fPythiaHeader->GetPtHard();
367 for (fPtHardBin = 0; fPtHardBin <= 11; fPtHardBin++) {
368 if (pthard >= ptHardLo[fPtHardBin] && pthard < ptHardHi[fPtHardBin])
372 fNTrials = fPythiaHeader->Trials();
377 //________________________________________________________________________
378 Bool_t AliJetResponseMaker::Run()
380 // Find the closest jets
385 DoJetLoop(fJets, fMCJets, kFALSE);
386 DoJetLoop(fMCJets, fJets, kTRUE);
388 const Int_t nMCJets = fMCJets->GetEntriesFast();
390 for (Int_t i = 0; i < nMCJets; i++) {
392 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
395 AliError(Form("Could not receive jet %d", i));
402 if (jet->Eta() < fMCminEta || jet->Eta() > fMCmaxEta || jet->Phi() < fMCminPhi || jet->Phi() > fMCmaxPhi)
405 if (jet->Pt() > fMaxBinPt)
408 if (jet->ClosestJet() && jet->ClosestJet()->ClosestJet() == jet &&
409 jet->ClosestJetDistance() < fMaxDistance) { // Matched jet found
410 jet->SetMatchedToClosest();
411 jet->ClosestJet()->SetMatchedToClosest();
418 //________________________________________________________________________
419 void AliJetResponseMaker::DoJetLoop(TClonesArray *jets1, TClonesArray *jets2, Bool_t mc)
423 Int_t nJets1 = jets1->GetEntriesFast();
424 Int_t nJets2 = jets2->GetEntriesFast();
426 for (Int_t i = 0; i < nJets1; i++) {
428 AliEmcalJet* jet1 = static_cast<AliEmcalJet*>(jets1->At(i));
431 AliError(Form("Could not receive jet %d", i));
435 if (!AcceptJet(jet1))
439 if (jet1->Eta() < fMinEta || jet1->Eta() > fMaxEta || jet1->Phi() < fMinPhi || jet1->Phi() > fMaxPhi)
443 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
447 for (Int_t j = 0; j < nJets2; j++) {
449 AliEmcalJet* jet2 = static_cast<AliEmcalJet*>(jets2->At(j));
452 AliError(Form("Could not receive jet %d", j));
456 if (!AcceptJet(jet2))
460 if (jet2->Eta() < fMinEta || jet2->Eta() > fMaxEta || jet2->Phi() < fMinPhi || jet2->Phi() > fMaxPhi)
464 if (jet1->Eta() < fMCminEta || jet1->Eta() > fMCmaxEta || jet1->Phi() < fMCminPhi || jet1->Phi() > fMCmaxPhi)
468 Double_t deta = jet2->Eta() - jet1->Eta();
469 Double_t dphi = jet2->Phi() - jet1->Phi();
470 Double_t d = TMath::Sqrt(deta * deta + dphi * dphi);
472 if (d < jet1->ClosestJetDistance()) {
473 jet1->SetSecondClosestJet(jet1->ClosestJet(), jet1->ClosestJetDistance());
474 jet1->SetClosestJet(jet2, d);
476 else if (d < jet1->SecondClosestJetDistance()) {
477 jet1->SetSecondClosestJet(jet2, d);
483 //________________________________________________________________________
484 Bool_t AliJetResponseMaker::FillHistograms()
488 fHistEvents->SetBinContent(fPtHardBin + 1, fHistEvents->GetBinContent(fPtHardBin + 1) + 1);
489 fHistNTrials->SetBinContent(fPtHardBin + 1, fHistNTrials->GetBinContent(fPtHardBin + 1) + fNTrials);
490 if (fEventWeightHist)
491 fHistEventWeight[fPtHardBin]->Fill(fPythiaHeader->EventWeight());
492 fHistZVertex->Fill(fVertex[2]);
494 const Int_t nMCJets = fMCJets->GetEntriesFast();
496 for (Int_t i = 0; i < nMCJets; i++) {
498 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
501 AliError(Form("Could not receive jet %d", i));
508 if (jet->Eta() < fMCminEta || jet->Eta() > fMCmaxEta || jet->Phi() < fMCminPhi || jet->Phi() > fMCmaxPhi)
511 if (jet->Pt() > fMaxBinPt)
514 if (jet->MatchedJet()) {
516 if (!AcceptBiasJet(jet->MatchedJet()) ||
517 jet->MatchedJet()->MaxTrackPt() > fMaxTrackPt || jet->MatchedJet()->MaxClusterPt() > fMaxClusterPt ||
518 jet->MatchedJet()->Pt() > fMaxBinPt) {
519 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
522 fHistClosestDistance->Fill(jet->ClosestJetDistance(), fEventWeight);
524 Double_t deta = jet->MatchedJet()->Eta() - jet->Eta();
525 fHistClosestDeltaEta->Fill(deta, fEventWeight);
527 Double_t dphi = jet->MatchedJet()->Phi() - jet->Phi();
528 fHistClosestDeltaPhi->Fill(dphi, fEventWeight);
530 Double_t dpt = jet->MatchedJet()->Pt() - jet->Pt();
531 fHistClosestDeltaPt->Fill(dpt, fEventWeight);
533 fHistPartvsDetecPt->Fill(jet->MatchedJet()->Pt(), jet->Pt(), fEventWeight);
537 fHistNonMatchedMCJetPt->Fill(jet->Pt(), fEventWeight);
538 fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
541 fHistMCJetsPt->Fill(jet->Pt(), fEventWeight);
542 fHistMCJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
544 if (fAnaType == kEMCAL)
545 fHistMCJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
547 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
548 AliVParticle *track = jet->TrackAt(it, fMCTracks);
550 fHistMCJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
553 if (!AcceptBiasJet(jet))
555 if (jet->Eta() < fMinEta || jet->Eta() > fMaxEta || jet->Phi() < fMinPhi || jet->Phi() > fMaxPhi)
558 fHistMCJetsPtFiducial->Fill(jet->Pt(), fEventWeight);
559 fHistMCJetPhiEtaFiducial->Fill(jet->Eta(), jet->Phi(), fEventWeight);
562 const Int_t nJets = fJets->GetEntriesFast();
564 for (Int_t i = 0; i < nJets; i++) {
566 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(i));
569 AliError(Form("Could not receive mc jet %d", i));
575 if (!AcceptBiasJet(jet))
577 if (jet->MaxTrackPt() > fMaxTrackPt || jet->MaxClusterPt() > fMaxClusterPt)
579 if (jet->Eta() < fMinEta || jet->Eta() > fMaxEta || jet->Phi() < fMinPhi || jet->Phi() > fMaxPhi)
582 if (!jet->MatchedJet()) {
583 fHistNonMatchedJetPt->Fill(jet->Pt(), fEventWeight);
586 fHistJetsPt->Fill(jet->Pt(), fEventWeight);
588 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
590 if (fAnaType == kEMCAL)
591 fHistJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
593 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
594 AliVParticle *track = jet->TrackAt(it, fTracks);
596 fHistJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
599 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
600 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
603 cluster->GetMomentum(nP, fVertex);
604 fHistJetsZvsPt->Fill(nP.Pt() / jet->Pt(), jet->Pt(), fEventWeight);