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