]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/UserTasks/AliAnalysisTaskIDFFTCF.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGJE / UserTasks / AliAnalysisTaskIDFFTCF.cxx
1 // *************************************************************************
2 // *                                                                       *
3 // * Task for Fragmentation Function Analysis in PWG4 Jet Task Force Train *
4 // *                                                                       *
5 // *************************************************************************
6
7
8 /**************************************************************************
9  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10  *                                                                        *
11  * Author: The ALICE Off-line Project.                                    *
12  * Contributors are mentioned in the code where appropriate.              *
13  *                                                                        *
14  * Permission to use, copy, modify and distribute this software and its   *
15  * documentation strictly for non-commercial purposes is hereby granted   *
16  * without fee, provided that the above copyright notice appears in all   *
17  * copies and that both the copyright notice and this permission notice   *
18  * appear in the supporting documentation. The authors make no claims     *
19  * about the suitability of this software for any purpose. It is          *
20  * provided "as is" without express or implied warranty.                  *
21  **************************************************************************/
22
23 /* $Id: */
24
25 #include "TList.h"
26 #include "TH1F.h"
27 #include "TH2F.h"
28 #include "TH3F.h"
29 #include "TString.h"
30 #include "THnSparse.h"
31 #include "TProfile.h"
32 #include "TFile.h"
33 #include "TKey.h"
34 #include "TRandom3.h"
35 #include "TAxis.h"
36
37 #include "AliAODInputHandler.h" 
38 #include "AliAODHandler.h" 
39 #include "AliESDEvent.h"
40 #include "AliESDInputHandler.h"
41 #include "AliAODMCParticle.h"
42 #include "AliAODJet.h"
43 #include "AliAODJetEventBackground.h"
44 #include "AliGenPythiaEventHeader.h"
45 #include "AliGenHijingEventHeader.h"
46 #include "AliInputEventHandler.h"
47
48 #include "AliAnalysisHelperJetTasks.h"
49 #include "AliAnalysisManager.h"
50 #include "AliAnalysisTaskSE.h"
51 #include "AliVParticle.h"
52 #include "AliVEvent.h"
53 #include "AliPIDResponse.h"
54 #include "AliIDFFUtils.h"
55
56 #include "AliAnalysisTaskIDFFTCF.h"
57 using std::cout;
58 using std::endl;
59 using std::cerr;
60
61 ClassImp(AliAnalysisTaskIDFFTCF)
62
63 Bool_t AliAnalysisTaskIDFFTCF::fkDump = kFALSE;
64
65 //____________________________________________________________________________
66 AliAnalysisTaskIDFFTCF::AliAnalysisTaskIDFFTCF()
67    : AliAnalysisTaskSE()
68    ,fESD(0)
69    ,fAOD(0)
70    ,fAODJets(0)  
71    ,fAODExtension(0)
72    ,fNonStdFile("")
73    ,fBranchRecJets("jets")
74    ,fBranchGenJets("")
75    ,fTrackTypeGen(0)
76    ,fJetTypeGen(0)
77    ,fJetTypeRecEff(0)
78    ,fUseAODInputJets(kTRUE)
79    ,fFilterMask(0)
80    ,fUsePhysicsSelection(kTRUE)
81    ,fEvtSelectionMask(0)
82    ,fEventClass(0)
83    ,fMaxVertexZ(10)
84    ,fLeadingJets(kFALSE)
85    ,fTPCCutMode(kPIDNone) 
86    ,fTOFCutMode(1)
87    ,fStream(0x0)
88    ,fTree(0x0)
89    ,fTrackPtCut(0)
90    ,fTrackEtaMin(0)
91    ,fTrackEtaMax(0)
92    ,fTrackPhiMin(0)
93    ,fTrackPhiMax(0)
94    ,fJetPtCut(0)
95    ,fJetEtaMin(0)
96    ,fJetEtaMax(0)
97    ,fJetPhiMin(0)
98    ,fJetPhiMax(0)
99    ,fFFRadius(0)
100    ,fFFMinLTrackPt(-1)
101    ,fFFMaxTrackPt(-1)
102    ,fFFMinnTracks(0)
103    ,fQAMode(0)
104    ,fFFMode(0)
105    ,fEffMode(0)
106    ,fAvgTrials(0)
107    ,fTracksRecCuts(0)
108    ,fTracksGen(0)
109    ,fTracksAODMCCharged(0)
110    ,fTracksAODMCChargedSec(0)
111    ,fTracksRecQualityCuts(0)
112    ,fJetsRec(0)
113    ,fJetsRecCuts(0)
114    ,fJetsGen(0)
115    ,fJetsRecEff(0)
116    ,fQATrackHistosRecCuts(0)
117    ,fQATrackHistosGen(0)
118    ,fQAJetHistosRec(0)
119    ,fQAJetHistosRecCuts(0)
120    ,fQAJetHistosRecCutsLeading(0)
121    ,fQAJetHistosGen(0)
122    ,fQAJetHistosGenLeading(0)
123    ,fQAJetHistosRecEffLeading(0)
124    ,fFFHistosRecCutsInc(0)
125    ,fFFHistosRecCutsIncPi(0)   
126    ,fFFHistosRecCutsIncPro(0)  
127    ,fFFHistosRecCutsIncK(0)    
128    ,fFFHistosRecCutsIncEl(0)   
129    ,fFFHistosRecCutsIncMu(0)   
130    ,fFFHistosRecLeadingTrack(0)
131    ,fFFHistosGenInc(0)
132    ,fFFHistosGenIncPi(0)   
133    ,fFFHistosGenIncPro(0)  
134    ,fFFHistosGenIncK(0)    
135    ,fFFHistosGenIncEl(0)   
136    ,fFFHistosGenIncMu(0)   
137    ,fFFHistosGenLeadingTrack(0)
138    ,fQATrackHighPtThreshold(0)
139    ,fTHnIDFF(0x0)
140    ,fTHnIncl(0x0)
141    ,fFFNBinsJetPt(0)    
142    ,fFFJetPtMin(0) 
143    ,fFFJetPtMax(0)
144    ,fFFNBinsPt(0)      
145    ,fFFPtMin(0)        
146    ,fFFPtMax(0)        
147    ,fFFNBinsXi(0)      
148    ,fFFXiMin(0)        
149    ,fFFXiMax(0)        
150    ,fFFNBinsZ(0)       
151    ,fFFZMin(0)         
152    ,fFFZMax(0)
153    ,fQAJetNBinsPt(0)   
154    ,fQAJetPtMin(0)     
155    ,fQAJetPtMax(0)     
156    ,fQAJetNBinsEta(0)  
157    ,fQAJetEtaMin(0)    
158    ,fQAJetEtaMax(0)    
159    ,fQAJetNBinsPhi(0)  
160    ,fQAJetPhiMin(0)    
161    ,fQAJetPhiMax(0)    
162    ,fQATrackNBinsPt(0) 
163    ,fQATrackPtMin(0)   
164    ,fQATrackPtMax(0)   
165    ,fQATrackNBinsEta(0)
166    ,fQATrackEtaMin(0)  
167    ,fQATrackEtaMax(0)  
168    ,fQATrackNBinsPhi(0)
169    ,fQATrackPhiMin(0)  
170    ,fQATrackPhiMax(0)
171    ,fCommonHistList(0)
172    ,fh1EvtSelection(0)
173    ,fh1VertexNContributors(0)
174    ,fh1VertexZ(0)
175    ,fh1EvtMult(0)
176    ,fh1EvtCent(0)
177    ,fh1Xsec(0)
178    ,fh1Trials(0)
179    ,fh1PtHard(0)
180    ,fh1PtHardTrials(0)
181    ,fh1nRecJetsCuts(0)
182    ,fh1nGenJets(0)
183    ,fh1nRecEffJets(0)
184    ,fh2PtRecVsGenPrim(0)
185    ,fh2PtRecVsGenSec(0)
186    ,fQATrackHistosRecEffGen(0)  
187    ,fQATrackHistosRecEffRec(0)
188    ,fQATrackHistosSecRec(0)   
189    ,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 = 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 = fAOD->GetTrack(it);
2301       
2302       if(type == kTrackAODCuts || type==kTrackAODQualityCuts){
2303
2304         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask))) continue;
2305  
2306         //new cut on TPC
2307         if(fTPCCutMode==kPIDN && !AliIDFFUtils::TPCCutPIDN(tr)){
2308           continue;
2309         }
2310         if(fTPCCutMode==kMIGeo && !AliIDFFUtils::TPCCutMIGeo(tr, fAOD, fStream)){
2311           continue;
2312         }
2313         
2314         if(type == kTrackAODCuts){
2315           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
2316           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
2317           if(tr->Pt()  < fTrackPtCut) continue;
2318         }
2319       }
2320       list->Add(tr);
2321       iCount++;
2322     }
2323   }
2324   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
2325     // kine particles, all or rather charged
2326     if(!fMCEvent) return iCount;
2327     
2328     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
2329       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
2330       
2331       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
2332         if(part->Charge()==0) continue;
2333         
2334         if(type == kTrackKineChargedAcceptance && 
2335            (       part->Eta() < fTrackEtaMin
2336                 || part->Eta() > fTrackEtaMax
2337                 || part->Phi() < fTrackPhiMin
2338                 || part->Phi() > fTrackPhiMax 
2339                 || part->Pt()  < fTrackPtCut)) continue;
2340       }
2341       
2342       list->Add(part);
2343       iCount++;
2344     }
2345   }
2346   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec)  {
2347     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
2348     if(!fAOD) return -1;
2349     
2350     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2351     if(!tca)return iCount;
2352     
2353     for(int it=0; it<tca->GetEntriesFast(); ++it){
2354       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
2355       if(!part)continue;
2356       if(type != kTrackAODMCChargedSec  && !part->IsPhysicalPrimary())continue;
2357       if((type == kTrackAODMCChargedSec) && part->IsPhysicalPrimary())continue;
2358
2359       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
2360         if(part->Charge()==0) continue;
2361
2362         if(type==kTrackAODMCChargedSec){
2363
2364           Int_t iMother = part->GetMother();
2365           if(iMother < 0) continue; // throw out PYTHIA stack partons + incoming protons
2366         }
2367         
2368
2369         if(type==kTrackAODMCChargedAcceptance && 
2370            (     part->Eta() > fTrackEtaMax
2371               || part->Eta() < fTrackEtaMin
2372               || part->Phi() > fTrackPhiMax
2373               || part->Phi() < fTrackPhiMin
2374               || part->Pt()  < fTrackPtCut)) continue;
2375       }
2376       
2377       list->Add(part);
2378       iCount++;
2379     }
2380   }
2381   
2382   list->Sort();
2383   return iCount;
2384   
2385 }
2386 // _______________________________________________________________________________
2387 Int_t AliAnalysisTaskIDFFTCF::GetListOfJets(TList *list, Int_t type)
2388 {
2389   // fill list of jets selected according to type
2390
2391   if(!list){
2392     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
2393     return -1;
2394   }
2395
2396   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
2397
2398     if(fBranchRecJets.Length()==0){
2399       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
2400       if(fDebug>1)fAOD->Print();
2401       return 0;
2402     }
2403
2404     TClonesArray *aodRecJets = 0; 
2405     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
2406     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
2407     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
2408
2409     if(!aodRecJets){
2410       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
2411       if(fDebug>1)fAOD->Print();
2412       return 0;
2413     }
2414
2415     // Reorder jet pt and fill new temporary AliAODJet objects
2416     Int_t nRecJets = 0;
2417     
2418     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
2419
2420       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
2421       if(!tmp) continue;
2422
2423       if( tmp->Pt() < fJetPtCut ) continue;
2424       if( type == kJetsRecAcceptance &&
2425           (    tmp->Eta() < fJetEtaMin
2426             || tmp->Eta() > fJetEtaMax
2427             || tmp->Phi() < fJetPhiMin
2428             || tmp->Phi() > fJetPhiMax )) continue;
2429
2430  
2431       list->Add(tmp);
2432       nRecJets++; 
2433     }
2434     
2435     list->Sort();
2436     
2437     return nRecJets;
2438   }
2439   else if(type == kJetsKine || type == kJetsKineAcceptance){
2440     
2441     // generated jets
2442     Int_t nGenJets = 0;
2443     
2444     if(!fMCEvent){
2445       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
2446       return 0;
2447     }
2448    
2449     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
2450     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
2451     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
2452
2453     if(!pythiaGenHeader){
2454       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
2455       
2456       if(!hijingGenHeader){
2457          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
2458          return 0;
2459       }else{
2460          TLorentzVector mom[4];
2461          AliAODJet* jet[4];
2462          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
2463
2464          for(Int_t i=0; i<2; ++i){
2465             if(!mom[i].Pt()) continue;
2466             jet[i] = new AliAODJet(mom[i]);
2467
2468             if( type == kJetsKineAcceptance &&
2469                 (    jet[i]->Eta() < fJetEtaMin
2470                   || jet[i]->Eta() > fJetEtaMax
2471                   || jet[i]->Phi() < fJetPhiMin
2472                   || jet[i]->Phi() > fJetPhiMax )) continue;
2473
2474             list->Add(jet[i]);
2475             nGenJets++;
2476          }
2477          list->Sort();
2478          return nGenJets;
2479       }
2480     }
2481     
2482     // fetch the pythia generated jets
2483     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
2484       
2485       Float_t p[4];
2486       AliAODJet *jet = new AliAODJet();
2487       pythiaGenHeader->TriggerJet(ip, p);
2488       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
2489
2490       if( type == kJetsKineAcceptance &&
2491           (    jet->Eta() < fJetEtaMin
2492             || jet->Eta() > fJetEtaMax
2493             || jet->Phi() < fJetPhiMin
2494             || jet->Phi() > fJetPhiMax )) continue;
2495       
2496         list->Add(jet);
2497         nGenJets++;
2498     }
2499     list->Sort();
2500     return nGenJets;
2501   }
2502   else if(type == kJetsGen || type == kJetsGenAcceptance ){
2503
2504     if(fBranchGenJets.Length()==0){
2505       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
2506       return 0;
2507     }
2508     
2509     TClonesArray *aodGenJets = 0;
2510     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
2511     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
2512     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
2513
2514     if(!aodGenJets){
2515       if(fDebug>0){
2516         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
2517       }
2518       if(fDebug>1)fAOD->Print();
2519       return 0;
2520     }
2521
2522     Int_t nGenJets = 0;
2523     
2524     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
2525           
2526       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
2527       if(!tmp) continue;
2528           
2529       if( tmp->Pt() < fJetPtCut ) continue;
2530       if( type == kJetsGenAcceptance &&
2531           (    tmp->Eta() < fJetEtaMin
2532             || tmp->Eta() > fJetEtaMax
2533             || tmp->Phi() < fJetPhiMin
2534             || tmp->Phi() > fJetPhiMax )) continue;
2535       
2536         list->Add(tmp);
2537         nGenJets++;
2538     }
2539     list->Sort();
2540     return nGenJets;
2541   } 
2542   else{
2543     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
2544     return 0;
2545   }
2546 }
2547
2548 // _________________________________________________________________________________________________________
2549 void AliAnalysisTaskIDFFTCF::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
2550 {
2551   // Set properties of THnSparse 
2552
2553   for(Int_t i=0; i<dim; i++){
2554     h->GetAxis(i)->SetTitle(labels[i]);
2555     h->GetAxis(i)->SetTitleColor(1);
2556   }
2557 }
2558
2559 // __________________________________________________________________________________________
2560 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y)
2561 {
2562   //Set properties of histos (x and y title)
2563
2564   h->SetXTitle(x);
2565   h->SetYTitle(y);
2566   h->GetXaxis()->SetTitleColor(1);
2567   h->GetYaxis()->SetTitleColor(1);
2568 }
2569
2570 // _________________________________________________________________________________________________________
2571 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y, const char* z)
2572 {
2573   //Set properties of histos (x,y and z title)
2574
2575   h->SetXTitle(x);
2576   h->SetYTitle(y);
2577   h->SetZTitle(z);
2578   h->GetXaxis()->SetTitleColor(1);
2579   h->GetYaxis()->SetTitleColor(1);
2580   h->GetZaxis()->SetTitleColor(1);
2581 }
2582
2583 // ________________________________________________________________________________________________________________________________________________________
2584 void AliAnalysisTaskIDFFTCF::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
2585                                                   const Double_t radius, Double_t& sumPt, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
2586 {
2587   // fill list of tracks in cone around jet axis  
2588
2589   sumPt = 0;
2590   Bool_t isBadMaxPt = kFALSE;
2591   Bool_t isBadMinPt = kTRUE;
2592
2593   Double_t jetMom[3];
2594   jet->PxPyPz(jetMom);
2595   TVector3 jet3mom(jetMom);
2596
2597   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
2598
2599     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
2600     if(!track)continue;
2601     Double_t trackMom[3];
2602     track->PxPyPz(trackMom);
2603     TVector3 track3mom(trackMom);
2604
2605     Double_t dR = jet3mom.DeltaR(track3mom);
2606
2607     if(dR<radius){
2608
2609       outputlist->Add(track);
2610       
2611       sumPt += track->Pt();
2612
2613       if(maxPt>0  && track->Pt()>maxPt)  isBadMaxPt = kTRUE;
2614       if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2615     }
2616   }
2617   
2618   isBadPt = kFALSE; 
2619   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2620   if(maxPt>0  && isBadMaxPt) isBadPt = kTRUE;  
2621   
2622   outputlist->Sort();
2623 }
2624
2625 // _________________________________________________________________________________________________________________________________________________________________
2626 void AliAnalysisTaskIDFFTCF::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
2627 {
2628   // list of jet tracks from trackrefs
2629   
2630   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
2631
2632   Bool_t isBadMaxPt = kFALSE;
2633   Bool_t isBadMinPt = kTRUE;
2634
2635   for(Int_t itrack=0; itrack<nTracks; itrack++) {
2636     
2637     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
2638     if(!track){
2639       AliError("expected ref track not found ");
2640       continue;
2641     }
2642     
2643     if(track->Pt()  < fTrackPtCut) continue; // track refs may contain low pt cut (bug in AliFastJetInput) 
2644     if(maxPt>0 && track->Pt()>maxPt)   isBadMaxPt = kTRUE;
2645     if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2646
2647     list->Add(track);
2648   }
2649   
2650   isBadPt = kFALSE; 
2651   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2652   if(maxPt>0 && isBadMaxPt)  isBadPt = kTRUE;  
2653
2654   list->Sort();
2655 }
2656
2657 // _ ________________________________________________________________________________________________________________________________
2658 void  AliAnalysisTaskIDFFTCF::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
2659                                               TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
2660 {
2661   // associate generated and reconstructed tracks, fill TArrays of list indices
2662
2663   Int_t nTracksRec  = tracksRec->GetSize();
2664   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
2665   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2666
2667
2668   if(!nTracksGen) return;
2669   if(!tca)        return;
2670   
2671   // set size
2672   indexAODTr.Set(nTracksGen);
2673   indexMCTr.Set(nTracksRec);
2674   isRefGen.Set(nTracksGen);
2675
2676   indexAODTr.Reset(-1);
2677   indexMCTr.Reset(-1);
2678   isRefGen.Reset(0);
2679
2680   // loop over reconstructed tracks, get generated track 
2681
2682   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
2683       
2684     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2685     if(!rectrack)continue;
2686     Int_t label = TMath::Abs(rectrack->GetLabel());
2687
2688     // find MC track in our list
2689     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
2690    
2691     Int_t listIndex = -1;
2692     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
2693
2694     if(listIndex>=0){
2695
2696       indexAODTr[listIndex] = iRec;
2697       indexMCTr[iRec]       = listIndex;
2698     }
2699   }
2700
2701
2702   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
2703
2704   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2705
2706     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
2707     if(!gentrack)continue;
2708     Int_t pdg = gentrack->GetPdgCode();    
2709
2710     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
2711     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
2712        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
2713       
2714       isRefGen[iGen] = kTRUE;
2715
2716       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2717
2718       if(iRec>=0){
2719         Float_t genPt = gentrack->Pt();
2720         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2721         if(vt){
2722           Float_t recPt = vt->Pt();
2723           fh2PtRecVsGen->Fill(genPt,recPt);
2724         }
2725       }
2726     }
2727   }
2728 }
2729
2730 // _____________________________________________________________________________________________________________________________________________
2731 void AliAnalysisTaskIDFFTCF::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
2732                                                          const TArrayI& indexAODTr, const TArrayS& isRefGen, const Int_t pdg, const Bool_t scaleGFL, 
2733                                                          const Bool_t scaleStrangeness){
2734
2735   // fill QA for single track reconstruction efficiency
2736
2737   Int_t nTracksGen  = tracksGen->GetSize();
2738
2739   if(!nTracksGen) return;
2740
2741   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2742
2743     if(isRefGen[iGen] != 1) continue; // select primaries
2744
2745     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
2746     if(!gentrack) continue;
2747     Double_t ptGen  = gentrack->Pt();
2748     Double_t etaGen = gentrack->Eta();
2749     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2750
2751     // apply same acc & pt cuts as for FF 
2752
2753     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
2754     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
2755     if(ptGen  < fTrackPtCut) continue;
2756     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2757
2758     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
2759
2760     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2761
2762     if(iRec>=0 && trackQARec){
2763
2764       if(scaleGFL || scaleStrangeness){ 
2765         
2766         Double_t weight = 1;
2767         
2768         if(scaleGFL){
2769           Double_t GFLcorr = 1; 
2770           if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2771           else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2772           
2773           if(GFLcorr > 0) weight *= 1/GFLcorr;
2774         }       
2775         if(scaleStrangeness){
2776           Double_t strCorr = GetMCStrangenessFactorCMS(gentrack);         
2777           weight *= strCorr;
2778         }
2779
2780         trackQARec->FillTrackQA(etaGen, phiGen, ptGen, kFALSE, 0, kTRUE, weight);
2781       }
2782       else trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
2783     }
2784   }
2785 }
2786
2787 // ______________________________________________________________________________________________________________________________________________________
2788
2789 void  AliAnalysisTaskIDFFTCF::FillJetTrackHistosRec(AliFragFuncHistos* ffhistRec, AliAODJet* jet, 
2790                                                     TList* jetTrackList, const TList* tracksGen, const TList* tracksRec, const TArrayI& indexAODTr,
2791                                                     const TArrayS& isRefGen, TList* jetTrackListTR, const Int_t pdg, 
2792                                                     const Bool_t scaleGFL, const Bool_t scaleStrangeness)
2793 {
2794   // fill objects for jet track reconstruction efficiency or secondaries contamination 
2795   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
2796   // jetTrackListTR pointer: track refs if not NULL  
2797   
2798
2799   // ensure proper normalization, even for secondaries
2800   Double_t jetPtRec = jet->Pt();
2801   //TVector3 jet3Mom = (jet->MomentumVector())->Vect();
2802
2803   ffhistRec->FillFF(-1, -1, jetPtRec, kTRUE);
2804
2805   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
2806   if(nTracksJet == 0) return; 
2807   
2808   TList* listRecTracks = new TList(); 
2809   listRecTracks->Clear();
2810   
2811   for(Int_t iTr=0; iTr<nTracksJet; iTr++){ // jet tracks loop
2812     
2813     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
2814     if(!gentrack)continue;
2815     // find jet track in gen tracks list
2816     Int_t iGen = tracksGen->IndexOf(gentrack); 
2817     
2818     if(iGen<0){
2819       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
2820       continue;
2821     }
2822     
2823     if(isRefGen[iGen] != 1) continue; // select primaries
2824     
2825     Double_t ptGen  = gentrack->Pt();
2826     Double_t etaGen = gentrack->Eta();
2827     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2828
2829     // gen level acc & pt cuts - skip in case of track refs  
2830     if(!jetTrackListTR && (etaGen < fTrackEtaMin || etaGen > fTrackEtaMax)) continue;
2831     if(!jetTrackListTR && (phiGen < fTrackPhiMin || phiGen > fTrackPhiMax)) continue;
2832     if(!jetTrackListTR &&  ptGen  < fTrackPtCut) continue;
2833     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2834
2835
2836     Double_t ptRec  = -1;       
2837     Double_t etaRec = -1;       
2838
2839     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2840     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
2841
2842     Bool_t isJetTrack = kFALSE;
2843     if(!jetTrackListTR) isJetTrack = kTRUE; // skip trackRefs check for tracks in ideal cone 
2844
2845     if(isRec){
2846       
2847       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*> (tracksRec->At(iRec));
2848       if(!rectrack) continue;
2849
2850       ptRec  = rectrack->Pt();  
2851       etaRec = rectrack->Eta(); 
2852      
2853       if(jetTrackListTR){ 
2854         Int_t iRecTR = jetTrackListTR->IndexOf(rectrack); 
2855         if(iRecTR >=0 ) isJetTrack = kTRUE; // rec tracks assigned to jet 
2856       }
2857     
2858       if(isJetTrack){
2859         
2860         Double_t trackPt  = ptRec;
2861         Double_t trackEta = etaRec;
2862         Bool_t incrementJetPt = kFALSE; 
2863         
2864         if(scaleGFL || scaleStrangeness){
2865
2866           Double_t weight = 1;
2867
2868           if(scaleGFL){
2869             Double_t GFLcorr = 1; 
2870             if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2871             else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2872
2873             if(GFLcorr > 0) weight *= 1/GFLcorr;
2874           }
2875           if(scaleStrangeness){
2876             Double_t strCorr = GetMCStrangenessFactorCMS(gentrack);       
2877             weight *= strCorr;
2878           }
2879
2880           ffhistRec->FillFF( trackPt, trackEta, jetPtRec, incrementJetPt, 0, kTRUE, weight );
2881         }
2882         else  ffhistRec->FillFF( trackPt, trackEta, jetPtRec, incrementJetPt);
2883         
2884         listRecTracks->Add(rectrack);   
2885       }
2886     }
2887   }
2888
2889   delete listRecTracks;
2890
2891 }
2892
2893 // ______________________________________________________________________________________________________________________________________________________
2894 Float_t AliAnalysisTaskIDFFTCF::CalcJetArea(const Float_t etaJet, const Float_t rc) const
2895 {
2896   // calculate area of jet with eta etaJet and radius rc
2897
2898   Float_t detamax = etaJet + rc;
2899   Float_t detamin = etaJet - rc;
2900   Float_t accmax = 0.0; Float_t accmin = 0.0;
2901   if(detamax > fTrackEtaMax){ // sector outside etamax
2902     Float_t h = fTrackEtaMax - etaJet;
2903     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2904   }
2905   if(detamin < fTrackEtaMin){ // sector outside etamin
2906     Float_t h = fTrackEtaMax + etaJet;
2907     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2908   }
2909   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
2910   
2911   return areaJet;
2912
2913 }
2914
2915 //____________________________________________________________________________________________________________________________________________
2916 void AliAnalysisTaskIDFFTCF::BookQAHistos(TList* list, AliFragFuncQATrackHistos** rec, TString strTitRec, AliFragFuncQATrackHistos** gen, TString strTitGen, 
2917                                           AliFragFuncQATrackHistos** sec, TString strTitSec){
2918   
2919   // book QA histos 
2920
2921   if(strTitRec.Length()>0){
2922     
2923     *rec = new AliFragFuncQATrackHistos(strTitRec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2924                                         fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2925                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2926                                         fQATrackHighPtThreshold);
2927
2928     (*rec)->DefineHistos(); 
2929     (*rec)->AddToOutput(list);  
2930   }
2931
2932   if(strTitGen.Length()>0){
2933
2934     *gen = new AliFragFuncQATrackHistos(strTitGen, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2935                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2936                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2937                                        fQATrackHighPtThreshold);
2938     
2939     (*gen)->DefineHistos(); 
2940     (*gen)->AddToOutput(list); 
2941   }
2942
2943   if(strTitSec.Length()>0){
2944     
2945     *sec = new AliFragFuncQATrackHistos(strTitSec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2946                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2947                                        fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2948                                        fQATrackHighPtThreshold);
2949
2950     (*sec)->DefineHistos(); 
2951     (*sec)->AddToOutput(list); 
2952   }    
2953   
2954 }
2955
2956 //____________________________________________________________________________________________________________________________________________
2957 void AliAnalysisTaskIDFFTCF::BookFFHistos(TList* list, AliFragFuncHistos** rec, TString strTitRec, AliFragFuncHistos** gen, TString strTitGen, 
2958                                           AliFragFuncHistos** sec, TString strTitSec){
2959   
2960   // book FF histos 
2961
2962   if(strTitRec.Length()>0){
2963
2964     *rec = new AliFragFuncHistos(strTitRec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2965                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2966                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2967                                  fFFNBinsZ , fFFZMin , fFFZMax);
2968
2969     (*rec)->DefineHistos(); 
2970     (*rec)->AddToOutput(list);
2971   }
2972   
2973   if(strTitGen.Length()>0){
2974     
2975     *gen = new AliFragFuncHistos(strTitGen, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2976                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2977                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2978                                  fFFNBinsZ , fFFZMin , fFFZMax);
2979
2980     (*gen)->DefineHistos(); 
2981     (*gen)->AddToOutput(list);
2982   }
2983
2984   if(strTitSec.Length()>0){
2985     
2986     *sec = new AliFragFuncHistos(strTitSec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2987                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2988                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2989                                  fFFNBinsZ , fFFZMin , fFFZMax);
2990
2991     (*sec)->DefineHistos(); 
2992     (*sec)->AddToOutput(list); 
2993   }
2994 }
2995
2996 //____________________________________________________________________________________
2997 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionPrMinus(const Double_t pTmc)
2998 {
2999   // GEANT-FLUKA correction for pbar from Roberto via Benjamin
3000
3001   Double_t corr = 1. - 0.129758 * TMath::Exp(-pTmc * 0.679612);
3002   return corr;
3003 }
3004
3005 //____________________________________________________________________________________
3006 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionKaMinus(const Double_t pTmc)
3007 {
3008
3009   // GEANT-FLUKA correction for K- from Roberto via Benjamin
3010
3011   Double_t corr = TMath::Min((0.972865 + 0.0117093 * pTmc), 1.);
3012   return corr; 
3013 }
3014
3015 //__________________________________________________________________________________________________
3016 Double_t AliAnalysisTaskIDFFTCF::GetMCStrangenessFactorCMS(AliAODMCParticle* daughter)
3017 {
3018   // strangeness ratio MC/data as function of mother pt from CMS data in |eta|<2.0
3019
3020   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
3021   if(!tca) return 1;
3022
3023   AliAODMCParticle* currentMother   = daughter;
3024   AliAODMCParticle* currentDaughter = daughter;
3025
3026
3027   // find first primary mother K0s, Lambda or Xi   
3028   while(1){
3029
3030     Int_t daughterPDG   = currentDaughter->GetPdgCode();        
3031
3032     Int_t motherLabel   = currentDaughter->GetMother();
3033     if(motherLabel >= tca->GetEntriesFast()){ // protection
3034       currentMother = currentDaughter; 
3035       break; 
3036     }
3037
3038     currentMother     = (AliAODMCParticle*) tca->At(motherLabel);
3039
3040     if(!currentMother){ 
3041       currentMother = currentDaughter; 
3042       break; 
3043     }
3044
3045     Int_t motherPDG   = currentMother->GetPdgCode();    
3046  
3047     // phys. primary found ?    
3048     if(currentMother->IsPhysicalPrimary()) break; 
3049
3050     if(TMath::Abs(daughterPDG) == 321){ // K+/K- e.g. from phi (ref data not feeddown corrected)
3051       currentMother = currentDaughter; break; 
3052     }           
3053     if(TMath::Abs(motherPDG) == 310 ){ // K0s e.g. from phi (ref data not feeddown corrected)
3054       break; 
3055     }   
3056     if(TMath::Abs(motherPDG) == 3212 && TMath::Abs(daughterPDG) == 3122){ // mother Sigma0, daughter Lambda (this case not included in feeddown corr.)
3057       currentMother = currentDaughter; break; 
3058     }
3059
3060     currentDaughter = currentMother;
3061   }
3062
3063
3064   Int_t motherPDG   = currentMother->GetPdgCode();      
3065   Double_t motherPt = currentMother->Pt();      
3066
3067   Double_t fac = 1;
3068
3069   if(TMath::Abs(motherPDG) == 310 || TMath::Abs(motherPDG)==321){ // K0s / K+ / K-
3070
3071     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.768049;
3072     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.732933;
3073     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.650298;
3074     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.571332;
3075     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.518734;
3076     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.492543;
3077     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.482704;
3078     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.488056;
3079     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.488861;
3080     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.492862;
3081     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.504332;
3082     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.501858;
3083     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.512970;
3084     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.524131;
3085     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.539130;
3086     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.554101;
3087     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.560348;
3088     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.568869;
3089     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.583310;
3090     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.604818;
3091     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.632630;
3092     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.710070;
3093     else if(6.00 <= motherPt && motherPt < 8.00) fac = 0.736365;
3094     else if(8.00 <= motherPt && motherPt < 10.00) fac = 0.835865;
3095   }
3096
3097   if(TMath::Abs(motherPDG) == 3122){ // Lambda
3098
3099     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.645162;
3100     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.627431;
3101     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.457136;
3102     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.384369;
3103     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.330597;
3104     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.309571;
3105     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.293620;
3106     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.283709;
3107     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.282047;
3108     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.277261;
3109     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.275772;
3110     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.280726;
3111     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.288540;
3112     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.288315;
3113     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.296619;
3114     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.302993;
3115     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.338121;
3116     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.349800;
3117     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.356802;
3118     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.391202;
3119     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.422573;
3120     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.573815;
3121     else if(6.00 <= motherPt && motherPt < 8.00) fac = 0.786984;
3122     else if(8.00 <= motherPt && motherPt < 10.00) fac = 1.020021;
3123   }     
3124   
3125   if(TMath::Abs(motherPDG) == 3312 || TMath::Abs(motherPDG) == 3322){ // xi 
3126
3127     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.666620;
3128     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.575908;
3129     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.433198;
3130     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.340901;
3131     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.290896;
3132     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.236074;
3133     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.218681;
3134     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.207763;
3135     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.222848;
3136     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.208806;
3137     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.197275;
3138     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.183645;
3139     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.188788;
3140     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.188282;
3141     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.207442;
3142     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.240388;
3143     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.241916;
3144     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.208276;
3145     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.234550;
3146     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.251689;
3147     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.310204;
3148     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.343492;  
3149   }
3150   
3151   Double_t weight = 1;
3152   if(fac > 0) weight = 1/fac;
3153         
3154   return weight;
3155 }