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 "AliMCEvent.h"
24 ClassImp(AliJetResponseMaker)
26 //________________________________________________________________________
27 AliJetResponseMaker::AliJetResponseMaker() :
28 AliAnalysisTaskEmcalJet("AliJetResponseMaker", kTRUE),
29 fMCTracksName("MCParticles"),
30 fMCJetsName("MCJets"),
36 fHistMCJetsNEFvsPt(0),
42 fHistClosestDistance(0),
43 fHistClosestDeltaPhi(0),
44 fHistClosestDeltaEta(0),
45 fHistClosestDeltaPt(0),
46 fHistNonMatchedMCJetPt(0),
47 fHistNonMatchedJetPt(0),
48 fHistPartvsDetecPt(0),
51 // Default constructor.
54 //________________________________________________________________________
55 AliJetResponseMaker::AliJetResponseMaker(const char *name) :
56 AliAnalysisTaskEmcalJet(name, kTRUE),
57 fMCTracksName("MCParticles"),
58 fMCJetsName("MCJets"),
64 fHistMCJetsNEFvsPt(0),
70 fHistClosestDistance(0),
71 fHistClosestDeltaPhi(0),
72 fHistClosestDeltaEta(0),
73 fHistClosestDeltaPt(0),
74 fHistNonMatchedMCJetPt(0),
75 fHistNonMatchedJetPt(0),
76 fHistPartvsDetecPt(0),
79 // Standard constructor.
82 //________________________________________________________________________
83 AliJetResponseMaker::~AliJetResponseMaker()
88 //________________________________________________________________________
89 void AliJetResponseMaker::UserCreateOutputObjects()
91 // Create user objects.
94 fOutput = new TList();
97 fHistJetPhiEta = new TH2F("fHistJetPhiEta", "fHistJetPhiEta", 20, -2, 2, 32, 0, 6.4);
98 fHistJetPhiEta->GetXaxis()->SetTitle("#eta");
99 fHistJetPhiEta->GetYaxis()->SetTitle("#phi");
100 fOutput->Add(fHistJetPhiEta);
102 fHistJetsPt = new TH1F("fHistJetsPt", "fHistJetsPt", fNbins, fMinBinPt, fMaxBinPt);
103 fHistJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
104 fHistJetsPt->GetYaxis()->SetTitle("counts");
105 fOutput->Add(fHistJetsPt);
107 fHistJetsZvsPt = new TH2F("fHistJetsZvsPt", "fHistJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
108 fHistJetsZvsPt->GetXaxis()->SetTitle("Z");
109 fHistJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
110 fOutput->Add(fHistJetsZvsPt);
112 if (fAnaType == kEMCAL) {
113 fHistJetsNEFvsPt = new TH2F("fHistJetsNEFvsPt", "fHistJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
114 fHistJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
115 fHistJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
116 fOutput->Add(fHistJetsNEFvsPt);
119 fHistMCJetPhiEta = new TH2F("fHistMCJetPhiEta", "fHistMCJetPhiEta", 20, -2, 2, 32, 0, 6.4);
120 fHistMCJetPhiEta->GetXaxis()->SetTitle("#eta");
121 fHistMCJetPhiEta->GetYaxis()->SetTitle("#phi");
122 fOutput->Add(fHistMCJetPhiEta);
124 fHistMCJetsPt = new TH1F("fHistMCJetsPt", "fHistMCJetsPt", fNbins, fMinBinPt, fMaxBinPt);
125 fHistMCJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
126 fHistMCJetsPt->GetYaxis()->SetTitle("counts");
127 fOutput->Add(fHistMCJetsPt);
129 fHistMCJetsZvsPt = new TH2F("fHistMCJetsZvsPt", "fHistMCJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
130 fHistMCJetsZvsPt->GetXaxis()->SetTitle("Z");
131 fHistMCJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
132 fOutput->Add(fHistMCJetsZvsPt);
134 if (fAnaType == kEMCAL) {
135 fHistMCJetsNEFvsPt = new TH2F("fHistMCJetsNEFvsPt", "fHistMCJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
136 fHistMCJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
137 fHistMCJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
138 fOutput->Add(fHistMCJetsNEFvsPt);
141 fHistClosestDistance = new TH1F("fHistClosestDistance", "fHistClosestDistance", 50, 0, fMaxDistance * 1.2);
142 fHistClosestDistance->GetXaxis()->SetTitle("d");
143 fHistClosestDistance->GetYaxis()->SetTitle("counts");
144 fOutput->Add(fHistClosestDistance);
146 fHistClosestDeltaPhi = new TH1F("fHistClosestDeltaPhi", "fHistClosestDeltaPhi", 64, -1.6, 4.8);
147 fHistClosestDeltaPhi->GetXaxis()->SetTitle("#Delta#phi");
148 fHistClosestDeltaPhi->GetYaxis()->SetTitle("counts");
149 fOutput->Add(fHistClosestDeltaPhi);
151 fHistClosestDeltaEta = new TH1F("fHistClosestDeltaEta", "fHistClosestDeltaEta", TMath::CeilNint(fMaxEta - fMinEta) * 20, fMinEta * 2, fMaxEta * 2);
152 fHistClosestDeltaEta->GetXaxis()->SetTitle("#Delta#eta");
153 fHistClosestDeltaEta->GetYaxis()->SetTitle("counts");
154 fOutput->Add(fHistClosestDeltaEta);
156 fHistClosestDeltaPt = new TH1F("fHistClosestDeltaPt", "fHistClosestDeltaPt", fNbins, -fMaxBinPt / 2, fMaxBinPt / 2);
157 fHistClosestDeltaPt->GetXaxis()->SetTitle("#Delta p_{T}");
158 fHistClosestDeltaPt->GetYaxis()->SetTitle("counts");
159 fOutput->Add(fHistClosestDeltaPt);
161 fHistNonMatchedMCJetPt = new TH1F("fHistNonMatchedMCJetPt", "fHistNonMatchedMCJetPt", fNbins, fMinBinPt, fMaxBinPt);
162 fHistNonMatchedMCJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
163 fHistNonMatchedMCJetPt->GetYaxis()->SetTitle("counts");
164 fOutput->Add(fHistNonMatchedMCJetPt);
166 fHistNonMatchedJetPt = new TH1F("fHistNonMatchedJetPt", "fHistNonMatchedJetPt", fNbins, fMinBinPt, fMaxBinPt);
167 fHistNonMatchedJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
168 fHistNonMatchedJetPt->GetYaxis()->SetTitle("counts");
169 fOutput->Add(fHistNonMatchedJetPt);
171 fHistPartvsDetecPt = new TH2F("fHistPartvsDetecPt", "fHistPartvsDetecPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
172 fHistPartvsDetecPt->GetXaxis()->SetTitle("p_{T}^{rec}");
173 fHistPartvsDetecPt->GetYaxis()->SetTitle("p_{T}^{gen}");
174 fOutput->Add(fHistPartvsDetecPt);
176 fHistMissedMCJets = new TH1F("fHistMissedMCJets", "fHistMissedMCJets", fNbins, fMinBinPt, fMaxBinPt);
177 fHistMissedMCJets->GetXaxis()->SetTitle("p_{T} [GeV/c]");
178 fHistMissedMCJets->GetYaxis()->SetTitle("counts");
179 fOutput->Add(fHistMissedMCJets);
181 PostData(1, fOutput); // Post data for ALL output slots > 0 here, to get at least an empty histogram
184 //________________________________________________________________________
185 Bool_t AliJetResponseMaker::FillHistograms()
189 // Find the closest jets
190 DoJetLoop(fJets, fMCJets, kFALSE);
191 DoJetLoop(fMCJets, fJets, kTRUE);
193 const Int_t nMCJets = fMCJets->GetEntriesFast();
195 for (Int_t i = 0; i < nMCJets; i++) {
197 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
200 AliError(Form("Could not receive jet %d", i));
204 if (!AcceptJet(jet, kTRUE, kFALSE))
207 if (jet->Pt() > fMaxBinPt)
210 if (jet->ClosestJet() && jet->ClosestJet()->ClosestJet() == jet &&
211 jet->ClosestJetDistance() < fMaxDistance) { // Matched jet found
212 jet->SetMatchedToClosest();
213 jet->ClosestJet()->SetMatchedToClosest();
214 if (jet->MatchedJet()->Pt() > fMaxBinPt) {
215 fHistMissedMCJets->Fill(jet->Pt());
218 fHistClosestDistance->Fill(jet->ClosestJetDistance());
219 Double_t deta = jet->MatchedJet()->Eta() - jet->Eta();
220 fHistClosestDeltaEta->Fill(deta);
221 Double_t dphi = jet->MatchedJet()->Phi() - jet->Phi();
222 fHistClosestDeltaPhi->Fill(dphi);
223 Double_t dpt = jet->MatchedJet()->Pt() - jet->Pt();
224 fHistClosestDeltaPt->Fill(dpt);
225 fHistPartvsDetecPt->Fill(jet->MatchedJet()->Pt(), jet->Pt());
229 fHistNonMatchedMCJetPt->Fill(jet->Pt());
230 fHistMissedMCJets->Fill(jet->Pt());
233 fHistMCJetsPt->Fill(jet->Pt());
235 fHistMCJetPhiEta->Fill(jet->Eta(), jet->Phi());
237 if (fAnaType == kEMCAL)
238 fHistMCJetsNEFvsPt->Fill(jet->NEF(), jet->Pt());
240 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
241 AliVParticle *track = jet->TrackAt(it, fMCTracks);
243 fHistMCJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt());
247 const Int_t nJets = fJets->GetEntriesFast();
249 for (Int_t i = 0; i < nJets; i++) {
251 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(i));
254 AliError(Form("Could not receive mc jet %d", i));
261 if (!jet->MatchedJet()) {
262 fHistNonMatchedJetPt->Fill(jet->Pt());
265 fHistJetsPt->Fill(jet->Pt());
267 fHistJetPhiEta->Fill(jet->Eta(), jet->Phi());
269 if (fAnaType == kEMCAL)
270 fHistJetsNEFvsPt->Fill(jet->NEF(), jet->Pt());
272 for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
273 AliVParticle *track = jet->TrackAt(it, fTracks);
275 fHistJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt());
278 for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
279 AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
282 cluster->GetMomentum(nP, fVertex);
283 fHistJetsZvsPt->Fill(nP.Pt() / jet->Pt(), jet->Pt());
291 //________________________________________________________________________
292 void AliJetResponseMaker::DoJetLoop(TClonesArray *jets1, TClonesArray *jets2, Bool_t mc)
296 Int_t nJets1 = jets1->GetEntriesFast();
297 Int_t nJets2 = jets2->GetEntriesFast();
299 for (Int_t i = 0; i < nJets1; i++) {
301 AliEmcalJet* jet1 = static_cast<AliEmcalJet*>(jets1->At(i));
304 AliError(Form("Could not receive jet %d", i));
308 if (!AcceptJet(jet1, kTRUE, mc))
311 for (Int_t j = 0; j < nJets2; j++) {
313 AliEmcalJet* jet2 = static_cast<AliEmcalJet*>(jets2->At(j));
316 AliError(Form("Could not receive jet %d", j));
320 if (!AcceptJet(jet2, kTRUE, !mc))
323 Double_t deta = jet2->Eta() - jet1->Eta();
324 Double_t dphi = jet2->Phi() - jet1->Phi();
325 Double_t d = TMath::Sqrt(deta * deta + dphi * dphi);
327 if (d < jet1->ClosestJetDistance()) {
328 jet1->SetSecondClosestJet(jet1->ClosestJet(), jet1->ClosestJetDistance());
329 jet1->SetClosestJet(jet2, d);
331 else if (d < jet1->SecondClosestJetDistance()) {
332 jet1->SetSecondClosestJet(jet2, d);
338 //________________________________________________________________________
339 Bool_t AliJetResponseMaker::RetrieveEventObjects()
341 // Retrieve event objects.
343 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
346 if (!fMCJetsName.IsNull() && !fMCJets) {
347 fMCJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCJetsName));
349 AliError(Form("%s: Could not retrieve mc jets %s!", GetName(), fMCJetsName.Data()));
352 else if (!fMCJets->GetClass()->GetBaseClass("AliEmcalJet")) {
353 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fMCJetsName.Data()));
359 if (!fMCTracksName.IsNull() && !fMCTracks) {
360 fMCTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCTracksName));
362 AliError(Form("%s: Could not retrieve mc tracks %s!", GetName(), fMCTracksName.Data()));
366 TClass *cl = fMCTracks->GetClass();
367 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
368 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fMCTracksName.Data()));
378 //________________________________________________________________________
379 void AliJetResponseMaker::Terminate(Option_t *)
381 // Called once at the end of the analysis.