]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGGA/EMCALJetTasks/AliJetResponseMaker.cxx
e2859d36ff85f3df79903e6d9133ffd0b6e41034
[u/mrichter/AliRoot.git] / PWGGA / EMCALJetTasks / AliJetResponseMaker.cxx
1 // $Id$
2 //
3 // Emcal jet response matrix maker task.
4 //
5 // Author: S. Aiola
6
7 #include "AliJetResponseMaker.h"
8
9 #include <TChain.h>
10 #include <TClonesArray.h>
11 #include <TH1F.h>
12 #include <TH2F.h>
13 #include <TList.h>
14 #include <TLorentzVector.h>
15
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"
24
25 ClassImp(AliJetResponseMaker)
26
27 //________________________________________________________________________
28 AliJetResponseMaker::AliJetResponseMaker() : 
29   AliAnalysisTaskEmcalJet("AliJetResponseMaker", kTRUE),
30   fMCTracksName("MCParticles"),
31   fMCJetsName("MCJets"),
32   fMaxDistance(0.25),
33   fDoWeighting(kFALSE),
34   fVertexCut(10),
35   fPythiaHeader(0),
36   fEventWeight(0),
37   fPtHardBin(0),
38   fNTrials(0),
39   fMCTracks(0),
40   fMCJets(0),
41   fHistNTrials(0),
42   fHistAcceptedEvents(0),
43   fHistEvents(0),
44   fHistMCJetPhiEta(0),
45   fHistMCJetsPt(0),
46   fHistMCJetsNEFvsPt(0),
47   fHistMCJetsZvsPt(0),
48   fHistJetPhiEta(0),
49   fHistJetsPt(0),
50   fHistJetsNEFvsPt(0),
51   fHistJetsZvsPt(0),
52   fHistClosestDistance(0),
53   fHistClosestDeltaPhi(0),
54   fHistClosestDeltaEta(0),
55   fHistClosestDeltaPt(0),
56   fHistNonMatchedMCJetPt(0),
57   fHistNonMatchedJetPt(0),
58   fHistPartvsDetecPt(0),
59   fHistMissedMCJets(0)
60 {
61   // Default constructor.
62 }
63
64 //________________________________________________________________________
65 AliJetResponseMaker::AliJetResponseMaker(const char *name) : 
66   AliAnalysisTaskEmcalJet(name, kTRUE),
67   fMCTracksName("MCParticles"),
68   fMCJetsName("MCJets"),
69   fMaxDistance(0.25),
70   fDoWeighting(kFALSE),
71   fVertexCut(10),
72   fPythiaHeader(0),
73   fEventWeight(0),
74   fPtHardBin(0),
75   fNTrials(0),
76   fMCTracks(0),
77   fMCJets(0),
78   fHistNTrials(0),
79   fHistAcceptedEvents(0),
80   fHistEvents(0),
81   fHistMCJetPhiEta(0),
82   fHistMCJetsPt(0),
83   fHistMCJetsNEFvsPt(0),
84   fHistMCJetsZvsPt(0),
85   fHistJetPhiEta(0),
86   fHistJetsPt(0),
87   fHistJetsNEFvsPt(0),
88   fHistJetsZvsPt(0),
89   fHistClosestDistance(0),
90   fHistClosestDeltaPhi(0),
91   fHistClosestDeltaEta(0),
92   fHistClosestDeltaPt(0),
93   fHistNonMatchedMCJetPt(0),
94   fHistNonMatchedJetPt(0),
95   fHistPartvsDetecPt(0),
96   fHistMissedMCJets(0)
97 {
98   // Standard constructor.
99 }
100
101 //________________________________________________________________________
102 AliJetResponseMaker::~AliJetResponseMaker()
103 {
104   // Destructor
105 }
106
107 //________________________________________________________________________
108 void AliJetResponseMaker::UserCreateOutputObjects()
109 {
110   // Create user objects.
111
112   OpenFile(1);
113   fOutput = new TList();
114   fOutput->SetOwner();
115
116   const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
117   const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
118
119   fHistNTrials = new TH1F("fHistNTrials", "fHistNTrials", 11, 0, 11);
120   fHistNTrials->GetXaxis()->SetTitle("p_{T} hard bin");
121   fHistNTrials->GetYaxis()->SetTitle("trials");
122   fOutput->Add(fHistNTrials);
123
124   fHistAcceptedEvents = new TH1F("fHistAcceptedEvents", "fHistAcceptedEvents", 11, 0, 11);
125   fHistAcceptedEvents->GetXaxis()->SetTitle("p_{T} hard bin");
126   fHistAcceptedEvents->GetYaxis()->SetTitle("accepted events");
127   fOutput->Add(fHistAcceptedEvents);
128
129   fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
130   fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
131   fHistEvents->GetYaxis()->SetTitle("total events");
132   fOutput->Add(fHistEvents);
133
134   for (Int_t i = 1; i < 12; i++) {
135     fHistNTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
136     fHistAcceptedEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
137     fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
138   }
139
140   fHistJetPhiEta = new TH2F("fHistJetPhiEta", "fHistJetPhiEta", 20, -2, 2, 32, 0, 6.4);
141   fHistJetPhiEta->GetXaxis()->SetTitle("#eta");
142   fHistJetPhiEta->GetYaxis()->SetTitle("#phi");
143   fOutput->Add(fHistJetPhiEta);
144   
145   fHistJetsPt = new TH1F("fHistJetsPt", "fHistJetsPt", fNbins, fMinBinPt, fMaxBinPt);
146   fHistJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
147   fHistJetsPt->GetYaxis()->SetTitle("counts");
148   fOutput->Add(fHistJetsPt);
149   
150   fHistJetsZvsPt = new TH2F("fHistJetsZvsPt", "fHistJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
151   fHistJetsZvsPt->GetXaxis()->SetTitle("Z");
152   fHistJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
153   fOutput->Add(fHistJetsZvsPt);
154   
155   if (fAnaType == kEMCAL) {
156     fHistJetsNEFvsPt = new TH2F("fHistJetsNEFvsPt", "fHistJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
157     fHistJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
158     fHistJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
159     fOutput->Add(fHistJetsNEFvsPt);
160   }
161
162   fHistMCJetPhiEta = new TH2F("fHistMCJetPhiEta", "fHistMCJetPhiEta", 20, -2, 2, 32, 0, 6.4);
163   fHistMCJetPhiEta->GetXaxis()->SetTitle("#eta");
164   fHistMCJetPhiEta->GetYaxis()->SetTitle("#phi");
165   fOutput->Add(fHistMCJetPhiEta);
166   
167   fHistMCJetsPt = new TH1F("fHistMCJetsPt", "fHistMCJetsPt", fNbins, fMinBinPt, fMaxBinPt);
168   fHistMCJetsPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
169   fHistMCJetsPt->GetYaxis()->SetTitle("counts");
170   fOutput->Add(fHistMCJetsPt);
171   
172   fHistMCJetsZvsPt = new TH2F("fHistMCJetsZvsPt", "fHistMCJetsZvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
173   fHistMCJetsZvsPt->GetXaxis()->SetTitle("Z");
174   fHistMCJetsZvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
175   fOutput->Add(fHistMCJetsZvsPt);
176   
177   if (fAnaType == kEMCAL) {
178     fHistMCJetsNEFvsPt = new TH2F("fHistMCJetsNEFvsPt", "fHistMCJetsNEFvsPt", fNbins, 0, 1.2, fNbins, fMinBinPt, fMaxBinPt);
179     fHistMCJetsNEFvsPt->GetXaxis()->SetTitle("NEF");
180     fHistMCJetsNEFvsPt->GetYaxis()->SetTitle("p_{T} [GeV/c]");
181     fOutput->Add(fHistMCJetsNEFvsPt);
182   }
183
184   fHistClosestDistance = new TH1F("fHistClosestDistance", "fHistClosestDistance", 50, 0, fMaxDistance * 1.2);
185   fHistClosestDistance->GetXaxis()->SetTitle("d");
186   fHistClosestDistance->GetYaxis()->SetTitle("counts");
187   fOutput->Add(fHistClosestDistance);
188
189   fHistClosestDeltaPhi = new TH1F("fHistClosestDeltaPhi", "fHistClosestDeltaPhi", 64, -1.6, 4.8);
190   fHistClosestDeltaPhi->GetXaxis()->SetTitle("#Delta#phi");
191   fHistClosestDeltaPhi->GetYaxis()->SetTitle("counts");
192   fOutput->Add(fHistClosestDeltaPhi);
193
194   fHistClosestDeltaEta = new TH1F("fHistClosestDeltaEta", "fHistClosestDeltaEta", TMath::CeilNint(fMaxEta - fMinEta) * 20, fMinEta * 2, fMaxEta * 2);
195   fHistClosestDeltaEta->GetXaxis()->SetTitle("#Delta#eta");
196   fHistClosestDeltaEta->GetYaxis()->SetTitle("counts");
197   fOutput->Add(fHistClosestDeltaEta);
198
199   fHistClosestDeltaPt = new TH1F("fHistClosestDeltaPt", "fHistClosestDeltaPt", fNbins, -fMaxBinPt / 2, fMaxBinPt / 2);
200   fHistClosestDeltaPt->GetXaxis()->SetTitle("#Delta p_{T}");
201   fHistClosestDeltaPt->GetYaxis()->SetTitle("counts");
202   fOutput->Add(fHistClosestDeltaPt);
203
204   fHistNonMatchedMCJetPt = new TH1F("fHistNonMatchedMCJetPt", "fHistNonMatchedMCJetPt", fNbins, fMinBinPt, fMaxBinPt);
205   fHistNonMatchedMCJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
206   fHistNonMatchedMCJetPt->GetYaxis()->SetTitle("counts");
207   fOutput->Add(fHistNonMatchedMCJetPt);
208
209   fHistNonMatchedJetPt = new TH1F("fHistNonMatchedJetPt", "fHistNonMatchedJetPt", fNbins, fMinBinPt, fMaxBinPt);
210   fHistNonMatchedJetPt->GetXaxis()->SetTitle("p_{T} [GeV/c]");
211   fHistNonMatchedJetPt->GetYaxis()->SetTitle("counts");
212   fOutput->Add(fHistNonMatchedJetPt);
213
214   fHistPartvsDetecPt = new TH2F("fHistPartvsDetecPt", "fHistPartvsDetecPt", fNbins, fMinBinPt, fMaxBinPt, fNbins, fMinBinPt, fMaxBinPt);
215   fHistPartvsDetecPt->GetXaxis()->SetTitle("p_{T}^{rec}");
216   fHistPartvsDetecPt->GetYaxis()->SetTitle("p_{T}^{gen}");
217   fOutput->Add(fHistPartvsDetecPt);
218
219   fHistMissedMCJets = new TH1F("fHistMissedMCJets", "fHistMissedMCJets", fNbins, fMinBinPt, fMaxBinPt);
220   fHistMissedMCJets->GetXaxis()->SetTitle("p_{T} [GeV/c]");
221   fHistMissedMCJets->GetYaxis()->SetTitle("counts");
222   fOutput->Add(fHistMissedMCJets);
223
224   PostData(1, fOutput); // Post data for ALL output slots > 0 here, to get at least an empty histogram
225 }
226
227 //________________________________________________________________________
228 void AliJetResponseMaker::DoJetLoop(TClonesArray *jets1, TClonesArray *jets2, Bool_t mc)
229 {
230   // Do the jet loop.
231
232   Int_t nJets1 = jets1->GetEntriesFast();
233   Int_t nJets2 = jets2->GetEntriesFast();
234
235   for (Int_t i = 0; i < nJets1; i++) {
236
237     AliEmcalJet* jet1 = static_cast<AliEmcalJet*>(jets1->At(i));
238
239     if (!jet1) {
240       AliError(Form("Could not receive jet %d", i));
241       continue;
242     }  
243
244     if (!AcceptJet(jet1, kTRUE, mc))
245       continue;
246
247     for (Int_t j = 0; j < nJets2; j++) {
248       
249       AliEmcalJet* jet2 = static_cast<AliEmcalJet*>(jets2->At(j));
250       
251       if (!jet2) {
252         AliError(Form("Could not receive jet %d", j));
253         continue;
254       }  
255       
256       if (!AcceptJet(jet2, kTRUE, !mc))
257         continue;
258       
259       Double_t deta = jet2->Eta() - jet1->Eta();
260       Double_t dphi = jet2->Phi() - jet1->Phi();
261       Double_t d = TMath::Sqrt(deta * deta + dphi * dphi);
262
263       if (d < jet1->ClosestJetDistance()) {
264         jet1->SetSecondClosestJet(jet1->ClosestJet(), jet1->ClosestJetDistance());
265         jet1->SetClosestJet(jet2, d);
266       }
267       else if (d < jet1->SecondClosestJetDistance()) {
268         jet1->SetSecondClosestJet(jet2, d);
269       }
270     }
271   }
272 }
273
274 //________________________________________________________________________
275 void AliJetResponseMaker::ExecOnce()
276 {
277   // Execute once.
278
279   if (!fMCJetsName.IsNull() && !fMCJets) {
280     fMCJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCJetsName));
281     if (!fMCJets) {
282       AliError(Form("%s: Could not retrieve mc jets %s!", GetName(), fMCJetsName.Data()));
283       return;
284     }
285     else if (!fMCJets->GetClass()->GetBaseClass("AliEmcalJet")) {
286       AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fMCJetsName.Data())); 
287       fMCJets = 0;
288       return;
289     }
290   }
291
292   if (!fMCTracksName.IsNull() && !fMCTracks) {
293     fMCTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCTracksName));
294     if (!fMCTracks) {
295       AliError(Form("%s: Could not retrieve mc tracks %s!", GetName(), fMCTracksName.Data())); 
296       return;
297     }
298     else {
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())); 
302         fMCTracks = 0;
303         return;
304       }
305     }
306   }
307
308   AliAnalysisTaskEmcalJet::ExecOnce();
309 }
310
311 //________________________________________________________________________
312 Bool_t AliJetResponseMaker::FillHistograms()
313 {
314   // Fill histograms.
315
316   const Int_t nMCJets = fMCJets->GetEntriesFast();
317
318   for (Int_t i = 0; i < nMCJets; i++) {
319
320     AliEmcalJet* jet = static_cast<AliEmcalJet*>(fMCJets->At(i));
321
322     if (!jet) {
323       AliError(Form("Could not receive jet %d", i));
324       continue;
325     }  
326
327     if (!AcceptJet(jet, kTRUE, kFALSE))
328       continue;
329
330     if (jet->Pt() > fMaxBinPt)
331       continue;
332
333     if (jet->ClosestJet() && jet->ClosestJet()->ClosestJet() == jet && 
334         jet->ClosestJetDistance() < fMaxDistance) {    // Matched jet found
335       jet->SetMatchedToClosest();
336       jet->ClosestJet()->SetMatchedToClosest();
337       if (jet->MatchedJet()->Pt() > fMaxBinPt) {
338         fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
339       }
340       else {
341         fHistClosestDistance->Fill(jet->ClosestJetDistance(), fEventWeight);
342
343         Double_t deta = jet->MatchedJet()->Eta() - jet->Eta();
344         fHistClosestDeltaEta->Fill(deta, fEventWeight);
345
346         Double_t dphi = jet->MatchedJet()->Phi() - jet->Phi();
347         fHistClosestDeltaPhi->Fill(dphi, fEventWeight);
348
349         Double_t dpt = jet->MatchedJet()->Pt() - jet->Pt();
350         fHistClosestDeltaPt->Fill(dpt, fEventWeight);
351
352         fHistPartvsDetecPt->Fill(jet->MatchedJet()->Pt(), jet->Pt(), fEventWeight);
353       }
354     }
355     else {
356       fHistNonMatchedMCJetPt->Fill(jet->Pt(), fEventWeight);
357       fHistMissedMCJets->Fill(jet->Pt(), fEventWeight);
358     }
359
360     fHistMCJetsPt->Fill(jet->Pt(), fEventWeight);
361
362     fHistMCJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
363
364     if (fAnaType == kEMCAL)
365       fHistMCJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
366
367     for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
368       AliVParticle *track = jet->TrackAt(it, fMCTracks);
369       if (track)
370         fHistMCJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
371     }
372   }
373
374   const Int_t nJets = fJets->GetEntriesFast();
375
376   for (Int_t i = 0; i < nJets; i++) {
377
378     AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJets->At(i));
379
380     if (!jet) {
381       AliError(Form("Could not receive mc jet %d", i));
382       continue;
383     }  
384     
385     if (!AcceptJet(jet))
386       continue;
387
388     if (!jet->MatchedJet()) {
389       fHistNonMatchedJetPt->Fill(jet->Pt(), fEventWeight);
390     }
391
392     fHistJetsPt->Fill(jet->Pt(), fEventWeight);
393
394     fHistJetPhiEta->Fill(jet->Eta(), jet->Phi(), fEventWeight);
395
396     if (fAnaType == kEMCAL)
397       fHistJetsNEFvsPt->Fill(jet->NEF(), jet->Pt(), fEventWeight);
398
399     for (Int_t it = 0; it < jet->GetNumberOfTracks(); it++) {
400       AliVParticle *track = jet->TrackAt(it, fTracks);
401       if (track)
402         fHistJetsZvsPt->Fill(track->Pt() / jet->Pt(), jet->Pt(), fEventWeight);
403     }
404
405     for (Int_t ic = 0; ic < jet->GetNumberOfClusters(); ic++) {
406       AliVCluster *cluster = jet->ClusterAt(ic, fCaloClusters);
407       if (cluster) {
408         TLorentzVector nP;
409         cluster->GetMomentum(nP, fVertex);
410         fHistJetsZvsPt->Fill(nP.Pt() / jet->Pt(), jet->Pt(), fEventWeight);
411       }
412     }
413   }
414
415   return kTRUE;
416 }
417
418 //________________________________________________________________________
419 Bool_t AliJetResponseMaker::RetrieveEventObjects()
420 {
421   // Retrieve event objects.
422
423   if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
424     return kFALSE;
425   
426   fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
427
428   if (!fPythiaHeader)
429     return kFALSE;
430
431   if (fDoWeighting)
432     fEventWeight = fPythiaHeader->EventWeight();
433   else
434     fEventWeight = 1;
435
436   const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
437   const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
438
439   Double_t pthard = fPythiaHeader->GetPtHard();
440   
441   for (fPtHardBin = 0; fPtHardBin < 11; fPtHardBin++) {
442     if (ptHardLo[fPtHardBin] < pthard && ptHardHi[fPtHardBin] > pthard)
443       break;
444   }
445
446   fNTrials = fPythiaHeader->Trials();
447
448   return kTRUE;
449 }
450
451 //________________________________________________________________________
452 Bool_t AliJetResponseMaker::Run()
453 {
454   // Find the closest jets
455
456   fHistEvents->SetBinContent(fPtHardBin, fHistEvents->GetBinContent(fPtHardBin) + 1);
457
458   if (TMath::Abs(fVertex[2]) > fVertexCut)
459     return kFALSE;
460   
461   fHistAcceptedEvents->SetBinContent(fPtHardBin, fHistEvents->GetBinContent(fPtHardBin) + 1);
462   fHistNTrials->SetBinContent(fPtHardBin, fHistNTrials->GetBinContent(fPtHardBin) + fNTrials);
463
464   DoJetLoop(fJets, fMCJets, kFALSE);
465   DoJetLoop(fMCJets, fJets, kTRUE);
466
467   return kTRUE;
468 }
469