Transition to new base class (from Redmer)
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / UserTasks / AliAnalysisTaskJetMatching.cxx
1 // 
2 // General task to match two sets of jets
3 //
4 // This task takes two TClonesArray's as input: 
5 // [1] fSourceJets - e.g. pythia jets
6 // [2] fTargetJets - e.g. a samle containing pythia jets embedded in a pbpb event
7 // the task will try to match jets from the source array to the target array, and
8 // save the found TARGET jets in a new array 'fMatchedJets'
9 //
10 // Author: Redmer Alexander Bertens, Utrecht Univeristy, Utrecht, Netherlands
11 // rbertens@cern.ch, rbertens@nikhef.nl, r.a.bertens@uu.nl 
12
13 // root includes
14 #include <TClonesArray.h>
15 #include <TChain.h>
16 #include <TMath.h>
17 #include <TF1.h>
18 #include <TF2.h>
19 #include <TH1F.h>
20 #include <TH2F.h>
21 #include <TProfile.h>
22 // aliroot includes
23 #include <AliAnalysisTask.h>
24 #include <AliAnalysisManager.h>
25 #include <AliLog.h>
26 #include <AliVEvent.h>
27 #include <AliVParticle.h>
28 // emcal jet framework includes
29 #include <AliEmcalJet.h>
30 #include <AliAnalysisTaskJetMatching.h>
31
32 class AliAnalysisTaskJetMatching;
33 using namespace std;
34
35 ClassImp(AliAnalysisTaskJetMatching)
36
37 AliAnalysisTaskJetMatching::AliAnalysisTaskJetMatching() : AliAnalysisTaskEmcalJetDev("AliAnalysisTaskJetMatching", kTRUE), 
38     fDebug(0), fSourceJets(0), fSourceJetsName(0), fTargetJets(0), fTargetJetsName(0), fMatchedJets(0), fMatchedJetsName(GetName()), fUseScaledRho(0), fMatchingScheme(kGeoEtaPhi), fDuplicateJetRecoveryMode(kDoNothing), fUseEmcalBaseJetCuts(kFALSE), fSourceBKG(kNoSourceBKG), fTargetBKG(kNoTargetBKG), fLocalJetMinEta(-10), fLocalJetMaxEta(-10), fLocalJetMinPhi(-10), fLocalJetMaxPhi(-10), fOutputList(0), fHistUnsortedCorrelation(0), fHistMatchedCorrelation(0), fHistSourceJetPt(0), fHistTargetJetPt(0), fHistMatchedJetPt(0), fHistNoConstSourceJet(0), fHistNoConstTargetJet(0), fHistNoConstMatchJet(0), fProfFracPtMatched(0), fProfFracPtJets(0), fProfFracNoMatched(0), fProfFracNoJets(0), fHistAnalysisSummary(0), fProfQAMatched(0), fProfQA(0), fNoMatchedJets(100), fMatchEta(.03), fMatchPhi(.03), fMatchR(.03), fMatchArea(0), fMaxRelEnergyDiff(.1), fMaxAbsEnergyDiff(5) {
39     // default constructor
40     ClearMatchedJetsCache();
41 }
42 //_____________________________________________________________________________
43 AliAnalysisTaskJetMatching::AliAnalysisTaskJetMatching(const char* name) : AliAnalysisTaskEmcalJetDev(name, kTRUE),
44     fDebug(0), fSourceJets(0), fSourceJetsName(0), fTargetJets(0), fTargetJetsName(0), fMatchedJets(0), fMatchedJetsName(GetName()), fUseScaledRho(0), fMatchingScheme(kGeoEtaPhi), fDuplicateJetRecoveryMode(kDoNothing), fUseEmcalBaseJetCuts(kFALSE), fSourceBKG(kNoSourceBKG), fTargetBKG(kNoTargetBKG), fLocalJetMinEta(-10), fLocalJetMaxEta(-10), fLocalJetMinPhi(-10), fLocalJetMaxPhi(-10), fOutputList(0), fHistUnsortedCorrelation(0), fHistMatchedCorrelation(0), fHistSourceJetPt(0), fHistTargetJetPt(0), fHistMatchedJetPt(0), fHistNoConstSourceJet(0), fHistNoConstTargetJet(0), fHistNoConstMatchJet(0), fProfFracPtMatched(0), fProfFracPtJets(0), fProfFracNoMatched(0), fProfFracNoJets(0), fHistAnalysisSummary(0), fProfQAMatched(0), fProfQA(0), fNoMatchedJets(100), fMatchEta(.03), fMatchPhi(.03), fMatchR(.03), fMatchArea(0), fMaxRelEnergyDiff(.1), fMaxAbsEnergyDiff(5) {
45     // constructor
46     ClearMatchedJetsCache();
47     DefineInput(0, TChain::Class());
48     DefineOutput(1, TList::Class());
49 }
50 //_____________________________________________________________________________
51 AliAnalysisTaskJetMatching::~AliAnalysisTaskJetMatching()
52 {
53     // destructor
54     if(fOutputList)             delete fOutputList;
55 }
56 //_____________________________________________________________________________
57 void AliAnalysisTaskJetMatching::ExecOnce() 
58 {
59     // initialize the anaysis
60     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
61     // get the stand alone jets from the input event
62     fSourceJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fSourceJetsName.Data()));
63     if(!fSourceJets) AliFatal(Form("%s: Container with name %s not found. Aborting", GetName(), fSourceJetsName.Data()));
64     fTargetJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTargetJetsName.Data()));
65     if(!fTargetJets) AliFatal(Form("%s: Container with name %s not found. Aborting", GetName(), fSourceJetsName.Data()));
66     // append the list of matched jets to the event
67     fMatchedJets->Delete();
68     if (!(InputEvent()->FindListObject(fMatchedJetsName))) InputEvent()->AddObject(fMatchedJets);
69     else AliFatal(Form("%s: Object with name %s already in event! Aborting", GetName(), fMatchedJetsName.Data()));
70     FillAnalysisSummaryHistogram();
71     AliAnalysisTaskEmcalJetDev::ExecOnce(); // init base class
72 }
73 //_____________________________________________________________________________
74 void AliAnalysisTaskJetMatching::UserCreateOutputObjects()
75 {
76     // create output objects
77     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
78      // add the matched jets array to the event
79     fMatchedJets = new TClonesArray("AliEmcalJet");
80     fMatchedJets->SetName(fMatchedJetsName);
81     fOutputList = new TList();
82     fOutputList->SetOwner(kTRUE);
83     // add analysis histograms
84     fHistUnsortedCorrelation = BookTH1F("fHistUnsortedCorrelation", "#Delta #varphi unsorted", 50, 0, TMath::Pi());
85     fHistMatchedCorrelation = BookTH1F("fHistMatchedCorrelation", "#Delta #varphi matched", 50, 0, TMath::Pi());
86     fHistSourceJetPt = BookTH1F("fHistSourceJetPt", "p_{t} [GeV/c]", 50, 0, 150);
87     fHistTargetJetPt = BookTH1F("fHistTargetJetPt", "p_{t} [GeV/c]", 50, 0, 150);
88     fHistMatchedJetPt = BookTH1F("fHistMatchedJetPt", "p_{t} [GeV/c]", 50, 0, 150);
89     fHistNoConstSourceJet = BookTH1F("fHistNoConstSourceJet", "number of constituents", 50, 0, 50);
90     fHistNoConstTargetJet = BookTH1F("fHistNoConstTargetJet", "number of constituents", 50, 0, 50);
91     fHistNoConstMatchJet = BookTH1F("fHistNoConstMatchJet", "number of constituents", 50, 0, 50);
92     // the analysis summary histo which stores all the analysis flags is always written to file
93     fHistAnalysisSummary = BookTH1F("fHistAnalysisSummary", "flag", 51, -0.5, 15.5);
94     fProfQAMatched = new TProfile("fProfQAMatched", "fProfQAMatched", 3, 0, 3);
95     fProfQAMatched->GetXaxis()->SetBinLabel(1, "<#delta p_{t} >");
96     fProfQAMatched->GetXaxis()->SetBinLabel(2, "<#delta #eta>");
97     fProfQAMatched->GetXaxis()->SetBinLabel(3, "<#delta #varphi>");
98     fOutputList->Add(fProfQAMatched);
99     fProfQA = new TProfile("fProfQA", "fProfQA", 3, 0, 3);
100     fProfQA->GetXaxis()->SetBinLabel(1, "<#delta p_{t} >");
101     fProfQA->GetXaxis()->SetBinLabel(2, "<#delta #eta>");
102     fProfQA->GetXaxis()->SetBinLabel(3, "<#delta #varphi>");
103     fOutputList->Add(fProfQA);
104     fProfFracPtMatched = new TProfile("fProfFracPtMatched", "fProfFracPtMatched", 10, 0, 200);
105     fOutputList->Add(fProfFracPtMatched);
106     fProfFracPtJets = new TProfile("fProfFracPtJets", "fProfFracPtJets", 10, 0, 200);
107     fOutputList->Add(fProfFracPtJets);
108     fProfFracNoMatched = new TProfile("fProfFracNoMatched", "fProfFracNoMatched", 10, 0, 200);
109     fOutputList->Add(fProfFracNoMatched);
110     fProfFracNoJets = new TProfile("fProfFracNoJets", "fProfFracNoJets", 10, 0, 200);
111     fOutputList->Add(fProfFracNoJets);
112     fOutputList->Sort();
113     PostData(1, fOutputList);
114 }
115 //_____________________________________________________________________________
116 TH1F* AliAnalysisTaskJetMatching::BookTH1F(const char* name, const char* x, Int_t bins, Double_t min, Double_t max, Bool_t append)
117 {
118     // book a TH1F and connect it to the output container
119     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
120     if(!fOutputList) return 0x0;
121     TString title(name);
122     title += Form(";%s;[counts]", x);
123     TH1F* histogram = new TH1F(name, title.Data(), bins, min, max);
124     histogram->Sumw2();
125     if(append) fOutputList->Add(histogram);
126     return histogram;   
127 }
128 //_____________________________________________________________________________
129 TH2F* AliAnalysisTaskJetMatching::BookTH2F(const char* name, const char* x, const char*y, Int_t binsx, Double_t minx, Double_t maxx, Int_t binsy, Double_t miny, Double_t maxy, Bool_t append)
130 {
131     // book a TH2F and connect it to the output container
132     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
133     if(!fOutputList) return 0x0;
134     TString title(name);
135     title += Form(";%s;%s", x, y);
136     TH2F* histogram = new TH2F(name, title.Data(), binsx, minx, maxx, binsy, miny, maxy);
137     histogram->Sumw2();
138     if(append) fOutputList->Add(histogram);
139     return histogram;   
140 }
141 //_____________________________________________________________________________
142 Bool_t AliAnalysisTaskJetMatching::Run()
143 {
144     // execute once for each event
145     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
146     if(!(InputEvent() && fSourceJetsName && fTargetJets && IsEventSelected())) return kFALSE;
147     // single event loop
148     switch (fMatchingScheme) {
149         case kGeoEtaPhi : {
150             DoGeometricMatchingEtaPhi();
151         } break;
152         case kGeoR : {
153             DoGeometricMatchingR();
154         } break;
155         case kGeoEtaPhiArea : {
156             DoGeometricMatchingEtaPhi(kTRUE);
157             } break;
158         case kGeoRArea : {
159             DoGeometricMatchingR(kTRUE);
160             } break;
161         case kDeepMatching : {
162             DoGeometricMatchingEtaPhi();
163             } break;
164        default : break;
165     }
166     if(fMatchedJetContainer[1][0]) {       // if matched jets are found, fill some more histograms
167         switch (fDuplicateJetRecoveryMode) {
168             case kDoNothing : break;
169             default : {
170                 DuplicateJetRecovery();
171                 break;
172             }
173         }
174     }
175     // if required do deep matching, i.e. match constituents in source and target jets 
176     switch (fMatchingScheme) {
177         case kDeepMatching : {
178             DoDeepMatching();
179             break; }
180         default : break;
181     }
182     // stream data to output
183     PostMatchedJets();
184     FillMatchedJetHistograms();
185     if(fDebug > 0) PrintInfo();
186     PostData(1, fOutputList);
187     return kTRUE;
188 }
189 //_____________________________________________________________________________
190 void AliAnalysisTaskJetMatching::DoGeometricMatchingEtaPhi(Bool_t pairCuts)
191 {
192     // do geometric matching
193     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
194     fNoMatchedJets = 0; // reset the matched jet counter
195     Int_t iSource(fSourceJets->GetEntriesFast()), iTarget(fTargetJets->GetEntriesFast());
196     for(Int_t i(0); i < iSource; i++) {
197         AliEmcalJet* sourceJet(static_cast<AliEmcalJet*>(fSourceJets->At(i)));
198         if(!PassesCuts(sourceJet)) continue;
199         for(Int_t j(0); j < iTarget; j++) {
200             AliEmcalJet* targetJet(static_cast<AliEmcalJet*>(fTargetJets->At(j)));
201             if(!PassesCuts(targetJet)) continue;
202             if((TMath::Abs(sourceJet->Eta() - targetJet->Eta()) < fMatchEta ) && (TMath::Abs(sourceJet->Phi()-targetJet->Phi()) < fMatchPhi)) {
203                 if(pairCuts && !PassesCuts(sourceJet, targetJet)) continue;
204                 fMatchedJetContainer[fNoMatchedJets][0] = sourceJet;
205                 fMatchedJetContainer[fNoMatchedJets][1] = targetJet;
206                 fNoMatchedJets++;
207                 if(fNoMatchedJets > 99) {
208                     AliError(Form("%s: Found too many matched jets (> 100). Adjust matching criteria !", GetName()));
209                     return;
210                 }
211             }
212         }
213     }
214 }
215 //_____________________________________________________________________________
216 void AliAnalysisTaskJetMatching::DoGeometricMatchingR(Bool_t pairCuts)
217 {
218     // do geometric matching based on shortest path between jet centers
219     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
220     fNoMatchedJets = 0; // reset the matched jet counter
221     Int_t iSource(fSourceJets->GetEntriesFast()), iTarget(fTargetJets->GetEntriesFast());
222     for(Int_t i(0); i < iSource; i++) {
223         AliEmcalJet* sourceJet(static_cast<AliEmcalJet*>(fSourceJets->At(i)));
224         if(!PassesCuts(sourceJet)) continue;
225         for(Int_t j(0); j < iTarget; j++) {
226             AliEmcalJet* targetJet(static_cast<AliEmcalJet*>(fTargetJets->At(j)));
227             if(!PassesCuts(targetJet)) continue;
228             Double_t etaS(sourceJet->Eta()), etaT(targetJet->Eta());
229             Double_t phiS(sourceJet->Phi()), phiT(targetJet->Phi());
230             // if necessary change phase
231             if(TMath::Abs(phiS-phiT) > TMath::Abs(phiS-phiT + TMath::TwoPi())) phiS+=TMath::TwoPi();
232             if(TMath::Abs(phiS-phiT) > TMath::Abs(phiS-phiT - TMath::TwoPi())) phiS-=TMath::TwoPi();
233             if(TMath::Sqrt(TMath::Abs((etaS-etaT)*(etaS-etaT)+(phiS-phiT)*(phiS-phiT)) <= fMatchR)) {
234                 if(pairCuts && !PassesCuts(sourceJet, targetJet)) continue;
235                 fMatchedJetContainer[fNoMatchedJets][0] = sourceJet;
236                 fMatchedJetContainer[fNoMatchedJets][1] = targetJet;
237                 fNoMatchedJets++;
238                 if(fNoMatchedJets > 99) {
239                     AliError(Form("%s: Found too many matched jets (> 100). Adjust matching criteria !", GetName()));
240                     return;
241                 }
242             }
243         }
244     }
245 }
246 //_____________________________________________________________________________
247 void AliAnalysisTaskJetMatching::DoDeepMatching()
248 {
249     // match constituents, can be VERY slow 
250     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
251     if(!fTracks) {
252         AliFatal(Form("%s Fatal error! To do deep matching, supply jet constituents ! \n", GetName()));
253         return; // coverity ...
254     }
255     for(Int_t i(0); i < fNoMatchedJets; i++) {
256         AliEmcalJet* sourceJet = fMatchedJetContainer[i][0];
257         AliEmcalJet* targetJet = fMatchedJetContainer[i][1];
258         if(sourceJet && targetJet) {    // duplicate check: slot migth be NULL
259             Double_t targetPt(0);
260             Int_t iSJ(sourceJet->GetNumberOfTracks());
261             Int_t iTJ(targetJet->GetNumberOfTracks());
262             Int_t overlap(0), alreadyFound(0);
263             for(Int_t j(0); j < iSJ; j++) {
264                 alreadyFound = 0;
265                 Int_t idSource((Int_t)sourceJet->TrackAt(j));
266                 for(Int_t k(0); k < iTJ; k++) { // compare all target tracks to the source track
267                     if(idSource == targetJet->TrackAt(k) && alreadyFound == 0) {
268                         overlap++;
269                         alreadyFound++; // avoid possible duplicate matching
270                         AliVParticle* vp(static_cast<AliVParticle*>(targetJet->TrackAt(k, fTracks)));
271                         if(vp) targetPt += vp->Pt();
272                         continue;
273                     }
274                 }
275             }
276             if(sourceJet->Pt() > 0) {
277                 fProfFracPtMatched->Fill(sourceJet->Pt(), targetPt / sourceJet->Pt());
278                 fProfFracPtJets->Fill(sourceJet->Pt(), targetJet->Pt() / sourceJet->Pt());
279                 fProfFracNoMatched->Fill(sourceJet->Pt(), (double)overlap / (double)sourceJet->GetNumberOfTracks());
280                 fProfFracNoJets->Fill(sourceJet->Pt(), (double)targetJet->GetNumberOfTracks() / (double)sourceJet->GetNumberOfTracks());
281             }
282             if(fDebug > 0) {
283                 printf("\n\n > Jet a has %i constituents \n", iSJ);
284                 printf(" > Jet b has %i constituents \n", iTJ);
285                 printf("  -OVERLAP %i tracks-\n\n", overlap);
286             }
287         }
288     }
289 }
290 //_____________________________________________________________________________
291 void AliAnalysisTaskJetMatching::DuplicateJetRecovery()
292 {
293     // find target jets that have been matched to a source jet more than once - uses nested loops!
294     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
295     Int_t iDuplicateJets(0);            // counter for duplicate jets
296     for(Int_t i(0); i < fNoMatchedJets; i++) {
297         for(Int_t j(i+1); j < fNoMatchedJets; j++) {
298             if(fMatchedJetContainer[i][1] == fMatchedJetContainer[j][1]) {
299                 iDuplicateJets++;
300                 switch (fDuplicateJetRecoveryMode) {
301                     case kTraceDuplicates : { 
302                         printf(" > found duplicate jet <\n");
303                         break; }
304                     case kRemoveDuplicates : { 
305                          fMatchedJetContainer[j][1] = NULL;
306                          break; }
307                     default : break;
308                 }
309             }
310         }
311     }
312 }
313 //_____________________________________________________________________________
314 void AliAnalysisTaskJetMatching::PostMatchedJets()
315 {
316     // post matched jets
317     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
318     for(Int_t i(0), p(0); i < fNoMatchedJets; i++) {
319         if(fMatchedJetContainer[i][1]) {        // duplicate jets will have NULL value here and are skipped
320             new((*fMatchedJets)[p]) AliEmcalJet(*fMatchedJetContainer[i][1]);
321             p++; 
322         }
323     }
324 }
325 //_____________________________________________________________________________
326 void AliAnalysisTaskJetMatching::FillAnalysisSummaryHistogram() const
327 {
328     // fill the analysis summary histrogram, saves all relevant analysis settigns
329     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
330     fHistAnalysisSummary->GetXaxis()->SetBinLabel(1, "fUseScaledRho");
331     fHistAnalysisSummary->SetBinContent(1, (int)fUseScaledRho);
332     fHistAnalysisSummary->GetXaxis()->SetBinLabel(2, "fMatchingScheme");
333     fHistAnalysisSummary->SetBinContent(2, (int)fMatchingScheme);
334     fHistAnalysisSummary->GetXaxis()->SetBinLabel(3, "fSourceBKG");
335     fHistAnalysisSummary->SetBinContent(3, (int)fSourceBKG);
336     fHistAnalysisSummary->GetXaxis()->SetBinLabel(4, "fTargetBKG");
337     fHistAnalysisSummary->SetBinContent(4, (int)fTargetBKG);
338     fHistAnalysisSummary->GetXaxis()->SetBinLabel(5, "fLocalJetMinEta");
339     fHistAnalysisSummary->SetBinContent(5, fLocalJetMinEta);
340     fHistAnalysisSummary->GetXaxis()->SetBinLabel(6, "fLocalJetMaxEta");
341     fHistAnalysisSummary->SetBinContent(6, fLocalJetMaxEta);
342     fHistAnalysisSummary->GetXaxis()->SetBinLabel(7, "fLocalJetMinPhi");
343     fHistAnalysisSummary->SetBinContent(7, fLocalJetMinPhi);
344     fHistAnalysisSummary->GetXaxis()->SetBinLabel(8, "fLocalJetMaxPhi");
345     fHistAnalysisSummary->SetBinContent(8, fLocalJetMaxPhi);
346     fHistAnalysisSummary->GetXaxis()->SetBinLabel(9, "fMatchEta");
347     fHistAnalysisSummary->SetBinContent(9, fMatchEta);
348     fHistAnalysisSummary->GetXaxis()->SetBinLabel(10, "fMatchPhi");
349     fHistAnalysisSummary->SetBinContent(10, fMatchPhi);
350     fHistAnalysisSummary->GetXaxis()->SetBinLabel(11, "fMatchR");
351     fHistAnalysisSummary->SetBinContent(11, fMatchR);
352     fHistAnalysisSummary->GetXaxis()->SetBinLabel(12, "fMatchArea");
353     fHistAnalysisSummary->SetBinContent(12, fMatchArea);
354     fHistAnalysisSummary->GetXaxis()->SetBinLabel(13, "fMaxRelEnergyDiff");
355     fHistAnalysisSummary->SetBinContent(13, fMaxRelEnergyDiff);
356     fHistAnalysisSummary->GetXaxis()->SetBinLabel(13, "fMaxAbsEnergyDiff");
357     fHistAnalysisSummary->SetBinContent(13, fMaxAbsEnergyDiff);
358     fHistAnalysisSummary->GetXaxis()->SetBinLabel(14, "iter");
359     fHistAnalysisSummary->SetBinContent(13, 1.);
360 }
361 //_____________________________________________________________________________
362 void AliAnalysisTaskJetMatching::FillMatchedJetHistograms() const
363 {
364     // fill matched jet histograms
365     if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
366     for(Int_t i(0); i < fSourceJets->GetEntriesFast(); i++) {
367         AliEmcalJet* source = static_cast<AliEmcalJet*>(fSourceJets->At(i));
368         if(!source) continue;
369         fHistSourceJetPt->Fill(source->Pt());
370         fHistNoConstSourceJet->Fill(source->GetNumberOfConstituents());
371         for(Int_t j(0); j < fTargetJets->GetEntriesFast(); j++) {
372             AliEmcalJet* target = static_cast<AliEmcalJet*>(fTargetJets->At(j));
373             if(target) {
374             fProfQA->Fill(0.5, TMath::Abs(source->Pt()-target->Pt()));
375             fProfQA->Fill(1.5, TMath::Abs(source->Eta()-target->Eta()));
376             fProfQA->Fill(2.5, TMath::Abs(source->Phi()-target->Phi()));
377  
378                 fHistUnsortedCorrelation->Fill(PhaseShift(source->Phi()-target->Phi(), 2));
379                 if(j==0) {
380                     fHistTargetJetPt->Fill(target->Pt());
381                     fHistNoConstTargetJet->Fill(target->GetNumberOfConstituents());
382                 }
383             }
384         }
385     }
386     for(Int_t i(0); i < fNoMatchedJets; i++) {
387         if(fMatchedJetContainer[i][0] && fMatchedJetContainer[i][1]) {
388             fHistMatchedCorrelation->Fill(PhaseShift(fMatchedJetContainer[i][0]->Phi()-fMatchedJetContainer[i][1]->Phi(), 2));
389             fHistMatchedJetPt->Fill(fMatchedJetContainer[i][1]->Pt());
390             fHistNoConstMatchJet->Fill(fMatchedJetContainer[i][1]->Pt());
391             fProfQAMatched->Fill(0.5, TMath::Abs(fMatchedJetContainer[i][0]->Pt()-fMatchedJetContainer[i][1]->Pt()));
392             fProfQAMatched->Fill(1.5, TMath::Abs(fMatchedJetContainer[i][0]->Eta()-fMatchedJetContainer[i][1]->Eta()));
393             fProfQAMatched->Fill(2.5, TMath::Abs(fMatchedJetContainer[i][0]->Phi()-fMatchedJetContainer[i][1]->Phi()));
394         }
395     }
396 }
397 //_____________________________________________________________________________
398 void AliAnalysisTaskJetMatching::PrintInfo() const
399 {
400     // print some info 
401     printf(" > No. of source jets from %s \n \t %i \n ", fSourceJetsName.Data(), fSourceJets->GetEntriesFast());
402     printf(" > No. of target jets from %s \n \t %i \n ", fTargetJetsName.Data(), fTargetJets->GetEntriesFast());
403     printf(" > No. of matched jets from %s \n \t %i \n ", fMatchedJetsName.Data(), fMatchedJets->GetEntriesFast());
404     if(fDebug > 3) InputEvent()->GetList()->ls();
405 }
406 //_____________________________________________________________________________
407 void AliAnalysisTaskJetMatching::Terminate(Option_t *)
408 {
409     // terminate
410 }
411 //_____________________________________________________________________________