]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/UserTasks/AliAnalysisTaskIDFFTCF.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGJE / UserTasks / AliAnalysisTaskIDFFTCF.cxx
1 // *************************************************************************
2 // *                                                                       *
3 // * Task for Fragmentation Function Analysis in PWG4 Jet Task Force Train *
4 // *                                                                       *
5 // *************************************************************************
6
7
8 /**************************************************************************
9  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10  *                                                                        *
11  * Author: The ALICE Off-line Project.                                    *
12  * Contributors are mentioned in the code where appropriate.              *
13  *                                                                        *
14  * Permission to use, copy, modify and distribute this software and its   *
15  * documentation strictly for non-commercial purposes is hereby granted   *
16  * without fee, provided that the above copyright notice appears in all   *
17  * copies and that both the copyright notice and this permission notice   *
18  * appear in the supporting documentation. The authors make no claims     *
19  * about the suitability of this software for any purpose. It is          *
20  * provided "as is" without express or implied warranty.                  *
21  **************************************************************************/
22
23 /* $Id: */
24
25 #include "TList.h"
26 #include "TH1F.h"
27 #include "TH2F.h"
28 #include "TH3F.h"
29 #include "TString.h"
30 #include "THnSparse.h"
31 #include "TProfile.h"
32 #include "TFile.h"
33 #include "TKey.h"
34 #include "TRandom3.h"
35 #include "TAxis.h"
36
37 #include "AliAODInputHandler.h" 
38 #include "AliAODHandler.h" 
39 #include "AliESDEvent.h"
40 #include "AliESDInputHandler.h"
41 #include "AliAODMCParticle.h"
42 #include "AliAODJet.h"
43 #include "AliAODJetEventBackground.h"
44 #include "AliGenPythiaEventHeader.h"
45 #include "AliGenHijingEventHeader.h"
46 #include "AliInputEventHandler.h"
47
48 #include "AliAnalysisHelperJetTasks.h"
49 #include "AliAnalysisManager.h"
50 #include "AliAnalysisTaskSE.h"
51 #include "AliVParticle.h"
52 #include "AliVEvent.h"
53 #include "AliPIDResponse.h"
54 #include "AliIDFFUtils.h"
55
56 #include "AliAnalysisTaskIDFFTCF.h"
57 using std::cout;
58 using std::endl;
59 using std::cerr;
60
61 ClassImp(AliAnalysisTaskIDFFTCF)
62
63 Bool_t AliAnalysisTaskIDFFTCF::fkDump = kFALSE;
64
65 //____________________________________________________________________________
66 AliAnalysisTaskIDFFTCF::AliAnalysisTaskIDFFTCF()
67    : AliAnalysisTaskSE()
68    ,fESD(0)
69    ,fAOD(0)
70    ,fAODJets(0)  
71    ,fAODExtension(0)
72    ,fNonStdFile("")
73    ,fBranchRecJets("jets")
74    ,fBranchGenJets("")
75    ,fTrackTypeGen(0)
76    ,fJetTypeGen(0)
77    ,fJetTypeRecEff(0)
78    ,fUseAODInputJets(kTRUE)
79    ,fFilterMask(0)
80    ,fUsePhysicsSelection(kTRUE)
81    ,fEvtSelectionMask(0)
82    ,fEventClass(0)
83    ,fMaxVertexZ(10)
84    ,fLeadingJets(kFALSE)
85    ,fTPCCutMode(kPIDNone) 
86    ,fTOFCutMode(1)
87    ,fStream(0x0)
88    ,fTree(0x0)
89    ,fTrackPtCut(0)
90    ,fTrackEtaMin(0)
91    ,fTrackEtaMax(0)
92    ,fTrackPhiMin(0)
93    ,fTrackPhiMax(0)
94    ,fJetPtCut(0)
95    ,fJetEtaMin(0)
96    ,fJetEtaMax(0)
97    ,fJetPhiMin(0)
98    ,fJetPhiMax(0)
99    ,fFFRadius(0)
100    ,fFFMinLTrackPt(-1)
101    ,fFFMaxTrackPt(-1)
102    ,fFFMinnTracks(0)
103    ,fQAMode(0)
104    ,fFFMode(0)
105    ,fEffMode(0)
106    ,fAvgTrials(0)
107    ,fTracksRecCuts(0)
108    ,fTracksGen(0)
109    ,fTracksAODMCCharged(0)
110    ,fTracksAODMCChargedSec(0)
111    ,fTracksRecQualityCuts(0)
112    ,fJetsRec(0)
113    ,fJetsRecCuts(0)
114    ,fJetsGen(0)
115    ,fJetsRecEff(0)
116    ,fQATrackHistosRecCuts(0)
117    ,fQATrackHistosGen(0)
118    ,fQAJetHistosRec(0)
119    ,fQAJetHistosRecCuts(0)
120    ,fQAJetHistosRecCutsLeading(0)
121    ,fQAJetHistosGen(0)
122    ,fQAJetHistosGenLeading(0)
123    ,fQAJetHistosRecEffLeading(0)
124    ,fFFHistosRecCutsInc(0)
125    ,fFFHistosRecCutsIncPi(0)   
126    ,fFFHistosRecCutsIncPro(0)  
127    ,fFFHistosRecCutsIncK(0)    
128    ,fFFHistosRecCutsIncEl(0)   
129    ,fFFHistosRecCutsIncMu(0)   
130    ,fFFHistosRecLeadingTrack(0)
131    ,fFFHistosGenInc(0)
132    ,fFFHistosGenIncPi(0)   
133    ,fFFHistosGenIncPro(0)  
134    ,fFFHistosGenIncK(0)    
135    ,fFFHistosGenIncEl(0)   
136    ,fFFHistosGenIncMu(0)   
137    ,fFFHistosGenLeadingTrack(0)
138    ,fQATrackHighPtThreshold(0)
139    ,fTHnIDFF(0x0)
140    ,fTHnIncl(0x0)
141    ,fFFNBinsJetPt(0)    
142    ,fFFJetPtMin(0) 
143    ,fFFJetPtMax(0)
144    ,fFFNBinsPt(0)      
145    ,fFFPtMin(0)        
146    ,fFFPtMax(0)        
147    ,fFFNBinsXi(0)      
148    ,fFFXiMin(0)        
149    ,fFFXiMax(0)        
150    ,fFFNBinsZ(0)       
151    ,fFFZMin(0)         
152    ,fFFZMax(0)
153    ,fQAJetNBinsPt(0)   
154    ,fQAJetPtMin(0)     
155    ,fQAJetPtMax(0)     
156    ,fQAJetNBinsEta(0)  
157    ,fQAJetEtaMin(0)    
158    ,fQAJetEtaMax(0)    
159    ,fQAJetNBinsPhi(0)  
160    ,fQAJetPhiMin(0)    
161    ,fQAJetPhiMax(0)    
162    ,fQATrackNBinsPt(0) 
163    ,fQATrackPtMin(0)   
164    ,fQATrackPtMax(0)   
165    ,fQATrackNBinsEta(0)
166    ,fQATrackEtaMin(0)  
167    ,fQATrackEtaMax(0)  
168    ,fQATrackNBinsPhi(0)
169    ,fQATrackPhiMin(0)  
170    ,fQATrackPhiMax(0)
171    ,fCommonHistList(0)
172    ,fh1EvtSelection(0)
173    ,fh1VertexNContributors(0)
174    ,fh1VertexZ(0)
175    ,fh1EvtMult(0)
176    ,fh1EvtCent(0)
177    ,fh1Xsec(0)
178    ,fh1Trials(0)
179    ,fh1PtHard(0)
180    ,fh1PtHardTrials(0)
181    ,fh1nRecJetsCuts(0)
182    ,fh1nGenJets(0)
183    ,fh1nRecEffJets(0)
184    ,fh2PtRecVsGenPrim(0)
185    ,fh2PtRecVsGenSec(0)
186    ,fQATrackHistosRecEffGen(0)  
187    ,fQATrackHistosRecEffRec(0)
188    ,fQATrackHistosSecRec(0)   
189    ,fQATrackHistosRecEffGenPi(0)  
190    ,fQATrackHistosRecEffGenPro(0) 
191    ,fQATrackHistosRecEffGenK(0)   
192    ,fQATrackHistosRecEffGenEl(0)  
193    ,fQATrackHistosRecEffGenMu(0)  
194    ,fQATrackHistosRecEffRecPi(0)  
195    ,fQATrackHistosRecEffRecPro(0) 
196    ,fQATrackHistosRecEffRecK(0)   
197    ,fQATrackHistosRecEffRecEl(0)  
198    ,fQATrackHistosRecEffRecMu(0)
199    ,fQATrackHistosRecEffRecProGFL(0)
200    ,fQATrackHistosRecEffRecKGFL(0)
201    ,fQATrackHistosSecRecPi(0)  
202    ,fQATrackHistosSecRecPro(0) 
203    ,fQATrackHistosSecRecK(0)   
204    ,fQATrackHistosSecRecEl(0)  
205    ,fQATrackHistosSecRecMu(0)  
206    ,fQATrackHistosSecRecProGFL(0) 
207    ,fQATrackHistosSecRecKGFL(0)
208    ,fFFHistosRecEffRec(0)
209    ,fFFHistosSecRec(0)
210    ,fFFHistosRecEffRecPi(0) 
211    ,fFFHistosRecEffRecPro(0)
212    ,fFFHistosRecEffRecK(0)  
213    ,fFFHistosRecEffRecEl(0) 
214    ,fFFHistosRecEffRecMu(0)
215    ,fFFHistosRecEffRecProGFL(0)
216    ,fFFHistosRecEffRecKGFL(0)
217    ,fFFHistosSecRecPi(0)    
218    ,fFFHistosSecRecPro(0)   
219    ,fFFHistosSecRecK(0)     
220    ,fFFHistosSecRecEl(0)    
221    ,fFFHistosSecRecMu(0) 
222    ,fFFHistosSecRecProGFL(0)   
223    ,fFFHistosSecRecKGFL(0)
224    ,fRandom(0)
225 {
226    // default constructor
227 }
228
229 //_______________________________________________________________________________________________
230 AliAnalysisTaskIDFFTCF::AliAnalysisTaskIDFFTCF(const char *name) 
231   : AliAnalysisTaskSE(name)
232   ,fESD(0)
233   ,fAOD(0)
234   ,fAODJets(0)  
235   ,fAODExtension(0)
236   ,fNonStdFile("")
237   ,fBranchRecJets("jets")
238   ,fBranchGenJets("")
239   ,fTrackTypeGen(0)
240   ,fJetTypeGen(0)
241   ,fJetTypeRecEff(0)
242   ,fUseAODInputJets(kTRUE)
243   ,fFilterMask(0)
244   ,fUsePhysicsSelection(kTRUE)
245   ,fEvtSelectionMask(0)
246   ,fEventClass(0)
247   ,fMaxVertexZ(10)
248   ,fLeadingJets(kFALSE)
249   ,fTPCCutMode(kPIDNone)  
250   ,fTOFCutMode(1)
251   ,fStream(0x0)
252   ,fTree(0x0)
253   ,fTrackPtCut(0)
254   ,fTrackEtaMin(0)
255   ,fTrackEtaMax(0)
256   ,fTrackPhiMin(0)
257   ,fTrackPhiMax(0)
258   ,fJetPtCut(0)
259   ,fJetEtaMin(0)
260   ,fJetEtaMax(0)
261   ,fJetPhiMin(0)
262   ,fJetPhiMax(0)
263   ,fFFRadius(0)
264   ,fFFMinLTrackPt(-1)
265   ,fFFMaxTrackPt(-1)
266   ,fFFMinnTracks(0)
267   ,fQAMode(0)
268   ,fFFMode(0)
269   ,fEffMode(0)
270   ,fAvgTrials(0)
271   ,fTracksRecCuts(0)
272   ,fTracksGen(0)
273   ,fTracksAODMCCharged(0)
274   ,fTracksAODMCChargedSec(0)
275   ,fTracksRecQualityCuts(0)
276   ,fJetsRec(0)
277   ,fJetsRecCuts(0)
278   ,fJetsGen(0)
279   ,fJetsRecEff(0)
280   ,fQATrackHistosRecCuts(0)
281   ,fQATrackHistosGen(0)
282   ,fQAJetHistosRec(0)
283   ,fQAJetHistosRecCuts(0)
284   ,fQAJetHistosRecCutsLeading(0)
285   ,fQAJetHistosGen(0)
286   ,fQAJetHistosGenLeading(0)
287   ,fQAJetHistosRecEffLeading(0)
288   ,fFFHistosRecCutsInc(0)
289   ,fFFHistosRecCutsIncPi(0)   
290   ,fFFHistosRecCutsIncPro(0)  
291   ,fFFHistosRecCutsIncK(0)    
292   ,fFFHistosRecCutsIncEl(0)   
293   ,fFFHistosRecCutsIncMu(0)   
294   ,fFFHistosRecLeadingTrack(0)
295   ,fFFHistosGenInc(0)
296   ,fFFHistosGenIncPi(0)   
297   ,fFFHistosGenIncPro(0)  
298   ,fFFHistosGenIncK(0)    
299   ,fFFHistosGenIncEl(0)   
300   ,fFFHistosGenIncMu(0)   
301   ,fFFHistosGenLeadingTrack(0)
302   ,fQATrackHighPtThreshold(0) 
303   ,fTHnIDFF(0x0)
304   ,fTHnIncl(0x0)
305   ,fFFNBinsJetPt(0)    
306   ,fFFJetPtMin(0) 
307   ,fFFJetPtMax(0)
308   ,fFFNBinsPt(0)      
309   ,fFFPtMin(0)        
310   ,fFFPtMax(0)        
311   ,fFFNBinsXi(0)      
312   ,fFFXiMin(0)        
313   ,fFFXiMax(0)        
314   ,fFFNBinsZ(0)       
315   ,fFFZMin(0)         
316   ,fFFZMax(0)         
317   ,fQAJetNBinsPt(0)   
318   ,fQAJetPtMin(0)     
319   ,fQAJetPtMax(0)     
320   ,fQAJetNBinsEta(0)  
321   ,fQAJetEtaMin(0)    
322   ,fQAJetEtaMax(0)    
323   ,fQAJetNBinsPhi(0)  
324   ,fQAJetPhiMin(0)    
325   ,fQAJetPhiMax(0)    
326   ,fQATrackNBinsPt(0) 
327   ,fQATrackPtMin(0)   
328   ,fQATrackPtMax(0)   
329   ,fQATrackNBinsEta(0)
330   ,fQATrackEtaMin(0)  
331   ,fQATrackEtaMax(0)  
332   ,fQATrackNBinsPhi(0)
333   ,fQATrackPhiMin(0)  
334   ,fQATrackPhiMax(0)  
335   ,fCommonHistList(0)
336   ,fh1EvtSelection(0)
337   ,fh1VertexNContributors(0)
338   ,fh1VertexZ(0)
339   ,fh1EvtMult(0)
340   ,fh1EvtCent(0)
341   ,fh1Xsec(0)
342   ,fh1Trials(0)
343   ,fh1PtHard(0)
344   ,fh1PtHardTrials(0)
345   ,fh1nRecJetsCuts(0)
346   ,fh1nGenJets(0)
347   ,fh1nRecEffJets(0)
348   ,fh2PtRecVsGenPrim(0)
349   ,fh2PtRecVsGenSec(0)
350   ,fQATrackHistosRecEffGen(0)  
351   ,fQATrackHistosRecEffRec(0)
352   ,fQATrackHistosSecRec(0) 
353   ,fQATrackHistosRecEffGenPi(0)  
354   ,fQATrackHistosRecEffGenPro(0) 
355   ,fQATrackHistosRecEffGenK(0)   
356   ,fQATrackHistosRecEffGenEl(0)  
357   ,fQATrackHistosRecEffGenMu(0)  
358   ,fQATrackHistosRecEffRecPi(0)  
359   ,fQATrackHistosRecEffRecPro(0) 
360   ,fQATrackHistosRecEffRecK(0)   
361   ,fQATrackHistosRecEffRecEl(0)  
362   ,fQATrackHistosRecEffRecMu(0)
363   ,fQATrackHistosRecEffRecProGFL(0)
364   ,fQATrackHistosRecEffRecKGFL(0)
365   ,fQATrackHistosSecRecPi(0)  
366   ,fQATrackHistosSecRecPro(0) 
367   ,fQATrackHistosSecRecK(0)   
368   ,fQATrackHistosSecRecEl(0)  
369   ,fQATrackHistosSecRecMu(0)
370   ,fQATrackHistosSecRecProGFL(0) 
371   ,fQATrackHistosSecRecKGFL(0)
372   ,fFFHistosRecEffRec(0)
373   ,fFFHistosSecRec(0)
374   ,fFFHistosRecEffRecPi(0) 
375   ,fFFHistosRecEffRecPro(0)
376   ,fFFHistosRecEffRecK(0)  
377   ,fFFHistosRecEffRecEl(0) 
378   ,fFFHistosRecEffRecMu(0)
379   ,fFFHistosRecEffRecProGFL(0)
380   ,fFFHistosRecEffRecKGFL(0)
381   ,fFFHistosSecRecPi(0)    
382   ,fFFHistosSecRecPro(0)   
383   ,fFFHistosSecRecK(0)     
384   ,fFFHistosSecRecEl(0)    
385   ,fFFHistosSecRecMu(0)
386   ,fFFHistosSecRecProGFL(0)   
387   ,fFFHistosSecRecKGFL(0)  
388   ,fRandom(0)
389 {
390   // constructor
391    
392   DefineOutput(1,TList::Class());
393
394   if(fkDump){
395     fStream = new TTreeStream("tree");
396     DefineOutput(2, TTree::Class());
397     fTree= fStream->GetTree();
398   }
399 }
400
401 //__________________________________________________________________________________________________________________________
402 AliAnalysisTaskIDFFTCF::AliAnalysisTaskIDFFTCF(const  AliAnalysisTaskIDFFTCF &copy)
403   : AliAnalysisTaskSE()
404   ,fESD(copy.fESD)
405   ,fAOD(copy.fAOD)
406   ,fAODJets(copy.fAODJets)  
407   ,fAODExtension(copy.fAODExtension)
408   ,fNonStdFile(copy.fNonStdFile)
409   ,fBranchRecJets(copy.fBranchRecJets)
410   ,fBranchGenJets(copy.fBranchGenJets)
411   ,fTrackTypeGen(copy.fTrackTypeGen)
412   ,fJetTypeGen(copy.fJetTypeGen)
413   ,fJetTypeRecEff(copy.fJetTypeRecEff)
414   ,fUseAODInputJets(copy.fUseAODInputJets)
415   ,fFilterMask(copy.fFilterMask)
416   ,fUsePhysicsSelection(copy.fUsePhysicsSelection)
417   ,fEvtSelectionMask(copy.fEvtSelectionMask)
418   ,fEventClass(copy.fEventClass)
419   ,fMaxVertexZ(copy.fMaxVertexZ)
420   ,fLeadingJets(copy.fLeadingJets)
421   ,fTPCCutMode(copy.fTPCCutMode)
422   ,fTOFCutMode(copy.fTOFCutMode)
423   ,fStream(copy.fStream)
424   ,fTree(copy.fTree)
425   ,fTrackPtCut(copy.fTrackPtCut)
426   ,fTrackEtaMin(copy.fTrackEtaMin)
427   ,fTrackEtaMax(copy.fTrackEtaMax)
428   ,fTrackPhiMin(copy.fTrackPhiMin)
429   ,fTrackPhiMax(copy.fTrackPhiMax)
430   ,fJetPtCut(copy.fJetPtCut)
431   ,fJetEtaMin(copy.fJetEtaMin)
432   ,fJetEtaMax(copy.fJetEtaMax)
433   ,fJetPhiMin(copy.fJetPhiMin)
434   ,fJetPhiMax(copy.fJetPhiMax)
435   ,fFFRadius(copy.fFFRadius)
436   ,fFFMinLTrackPt(copy.fFFMinLTrackPt)
437   ,fFFMaxTrackPt(copy.fFFMaxTrackPt)
438   ,fFFMinnTracks(copy.fFFMinnTracks)
439   ,fQAMode(copy.fQAMode)
440   ,fFFMode(copy.fFFMode)
441   ,fEffMode(copy.fEffMode)
442   ,fAvgTrials(copy.fAvgTrials)
443   ,fTracksRecCuts(copy.fTracksRecCuts)
444   ,fTracksGen(copy.fTracksGen)
445   ,fTracksAODMCCharged(copy.fTracksAODMCCharged)
446   ,fTracksAODMCChargedSec(copy.fTracksAODMCChargedSec)
447   ,fTracksRecQualityCuts(copy.fTracksRecQualityCuts)
448   ,fJetsRec(copy.fJetsRec)
449   ,fJetsRecCuts(copy.fJetsRecCuts)
450   ,fJetsGen(copy.fJetsGen)
451   ,fJetsRecEff(copy.fJetsRecEff)
452   ,fQATrackHistosRecCuts(copy.fQATrackHistosRecCuts)
453   ,fQATrackHistosGen(copy.fQATrackHistosGen)
454   ,fQAJetHistosRec(copy.fQAJetHistosRec)
455   ,fQAJetHistosRecCuts(copy.fQAJetHistosRecCuts)
456   ,fQAJetHistosRecCutsLeading(copy.fQAJetHistosRecCutsLeading)
457   ,fQAJetHistosGen(copy.fQAJetHistosGen)
458   ,fQAJetHistosGenLeading(copy.fQAJetHistosGenLeading)
459   ,fQAJetHistosRecEffLeading(copy.fQAJetHistosRecEffLeading)
460   ,fFFHistosRecCutsInc(copy.fFFHistosRecCutsInc)
461   ,fFFHistosRecCutsIncPi(copy.fFFHistosRecCutsIncPi)
462   ,fFFHistosRecCutsIncPro(copy.fFFHistosRecCutsIncPro) 
463   ,fFFHistosRecCutsIncK(copy.fFFHistosRecCutsIncK)
464   ,fFFHistosRecCutsIncEl(copy.fFFHistosRecCutsIncEl) 
465   ,fFFHistosRecCutsIncMu(copy.fFFHistosRecCutsIncMu) 
466   ,fFFHistosRecLeadingTrack(copy.fFFHistosRecLeadingTrack)
467   ,fFFHistosGenInc(copy.fFFHistosGenInc)
468   ,fFFHistosGenIncPi(copy.fFFHistosGenIncPi)
469   ,fFFHistosGenIncPro(copy.fFFHistosGenIncPro) 
470   ,fFFHistosGenIncK(copy.fFFHistosGenIncK)
471   ,fFFHistosGenIncEl(copy.fFFHistosGenIncEl) 
472   ,fFFHistosGenIncMu(copy.fFFHistosGenIncMu) 
473   ,fFFHistosGenLeadingTrack(copy.fFFHistosGenLeadingTrack)
474   ,fQATrackHighPtThreshold(copy.fQATrackHighPtThreshold) 
475   ,fTHnIDFF(copy.fTHnIDFF)
476   ,fTHnIncl(copy.fTHnIncl)
477   ,fFFNBinsJetPt(copy.fFFNBinsJetPt)    
478   ,fFFJetPtMin(copy.fFFJetPtMin) 
479   ,fFFJetPtMax(copy.fFFJetPtMax)
480   ,fFFNBinsPt(copy.fFFNBinsPt)      
481   ,fFFPtMin(copy.fFFPtMin)        
482   ,fFFPtMax(copy.fFFPtMax)        
483   ,fFFNBinsXi(copy.fFFNBinsXi)      
484   ,fFFXiMin(copy.fFFXiMin)        
485   ,fFFXiMax(copy.fFFXiMax)        
486   ,fFFNBinsZ(copy.fFFNBinsZ)       
487   ,fFFZMin(copy.fFFZMin)         
488   ,fFFZMax(copy.fFFZMax)         
489   ,fQAJetNBinsPt(copy.fQAJetNBinsPt)   
490   ,fQAJetPtMin(copy.fQAJetPtMin)     
491   ,fQAJetPtMax(copy.fQAJetPtMax)     
492   ,fQAJetNBinsEta(copy.fQAJetNBinsEta)  
493   ,fQAJetEtaMin(copy.fQAJetEtaMin)    
494   ,fQAJetEtaMax(copy.fQAJetEtaMax)    
495   ,fQAJetNBinsPhi(copy.fQAJetNBinsPhi)  
496   ,fQAJetPhiMin(copy.fQAJetPhiMin)    
497   ,fQAJetPhiMax(copy.fQAJetPhiMax)    
498   ,fQATrackNBinsPt(copy.fQATrackNBinsPt) 
499   ,fQATrackPtMin(copy.fQATrackPtMin)   
500   ,fQATrackPtMax(copy.fQATrackPtMax)   
501   ,fQATrackNBinsEta(copy.fQATrackNBinsEta)
502   ,fQATrackEtaMin(copy.fQATrackEtaMin)  
503   ,fQATrackEtaMax(copy.fQATrackEtaMax)  
504   ,fQATrackNBinsPhi(copy.fQATrackNBinsPhi)
505   ,fQATrackPhiMin(copy.fQATrackPhiMin)  
506   ,fQATrackPhiMax(copy.fQATrackPhiMax)
507   ,fCommonHistList(copy.fCommonHistList)
508   ,fh1EvtSelection(copy.fh1EvtSelection)
509   ,fh1VertexNContributors(copy.fh1VertexNContributors)
510   ,fh1VertexZ(copy.fh1VertexZ)
511   ,fh1EvtMult(copy.fh1EvtMult)
512   ,fh1EvtCent(copy.fh1EvtCent)
513   ,fh1Xsec(copy.fh1Xsec)
514   ,fh1Trials(copy.fh1Trials)
515   ,fh1PtHard(copy.fh1PtHard)  
516   ,fh1PtHardTrials(copy.fh1PtHardTrials)  
517   ,fh1nRecJetsCuts(copy.fh1nRecJetsCuts)
518   ,fh1nGenJets(copy.fh1nGenJets)
519   ,fh1nRecEffJets(copy.fh1nRecEffJets)
520   ,fh2PtRecVsGenPrim(copy.fh2PtRecVsGenPrim)
521   ,fh2PtRecVsGenSec(copy.fh2PtRecVsGenSec)
522   ,fQATrackHistosRecEffGen(copy.fQATrackHistosRecEffGen)  
523   ,fQATrackHistosRecEffRec(copy.fQATrackHistosRecEffRec)  
524   ,fQATrackHistosSecRec(copy.fQATrackHistosSecRec)  
525   ,fQATrackHistosRecEffGenPi(copy.fQATrackHistosRecEffGenPi)  
526   ,fQATrackHistosRecEffGenPro(copy.fQATrackHistosRecEffGenPro) 
527   ,fQATrackHistosRecEffGenK(copy.fQATrackHistosRecEffGenK)
528   ,fQATrackHistosRecEffGenEl(copy.fQATrackHistosRecEffGenEl) 
529   ,fQATrackHistosRecEffGenMu(copy.fQATrackHistosRecEffGenMu) 
530   ,fQATrackHistosRecEffRecPi(copy.fQATrackHistosRecEffRecPi) 
531   ,fQATrackHistosRecEffRecPro(copy.fQATrackHistosRecEffRecPro) 
532   ,fQATrackHistosRecEffRecK(copy.fQATrackHistosRecEffRecK)
533   ,fQATrackHistosRecEffRecEl(copy.fQATrackHistosRecEffRecEl) 
534   ,fQATrackHistosRecEffRecMu(copy.fQATrackHistosRecEffRecMu)   
535   ,fQATrackHistosRecEffRecProGFL(copy.fQATrackHistosRecEffRecProGFL)
536   ,fQATrackHistosRecEffRecKGFL(copy.fQATrackHistosRecEffRecKGFL)  
537   ,fQATrackHistosSecRecPi(copy.fQATrackHistosSecRecPi) 
538   ,fQATrackHistosSecRecPro(copy.fQATrackHistosSecRecPro) 
539   ,fQATrackHistosSecRecK(copy.fQATrackHistosSecRecK)
540   ,fQATrackHistosSecRecEl(copy.fQATrackHistosSecRecEl) 
541   ,fQATrackHistosSecRecMu(copy.fQATrackHistosSecRecMu) 
542   ,fQATrackHistosSecRecProGFL(copy.fQATrackHistosSecRecProGFL) 
543   ,fQATrackHistosSecRecKGFL(copy.fQATrackHistosSecRecKGFL)
544   ,fFFHistosRecEffRec(copy.fFFHistosRecEffRec)  
545   ,fFFHistosSecRec(copy.fFFHistosSecRec)   
546   ,fFFHistosRecEffRecPi(copy.fFFHistosRecEffRecPi)  
547   ,fFFHistosRecEffRecPro(copy.fFFHistosRecEffRecPro)
548   ,fFFHistosRecEffRecK(copy.fFFHistosRecEffRecK)  
549   ,fFFHistosRecEffRecEl(copy.fFFHistosRecEffRecEl) 
550   ,fFFHistosRecEffRecMu(copy.fFFHistosRecEffRecMu) 
551   ,fFFHistosRecEffRecProGFL(copy.fFFHistosRecEffRecProGFL)
552   ,fFFHistosRecEffRecKGFL(copy.fFFHistosRecEffRecKGFL)  
553   ,fFFHistosSecRecPi(copy.fFFHistosSecRecPi)    
554   ,fFFHistosSecRecPro(copy.fFFHistosSecRecPro)   
555   ,fFFHistosSecRecK(copy.fFFHistosSecRecK)     
556   ,fFFHistosSecRecEl(copy.fFFHistosSecRecEl)    
557   ,fFFHistosSecRecMu(copy.fFFHistosSecRecMu)
558   ,fFFHistosSecRecProGFL(copy.fFFHistosSecRecProGFL)   
559   ,fFFHistosSecRecKGFL(copy.fFFHistosSecRecKGFL)  
560   ,fRandom(copy.fRandom)
561 {
562   // copy constructor
563 }
564
565 // _________________________________________________________________________________________________________________________________
566 AliAnalysisTaskIDFFTCF& AliAnalysisTaskIDFFTCF::operator=(const AliAnalysisTaskIDFFTCF& o)
567 {
568   // assignment
569   
570   if(this!=&o){
571
572     AliAnalysisTaskSE::operator=(o);
573     fESD                           = o.fESD;
574     fAOD                           = o.fAOD;
575     fAODJets                       = o.fAODJets;  
576     fAODExtension                  = o.fAODExtension;
577     fNonStdFile                    = o.fNonStdFile;
578     fBranchRecJets                 = o.fBranchRecJets;
579     fBranchGenJets                 = o.fBranchGenJets;
580     fTrackTypeGen                  = o.fTrackTypeGen;
581     fJetTypeGen                    = o.fJetTypeGen;
582     fJetTypeRecEff                 = o.fJetTypeRecEff;
583     fUseAODInputJets               = o.fUseAODInputJets;
584     fFilterMask                    = o.fFilterMask;
585     fUsePhysicsSelection           = o.fUsePhysicsSelection;
586     fEvtSelectionMask              = o.fEvtSelectionMask;
587     fEventClass                    = o.fEventClass;
588     fMaxVertexZ                    = o.fMaxVertexZ;
589     fLeadingJets                   = o.fLeadingJets;
590     fTPCCutMode                    = o.fTPCCutMode;
591     fTOFCutMode                    = o.fTOFCutMode;
592     fStream                        = o.fStream;
593     fTree                          = o.fTree;
594     fTrackPtCut                    = o.fTrackPtCut;
595     fTrackEtaMin                   = o.fTrackEtaMin;
596     fTrackEtaMax                   = o.fTrackEtaMax;
597     fTrackPhiMin                   = o.fTrackPhiMin;
598     fTrackPhiMax                   = o.fTrackPhiMax;
599     fJetPtCut                      = o.fJetPtCut;
600     fJetEtaMin                     = o.fJetEtaMin;
601     fJetEtaMax                     = o.fJetEtaMax;
602     fJetPhiMin                     = o.fJetPhiMin;
603     fJetPhiMax                     = o.fJetPhiMin;
604     fFFRadius                      = o.fFFRadius;
605     fFFMinLTrackPt                 = o.fFFMinLTrackPt;
606     fFFMaxTrackPt                  = o.fFFMaxTrackPt;
607     fFFMinnTracks                  = o.fFFMinnTracks;
608     fQAMode                        = o.fQAMode;
609     fFFMode                        = o.fFFMode;
610     fEffMode                       = o.fEffMode;
611     fAvgTrials                     = o.fAvgTrials;
612     fTracksRecCuts                 = o.fTracksRecCuts;
613     fTracksGen                     = o.fTracksGen;
614     fTracksAODMCCharged            = o.fTracksAODMCCharged;
615     fTracksAODMCChargedSec         = o.fTracksAODMCChargedSec;
616     fTracksRecQualityCuts          = o.fTracksRecQualityCuts;
617     fJetsRec                       = o.fJetsRec;
618     fJetsRecCuts                   = o.fJetsRecCuts;
619     fJetsGen                       = o.fJetsGen;
620     fJetsRecEff                    = o.fJetsRecEff;
621     fQATrackHistosRecCuts          = o.fQATrackHistosRecCuts;
622     fQATrackHistosGen              = o.fQATrackHistosGen;
623     fQAJetHistosRec                = o.fQAJetHistosRec;
624     fQAJetHistosRecCuts            = o.fQAJetHistosRecCuts;
625     fQAJetHistosRecCutsLeading     = o.fQAJetHistosRecCutsLeading;
626     fQAJetHistosGen                = o.fQAJetHistosGen;
627     fQAJetHistosGenLeading         = o.fQAJetHistosGenLeading;
628     fQAJetHistosRecEffLeading      = o.fQAJetHistosRecEffLeading;
629     fFFHistosRecCutsInc            = o.fFFHistosRecCutsInc;
630     fFFHistosRecCutsIncPi          = o.fFFHistosRecCutsIncPi;
631     fFFHistosRecCutsIncPro         = o.fFFHistosRecCutsIncPro; 
632     fFFHistosRecCutsIncK           = o.fFFHistosRecCutsIncK;
633     fFFHistosRecCutsIncEl          = o.fFFHistosRecCutsIncEl; 
634     fFFHistosRecCutsIncMu          = o.fFFHistosRecCutsIncMu; 
635     fFFHistosRecLeadingTrack       = o.fFFHistosRecLeadingTrack;
636     fFFHistosGenInc                = o.fFFHistosGenInc;
637     fFFHistosGenIncPi              = o.fFFHistosGenIncPi;
638     fFFHistosGenIncPro             = o.fFFHistosGenIncPro; 
639     fFFHistosGenIncK               = o.fFFHistosGenIncK;
640     fFFHistosGenIncEl              = o.fFFHistosGenIncEl; 
641     fFFHistosGenIncMu              = o.fFFHistosGenIncMu; 
642     fFFHistosGenLeadingTrack       = o.fFFHistosGenLeadingTrack;
643     fQATrackHighPtThreshold        = o.fQATrackHighPtThreshold; 
644     fTHnIDFF                       = o.fTHnIDFF;
645     fTHnIncl                       = o.fTHnIncl;
646     fFFNBinsJetPt                  = o.fFFNBinsJetPt;    
647     fFFJetPtMin                    = o.fFFJetPtMin; 
648     fFFJetPtMax                    = o.fFFJetPtMax;
649     fFFNBinsPt                     = o.fFFNBinsPt;      
650     fFFPtMin                       = o.fFFPtMin;        
651     fFFPtMax                       = o.fFFPtMax;        
652     fFFNBinsXi                     = o.fFFNBinsXi;      
653     fFFXiMin                       = o.fFFXiMin;        
654     fFFXiMax                       = o.fFFXiMax;        
655     fFFNBinsZ                      = o.fFFNBinsZ;       
656     fFFZMin                        = o.fFFZMin;         
657     fFFZMax                        = o.fFFZMax;         
658     fQAJetNBinsPt                  = o.fQAJetNBinsPt;   
659     fQAJetPtMin                    = o.fQAJetPtMin;     
660     fQAJetPtMax                    = o.fQAJetPtMax;     
661     fQAJetNBinsEta                 = o.fQAJetNBinsEta;  
662     fQAJetEtaMin                   = o.fQAJetEtaMin;    
663     fQAJetEtaMax                   = o.fQAJetEtaMax;    
664     fQAJetNBinsPhi                 = o.fQAJetNBinsPhi;  
665     fQAJetPhiMin                   = o.fQAJetPhiMin;    
666     fQAJetPhiMax                   = o.fQAJetPhiMax;    
667     fQATrackNBinsPt                = o.fQATrackNBinsPt; 
668     fQATrackPtMin                  = o.fQATrackPtMin;   
669     fQATrackPtMax                  = o.fQATrackPtMax;   
670     fQATrackNBinsEta               = o.fQATrackNBinsEta;
671     fQATrackEtaMin                 = o.fQATrackEtaMin;  
672     fQATrackEtaMax                 = o.fQATrackEtaMax;  
673     fQATrackNBinsPhi               = o.fQATrackNBinsPhi;
674     fQATrackPhiMin                 = o.fQATrackPhiMin;  
675     fQATrackPhiMax                 = o.fQATrackPhiMax;  
676     fCommonHistList                = o.fCommonHistList;
677     fh1EvtSelection                = o.fh1EvtSelection;
678     fh1VertexNContributors         = o.fh1VertexNContributors;
679     fh1VertexZ                     = o.fh1VertexZ;
680     fh1EvtMult                     = o.fh1EvtMult;
681     fh1EvtCent                     = o.fh1EvtCent;
682     fh1Xsec                        = o.fh1Xsec;
683     fh1Trials                      = o.fh1Trials;
684     fh1PtHard                      = o.fh1PtHard;
685     fh1PtHardTrials                = o.fh1PtHardTrials;
686     fh1nRecJetsCuts                = o.fh1nRecJetsCuts;
687     fh1nGenJets                    = o.fh1nGenJets; 
688     fh1nRecEffJets                 = o.fh1nRecEffJets;
689     fh2PtRecVsGenPrim              = o.fh2PtRecVsGenPrim;
690     fh2PtRecVsGenSec               = o.fh2PtRecVsGenSec; 
691     fQATrackHistosRecEffGen        = o.fQATrackHistosRecEffGen;  
692     fQATrackHistosRecEffRec        = o.fQATrackHistosRecEffRec;  
693     fQATrackHistosSecRec           = o.fQATrackHistosSecRec;  
694     fQATrackHistosRecEffGenPi      = o.fQATrackHistosRecEffGenPi;  
695     fQATrackHistosRecEffGenPro     = o.fQATrackHistosRecEffGenPro; 
696     fQATrackHistosRecEffGenK       = o.fQATrackHistosRecEffGenK;
697     fQATrackHistosRecEffGenEl      = o.fQATrackHistosRecEffGenEl; 
698     fQATrackHistosRecEffGenMu      = o.fQATrackHistosRecEffGenMu; 
699     fQATrackHistosRecEffRecPi      = o.fQATrackHistosRecEffRecPi; 
700     fQATrackHistosRecEffRecPro     = o.fQATrackHistosRecEffRecPro; 
701     fQATrackHistosRecEffRecK       = o.fQATrackHistosRecEffRecK;
702     fQATrackHistosRecEffRecEl      = o.fQATrackHistosRecEffRecEl; 
703     fQATrackHistosRecEffRecMu      = o.fQATrackHistosRecEffRecMu; 
704     fQATrackHistosRecEffRecProGFL  = o.fQATrackHistosRecEffRecProGFL;
705     fQATrackHistosRecEffRecKGFL    = o.fQATrackHistosRecEffRecKGFL;
706     fQATrackHistosSecRecPi         = o.fQATrackHistosSecRecPi;  
707     fQATrackHistosSecRecPro        = o.fQATrackHistosSecRecPro; 
708     fQATrackHistosSecRecK          = o.fQATrackHistosSecRecK;
709     fQATrackHistosSecRecEl         = o.fQATrackHistosSecRecEl; 
710     fQATrackHistosSecRecMu         = o.fQATrackHistosSecRecMu; 
711     fQATrackHistosSecRecProGFL     = o.fQATrackHistosSecRecProGFL;
712     fQATrackHistosSecRecKGFL       = o.fQATrackHistosSecRecKGFL;
713     fFFHistosRecEffRec             = o.fFFHistosRecEffRec;  
714     fFFHistosSecRec                = o.fFFHistosSecRec;   
715     fFFHistosRecEffRecPi           = o.fFFHistosRecEffRecPi;  
716     fFFHistosRecEffRecPro          = o.fFFHistosRecEffRecPro;
717     fFFHistosRecEffRecK            = o.fFFHistosRecEffRecK;  
718     fFFHistosRecEffRecEl           = o.fFFHistosRecEffRecEl; 
719     fFFHistosRecEffRecMu           = o.fFFHistosRecEffRecMu; 
720     fFFHistosRecEffRecProGFL       = o.fFFHistosRecEffRecProGFL;
721     fFFHistosRecEffRecKGFL         = o.fFFHistosRecEffRecKGFL;
722     fFFHistosSecRecPi              = o.fFFHistosSecRecPi;    
723     fFFHistosSecRecPro             = o.fFFHistosSecRecPro;   
724     fFFHistosSecRecK               = o.fFFHistosSecRecK;     
725     fFFHistosSecRecEl              = o.fFFHistosSecRecEl;    
726     fFFHistosSecRecMu              = o.fFFHistosSecRecMu;    
727     fFFHistosSecRecProGFL          = o.fFFHistosSecRecProGFL;   
728     fFFHistosSecRecKGFL            = o.fFFHistosSecRecKGFL;  
729     fRandom                        = o.fRandom;
730   }
731   
732   return *this;
733 }
734
735 //___________________________________________________________________________
736 AliAnalysisTaskIDFFTCF::~AliAnalysisTaskIDFFTCF()
737 {
738   // destructor
739   
740   if(fTracksRecCuts)           delete fTracksRecCuts;
741   if(fTracksGen)               delete fTracksGen;
742   if(fTracksAODMCCharged)      delete fTracksAODMCCharged;  
743   if(fTracksAODMCChargedSec)   delete fTracksAODMCChargedSec;  
744   if(fTracksRecQualityCuts)    delete fTracksRecQualityCuts; 
745   if(fJetsRec)                 delete fJetsRec;
746   if(fJetsRecCuts)             delete fJetsRecCuts;
747   if(fJetsGen)                 delete fJetsGen;
748   if(fJetsRecEff)              delete fJetsRecEff;
749
750   if(fRandom)               delete fRandom;
751 }
752
753 //______________________________________________________________________________________________________
754 AliAnalysisTaskIDFFTCF::AliFragFuncHistos::AliFragFuncHistos(const char* name, 
755                                                          Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,  
756                                                          Int_t nPt, Float_t ptMin, Float_t ptMax,
757                                                          Int_t nXi, Float_t xiMin, Float_t xiMax,
758                                                          Int_t nZ , Float_t zMin , Float_t zMax)
759   : TObject()
760   ,fNBinsJetPt(nJetPt)
761   ,fJetPtMin(jetPtMin)
762   ,fJetPtMax(jetPtMax)
763   ,fNBinsPt(nPt) 
764   ,fPtMin(ptMin)   
765   ,fPtMax(ptMax)   
766   ,fNBinsXi(nXi) 
767   ,fXiMin(xiMin)   
768   ,fXiMax(xiMax)   
769   ,fNBinsZ(nZ)  
770   ,fZMin(zMin)    
771   ,fZMax(zMax)
772   ,fh2TrackPt(0)
773   ,fh2Xi(0)
774   ,fh2Z(0)
775   ,fh1JetPt(0)
776   ,fNameFF(name)
777 {
778   // default constructor
779
780 }
781
782 //___________________________________________________________________________
783 AliAnalysisTaskIDFFTCF::AliFragFuncHistos::AliFragFuncHistos(const AliFragFuncHistos& copy)
784   : TObject()
785   ,fNBinsJetPt(copy.fNBinsJetPt)
786   ,fJetPtMin(copy.fJetPtMin)
787   ,fJetPtMax(copy.fJetPtMax)
788   ,fNBinsPt(copy.fNBinsPt) 
789   ,fPtMin(copy.fPtMin)   
790   ,fPtMax(copy.fPtMax)   
791   ,fNBinsXi(copy.fNBinsXi) 
792   ,fXiMin(copy.fXiMin)   
793   ,fXiMax(copy.fXiMax)   
794   ,fNBinsZ(copy.fNBinsZ)  
795   ,fZMin(copy.fZMin)    
796   ,fZMax(copy.fZMax)
797   ,fh2TrackPt(copy.fh2TrackPt)
798   ,fh2Xi(copy.fh2Xi)
799   ,fh2Z(copy.fh2Z)
800   ,fh1JetPt(copy.fh1JetPt)
801   ,fNameFF(copy.fNameFF)
802 {
803   // copy constructor
804 }
805
806 //_______________________________________________________________________________________________________________________________________________________________
807 AliAnalysisTaskIDFFTCF::AliFragFuncHistos& AliAnalysisTaskIDFFTCF::AliFragFuncHistos::operator=(const AliAnalysisTaskIDFFTCF::AliFragFuncHistos& o)
808 {
809   // assignment
810   
811   if(this!=&o){
812     TObject::operator=(o);
813     fNBinsJetPt = o.fNBinsJetPt;
814     fJetPtMin   = o.fJetPtMin;
815     fJetPtMax   = o.fJetPtMax;
816     fNBinsPt    = o.fNBinsPt; 
817     fPtMin      = o.fPtMin;   
818     fPtMax      = o.fPtMax;   
819     fNBinsXi    = o.fNBinsXi; 
820     fXiMin      = o.fXiMin;   
821     fXiMax      = o.fXiMax;   
822     fNBinsZ     = o.fNBinsZ;  
823     fZMin       = o.fZMin;    
824     fZMax       = o.fZMax;    
825     fh2TrackPt  = o.fh2TrackPt;
826     fh2Xi       = o.fh2Xi;
827     fh2Z        = o.fh2Z;
828     fh1JetPt    = o.fh1JetPt;
829     fNameFF     = o.fNameFF;
830   }
831     
832   return *this;
833 }
834
835 //_________________________________________________________
836 AliAnalysisTaskIDFFTCF::AliFragFuncHistos::~AliFragFuncHistos()
837 {
838   // destructor 
839
840   if(fh1JetPt)   delete fh1JetPt;
841   if(fh2TrackPt) delete fh2TrackPt;
842   if(fh2Xi)      delete fh2Xi;
843   if(fh2Z)       delete fh2Z;
844 }
845
846 //_________________________________________________________________
847 void AliAnalysisTaskIDFFTCF::AliFragFuncHistos::DefineHistos()
848 {
849   // book FF histos
850
851   fh1JetPt   = new TH1F(Form("fh1FFJetPt%s", fNameFF.Data()),"",fNBinsJetPt,fJetPtMin,fJetPtMax);
852   fh2TrackPt = new TH2F(Form("fh2FFTrackPt%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax,fNBinsPt, fPtMin, fPtMax);
853   fh2Z       = new TH2F(Form("fh2FFZ%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsZ, fZMin, fZMax);
854   fh2Xi      = new TH2F(Form("fh2FFXi%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsXi, fXiMin, fXiMax);
855
856   AliAnalysisTaskIDFFTCF::SetProperties(fh1JetPt, "p_{T} [GeV/c]", "entries"); 
857   AliAnalysisTaskIDFFTCF::SetProperties(fh2TrackPt,"jet p_{T} [GeV/c]","p_{T} [GeV/c]","entries");
858   AliAnalysisTaskIDFFTCF::SetProperties(fh2Xi,"jet p_{T} [GeV/c]","#xi", "entries");
859   AliAnalysisTaskIDFFTCF::SetProperties(fh2Z,"jet p_{T} [GeV/c]","z","entries");
860 }
861
862 //_______________________________________________________________________________________________________________
863 void AliAnalysisTaskIDFFTCF::AliFragFuncHistos::FillFF(Float_t trackPt, Float_t jetPt, Bool_t incrementJetPt, Float_t norm, 
864                                                                         Bool_t scaleStrangeness, Float_t scaleFacStrangeness)
865 {
866
867   // fill FF
868
869   if(incrementJetPt && norm) fh1JetPt->Fill(jetPt,1/norm);
870   else if(incrementJetPt) fh1JetPt->Fill(jetPt);
871
872  // Added for proper normalization of FF background estimation
873   // when zero track are found in the background region
874   if((int)trackPt==-1) return;
875  
876   if(norm)fh2TrackPt->Fill(jetPt,trackPt,1/norm);
877   else if(scaleStrangeness) fh2TrackPt->Fill(jetPt,trackPt,scaleFacStrangeness);
878   else fh2TrackPt->Fill(jetPt,trackPt);
879  
880   Double_t z = 0.;
881   if(jetPt>0) z = trackPt / jetPt;
882   Double_t xi = 0;
883   if(z>0) xi = TMath::Log(1/z);
884   
885   if(trackPt>(1-1e-06)*jetPt && trackPt<(1+1e-06)*jetPt){ // case z=1 : move entry to last histo bin <1
886     z  = 1-1e-06;
887     xi = 1e-06;
888   }
889
890
891   if(norm){
892     fh2Xi->Fill(jetPt,xi,1/norm);
893     fh2Z->Fill(jetPt,z,1/norm);
894   }
895   else if(scaleStrangeness){
896     fh2Xi->Fill(jetPt,xi,scaleFacStrangeness);
897     fh2Z->Fill(jetPt,z,scaleFacStrangeness);
898   }
899   else {
900     fh2Xi->Fill(jetPt,xi);
901     fh2Z->Fill(jetPt,z);
902   }
903 }
904
905 //_________________________________________________________________________________
906 void AliAnalysisTaskIDFFTCF::AliFragFuncHistos::AddToOutput(TList* list) const
907 {
908   // add histos to list
909
910   list->Add(fh1JetPt);
911   
912   list->Add(fh2TrackPt);
913   list->Add(fh2Xi);
914   list->Add(fh2Z);
915 }
916
917 //_________________________________________________________________________________________________________
918 AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::AliFragFuncQAJetHistos(const char* name,
919                                                                Int_t nPt,   Float_t ptMin,   Float_t ptMax,
920                                                                Int_t nEta,  Float_t etaMin,  Float_t etaMax,
921                                                                Int_t nPhi,  Float_t phiMin,  Float_t phiMax)
922   : TObject()
923   ,fNBinsPt(nPt)
924   ,fPtMin(ptMin)
925   ,fPtMax(ptMax)
926   ,fNBinsEta(nEta)
927   ,fEtaMin(etaMin)
928   ,fEtaMax(etaMax)
929   ,fNBinsPhi(nPhi)
930   ,fPhiMin(phiMin)
931   ,fPhiMax(phiMax)
932   ,fh2EtaPhi(0)
933   ,fh1Pt(0)
934   ,fNameQAJ(name)
935 {
936   // default constructor
937 }
938
939 //____________________________________________________________________________________
940 AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::AliFragFuncQAJetHistos(const AliFragFuncQAJetHistos& copy)
941   : TObject()
942   ,fNBinsPt(copy.fNBinsPt)
943   ,fPtMin(copy.fPtMin)
944   ,fPtMax(copy.fPtMax)
945   ,fNBinsEta(copy.fNBinsEta)
946   ,fEtaMin(copy.fEtaMin)
947   ,fEtaMax(copy.fEtaMax)
948   ,fNBinsPhi(copy.fNBinsPhi)
949   ,fPhiMin(copy.fPhiMin)
950   ,fPhiMax(copy.fPhiMax)
951   ,fh2EtaPhi(copy.fh2EtaPhi)
952   ,fh1Pt(copy.fh1Pt)
953   ,fNameQAJ(copy.fNameQAJ)
954 {
955   // copy constructor
956 }
957
958 //________________________________________________________________________________________________________________________________________________________________________
959 AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos& AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::operator=(const AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos& o)
960 {
961   // assignment
962   
963   if(this!=&o){
964     TObject::operator=(o);
965     fNBinsPt  = o.fNBinsPt;
966     fPtMin    = o.fPtMin;
967     fPtMax    = o.fPtMax;
968     fNBinsEta = o.fNBinsEta;
969     fEtaMin   = o.fEtaMin;
970     fEtaMax   = o.fEtaMax;
971     fNBinsPhi = o.fNBinsPhi;
972     fPhiMin   = o.fPhiMin;
973     fPhiMax   = o.fPhiMax;
974     fh2EtaPhi = o.fh2EtaPhi;
975     fh1Pt     = o.fh1Pt;
976     fNameQAJ  = o.fNameQAJ;
977   }
978   
979   return *this;
980 }
981
982 //______________________________________________________________
983 AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::~AliFragFuncQAJetHistos()
984 {
985   // destructor 
986   
987   if(fh2EtaPhi) delete fh2EtaPhi;
988   if(fh1Pt)     delete fh1Pt;
989 }
990
991 //____________________________________________________________________
992 void AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::DefineHistos()
993 {
994   // book jet QA histos
995
996   fh2EtaPhi  = new TH2F(Form("fh2JetQAEtaPhi%s", fNameQAJ.Data()), Form("%s: #eta - #phi distribution", fNameQAJ.Data()), fNBinsEta, fEtaMin, fEtaMax, fNBinsPhi, fPhiMin, fPhiMax);
997   fh1Pt      = new TH1F(Form("fh1JetQAPt%s", fNameQAJ.Data()), Form("%s: p_{T} distribution", fNameQAJ.Data()), fNBinsPt, fPtMin, fPtMax);
998         
999   AliAnalysisTaskIDFFTCF::SetProperties(fh2EtaPhi, "#eta", "#phi"); 
1000   AliAnalysisTaskIDFFTCF::SetProperties(fh1Pt, "p_{T} [GeV/c]", "entries");
1001 }
1002
1003 //____________________________________________________________________________________________________
1004 void AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::FillJetQA(Float_t eta, Float_t phi, Float_t pt)
1005 {
1006   // fill jet QA histos 
1007
1008   fh2EtaPhi->Fill( eta, phi);
1009   fh1Pt->Fill( pt );
1010 }
1011
1012 //____________________________________________________________________________________
1013 void AliAnalysisTaskIDFFTCF::AliFragFuncQAJetHistos::AddToOutput(TList* list) const 
1014 {
1015   // add histos to list
1016
1017   list->Add(fh2EtaPhi);
1018   list->Add(fh1Pt);
1019 }
1020
1021 //___________________________________________________________________________________________________________
1022 AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::AliFragFuncQATrackHistos(const char* name,
1023                                                                    Int_t nPt, Float_t ptMin, Float_t ptMax,
1024                                                                    Int_t nEta, Float_t etaMin, Float_t etaMax,
1025                                                                    Int_t nPhi, Float_t phiMin, Float_t phiMax,
1026                                                                    Float_t ptThresh) 
1027   : TObject()
1028   ,fNBinsPt(nPt)
1029   ,fPtMin(ptMin)
1030   ,fPtMax(ptMax)
1031   ,fNBinsEta(nEta)
1032   ,fEtaMin(etaMin)
1033   ,fEtaMax(etaMax)
1034   ,fNBinsPhi(nPhi)
1035   ,fPhiMin(phiMin)
1036   ,fPhiMax(phiMax)
1037   ,fHighPtThreshold(ptThresh)
1038   ,fh2EtaPhi(0)
1039   ,fh1Pt(0)
1040   ,fh2HighPtEtaPhi(0)
1041   ,fh2PhiPt(0)
1042   ,fNameQAT(name)
1043 {
1044   // default constructor
1045 }
1046
1047 //__________________________________________________________________________________________
1048 AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::AliFragFuncQATrackHistos(const AliFragFuncQATrackHistos& copy)
1049   : TObject()
1050   ,fNBinsPt(copy.fNBinsPt)
1051   ,fPtMin(copy.fPtMin)
1052   ,fPtMax(copy.fPtMax)
1053   ,fNBinsEta(copy.fNBinsEta)
1054   ,fEtaMin(copy.fEtaMin)
1055   ,fEtaMax(copy.fEtaMax)
1056   ,fNBinsPhi(copy.fNBinsPhi)
1057   ,fPhiMin(copy.fPhiMin)
1058   ,fPhiMax(copy.fPhiMax)
1059   ,fHighPtThreshold(copy.fHighPtThreshold)
1060   ,fh2EtaPhi(copy.fh2EtaPhi)
1061   ,fh1Pt(copy.fh1Pt)
1062   ,fh2HighPtEtaPhi(copy.fh2HighPtEtaPhi)
1063   ,fh2PhiPt(copy.fh2PhiPt)
1064   ,fNameQAT(copy.fNameQAT)
1065 {
1066   // copy constructor
1067 }
1068
1069 // _____________________________________________________________________________________________________________________________________________________________________________
1070 AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos& AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::operator=(const AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos& o)
1071 {
1072   // assignment
1073   
1074   if(this!=&o){
1075     TObject::operator=(o);
1076     fNBinsPt         = o.fNBinsPt;
1077     fPtMin           = o.fPtMin;
1078     fPtMax           = o.fPtMax;
1079     fNBinsEta        = o.fNBinsEta;
1080     fEtaMin          = o.fEtaMin;
1081     fEtaMax          = o.fEtaMax;
1082     fNBinsPhi        = o.fNBinsPhi;
1083     fPhiMin          = o.fPhiMin;
1084     fPhiMax          = o.fPhiMax;
1085     fHighPtThreshold = o.fHighPtThreshold;
1086     fh2EtaPhi        = o.fh2EtaPhi;
1087     fh1Pt            = o.fh1Pt;
1088     fh2HighPtEtaPhi  = o.fh2HighPtEtaPhi;
1089     fh2PhiPt         = o.fh2PhiPt;
1090     fNameQAT         = o.fNameQAT;
1091   }
1092   
1093   return *this;
1094 }
1095
1096 //___________________________________________________________________
1097 AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::~AliFragFuncQATrackHistos()
1098 {
1099   // destructor 
1100   
1101   if(fh2EtaPhi)       delete fh2EtaPhi;
1102   if(fh2HighPtEtaPhi) delete fh2HighPtEtaPhi;
1103   if(fh1Pt)           delete fh1Pt;
1104   if(fh2PhiPt)        delete fh2PhiPt;
1105 }
1106
1107 //______________________________________________________________________
1108 void AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::DefineHistos()
1109 {
1110   // book track QA histos
1111
1112   fh2EtaPhi       = new TH2F(Form("fh2TrackQAEtaPhi%s", fNameQAT.Data()), Form("%s: #eta - #phi distribution", fNameQAT.Data()), fNBinsEta, fEtaMin, fEtaMax, fNBinsPhi, fPhiMin, fPhiMax);
1113   fh2HighPtEtaPhi = new TH2F(Form("fh2TrackQAHighPtEtaPhi%s", fNameQAT.Data()), Form("%s: #eta - #phi distribution for high-p_{T}", fNameQAT.Data()), fNBinsEta, fEtaMin, fEtaMax, fNBinsPhi, fPhiMin, fPhiMax);
1114   fh1Pt           = new TH1F(Form("fh1TrackQAPt%s", fNameQAT.Data()), Form("%s: p_{T} distribution", fNameQAT.Data()), fNBinsPt, fPtMin, fPtMax);
1115     fh2PhiPt        = new TH2F(Form("fh2TrackQAPhiPt%s", fNameQAT.Data()), Form("%s: #phi - p_{T} distribution", fNameQAT.Data()), fNBinsPhi, fPhiMin, fPhiMax, fNBinsPt, fPtMin, fPtMax);
1116
1117   AliAnalysisTaskIDFFTCF::SetProperties(fh2EtaPhi, "#eta", "#phi"); 
1118   AliAnalysisTaskIDFFTCF::SetProperties(fh2HighPtEtaPhi, "#eta", "#phi");
1119   AliAnalysisTaskIDFFTCF::SetProperties(fh1Pt, "p_{T} [GeV/c]", "entries");
1120   AliAnalysisTaskIDFFTCF::SetProperties(fh2PhiPt, "#phi", "p_{T} [GeV/c]"); 
1121 }
1122
1123
1124
1125 //________________________________________________________________________________________________________
1126 void AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::FillTrackQA(Float_t eta, Float_t phi, Float_t pt, Bool_t weightPt, Float_t norm, 
1127                                                                                     Bool_t scaleStrangeness, Float_t scaleFacStrangeness)
1128 {
1129   // fill track QA histos
1130   Float_t weight = 1.;
1131   if(weightPt) weight = pt;  
1132   fh2EtaPhi->Fill( eta, phi, weight);
1133   if(scaleStrangeness) fh2EtaPhi->Fill( eta, phi, scaleFacStrangeness);
1134   if(pt > fHighPtThreshold) fh2HighPtEtaPhi->Fill( eta, phi, weight);
1135   if(pt > fHighPtThreshold && scaleStrangeness) fh2HighPtEtaPhi->Fill( eta, phi, weight);
1136   if(norm) fh1Pt->Fill( pt, 1/norm );
1137   else if(scaleStrangeness) fh1Pt->Fill(pt,scaleFacStrangeness); 
1138   else  fh1Pt->Fill( pt );
1139
1140   if(scaleFacStrangeness) fh2PhiPt->Fill(phi, pt, scaleFacStrangeness);
1141   else fh2PhiPt->Fill(phi, pt);
1142 }
1143
1144 //______________________________________________________________________________________
1145 void AliAnalysisTaskIDFFTCF::AliFragFuncQATrackHistos::AddToOutput(TList* list) const
1146 {
1147   // add histos to list
1148
1149   list->Add(fh2EtaPhi);
1150   list->Add(fh2HighPtEtaPhi);
1151   list->Add(fh1Pt);
1152   list->Add(fh2PhiPt);
1153 }
1154
1155 //_________________________________________________________________________________
1156 Bool_t AliAnalysisTaskIDFFTCF::Notify()
1157 {
1158   //
1159   // Implemented Notify() to read the cross sections
1160   // and number of trials from pyxsec.root
1161   // (taken from AliAnalysisTaskJetSpectrum2)
1162   // 
1163   TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
1164   Float_t xsection = 0;
1165   Float_t ftrials  = 1;
1166
1167   fAvgTrials = 1;
1168   if(tree){
1169     TFile *curfile = tree->GetCurrentFile();
1170     if (!curfile) {
1171       Error("Notify","No current file");
1172       return kFALSE;
1173     }
1174     if(!fh1Xsec||!fh1Trials){
1175       Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
1176       return kFALSE;
1177     }
1178     AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
1179     fh1Xsec->Fill("<#sigma>",xsection);
1180     // construct a poor man average trials 
1181     Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
1182     if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
1183   }
1184
1185   // Set seed for backg study
1186   fRandom = new TRandom3();
1187   fRandom->SetSeed(0);
1188
1189   return kTRUE;
1190 }
1191
1192 //__________________________________________________________________
1193 void AliAnalysisTaskIDFFTCF::UserCreateOutputObjects()
1194 {
1195   // create output objects
1196
1197   if(fDebug > 1) Printf("AliAnalysisTaskIDFFTCF::UserCreateOutputObjects()");
1198  
1199   // create list of tracks and jets 
1200
1201   fTracksRecCuts = new TList();
1202   fTracksRecCuts->SetOwner(kFALSE);  
1203
1204   fTracksGen = new TList();
1205   fTracksGen->SetOwner(kFALSE);
1206
1207   fTracksAODMCCharged = new TList();
1208   fTracksAODMCCharged->SetOwner(kFALSE);
1209     
1210   fTracksAODMCChargedSec = new TList();
1211   fTracksAODMCChargedSec->SetOwner(kFALSE);
1212
1213   fTracksRecQualityCuts = new TList(); 
1214   fTracksRecQualityCuts->SetOwner(kFALSE);
1215
1216   fJetsRec = new TList();
1217   fJetsRec->SetOwner(kFALSE);
1218
1219   fJetsRecCuts = new TList();
1220   fJetsRecCuts->SetOwner(kFALSE);
1221
1222   fJetsGen = new TList();
1223   fJetsGen->SetOwner(kFALSE);
1224
1225   fJetsRecEff = new TList();
1226   fJetsRecEff->SetOwner(kFALSE);
1227
1228   //
1229   // Create histograms / output container
1230   //
1231
1232   OpenFile(1);
1233   fCommonHistList = new TList();
1234   fCommonHistList->SetOwner(kTRUE);
1235
1236   Bool_t oldStatus = TH1::AddDirectoryStatus();
1237   TH1::AddDirectory(kFALSE);  
1238   
1239   // Histograms 
1240   fh1EvtSelection            = new TH1F("fh1EvtSelection", "Event Selection", 6, -0.5, 5.5);
1241   fh1EvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
1242   fh1EvtSelection->GetXaxis()->SetBinLabel(2,"event selection: rejected");
1243   fh1EvtSelection->GetXaxis()->SetBinLabel(3,"event class: rejected");
1244   fh1EvtSelection->GetXaxis()->SetBinLabel(4,"vertex Ncontr: rejected");
1245   fh1EvtSelection->GetXaxis()->SetBinLabel(5,"vertex z: rejected");
1246   fh1EvtSelection->GetXaxis()->SetBinLabel(6,"vertex type: rejected");
1247   
1248   fh1VertexNContributors     = new TH1F("fh1VertexNContributors", "Vertex N contributors", 2500,-.5, 2499.5);
1249   fh1VertexZ                 = new TH1F("fh1VertexZ", "Vertex z distribution", 30, -15., 15.);
1250   fh1EvtMult                 = new TH1F("fh1EvtMult","Event multiplicity, track pT cut > 150 MeV/c, |#eta| < 0.9",120,0.,12000.);
1251   fh1EvtCent                 = new TH1F("fh1EvtCent","centrality",100,0.,100.);
1252
1253   fh1Xsec                    = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
1254   fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
1255   fh1Trials                  = new TH1F("fh1Trials","trials from pyxsec.root",1,0,1);
1256   fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
1257   fh1PtHard                  = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
1258   fh1PtHardTrials            = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
1259
1260   fh1nRecJetsCuts            = new TH1F("fh1nRecJetsCuts","reconstructed jets per event",10,-0.5,9.5);
1261   fh1nGenJets                = new TH1F("fh1nGenJets","generated jets per event",10,-0.5,9.5);
1262   fh1nRecEffJets             = new TH1F("fh1nRecEffJets","reconstruction effiency: jets per event",10,-0.5,9.5);
1263
1264   fh2PtRecVsGenPrim          = new TH2F("fh2PtRecVsGenPrim","rec vs gen pt",fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax,fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax);
1265   fh2PtRecVsGenSec           = new TH2F("fh2PtRecVsGenSec","rec vs gen pt",fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax,fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax);
1266   
1267
1268   if(fQAMode){
1269     if(fQAMode&1){ // track QA
1270       fQATrackHistosRecCuts      = new AliFragFuncQATrackHistos("RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
1271                                                                 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
1272                                                                 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
1273                                                                 fQATrackHighPtThreshold);
1274       fQATrackHistosGen          = new AliFragFuncQATrackHistos("Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
1275                                                                 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
1276                                                                 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
1277                                                                 fQATrackHighPtThreshold);
1278     }
1279     
1280     if(fQAMode&2){ // jet QA
1281       fQAJetHistosRec            = new AliFragFuncQAJetHistos("Rec", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1282                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
1283                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
1284       fQAJetHistosRecCuts        = new AliFragFuncQAJetHistos("RecCuts", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1285                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
1286                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
1287       fQAJetHistosRecCutsLeading = new AliFragFuncQAJetHistos("RecCutsLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1288                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
1289                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
1290       fQAJetHistosGen            = new AliFragFuncQAJetHistos("Gen", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1291                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
1292                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
1293       fQAJetHistosGenLeading     = new AliFragFuncQAJetHistos("GenLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1294                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
1295                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);  
1296
1297       if(fEffMode) fQAJetHistosRecEffLeading  = new AliFragFuncQAJetHistos("RecEffLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
1298                                                                            fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
1299     }
1300   } // end: QA
1301
1302   if(fFFMode){
1303     
1304
1305
1306     fTHnIDFF  = AliIDFFUtils::GetTHn("THnIDFF");
1307     fTHnIncl  = AliIDFFUtils::GetTHn("THnIncl");
1308   } // end: FF
1309   
1310   // efficiency
1311
1312
1313
1314     
1315   // ____________ define histograms ____________________
1316   
1317   if(fQAMode){
1318     if(fQAMode&1){ // track QA
1319       fQATrackHistosRecCuts->DefineHistos();
1320       fQATrackHistosGen->DefineHistos();
1321     }
1322
1323     if(fQAMode&2){ // jet QA
1324       fQAJetHistosRec->DefineHistos();
1325       fQAJetHistosRecCuts->DefineHistos();
1326       fQAJetHistosRecCutsLeading->DefineHistos();
1327       fQAJetHistosGen->DefineHistos();
1328       fQAJetHistosGenLeading->DefineHistos();
1329       if(fEffMode) fQAJetHistosRecEffLeading->DefineHistos();
1330     }
1331   }
1332   
1333   if(fFFMode){
1334     fCommonHistList->Add(fTHnIDFF);
1335     fCommonHistList->Add(fTHnIncl);
1336   }
1337     
1338   Bool_t genJets    = (fJetTypeGen != kJetsUndef) ? kTRUE : kFALSE;
1339   Bool_t genTracks  = (fTrackTypeGen != kTrackUndef) ? kTRUE : kFALSE;
1340   Bool_t recJetsEff = (fJetTypeRecEff != kJetsUndef) ? kTRUE : kFALSE;
1341
1342   fCommonHistList->Add(fh1EvtSelection);
1343   fCommonHistList->Add(fh1EvtMult);
1344   fCommonHistList->Add(fh1EvtCent);
1345   fCommonHistList->Add(fh1VertexNContributors);
1346   fCommonHistList->Add(fh1VertexZ);    
1347   fCommonHistList->Add(fh1nRecJetsCuts);
1348   fCommonHistList->Add(fh1Xsec);
1349   fCommonHistList->Add(fh1Trials);
1350   fCommonHistList->Add(fh1PtHard);
1351   fCommonHistList->Add(fh1PtHardTrials);
1352  
1353   if(genJets) fCommonHistList->Add(fh1nGenJets);
1354  
1355   // QA  
1356   if(fQAMode){
1357     if(fQAMode&1){ // track QA
1358       fQATrackHistosRecCuts->AddToOutput(fCommonHistList);
1359       if(genTracks) fQATrackHistosGen->AddToOutput(fCommonHistList);
1360     }
1361
1362     if(fQAMode&2){ // jet QA
1363       fQAJetHistosRec->AddToOutput(fCommonHistList);
1364       fQAJetHistosRecCuts->AddToOutput(fCommonHistList);
1365       fQAJetHistosRecCutsLeading->AddToOutput(fCommonHistList);
1366       if(recJetsEff && fEffMode) fQAJetHistosRecEffLeading->AddToOutput(fCommonHistList); 
1367       if(genJets){
1368         fQAJetHistosGen->AddToOutput(fCommonHistList);
1369         fQAJetHistosGenLeading->AddToOutput(fCommonHistList);
1370       }
1371     }
1372   }
1373
1374   if(fFFMode){
1375     BookFFHistos(fCommonHistList,&fFFHistosRecCutsInc,"RecCutsInc",&fFFHistosGenInc,"GenInc");
1376     BookFFHistos(fCommonHistList,&fFFHistosRecLeadingTrack,"RecLeadingTrack",&fFFHistosGenLeadingTrack,"GenLeadingTrack");
1377   }
1378     
1379
1380   if(fFFMode && genTracks){ 
1381     BookFFHistos(fCommonHistList,&fFFHistosRecCutsIncPi,"RecCutsInc_piPlusPiMinus",&fFFHistosGenIncPi,"GenInc_piPlusPiMinus");
1382     BookFFHistos(fCommonHistList,&fFFHistosRecCutsIncPro,"RecCutsInc_ppbar",&fFFHistosGenIncPro,"GenInc_ppbar");
1383     BookFFHistos(fCommonHistList,&fFFHistosRecCutsIncK,"RecCutsInc_kPlusKMinus",&fFFHistosGenIncK,"GenInc_kPlusKMinus");
1384     BookFFHistos(fCommonHistList,&fFFHistosRecCutsIncEl,"RecCutsInc_ePlusEMinus",&fFFHistosGenIncEl,"GenInc_ePlusEMinus");
1385     BookFFHistos(fCommonHistList,&fFFHistosRecCutsIncMu,"RecCutsInc_muPlusMuMinus",&fFFHistosGenIncMu,"GenInc_muPlusMuMinus");
1386   }
1387
1388
1389   if(fEffMode && recJetsEff && genTracks){
1390     if(fQAMode&1){
1391       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRec,"RecEffRec",&fQATrackHistosRecEffGen,"RecEffGen",&fQATrackHistosSecRec,"SecRec");
1392       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecPi,"RecEffRec_piPlusPiMinus",&fQATrackHistosRecEffGenPi,"RecEffGen_piPlusPiMinus",&fQATrackHistosSecRecPi,"SecRec_piPlusPiMinus");
1393       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecPro,"RecEffRec_ppbar",&fQATrackHistosRecEffGenPro,"RecEffGen_ppbar",&fQATrackHistosSecRecPro,"SecRec_ppbar");
1394       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecK,"RecEffRec_kPlusKMinus",&fQATrackHistosRecEffGenK,"RecEffGen_kPlusKMinus",&fQATrackHistosSecRecK,"SecRec_kPlusKMinus");
1395       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecEl,"RecEffRec_ePlusEMinus",&fQATrackHistosRecEffGenEl,"RecEffGen_ePlusEMinus",&fQATrackHistosSecRecEl,"SecRec_ePlusEMinus");
1396       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecMu,"RecEffRec_muPlusMuMinus",&fQATrackHistosRecEffGenMu,"RecEffGen_muPlusMuMinus",&fQATrackHistosSecRecMu,"SecRec_muPlusMuMinus");
1397       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecProGFL,"RecEffRec_ppbarGFL",0,"",&fQATrackHistosSecRecProGFL,"SecRec_ppbarGFL");
1398       BookQAHistos(fCommonHistList,&fQATrackHistosRecEffRecKGFL,"RecEffRec_kPlusKMinusGFL",0,"",&fQATrackHistosSecRecKGFL,"SecRec_kPlusKMinusGFL");
1399     }
1400     if(fFFMode){
1401       BookFFHistos(fCommonHistList,&fFFHistosRecEffRec,"RecEffRec",0x0,"",&fFFHistosSecRec,"SecRec");
1402       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecPi,"RecEffRec_piPlusPiMinus",0x0,"",&fFFHistosSecRecPi,"SecRec_piPlusPiMinus");
1403       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecPro,"RecEffRec_ppbar",0x0,"",&fFFHistosSecRecPro,"SecRec_ppbar");
1404       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecK,"RecEffRec_kPlusKMinus",0x0,"",&fFFHistosSecRecK,"SecRec_kPlusKMinus");
1405       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecEl,"RecEffRec_ePlusEMinus",0x0,"",&fFFHistosSecRecEl,"SecRec_ePlusEMinus");
1406       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecMu,"RecEffRec_muPlusMuMinus",0x0,"",&fFFHistosSecRecMu,"SecRec_muPlusMuMinus");
1407       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecProGFL,"RecEffRec_ppbarGFL",0x0,"",&fFFHistosSecRecProGFL,"SecRec_ppbarGFL");
1408       BookFFHistos(fCommonHistList,&fFFHistosRecEffRecKGFL,"RecEffRec_kPlusKMinusGFL",0x0,"",&fFFHistosSecRecKGFL,"SecRec_kPlusKMinusGFL");
1409     }
1410
1411     fCommonHistList->Add(fh1nRecEffJets);
1412     fCommonHistList->Add(fh2PtRecVsGenPrim); 
1413     fCommonHistList->Add(fh2PtRecVsGenSec); 
1414   }
1415   
1416   // =========== Switch on Sumw2 for all histos ===========
1417   for (Int_t i=0; i<fCommonHistList->GetEntries(); ++i){
1418     TH1 *h1 = dynamic_cast<TH1*>(fCommonHistList->At(i));
1419     if (h1) h1->Sumw2();
1420     else{
1421       THnSparse *hnSparse = dynamic_cast<THnSparse*>(fCommonHistList->At(i));
1422       if(hnSparse) hnSparse->Sumw2();
1423     }
1424   }
1425   
1426   TH1::AddDirectory(oldStatus);
1427
1428   PostData(1, fCommonHistList);
1429
1430   if(fStream){
1431     PostData(2, fTree);
1432   }
1433 }
1434
1435 //_______________________________________________
1436 void AliAnalysisTaskIDFFTCF::Init()
1437 {
1438   // Initialization
1439   if(fDebug > 1) Printf("AliAnalysisTaskIDFFTCF::Init()");
1440
1441 }
1442
1443 //_____________________________________________________________
1444 void AliAnalysisTaskIDFFTCF::UserExec(Option_t *) 
1445 {
1446   AliIDFFUtils::fPid = 0x0;
1447
1448   // Main loop
1449   // Called for each event
1450   if(fDebug > 1) Printf("AliAnalysisTaskIDFFTCF::UserExec()");
1451   
1452   
1453   if(fDebug > 1) Printf("Analysis event #%5d", (Int_t) fEntry);
1454
1455   // Trigger selection
1456   AliInputEventHandler* inputHandler = (AliInputEventHandler*)
1457     ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1458   
1459   if(!(inputHandler->IsEventSelected() & fEvtSelectionMask)){
1460     fh1EvtSelection->Fill(1.);
1461     if (fDebug > 1 ) Printf(" Trigger Selection: event REJECTED ... ");
1462     PostData(1, fCommonHistList);
1463     return;
1464   }
1465   
1466   fESD = dynamic_cast<AliESDEvent*>(InputEvent());
1467   if(!fESD){
1468     if(fDebug>3) Printf("%s:%d ESDEvent not found in the input", (char*)__FILE__,__LINE__);
1469   }
1470   
1471   fMCEvent = MCEvent();
1472   if(!fMCEvent){
1473     if(fDebug>3) Printf("%s:%d MCEvent not found in the input", (char*)__FILE__,__LINE__);
1474   }
1475   
1476   // get AOD event from input/ouput
1477   TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
1478   if( handler && handler->InheritsFrom("AliAODInputHandler") ) {
1479     fAOD  =  ((AliAODInputHandler*)handler)->GetEvent();
1480     AliIDFFUtils::fPid = ((AliAODInputHandler*)handler)->GetPIDResponse();
1481     if(fUseAODInputJets) fAODJets = fAOD;
1482     if (fDebug > 1)  Printf("%s:%d AOD event from input", (char*)__FILE__,__LINE__);
1483   }
1484   else {
1485     handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
1486     if( handler && handler->InheritsFrom("AliAODHandler") ) {
1487       fAOD = ((AliAODHandler*)handler)->GetAOD();
1488       
1489       AliInputEventHandler* esdinputHandler = 
1490         (AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
1491       AliIDFFUtils::fPid = esdinputHandler->GetPIDResponse();
1492      
1493       fAODJets = fAOD;
1494       if (fDebug > 1)  Printf("%s:%d AOD event from output", (char*)__FILE__,__LINE__);
1495     }
1496   }
1497   
1498   if(!fAODJets && !fUseAODInputJets){ // case we have AOD in input & output and want jets from output
1499     TObject* outHandler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
1500     if( outHandler && outHandler->InheritsFrom("AliAODHandler") ) {
1501       fAODJets = ((AliAODHandler*)outHandler)->GetAOD();
1502       if (fDebug > 1)  Printf("%s:%d jets from output AOD", (char*)__FILE__,__LINE__);
1503     }
1504   }
1505   
1506   if(fNonStdFile.Length()!=0){
1507     // case we have an AOD extension - fetch the jets from the extended output
1508     
1509     AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1510     fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);    
1511     if(!fAODExtension){
1512       if(fDebug>1)Printf("AODExtension not found for %s",fNonStdFile.Data());
1513     }
1514   }
1515   
1516   if(!fAOD){
1517     Printf("%s:%d AODEvent not found", (char*)__FILE__,__LINE__);
1518     return;
1519   }
1520   if(!AliIDFFUtils::fPid){
1521     Printf("%s:%d PIDresponse not found", (char*)__FILE__,__LINE__);
1522     return;
1523   }
1524   if(!fAODJets){
1525     Printf("%s:%d AODEvent with jet branch not found", (char*)__FILE__,__LINE__);
1526     return;
1527   }
1528
1529   
1530   // event selection **************************************************
1531   // *** event class ***
1532   Double_t centPercent = -1;
1533   if(fEventClass>0){
1534     Int_t cl = 0;
1535     if(handler->InheritsFrom("AliAODInputHandler")){ 
1536       // since it is not supported by the helper task define own classes
1537       centPercent = fAOD->GetHeader()->GetCentrality();
1538       cl = 1;
1539       if(centPercent>10) cl = 2;
1540       if(centPercent>30) cl = 3;
1541       if(centPercent>50) cl = 4;
1542     }
1543     else {
1544       cl = AliAnalysisHelperJetTasks::EventClass();
1545       if(fESD) centPercent = fESD->GetCentrality()->GetCentralityPercentile("V0M"); // retrieve value 'by hand'
1546     }
1547     
1548     if(cl!=fEventClass){
1549       // event not in selected event class, reject event
1550       if (fDebug > 1) Printf("%s:%d event not in selected event class: event REJECTED ...",(char*)__FILE__,__LINE__);
1551       fh1EvtSelection->Fill(2.);
1552       PostData(1, fCommonHistList);
1553       return;
1554     }
1555   }
1556
1557   // *** vertex cut ***
1558   AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
1559   Int_t nTracksPrim = primVtx->GetNContributors();
1560   fh1VertexNContributors->Fill(nTracksPrim);
1561   
1562   
1563   if (fDebug > 1) Printf("%s:%d primary vertex selection: %d", (char*)__FILE__,__LINE__,nTracksPrim);
1564   if(!nTracksPrim){
1565     if (fDebug > 1) Printf("%s:%d primary vertex selection: event REJECTED...",(char*)__FILE__,__LINE__); 
1566     fh1EvtSelection->Fill(3.);
1567     PostData(1, fCommonHistList);
1568     return;
1569   }
1570   
1571   fh1VertexZ->Fill(primVtx->GetZ());
1572   
1573   if(TMath::Abs(primVtx->GetZ())>fMaxVertexZ){
1574     if (fDebug > 1) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ()); 
1575     fh1EvtSelection->Fill(4.);
1576     PostData(1, fCommonHistList);
1577     return; 
1578   }
1579   
1580   TString primVtxName(primVtx->GetName());
1581
1582   if(primVtxName.CompareTo("TPCVertex",TString::kIgnoreCase) == 1){
1583     if (fDebug > 1) Printf("%s:%d primary vertex selection: TPC vertex, event REJECTED...",(char*)__FILE__,__LINE__);
1584     fh1EvtSelection->Fill(5.);
1585     PostData(1, fCommonHistList);
1586     return;
1587   }
1588
1589   if (fDebug > 1) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__); 
1590   fh1EvtSelection->Fill(0.);
1591   fh1EvtCent->Fill(centPercent);
1592
1593
1594   //___ get MC information __________________________________________________________________
1595
1596   fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
1597
1598   Double_t ptHard = 0.;
1599   Double_t nTrials = 1; // trials for MC trigger weight for real data
1600
1601   if(fMCEvent){
1602     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
1603     
1604     if(genHeader){
1605       
1606       AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
1607       AliGenHijingEventHeader*  hijingGenHeader = 0x0;
1608       
1609       if(pythiaGenHeader){
1610         if(fDebug>3) Printf("%s:%d pythiaGenHeader found", (char*)__FILE__,__LINE__);
1611         nTrials = pythiaGenHeader->Trials();
1612         ptHard  = pythiaGenHeader->GetPtHard();
1613         
1614         fh1PtHard->Fill(ptHard);
1615         fh1PtHardTrials->Fill(ptHard,nTrials);
1616         
1617       } else { // no pythia, hijing?
1618         
1619         if(fDebug>3) Printf("%s:%d no pythiaGenHeader found", (char*)__FILE__,__LINE__);
1620         
1621         hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
1622         if(!hijingGenHeader){
1623           Printf("%s:%d no pythiaGenHeader or hjingGenHeader found", (char*)__FILE__,__LINE__);
1624         } else {
1625           if(fDebug>3) Printf("%s:%d hijingGenHeader found", (char*)__FILE__,__LINE__);
1626         }
1627       }
1628       
1629       //fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
1630     }
1631   }
1632   
1633   //___ fetch jets __________________________________________________________________________
1634   
1635   Int_t nJ = GetListOfJets(fJetsRec, kJetsRec);
1636   Int_t nRecJets = 0;
1637   if(nJ>=0) nRecJets = fJetsRec->GetEntries();
1638   if(fDebug>2)Printf("%s:%d Selected Rec jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
1639   if(nJ != nRecJets) Printf("%s:%d Mismatch Selected Rec Jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
1640   
1641   Int_t nJCuts = GetListOfJets(fJetsRecCuts, kJetsRecAcceptance);
1642   Int_t nRecJetsCuts = 0;
1643   if(nJCuts>=0) nRecJetsCuts = fJetsRecCuts->GetEntries();
1644   if(fDebug>2)Printf("%s:%d Selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
1645   if(nRecJetsCuts != nJCuts) Printf("%s:%d Mismatch selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
1646   fh1nRecJetsCuts->Fill(nRecJetsCuts);
1647
1648   if(fJetTypeGen==kJetsKine || fJetTypeGen == kJetsKineAcceptance) fJetsGen->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
1649
1650   Int_t nJGen  = GetListOfJets(fJetsGen, fJetTypeGen);
1651   Int_t nGenJets = 0;
1652   if(nJGen>=0) nGenJets = fJetsGen->GetEntries();
1653   if(fDebug>2)Printf("%s:%d Selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
1654   
1655   if(nJGen != nGenJets) Printf("%s:%d Mismatch selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
1656   fh1nGenJets->Fill(nGenJets);
1657   
1658   
1659   if(fJetTypeRecEff==kJetsKine || fJetTypeRecEff == kJetsKineAcceptance) fJetsRecEff->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
1660   Int_t nJRecEff  = GetListOfJets(fJetsRecEff, fJetTypeRecEff);
1661   Int_t nRecEffJets = 0;
1662   if(nJRecEff>=0) nRecEffJets = fJetsRecEff->GetEntries();
1663   if(fDebug>2)Printf("%s:%d Selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
1664   if(nJRecEff != nRecEffJets) Printf("%s:%d Mismatch selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
1665   fh1nRecEffJets->Fill(nRecEffJets);
1666   
1667       
1668   //____ fetch particles __________________________________________________________
1669   
1670   Int_t nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODCuts);
1671   
1672   Int_t nRecPartCuts = 0;
1673   if(nTCuts>=0) nRecPartCuts = fTracksRecCuts->GetEntries();
1674   if(fDebug>2)Printf("%s:%d Selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
1675   if(nRecPartCuts != nTCuts) Printf("%s:%d Mismatch selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
1676   fh1EvtMult->Fill(nRecPartCuts);
1677
1678
1679   Int_t nTGen = GetListOfTracks(fTracksGen,fTrackTypeGen);
1680   Int_t nGenPart = 0;
1681   if(nTGen>=0) nGenPart = fTracksGen->GetEntries();
1682   if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
1683   if(nGenPart != nTGen) Printf("%s:%d Mismatch selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
1684   
1685   
1686   //____ analysis, fill histos ___________________________________________________
1687   
1688   if(fQAMode){
1689     // loop over tracks
1690     if(fQAMode&1){
1691       for(Int_t it=0; it<nRecPartCuts; ++it){
1692         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksRecCuts->At(it));
1693         if(part)fQATrackHistosRecCuts->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt() );
1694
1695         // fill inclusive tracks XXX, they have the same track cuts!
1696         AliAODTrack * inclusiveaod  = dynamic_cast<AliAODTrack*>(fTracksRecCuts->At(it));
1697         if(inclusiveaod){
1698           AliIDFFUtils::FillTHn(fTHnIncl, -999, inclusiveaod, fAOD, fTOFCutMode);
1699         }
1700
1701       }      
1702       for(Int_t it=0; it<nGenPart; ++it){
1703         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksGen->At(it));
1704         if(part)fQATrackHistosGen->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt());
1705       }
1706     }
1707     
1708     // loop over jets
1709     if(fQAMode&2){
1710       for(Int_t ij=0; ij<nRecJets; ++ij){
1711         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRec->At(ij));
1712         if(jet)fQAJetHistosRec->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
1713       }
1714     }
1715   }
1716   
1717   if(fQAMode || fFFMode){
1718
1719     for(Int_t ij=0; ij<nRecJetsCuts; ++ij){
1720     
1721       AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
1722       Float_t jetPt  = jet->Pt();
1723       
1724       if(fQAMode&2) fQAJetHistosRecCuts->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt);
1725     
1726       if(fLeadingJets && ij>0) continue;  // leading/all jets
1727         
1728       if(fQAMode&2 && (ij==0) ) fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt );
1729       
1730       // get tracks in jet
1731       TList* jettracklist = new TList();
1732       Double_t sumPt      = 0.;
1733       Bool_t isBadJet     = kFALSE;
1734
1735       if(GetFFRadius()<=0)
1736         GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1737       else 
1738         GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, 
1739                              GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1740       
1741       if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
1742       
1743       if(isBadJet) continue; 
1744       
1745       for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1746         
1747         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
1748         if(!trackVP)continue;
1749         
1750         AliAODTrack * aodtrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
1751         if(!aodtrack) continue;
1752                 
1753         Float_t trackPt = trackVP->Pt();
1754         
1755         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
1756         
1757         if(fFFMode){
1758           
1759           fFFHistosRecCutsInc->FillFF(trackPt, jetPt, incrementJetPt); 
1760             
1761           AliIDFFUtils::FillTHn(fTHnIDFF, jetPt, aodtrack, fAOD, fTOFCutMode);
1762
1763           if(it==0){ // leading track, all jets 
1764             fFFHistosRecLeadingTrack->FillFF( trackPt, jetPt, kTRUE);
1765           }
1766         } 
1767
1768       }
1769       
1770       delete jettracklist;      
1771       
1772     } // end: rec. jets after cuts
1773
1774     // loop again over rec jets: 
1775     // PID histos (only for MC) 
1776
1777     if(fBranchGenJets.Length()>0){ // check if we're running over MC 
1778       
1779       for(Int_t ij=0; ij<nRecJetsCuts; ++ij){ // rec jets loop
1780         
1781         if(fLeadingJets && ij>0) continue;  // leading/all jets
1782
1783         TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
1784         if(!tca) continue;
1785         
1786         AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
1787         Float_t jetPt  = jet->Pt();
1788                 
1789         // get tracks in jet
1790         TList* jettracklist = new TList();
1791         Double_t sumPt      = 0.;
1792         Bool_t isBadJet     = kFALSE;
1793         
1794         if(GetFFRadius()<=0)
1795           GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1796         else 
1797           GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, 
1798                                GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1799         
1800         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
1801         
1802         if(isBadJet) continue; 
1803         
1804         Bool_t incrementJetPt = kTRUE; // there could be 0 tracks in jet: first fill jet pt histo once 
1805         fFFHistosRecCutsIncPi->FillFF(-1, jetPt, incrementJetPt);
1806         fFFHistosRecCutsIncPro->FillFF(-1, jetPt, incrementJetPt); 
1807         fFFHistosRecCutsIncK->FillFF(-1, jetPt, incrementJetPt);   
1808         fFFHistosRecCutsIncEl->FillFF(-1, jetPt, incrementJetPt);  
1809         fFFHistosRecCutsIncMu->FillFF(-1, jetPt, incrementJetPt);   
1810       
1811         incrementJetPt = kFALSE; 
1812
1813         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1814           
1815           AliAODTrack * rectrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
1816           if(!rectrack) continue;
1817
1818           Int_t label   = TMath::Abs(rectrack->GetLabel());
1819           Float_t recPt = rectrack->Pt();
1820           
1821           // find MC track in our list
1822           AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
1823           
1824           // Float_t genPt = gentrack->Pt();
1825                     
1826           if(gentrack){
1827             Int_t mcpdg = TMath::Abs(gentrack->GetPdgCode());
1828             
1829             if(mcpdg == 211)  fFFHistosRecCutsIncPi->FillFF(recPt, jetPt, incrementJetPt);
1830             if(mcpdg == 2212) fFFHistosRecCutsIncPro->FillFF(recPt, jetPt, incrementJetPt);
1831             if(mcpdg == 321)  fFFHistosRecCutsIncK->FillFF(recPt, jetPt, incrementJetPt);
1832             if(mcpdg == 11)   fFFHistosRecCutsIncEl->FillFF(recPt, jetPt, incrementJetPt);
1833             if(mcpdg == 13)   fFFHistosRecCutsIncMu->FillFF(recPt, jetPt, incrementJetPt); 
1834           }
1835         }
1836         delete jettracklist;    
1837         
1838       } // end: rec. jets after cuts
1839     } // MC 
1840
1841
1842     // generated jets
1843     for(Int_t ij=0; ij<nGenJets; ++ij){
1844       
1845       AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
1846       if(!jet)continue;
1847
1848       Float_t jetPt  = jet->Pt();
1849
1850       if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt);
1851
1852       if(fLeadingJets && ij>0) continue;  // leading/all jets
1853
1854       if(fQAMode&2 && (ij==0)) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt);
1855
1856       TList* jettracklist = new TList();
1857       Double_t sumPt      = 0.;
1858       Bool_t isBadJet     = kFALSE;
1859         
1860       if(GetFFRadius()<=0){
1861         GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1862       } else {
1863         GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1864       }
1865       
1866       if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
1867       
1868       if(isBadJet) continue; 
1869
1870       Bool_t incrementJetPt = kTRUE; // first fill jet pt histo once 
1871       fFFHistosGenInc->FillFF(-1, jetPt, incrementJetPt);
1872       fFFHistosGenIncPi->FillFF(-1, jetPt, incrementJetPt);
1873       fFFHistosGenIncPro->FillFF(-1, jetPt, incrementJetPt); 
1874       fFFHistosGenIncK->FillFF(-1, jetPt, incrementJetPt);   
1875       fFFHistosGenIncEl->FillFF(-1, jetPt, incrementJetPt);  
1876       fFFHistosGenIncMu->FillFF(-1, jetPt, incrementJetPt);   
1877
1878       incrementJetPt = kFALSE;
1879
1880       for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1881         
1882         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
1883         if(!trackVP)continue;
1884         
1885         Float_t trackPt = trackVP->Pt();
1886         
1887         if(fFFMode){
1888
1889           fFFHistosGenInc->FillFF( trackPt, jetPt, incrementJetPt);
1890
1891           AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*>(trackVP);
1892           
1893           if(gentrack){
1894             
1895             Int_t mcpdg = TMath::Abs(gentrack->GetPdgCode());
1896             
1897             if(mcpdg == 211)  fFFHistosGenIncPi->FillFF(trackPt, jetPt, incrementJetPt);
1898             if(mcpdg == 2212) fFFHistosGenIncPro->FillFF(trackPt, jetPt, incrementJetPt);
1899             if(mcpdg == 321)  fFFHistosGenIncK->FillFF(trackPt, jetPt, incrementJetPt);
1900             if(mcpdg == 11)   fFFHistosGenIncEl->FillFF(trackPt, jetPt, incrementJetPt);
1901             if(mcpdg == 13)   fFFHistosGenIncMu->FillFF(trackPt, jetPt, incrementJetPt);
1902           }
1903         }
1904         
1905         if(it==0){ // leading track, all jets 
1906           fFFHistosGenLeadingTrack->FillFF( trackPt, jetPt, kTRUE );      
1907         }
1908         
1909       } // track loop 
1910
1911       delete jettracklist;
1912
1913     } // gen jets loop     
1914   } // end: QA, FF and intra-jet
1915   
1916   
1917   // ____ efficiency _______________________________
1918
1919   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
1920
1921     // arrays holding for each generated particle the reconstructed AOD track index & isPrimary flag, are initialized in AssociateGenRec(...) function
1922     TArrayI indexAODTr; 
1923     TArrayS isGenPrim; 
1924
1925     // array holding for each reconstructed AOD track generated particle index, initialized in AssociateGenRec(...) function
1926     TArrayI indexMCTr; 
1927
1928     // ... and another set for secondaries from strange/non strange mothers (secondary MC tracks are stored in different lists)
1929     TArrayI indexAODTrSec; 
1930     TArrayS isGenSec; 
1931     TArrayI indexMCTrSec; 
1932    
1933     Int_t  nTracksAODMCCharged = GetListOfTracks(fTracksAODMCCharged, kTrackAODMCCharged);
1934     if(fDebug>2)Printf("%s:%d selected AODMC tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCCharged);
1935   
1936     Int_t  nTracksAODMCChargedSec = GetListOfTracks(fTracksAODMCChargedSec, kTrackAODMCChargedSec);
1937     if(fDebug>2)Printf("%s:%d selected AODMC secondary tracks NS: %d ",(char*)__FILE__,__LINE__,nTracksAODMCChargedSec);
1938   
1939
1940     Int_t  nTracksRecQualityCuts = GetListOfTracks(fTracksRecQualityCuts, kTrackAODQualityCuts);
1941     if(fDebug>2)Printf("%s:%d selected rec tracks quality after cuts, full acceptance/pt : %d ",(char*)__FILE__,__LINE__,nTracksRecQualityCuts);
1942   
1943     // associate gen and rec tracks, store indices in TArrays 
1944     AssociateGenRec(fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,indexMCTr,isGenPrim,fh2PtRecVsGenPrim); 
1945     AssociateGenRec(fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,indexMCTrSec,isGenSec,fh2PtRecVsGenSec);
1946   
1947     // single track eff 
1948     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGen,fQATrackHistosRecEffRec,fTracksAODMCCharged,indexAODTr,isGenPrim);
1949     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenPi,fQATrackHistosRecEffRecPi,fTracksAODMCCharged,indexAODTr,isGenPrim, 211);
1950     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenPro,fQATrackHistosRecEffRecPro,fTracksAODMCCharged,indexAODTr,isGenPrim, 2212);
1951     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenK,fQATrackHistosRecEffRecK,fTracksAODMCCharged,indexAODTr,isGenPrim, 321);
1952     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenEl,fQATrackHistosRecEffRecEl,fTracksAODMCCharged,indexAODTr,isGenPrim, 11);
1953     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenMu,fQATrackHistosRecEffRecMu,fTracksAODMCCharged,indexAODTr,isGenPrim, 13);
1954     if(fQAMode&1) FillSingleTrackHistosRecGen(0,fQATrackHistosRecEffRecProGFL,fTracksAODMCCharged,indexAODTr,isGenPrim, 2212,kTRUE);
1955     if(fQAMode&1) FillSingleTrackHistosRecGen(0,fQATrackHistosRecEffRecKGFL,fTracksAODMCCharged,indexAODTr,isGenPrim, 321,kTRUE);
1956
1957     // secondaries
1958     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec);
1959     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecPi,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,211);
1960     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecPro,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212);
1961     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecK,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321);
1962     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecEl,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,11);
1963     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecMu,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,13);
1964     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecProGFL,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212,kTRUE);
1965     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecKGFL,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321,kTRUE);
1966  
1967
1968     // jet track eff    
1969     Double_t sumPtGenLeadingJetRecEff = 0;
1970     Double_t sumPtGenLeadingJetSec    = 0;
1971     Double_t sumPtRecLeadingJetRecEff = 0;
1972     
1973     for(Int_t ij=0; ij<nRecEffJets; ++ij){ // jet loop 
1974   
1975         if(fLeadingJets && ij>0) continue;  // leading/all jets
1976  
1977         AliAODJet* jet = (AliAODJet*)(fJetsRecEff->At(ij));
1978         
1979         Bool_t isBadJetGenPrim = kFALSE;
1980         Bool_t isBadJetGenSec  = kFALSE;
1981         Bool_t isBadJetRec     = kFALSE;
1982         
1983         // for efficiency: gen tracks from pointing with gen/rec jet
1984         TList* jettracklistGenPrim = new TList();
1985         
1986         // if radius<0 -> trackRefs: collect gen tracks in wide radius + fill FF recEff rec histos with tracks contained in track refs
1987         // note : FF recEff gen histos will be somewhat useless in this approach
1988         
1989         if(GetFFRadius() >0)
1990           GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, GetFFRadius(), sumPtGenLeadingJetRecEff, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetGenPrim); 
1991         else
1992           GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, TMath::Abs(GetFFRadius())+0.2, sumPtGenLeadingJetRecEff, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetGenPrim); 
1993         
1994         TList* jettracklistGenSec = new TList();
1995         if(GetFFRadius() >0)
1996           GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, GetFFRadius(), sumPtGenLeadingJetSec, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetGenSec); 
1997         else
1998           GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, TMath::Abs(GetFFRadius())+0.2, sumPtGenLeadingJetSec, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetGenSec); 
1999         
2000         
2001         // bin efficiency in jet pt bins using rec tracks  
2002         TList* jettracklistRec = new TList();
2003         if(GetFFRadius() >0) GetJetTracksPointing(fTracksRecCuts,jettracklistRec, jet, GetFFRadius(), sumPtRecLeadingJetRecEff, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetRec); 
2004         else                 GetJetTracksTrackrefs(jettracklistRec, jet, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetRec); 
2005         
2006         
2007         Double_t jetEta   = jet->Eta();
2008         Double_t jetPhi   = TVector2::Phi_0_2pi(jet->Phi());
2009         
2010         if(GetFFMinNTracks()>0 && jettracklistGenPrim->GetSize()<=GetFFMinNTracks())   isBadJetGenPrim = kTRUE;
2011         if(GetFFMinNTracks()>0 && jettracklistGenSec->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
2012         if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())       isBadJetRec     = kTRUE;
2013         
2014         if(isBadJetRec) continue;
2015         
2016         if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
2017         
2018         if(fFFMode){
2019           
2020           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRec,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0); 
2021           else                FillJetTrackHistosRec(fFFHistosRecEffRec,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec);
2022           
2023           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecPi,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,211); 
2024           else                FillJetTrackHistosRec(fFFHistosRecEffRecPi,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,211);
2025
2026           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecPro,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,2212); 
2027           else                FillJetTrackHistosRec(fFFHistosRecEffRecPro,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,2212);
2028
2029           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecK,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,321); 
2030           else                FillJetTrackHistosRec(fFFHistosRecEffRecK,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,321);
2031
2032           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecEl,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,11); 
2033           else                FillJetTrackHistosRec(fFFHistosRecEffRecEl,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,11);
2034
2035           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecMu,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,13); 
2036           else                FillJetTrackHistosRec(fFFHistosRecEffRecMu,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,13);
2037
2038           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecProGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,2212,kTRUE); 
2039           else                FillJetTrackHistosRec(fFFHistosRecEffRecProGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,2212,kTRUE);
2040
2041           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecKGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,321,kTRUE); 
2042           else                FillJetTrackHistosRec(fFFHistosRecEffRecKGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,321,kTRUE);
2043
2044
2045
2046           // secondaries: use jet pt from primaries 
2047           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRec,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0);
2048           else                FillJetTrackHistosRec(fFFHistosSecRec,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec);
2049
2050           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecPi,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,211);
2051           else                FillJetTrackHistosRec(fFFHistosSecRecPi,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,211);
2052
2053           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecPro,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212); 
2054           else                FillJetTrackHistosRec(fFFHistosSecRecPro,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212);
2055
2056           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecK,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321); 
2057           else                FillJetTrackHistosRec(fFFHistosSecRecK,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321);
2058
2059           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecEl,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,11); 
2060           else                FillJetTrackHistosRec(fFFHistosSecRecEl,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,11);
2061
2062           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecMu,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,13);
2063           else                FillJetTrackHistosRec(fFFHistosSecRecMu,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,13);
2064
2065           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecProGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212,kTRUE); 
2066           else                FillJetTrackHistosRec(fFFHistosSecRecProGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212,kTRUE);
2067
2068           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecKGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321,kTRUE); 
2069           else                FillJetTrackHistosRec(fFFHistosSecRecKGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321,kTRUE); 
2070         }
2071         
2072         delete jettracklistGenPrim;
2073         delete jettracklistGenSec;
2074         delete jettracklistRec;   
2075         
2076     } // jet loop 
2077   } // eff mode
2078
2079   
2080   //___________________
2081   
2082   fTracksRecCuts->Clear();
2083   fTracksGen->Clear();
2084   fTracksAODMCCharged->Clear();
2085   fTracksAODMCChargedSec->Clear();
2086   fTracksRecQualityCuts->Clear();
2087
2088   fJetsRec->Clear();
2089   fJetsRecCuts->Clear();
2090   fJetsGen->Clear();
2091   fJetsRecEff->Clear();
2092   
2093   //Post output data.
2094   PostData(1, fCommonHistList);
2095 }
2096
2097 //______________________________________________________________
2098 void AliAnalysisTaskIDFFTCF::Terminate(Option_t *) 
2099 {
2100   // terminated
2101
2102   if(fDebug > 1) printf("AliAnalysisTaskIDFFTCF::Terminate() \n");
2103 }  
2104
2105 //_________________________________________________________________________________
2106 Int_t AliAnalysisTaskIDFFTCF::GetListOfTracks(TList *list, Int_t type)
2107 {
2108   // fill list of tracks selected according to type
2109
2110   if(fDebug > 2) Printf("%s:%d Selecting tracks with %d", (char*)__FILE__,__LINE__,type);
2111   
2112   if(!list){
2113     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
2114     return -1;
2115   }
2116
2117   if(!fAOD) return -1;
2118
2119   if(!fAOD->GetTracks()) return 0;
2120
2121   if(type==kTrackUndef) return 0;
2122   
2123   Int_t iCount = 0;
2124
2125
2126   if(type==kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAOD){
2127
2128     // all rec. tracks, esd filter mask, eta range
2129     
2130     for(Int_t it=0; it<fAOD->GetNumberOfTracks(); ++it){
2131       AliAODTrack *tr = fAOD->GetTrack(it);
2132       
2133       if(type == kTrackAODCuts || type==kTrackAODQualityCuts){
2134
2135         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
2136  
2137         //new cut on TPC
2138         if(fTPCCutMode==kPIDN && !AliIDFFUtils::TPCCutPIDN(tr)){
2139           continue;
2140         }
2141         if(fTPCCutMode==kMIGeo && !AliIDFFUtils::TPCCutMIGeo(tr, fAOD, fStream)){
2142           continue;
2143         }
2144         
2145         if(type == kTrackAODCuts){
2146           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
2147           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
2148           if(tr->Pt()  < fTrackPtCut) continue;
2149         }
2150       }
2151       list->Add(tr);
2152       iCount++;
2153     }
2154   }
2155   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
2156     // kine particles, all or rather charged
2157     if(!fMCEvent) return iCount;
2158     
2159     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
2160       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
2161       
2162       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
2163         if(part->Charge()==0) continue;
2164         
2165         if(type == kTrackKineChargedAcceptance && 
2166            (       part->Eta() < fTrackEtaMin
2167                 || part->Eta() > fTrackEtaMax
2168                 || part->Phi() < fTrackPhiMin
2169                 || part->Phi() > fTrackPhiMax 
2170                 || part->Pt()  < fTrackPtCut)) continue;
2171       }
2172       
2173       list->Add(part);
2174       iCount++;
2175     }
2176   }
2177   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec)  {
2178     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
2179     if(!fAOD) return -1;
2180     
2181     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2182     if(!tca)return iCount;
2183     
2184     for(int it=0; it<tca->GetEntriesFast(); ++it){
2185       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
2186       if(!part)continue;
2187       if(type != kTrackAODMCChargedSec  && !part->IsPhysicalPrimary())continue;
2188       if((type == kTrackAODMCChargedSec) && part->IsPhysicalPrimary())continue;
2189
2190       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
2191         if(part->Charge()==0) continue;
2192
2193         if(type==kTrackAODMCChargedSec){
2194
2195           Int_t iMother = part->GetMother();
2196           if(iMother < 0) continue; // throw out PYTHIA stack partons + incoming protons
2197         }
2198         
2199
2200         if(type==kTrackAODMCChargedAcceptance && 
2201            (     part->Eta() > fTrackEtaMax
2202               || part->Eta() < fTrackEtaMin
2203               || part->Phi() > fTrackPhiMax
2204               || part->Phi() < fTrackPhiMin
2205               || part->Pt()  < fTrackPtCut)) continue;
2206       }
2207       
2208       list->Add(part);
2209       iCount++;
2210     }
2211   }
2212   
2213   list->Sort();
2214   return iCount;
2215   
2216 }
2217 // _______________________________________________________________________________
2218 Int_t AliAnalysisTaskIDFFTCF::GetListOfJets(TList *list, Int_t type)
2219 {
2220   // fill list of jets selected according to type
2221
2222   if(!list){
2223     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
2224     return -1;
2225   }
2226
2227   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
2228
2229     if(fBranchRecJets.Length()==0){
2230       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
2231       if(fDebug>1)fAOD->Print();
2232       return 0;
2233     }
2234
2235     TClonesArray *aodRecJets = 0; 
2236     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
2237     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
2238     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
2239
2240     if(!aodRecJets){
2241       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
2242       if(fDebug>1)fAOD->Print();
2243       return 0;
2244     }
2245
2246     // Reorder jet pt and fill new temporary AliAODJet objects
2247     Int_t nRecJets = 0;
2248     
2249     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
2250
2251       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
2252       if(!tmp) continue;
2253
2254       if( tmp->Pt() < fJetPtCut ) continue;
2255       if( type == kJetsRecAcceptance &&
2256           (    tmp->Eta() < fJetEtaMin
2257             || tmp->Eta() > fJetEtaMax
2258             || tmp->Phi() < fJetPhiMin
2259             || tmp->Phi() > fJetPhiMax )) continue;
2260
2261  
2262       list->Add(tmp);
2263       nRecJets++; 
2264     }
2265     
2266     list->Sort();
2267     
2268     return nRecJets;
2269   }
2270   else if(type == kJetsKine || type == kJetsKineAcceptance){
2271     
2272     // generated jets
2273     Int_t nGenJets = 0;
2274     
2275     if(!fMCEvent){
2276       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
2277       return 0;
2278     }
2279    
2280     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
2281     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
2282     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
2283
2284     if(!pythiaGenHeader){
2285       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
2286       
2287       if(!hijingGenHeader){
2288          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
2289          return 0;
2290       }else{
2291          TLorentzVector mom[4];
2292          AliAODJet* jet[4];
2293          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
2294
2295          for(Int_t i=0; i<2; ++i){
2296             if(!mom[i].Pt()) continue;
2297             jet[i] = new AliAODJet(mom[i]);
2298
2299             if( type == kJetsKineAcceptance &&
2300                 (    jet[i]->Eta() < fJetEtaMin
2301                   || jet[i]->Eta() > fJetEtaMax
2302                   || jet[i]->Phi() < fJetPhiMin
2303                   || jet[i]->Phi() > fJetPhiMax )) continue;
2304
2305             list->Add(jet[i]);
2306             nGenJets++;
2307          }
2308          list->Sort();
2309          return nGenJets;
2310       }
2311     }
2312     
2313     // fetch the pythia generated jets
2314     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
2315       
2316       Float_t p[4];
2317       AliAODJet *jet = new AliAODJet();
2318       pythiaGenHeader->TriggerJet(ip, p);
2319       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
2320
2321       if( type == kJetsKineAcceptance &&
2322           (    jet->Eta() < fJetEtaMin
2323             || jet->Eta() > fJetEtaMax
2324             || jet->Phi() < fJetPhiMin
2325             || jet->Phi() > fJetPhiMax )) continue;
2326       
2327         list->Add(jet);
2328         nGenJets++;
2329     }
2330     list->Sort();
2331     return nGenJets;
2332   }
2333   else if(type == kJetsGen || type == kJetsGenAcceptance ){
2334
2335     if(fBranchGenJets.Length()==0){
2336       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
2337       return 0;
2338     }
2339     
2340     TClonesArray *aodGenJets = 0;
2341     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
2342     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
2343     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
2344
2345     if(!aodGenJets){
2346       if(fDebug>0){
2347         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
2348       }
2349       if(fDebug>1)fAOD->Print();
2350       return 0;
2351     }
2352
2353     Int_t nGenJets = 0;
2354     
2355     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
2356           
2357       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
2358       if(!tmp) continue;
2359           
2360       if( tmp->Pt() < fJetPtCut ) continue;
2361       if( type == kJetsGenAcceptance &&
2362           (    tmp->Eta() < fJetEtaMin
2363             || tmp->Eta() > fJetEtaMax
2364             || tmp->Phi() < fJetPhiMin
2365             || tmp->Phi() > fJetPhiMax )) continue;
2366       
2367         list->Add(tmp);
2368         nGenJets++;
2369     }
2370     list->Sort();
2371     return nGenJets;
2372   } 
2373   else{
2374     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
2375     return 0;
2376   }
2377 }
2378
2379 // _________________________________________________________________________________________________________
2380 void AliAnalysisTaskIDFFTCF::SetProperties(THnSparse* h, Int_t dim, const char** labels)
2381 {
2382   // Set properties of THnSparse 
2383
2384   for(Int_t i=0; i<dim; i++){
2385     h->GetAxis(i)->SetTitle(labels[i]);
2386     h->GetAxis(i)->SetTitleColor(1);
2387   }
2388 }
2389
2390 // __________________________________________________________________________________________
2391 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y)
2392 {
2393   //Set properties of histos (x and y title)
2394
2395   h->SetXTitle(x);
2396   h->SetYTitle(y);
2397   h->GetXaxis()->SetTitleColor(1);
2398   h->GetYaxis()->SetTitleColor(1);
2399 }
2400
2401 // _________________________________________________________________________________________________________
2402 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y, const char* z)
2403 {
2404   //Set properties of histos (x,y and z title)
2405
2406   h->SetXTitle(x);
2407   h->SetYTitle(y);
2408   h->SetZTitle(z);
2409   h->GetXaxis()->SetTitleColor(1);
2410   h->GetYaxis()->SetTitleColor(1);
2411   h->GetZaxis()->SetTitleColor(1);
2412 }
2413
2414 // ________________________________________________________________________________________________________________________________________________________
2415 void AliAnalysisTaskIDFFTCF::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
2416                                                   Double_t radius, Double_t& sumPt, Double_t minPtL, Double_t maxPt, Bool_t& isBadPt)
2417 {
2418   // fill list of tracks in cone around jet axis  
2419
2420   sumPt = 0;
2421   Bool_t isBadMaxPt = kFALSE;
2422   Bool_t isBadMinPt = kTRUE;
2423
2424   Double_t jetMom[3];
2425   jet->PxPyPz(jetMom);
2426   TVector3 jet3mom(jetMom);
2427
2428   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
2429
2430     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
2431     if(!track)continue;
2432     Double_t trackMom[3];
2433     track->PxPyPz(trackMom);
2434     TVector3 track3mom(trackMom);
2435
2436     Double_t dR = jet3mom.DeltaR(track3mom);
2437
2438     if(dR<radius){
2439
2440       outputlist->Add(track);
2441       
2442       sumPt += track->Pt();
2443
2444       if(maxPt>0  && track->Pt()>maxPt)  isBadMaxPt = kTRUE;
2445       if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2446     }
2447   }
2448   
2449   isBadPt = kFALSE; 
2450   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2451   if(maxPt>0  && isBadMaxPt) isBadPt = kTRUE;  
2452   
2453   outputlist->Sort();
2454 }
2455
2456 // _________________________________________________________________________________________________________________________________________________________________
2457 void AliAnalysisTaskIDFFTCF::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, Double_t minPtL, Double_t maxPt, Bool_t& isBadPt)
2458 {
2459   // list of jet tracks from trackrefs
2460   
2461   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
2462
2463   Bool_t isBadMaxPt = kFALSE;
2464   Bool_t isBadMinPt = kTRUE;
2465
2466   for(Int_t itrack=0; itrack<nTracks; itrack++) {
2467     
2468     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
2469     if(!track){
2470       AliError("expected ref track not found ");
2471       continue;
2472     }
2473     
2474     if(track->Pt()  < fTrackPtCut) continue; // track refs may contain low pt cut (bug in AliFastJetInput) 
2475     if(maxPt>0 && track->Pt()>maxPt)   isBadMaxPt = kTRUE;
2476     if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2477
2478     list->Add(track);
2479   }
2480   
2481   isBadPt = kFALSE; 
2482   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2483   if(maxPt>0 && isBadMaxPt)  isBadPt = kTRUE;  
2484
2485   list->Sort();
2486 }
2487
2488 // _ ________________________________________________________________________________________________________________________________
2489 void  AliAnalysisTaskIDFFTCF::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
2490                                               TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
2491 {
2492   // associate generated and reconstructed tracks, fill TArrays of list indices
2493
2494   Int_t nTracksRec  = tracksRec->GetSize();
2495   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
2496   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2497
2498
2499   if(!nTracksGen) return;
2500   if(!tca)        return;
2501   
2502   // set size
2503   indexAODTr.Set(nTracksGen);
2504   indexMCTr.Set(nTracksRec);
2505   isRefGen.Set(nTracksGen);
2506
2507   indexAODTr.Reset(-1);
2508   indexMCTr.Reset(-1);
2509   isRefGen.Reset(0);
2510
2511   // loop over reconstructed tracks, get generated track 
2512
2513   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
2514       
2515     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2516     if(!rectrack)continue;
2517     Int_t label = TMath::Abs(rectrack->GetLabel());
2518
2519     // find MC track in our list
2520     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
2521    
2522     Int_t listIndex = -1;
2523     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
2524
2525     if(listIndex>=0){
2526
2527       indexAODTr[listIndex] = iRec;
2528       indexMCTr[iRec]       = listIndex;
2529     }
2530   }
2531
2532
2533   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
2534
2535   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2536
2537     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
2538     if(!gentrack)continue;
2539     Int_t pdg = gentrack->GetPdgCode();    
2540
2541     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
2542     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
2543        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
2544       
2545       isRefGen[iGen] = kTRUE;
2546
2547       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2548
2549       if(iRec>=0){
2550         Float_t genPt = gentrack->Pt();
2551         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2552         if(vt){
2553           Float_t recPt = vt->Pt();
2554           fh2PtRecVsGen->Fill(genPt,recPt);
2555         }
2556       }
2557     }
2558   }
2559 }
2560
2561 // _____________________________________________________________________________________________________________________________________________
2562 void AliAnalysisTaskIDFFTCF::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
2563                                                          const TArrayI& indexAODTr, const TArrayS& isRefGen, Int_t pdg, Bool_t scaleGFL){
2564
2565   // fill QA for single track reconstruction efficiency
2566   
2567   Int_t nTracksGen  = tracksGen->GetSize();
2568
2569   if(!nTracksGen) return;
2570
2571   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2572
2573     if(isRefGen[iGen] != 1) continue; // select primaries
2574
2575     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
2576     if(!gentrack) continue;
2577     Double_t ptGen  = gentrack->Pt();
2578     Double_t etaGen = gentrack->Eta();
2579     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2580
2581     // apply same acc & pt cuts as for FF 
2582
2583     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
2584     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
2585     if(ptGen  < fTrackPtCut) continue;
2586     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2587
2588     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
2589
2590     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2591
2592     if(iRec>=0 && trackQARec){
2593
2594       if(scaleGFL){ 
2595         
2596         Double_t GFLcorr = 1; 
2597         if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2598         else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2599
2600         Double_t weight = 1;
2601         if(GFLcorr > 0) weight = 1/GFLcorr;
2602         
2603         trackQARec->FillTrackQA(etaGen, phiGen, ptGen, kFALSE, 0, kTRUE, weight);
2604       }
2605       else trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
2606     }
2607   }
2608 }
2609
2610 // ______________________________________________________________________________________________________________________________________________________
2611
2612 void  AliAnalysisTaskIDFFTCF::FillJetTrackHistosRec(AliFragFuncHistos* ffhistRec, AliAODJet* jet, 
2613                                                     TList* jetTrackList, const TList* tracksGen, const TList* tracksRec, const TArrayI& indexAODTr,
2614                                                     const TArrayS& isRefGen, TList* jetTrackListTR, Int_t pdg, Bool_t scaleGFL)
2615 {
2616   // fill objects for jet track reconstruction efficiency or secondaries contamination 
2617   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
2618   // jetTrackListTR pointer: track refs if not NULL  
2619   
2620
2621   // ensure proper normalization, even for secondaries
2622   Double_t jetPtRec = jet->Pt();
2623   ffhistRec->FillFF(-1, jetPtRec, kTRUE);
2624
2625   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
2626   if(nTracksJet == 0) return; 
2627   
2628   TList* listRecTracks = new TList(); 
2629   listRecTracks->Clear();
2630   
2631   for(Int_t iTr=0; iTr<nTracksJet; iTr++){ // jet tracks loop
2632     
2633     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
2634     if(!gentrack)continue;
2635     // find jet track in gen tracks list
2636     Int_t iGen = tracksGen->IndexOf(gentrack); 
2637     
2638     if(iGen<0){
2639       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
2640       continue;
2641     }
2642     
2643     if(isRefGen[iGen] != 1) continue; // select primaries
2644     
2645     Double_t ptGen  = gentrack->Pt();
2646     Double_t etaGen = gentrack->Eta();
2647     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2648
2649     // gen level acc & pt cuts - skip in case of track refs  
2650     if(!jetTrackListTR && (etaGen < fTrackEtaMin || etaGen > fTrackEtaMax)) continue;
2651     if(!jetTrackListTR && (phiGen < fTrackPhiMin || phiGen > fTrackPhiMax)) continue;
2652     if(!jetTrackListTR &&  ptGen  < fTrackPtCut) continue;
2653     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2654
2655
2656     Double_t ptRec = -1;        
2657
2658     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2659     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
2660
2661     Bool_t isJetTrack = kFALSE;
2662     if(!jetTrackListTR) isJetTrack = kTRUE; // skip trackRefs check for tracks in ideal cone 
2663
2664     if(isRec){
2665       
2666       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*> (tracksRec->At(iRec));
2667       if(!rectrack) continue;
2668
2669       ptRec = rectrack->Pt();   
2670       
2671       if(jetTrackListTR){ 
2672         Int_t iRecTR = jetTrackListTR->IndexOf(rectrack); 
2673         if(iRecTR >=0 ) isJetTrack = kTRUE; // rec tracks assigned to jet 
2674       }
2675     
2676       if(isJetTrack){
2677         
2678         Double_t trackPt = ptRec;
2679         Bool_t incrementJetPt = kFALSE; 
2680         
2681         if(scaleGFL){
2682         
2683           //Double_t weight = 1; 
2684           //if(gentrack->GetPdgCode() == -2212)      weight = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2685           //else if(gentrack->GetPdgCode() == -321)  weight = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2686           //else                                     weight = 1; 
2687           
2688           Double_t GFLcorr = 1; 
2689           if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2690           else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2691
2692           Double_t weight = 1;
2693           if(GFLcorr > 0) weight = 1/GFLcorr;
2694
2695           ffhistRec->FillFF( trackPt, jetPtRec, incrementJetPt, 0, kTRUE, weight );
2696         }
2697         else  ffhistRec->FillFF( trackPt, jetPtRec, incrementJetPt );
2698         
2699         listRecTracks->Add(rectrack);   
2700       }
2701     }
2702   }
2703
2704   delete listRecTracks;
2705
2706 }
2707
2708 // ______________________________________________________________________________________________________________________________________________________
2709 Float_t AliAnalysisTaskIDFFTCF::CalcJetArea(const Float_t etaJet, const Float_t rc) const
2710 {
2711   // calculate area of jet with eta etaJet and radius rc
2712
2713   Float_t detamax = etaJet + rc;
2714   Float_t detamin = etaJet - rc;
2715   Float_t accmax = 0.0; Float_t accmin = 0.0;
2716   if(detamax > fTrackEtaMax){ // sector outside etamax
2717     Float_t h = fTrackEtaMax - etaJet;
2718     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2719   }
2720   if(detamin < fTrackEtaMin){ // sector outside etamin
2721     Float_t h = fTrackEtaMax + etaJet;
2722     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2723   }
2724   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
2725   
2726   return areaJet;
2727
2728 }
2729
2730 //____________________________________________________________________________________________________________________________________________
2731 void AliAnalysisTaskIDFFTCF::BookQAHistos(TList* list, AliFragFuncQATrackHistos** rec, TString strTitRec, AliFragFuncQATrackHistos** gen, TString strTitGen, 
2732                                           AliFragFuncQATrackHistos** sec, TString strTitSec){
2733   
2734   // book QA histos 
2735
2736   if(strTitRec.Length()>0){
2737     
2738     *rec = new AliFragFuncQATrackHistos(strTitRec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2739                                         fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2740                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2741                                         fQATrackHighPtThreshold);
2742
2743     (*rec)->DefineHistos(); 
2744     (*rec)->AddToOutput(list);  
2745   }
2746
2747   if(strTitGen.Length()>0){
2748
2749     *gen = new AliFragFuncQATrackHistos(strTitGen, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2750                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2751                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2752                                        fQATrackHighPtThreshold);
2753     
2754     (*gen)->DefineHistos(); 
2755     (*gen)->AddToOutput(list); 
2756   }
2757
2758   if(strTitSec.Length()>0){
2759     
2760     *sec = new AliFragFuncQATrackHistos(strTitSec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2761                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2762                                        fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2763                                        fQATrackHighPtThreshold);
2764
2765     (*sec)->DefineHistos(); 
2766     (*sec)->AddToOutput(list); 
2767   }    
2768   
2769 }
2770
2771 //____________________________________________________________________________________________________________________________________________
2772 void AliAnalysisTaskIDFFTCF::BookFFHistos(TList* list, AliFragFuncHistos** rec, TString strTitRec, AliFragFuncHistos** gen, TString strTitGen, 
2773                                           AliFragFuncHistos** sec, TString strTitSec){
2774   
2775   // book FF histos 
2776
2777   if(strTitRec.Length()>0){
2778
2779     *rec = new AliFragFuncHistos(strTitRec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2780                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2781                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2782                                  fFFNBinsZ , fFFZMin , fFFZMax);
2783
2784     (*rec)->DefineHistos(); 
2785     (*rec)->AddToOutput(list);
2786   }
2787   
2788   if(strTitGen.Length()>0){
2789     
2790     *gen = new AliFragFuncHistos(strTitGen, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2791                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2792                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2793                                  fFFNBinsZ , fFFZMin , fFFZMax);
2794
2795     (*gen)->DefineHistos(); 
2796     (*gen)->AddToOutput(list);
2797   }
2798
2799   if(strTitSec.Length()>0){
2800     
2801     *sec = new AliFragFuncHistos(strTitSec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2802                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2803                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2804                                  fFFNBinsZ , fFFZMin , fFFZMax);
2805
2806     (*sec)->DefineHistos(); 
2807     (*sec)->AddToOutput(list); 
2808   }
2809 }
2810
2811 //____________________________________________________________________________________
2812 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionPrMinus(Double_t pTmc)
2813 {
2814   // GEANT-FLUKA correction for pbar from Roberto via Benjamin
2815
2816   Double_t corr = 1. - 0.129758 * TMath::Exp(-pTmc * 0.679612);
2817   return corr;
2818 }
2819
2820 //____________________________________________________________________________________
2821 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionKaMinus(Double_t pTmc)
2822 {
2823
2824   // GEANT-FLUKA correction for K- from Roberto via Benjamin
2825
2826   Double_t corr = TMath::Min((0.972865 + 0.0117093 * pTmc), 1.);
2827   return corr; 
2828 }