]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/UserTasks/AliAnalysisTaskIDFFTCF.cxx
add common abstract interface classes for flat and fat ESDs
[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) continue; 
1860       
1861       for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1862         
1863         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
1864         if(!trackVP)continue;
1865         
1866         AliAODTrack * aodtrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
1867         if(!aodtrack) continue;
1868                 
1869         Float_t trackPt  = trackVP->Pt();
1870         Float_t trackEta = trackVP->Eta();
1871         
1872         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
1873         
1874         if(fFFMode){
1875           
1876           fFFHistosRecCutsInc->FillFF(trackPt, trackEta, jetPt, incrementJetPt); 
1877             
1878           AliIDFFUtils::FillTHn(fTHnIDFF, jetPt, aodtrack, fAOD, fTOFCutMode);
1879
1880           if(it==0){ // leading track, all jets 
1881             fFFHistosRecLeadingTrack->FillFF( trackPt, trackEta, jetPt, kTRUE);
1882           }
1883         } 
1884
1885       }
1886       
1887       delete jettracklist;      
1888       
1889     } // end: rec. jets after cuts
1890
1891     // loop again over rec jets: 
1892     // PID histos (only for MC) 
1893
1894     if(fBranchGenJets.Length()>0){ // check if we're running over MC 
1895       
1896       for(Int_t ij=0; ij<nRecJetsCuts; ++ij){ // rec jets loop
1897         
1898         if(fLeadingJets && ij>0) continue;  // leading/all jets
1899
1900         TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
1901         if(!tca) continue;
1902         
1903         AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
1904         Float_t jetPt  = jet->Pt();
1905                 
1906         // get tracks in jet
1907         TList* jettracklist = new TList();
1908         Double_t sumPt      = 0.;
1909         Bool_t isBadJet     = kFALSE;
1910         
1911         if(GetFFRadius()<=0)
1912           GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1913         else 
1914           GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, 
1915                                GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1916         
1917         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
1918         
1919         if(isBadJet) continue; 
1920         
1921         Bool_t incrementJetPt = kTRUE; // there could be 0 tracks in jet: first fill jet pt histo once 
1922         fFFHistosRecCutsIncPi->FillFF(-1, -1, jetPt, incrementJetPt);
1923         fFFHistosRecCutsIncPro->FillFF(-1,-1, jetPt, incrementJetPt); 
1924         fFFHistosRecCutsIncK->FillFF(-1,  -1, jetPt, incrementJetPt);   
1925         fFFHistosRecCutsIncEl->FillFF(-1, -1, jetPt, incrementJetPt);  
1926         fFFHistosRecCutsIncMu->FillFF(-1, -1, jetPt, incrementJetPt);   
1927       
1928         incrementJetPt = kFALSE; 
1929
1930         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1931
1932           AliAODTrack * rectrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
1933           if(!rectrack) continue;
1934
1935           Int_t label   = TMath::Abs(rectrack->GetLabel());
1936           Float_t recPt  = rectrack->Pt();
1937           Float_t recEta = rectrack->Eta();
1938           
1939           // find MC track in our list
1940           AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
1941           
1942           // Float_t genPt = gentrack->Pt();
1943                     
1944           if(gentrack){
1945             Int_t mcpdg = TMath::Abs(gentrack->GetPdgCode());
1946             
1947             if(mcpdg == 211)  fFFHistosRecCutsIncPi->FillFF(recPt,  recEta, jetPt, incrementJetPt);
1948             if(mcpdg == 2212) fFFHistosRecCutsIncPro->FillFF(recPt, recEta, jetPt, incrementJetPt);
1949             if(mcpdg == 321)  fFFHistosRecCutsIncK->FillFF(recPt,   recEta, jetPt, incrementJetPt);
1950             if(mcpdg == 11)   fFFHistosRecCutsIncEl->FillFF(recPt,  recEta, jetPt, incrementJetPt);
1951             if(mcpdg == 13)   fFFHistosRecCutsIncMu->FillFF(recPt,  recEta, jetPt, incrementJetPt); 
1952           }
1953         }
1954         delete jettracklist;    
1955         
1956       } // end: rec. jets after cuts
1957     } // MC 
1958
1959
1960     // generated jets
1961     for(Int_t ij=0; ij<nGenJets; ++ij){
1962       
1963       AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
1964       if(!jet)continue;
1965
1966       Float_t jetPt  = jet->Pt();
1967
1968       if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt);
1969
1970       if(fLeadingJets && ij>0) continue;  // leading/all jets
1971
1972       if(fQAMode&2 && (ij==0)) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jetPt);
1973
1974       TList* jettracklist = new TList();
1975       Double_t sumPt      = 0.;
1976       Bool_t isBadJet     = kFALSE;
1977         
1978       if(GetFFRadius()<=0){
1979         GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1980       } else {
1981         GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
1982       }
1983       
1984       if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
1985       
1986       if(isBadJet) continue; 
1987
1988       Bool_t incrementJetPt = kTRUE; // first fill jet pt histo once 
1989       fFFHistosGenInc->FillFF(-1,   -1, jetPt, incrementJetPt);
1990       fFFHistosGenIncPi->FillFF(-1, -1, jetPt, incrementJetPt);
1991       fFFHistosGenIncPro->FillFF(-1,-1, jetPt, incrementJetPt); 
1992       fFFHistosGenIncK->FillFF(-1,  -1, jetPt, incrementJetPt);   
1993       fFFHistosGenIncEl->FillFF(-1, -1, jetPt, incrementJetPt);  
1994       fFFHistosGenIncMu->FillFF(-1, -1, jetPt, incrementJetPt);   
1995
1996       incrementJetPt = kFALSE;
1997
1998       for(Int_t it=0; it<jettracklist->GetSize(); ++it){
1999         
2000         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
2001         if(!trackVP)continue;
2002
2003         Float_t trackPt  = trackVP->Pt();
2004         Float_t trackEta = trackVP->Eta();
2005         
2006         if(fFFMode){
2007
2008           fFFHistosGenInc->FillFF( trackPt, trackEta, jetPt, incrementJetPt);
2009
2010           AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*>(trackVP);
2011           
2012           if(gentrack){
2013             
2014             Int_t mcpdg = TMath::Abs(gentrack->GetPdgCode());
2015             
2016             if(mcpdg == 211)  fFFHistosGenIncPi->FillFF(trackPt, trackEta, jetPt, incrementJetPt);
2017             if(mcpdg == 2212) fFFHistosGenIncPro->FillFF(trackPt, trackEta, jetPt, incrementJetPt);
2018             if(mcpdg == 321)  fFFHistosGenIncK->FillFF(trackPt, trackEta, jetPt, incrementJetPt);
2019             if(mcpdg == 11)   fFFHistosGenIncEl->FillFF(trackPt, trackEta, jetPt, incrementJetPt);
2020             if(mcpdg == 13)   fFFHistosGenIncMu->FillFF(trackPt, trackEta, jetPt, incrementJetPt);
2021           }
2022         }
2023         
2024         if(it==0){ // leading track, all jets 
2025           fFFHistosGenLeadingTrack->FillFF( trackPt, trackEta, jetPt, kTRUE);     
2026         }
2027         
2028       } // track loop 
2029
2030       delete jettracklist;
2031
2032     } // gen jets loop     
2033   } // end: QA, FF and intra-jet
2034   
2035   
2036   // ____ efficiency _______________________________
2037
2038   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
2039
2040     // arrays holding for each generated particle the reconstructed AOD track index & isPrimary flag, are initialized in AssociateGenRec(...) function
2041     TArrayI indexAODTr; 
2042     TArrayS isGenPrim; 
2043
2044     // array holding for each reconstructed AOD track generated particle index, initialized in AssociateGenRec(...) function
2045     TArrayI indexMCTr; 
2046
2047     // ... and another set for secondaries from strange/non strange mothers (secondary MC tracks are stored in different lists)
2048     TArrayI indexAODTrSec; 
2049     TArrayS isGenSec; 
2050     TArrayI indexMCTrSec; 
2051    
2052     Int_t  nTracksAODMCCharged = GetListOfTracks(fTracksAODMCCharged, kTrackAODMCCharged);
2053     if(fDebug>2)Printf("%s:%d selected AODMC tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCCharged);
2054   
2055     Int_t  nTracksAODMCChargedSec = GetListOfTracks(fTracksAODMCChargedSec, kTrackAODMCChargedSec);
2056     if(fDebug>2)Printf("%s:%d selected AODMC secondary tracks NS: %d ",(char*)__FILE__,__LINE__,nTracksAODMCChargedSec);
2057   
2058
2059     Int_t  nTracksRecQualityCuts = GetListOfTracks(fTracksRecQualityCuts, kTrackAODQualityCuts);
2060     if(fDebug>2)Printf("%s:%d selected rec tracks quality after cuts, full acceptance/pt : %d ",(char*)__FILE__,__LINE__,nTracksRecQualityCuts);
2061   
2062     // associate gen and rec tracks, store indices in TArrays 
2063     AssociateGenRec(fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,indexMCTr,isGenPrim,fh2PtRecVsGenPrim); 
2064     AssociateGenRec(fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,indexMCTrSec,isGenSec,fh2PtRecVsGenSec);
2065   
2066     // single track eff 
2067     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGen,fQATrackHistosRecEffRec,fTracksAODMCCharged,indexAODTr,isGenPrim);
2068     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenPi,fQATrackHistosRecEffRecPi,fTracksAODMCCharged,indexAODTr,isGenPrim, 211);
2069     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenPro,fQATrackHistosRecEffRecPro,fTracksAODMCCharged,indexAODTr,isGenPrim, 2212);
2070     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenK,fQATrackHistosRecEffRecK,fTracksAODMCCharged,indexAODTr,isGenPrim, 321);
2071     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenEl,fQATrackHistosRecEffRecEl,fTracksAODMCCharged,indexAODTr,isGenPrim, 11);
2072     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGenMu,fQATrackHistosRecEffRecMu,fTracksAODMCCharged,indexAODTr,isGenPrim, 13);
2073     if(fQAMode&1) FillSingleTrackHistosRecGen(0,fQATrackHistosRecEffRecProGFL,fTracksAODMCCharged,indexAODTr,isGenPrim, 2212,kTRUE);
2074     if(fQAMode&1) FillSingleTrackHistosRecGen(0,fQATrackHistosRecEffRecKGFL,fTracksAODMCCharged,indexAODTr,isGenPrim, 321,kTRUE);
2075
2076     // secondaries
2077     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec);
2078     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,0,kFALSE,kTRUE);
2079     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecPi,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,211);
2080     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecPro,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212);
2081     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecK,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321);
2082     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecEl,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,11);
2083     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecMu,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,13);
2084     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecProGFL,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212,kTRUE);
2085     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecKGFL,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321,kTRUE);
2086
2087     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecPiSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,211,kFALSE,kTRUE);
2088     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecProSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212,kFALSE,kTRUE);
2089     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecKSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321,kFALSE,kTRUE);
2090     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecElSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,11,kFALSE,kTRUE);
2091     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecMuSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,13,kFALSE,kTRUE);
2092     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecProGFLSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,2212,kTRUE,kTRUE);
2093     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRecKGFLSSc,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,321,kTRUE,kTRUE);
2094  
2095     // jet track eff    
2096     Double_t sumPtGenLeadingJetRecEff = 0;
2097     Double_t sumPtGenLeadingJetSec    = 0;
2098     Double_t sumPtRecLeadingJetRecEff = 0;
2099     
2100     for(Int_t ij=0; ij<nRecEffJets; ++ij){ // jet loop 
2101   
2102         if(fLeadingJets && ij>0) continue;  // leading/all jets
2103  
2104         AliAODJet* jet = (AliAODJet*)(fJetsRecEff->At(ij));
2105         
2106         Bool_t isBadJetGenPrim = kFALSE;
2107         Bool_t isBadJetGenSec  = kFALSE;
2108         Bool_t isBadJetRec     = kFALSE;
2109         
2110         // for efficiency: gen tracks from pointing with gen/rec jet
2111         TList* jettracklistGenPrim = new TList();
2112         
2113         // if radius<0 -> trackRefs: collect gen tracks in wide radius + fill FF recEff rec histos with tracks contained in track refs
2114         // note : FF recEff gen histos will be somewhat useless in this approach
2115         
2116         if(GetFFRadius() >0)
2117           GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, GetFFRadius(), sumPtGenLeadingJetRecEff, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetGenPrim); 
2118         else
2119           GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, TMath::Abs(GetFFRadius())+0.2, sumPtGenLeadingJetRecEff, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetGenPrim); 
2120         
2121         TList* jettracklistGenSec = new TList();
2122         if(GetFFRadius() >0)
2123           GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, GetFFRadius(), sumPtGenLeadingJetSec, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetGenSec); 
2124         else
2125           GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, TMath::Abs(GetFFRadius())+0.2, sumPtGenLeadingJetSec, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetGenSec); 
2126         
2127         
2128         // bin efficiency in jet pt bins using rec tracks  
2129         TList* jettracklistRec = new TList();
2130         if(GetFFRadius() >0) GetJetTracksPointing(fTracksRecCuts,jettracklistRec, jet, GetFFRadius(), sumPtRecLeadingJetRecEff, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetRec); 
2131         else                 GetJetTracksTrackrefs(jettracklistRec, jet, GetFFMinLTrackPt() , GetFFMaxTrackPt(), isBadJetRec); 
2132         
2133         
2134         Double_t jetEta   = jet->Eta();
2135         Double_t jetPhi   = TVector2::Phi_0_2pi(jet->Phi());
2136         
2137         if(GetFFMinNTracks()>0 && jettracklistGenPrim->GetSize()<=GetFFMinNTracks())   isBadJetGenPrim = kTRUE;
2138         if(GetFFMinNTracks()>0 && jettracklistGenSec->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
2139         if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())       isBadJetRec     = kTRUE;
2140         
2141         if(isBadJetRec) continue;
2142         
2143         if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
2144         
2145         if(fFFMode){
2146           
2147           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRec,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0); 
2148           else                FillJetTrackHistosRec(fFFHistosRecEffRec,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec);
2149           
2150           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecPi,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,211); 
2151           else                FillJetTrackHistosRec(fFFHistosRecEffRecPi,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,211);
2152
2153           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecPro,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,2212); 
2154           else                FillJetTrackHistosRec(fFFHistosRecEffRecPro,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,2212);
2155
2156           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecK,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,321); 
2157           else                FillJetTrackHistosRec(fFFHistosRecEffRecK,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,321);
2158
2159           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecEl,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,11); 
2160           else                FillJetTrackHistosRec(fFFHistosRecEffRecEl,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,11);
2161
2162           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecMu,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,13); 
2163           else                FillJetTrackHistosRec(fFFHistosRecEffRecMu,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,13);
2164
2165           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecProGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,2212,kTRUE); 
2166           else                FillJetTrackHistosRec(fFFHistosRecEffRecProGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,2212,kTRUE);
2167
2168           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosRecEffRecKGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,0,321,kTRUE); 
2169           else                FillJetTrackHistosRec(fFFHistosRecEffRecKGFL,jet,jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,jettracklistRec,321,kTRUE);
2170
2171
2172
2173           // secondaries: use jet pt from primaries 
2174           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRec,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0);
2175           else                FillJetTrackHistosRec(fFFHistosSecRec,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec);
2176
2177           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,0,kFALSE,kTRUE);
2178           else                FillJetTrackHistosRec(fFFHistosSecRecSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,kFALSE,kTRUE);
2179
2180           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecPi,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,211);
2181           else                FillJetTrackHistosRec(fFFHistosSecRecPi,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,211);
2182
2183           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecPro,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212); 
2184           else                FillJetTrackHistosRec(fFFHistosSecRecPro,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212);
2185
2186           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecK,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321); 
2187           else                FillJetTrackHistosRec(fFFHistosSecRecK,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321);
2188
2189           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecEl,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,11); 
2190           else                FillJetTrackHistosRec(fFFHistosSecRecEl,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,11);
2191
2192           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecMu,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,13);
2193           else                FillJetTrackHistosRec(fFFHistosSecRecMu,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,13);
2194
2195           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecProGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212,kTRUE); 
2196           else                FillJetTrackHistosRec(fFFHistosSecRecProGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212,kTRUE);
2197
2198           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecKGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321,kTRUE); 
2199           else                FillJetTrackHistosRec(fFFHistosSecRecKGFL,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321,kTRUE); 
2200
2201
2202           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecPiSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,211,kFALSE,kTRUE);
2203           else                FillJetTrackHistosRec(fFFHistosSecRecPiSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,211,kFALSE,kTRUE);
2204
2205           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecProSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212,kFALSE,kTRUE); 
2206           else                FillJetTrackHistosRec(fFFHistosSecRecProSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212,kFALSE,kTRUE);
2207
2208           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecKSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321,kFALSE,kTRUE); 
2209           else                FillJetTrackHistosRec(fFFHistosSecRecKSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321,kFALSE,kTRUE);
2210
2211           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecElSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,11,kFALSE,kTRUE); 
2212           else                FillJetTrackHistosRec(fFFHistosSecRecElSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,11,kFALSE,kTRUE);
2213
2214           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecMuSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,13,kFALSE,kTRUE);
2215           else                FillJetTrackHistosRec(fFFHistosSecRecMuSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,13,kFALSE,kTRUE);
2216
2217           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecProGFLSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,2212,kTRUE,kTRUE); 
2218           else                FillJetTrackHistosRec(fFFHistosSecRecProGFLSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,2212,kTRUE,kTRUE);
2219
2220           if(GetFFRadius()>0) FillJetTrackHistosRec(fFFHistosSecRecKGFLSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts, indexAODTrSec,isGenSec,0,321,kTRUE,kTRUE); 
2221           else                FillJetTrackHistosRec(fFFHistosSecRecKGFLSSc,jet,jettracklistGenSec,fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,isGenSec,jettracklistRec,321,kTRUE,kTRUE); 
2222
2223
2224
2225         }
2226         
2227         delete jettracklistGenPrim;
2228         delete jettracklistGenSec;
2229         delete jettracklistRec;   
2230         
2231     } // jet loop 
2232   } // eff mode
2233
2234   
2235   //___________________
2236   
2237   fTracksRecCuts->Clear();
2238   fTracksGen->Clear();
2239   fTracksAODMCCharged->Clear();
2240   fTracksAODMCChargedSec->Clear();
2241   fTracksRecQualityCuts->Clear();
2242
2243   fJetsRec->Clear();
2244   fJetsRecCuts->Clear();
2245   fJetsGen->Clear();
2246   fJetsRecEff->Clear();
2247   
2248   //Post output data.
2249   PostData(1, fCommonHistList);
2250 }
2251
2252 //______________________________________________________________
2253 void AliAnalysisTaskIDFFTCF::Terminate(Option_t *) 
2254 {
2255   // terminated
2256
2257   if(fDebug > 1) printf("AliAnalysisTaskIDFFTCF::Terminate() \n");
2258 }  
2259
2260 //_________________________________________________________________________________
2261 Int_t AliAnalysisTaskIDFFTCF::GetListOfTracks(TList *list, Int_t type)
2262 {
2263   // fill list of tracks selected according to type
2264
2265   if(fDebug > 2) Printf("%s:%d Selecting tracks with %d", (char*)__FILE__,__LINE__,type);
2266   
2267   if(!list){
2268     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
2269     return -1;
2270   }
2271
2272   if(!fAOD) return -1;
2273
2274   if(!fAOD->GetTracks()) return 0;
2275
2276   if(type==kTrackUndef) return 0;
2277   
2278   Int_t iCount = 0;
2279
2280
2281   if(type==kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAOD){
2282
2283     // all rec. tracks, esd filter mask, eta range
2284     
2285     for(Int_t it=0; it<fAOD->GetNumberOfTracks(); ++it){
2286       AliAODTrack *tr = fAOD->GetTrack(it);
2287       
2288       if(type == kTrackAODCuts || type==kTrackAODQualityCuts){
2289
2290         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
2291  
2292         //new cut on TPC
2293         if(fTPCCutMode==kPIDN && !AliIDFFUtils::TPCCutPIDN(tr)){
2294           continue;
2295         }
2296         if(fTPCCutMode==kMIGeo && !AliIDFFUtils::TPCCutMIGeo(tr, fAOD, fStream)){
2297           continue;
2298         }
2299         
2300         if(type == kTrackAODCuts){
2301           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
2302           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
2303           if(tr->Pt()  < fTrackPtCut) continue;
2304         }
2305       }
2306       list->Add(tr);
2307       iCount++;
2308     }
2309   }
2310   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
2311     // kine particles, all or rather charged
2312     if(!fMCEvent) return iCount;
2313     
2314     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
2315       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
2316       
2317       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
2318         if(part->Charge()==0) continue;
2319         
2320         if(type == kTrackKineChargedAcceptance && 
2321            (       part->Eta() < fTrackEtaMin
2322                 || part->Eta() > fTrackEtaMax
2323                 || part->Phi() < fTrackPhiMin
2324                 || part->Phi() > fTrackPhiMax 
2325                 || part->Pt()  < fTrackPtCut)) continue;
2326       }
2327       
2328       list->Add(part);
2329       iCount++;
2330     }
2331   }
2332   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec)  {
2333     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
2334     if(!fAOD) return -1;
2335     
2336     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2337     if(!tca)return iCount;
2338     
2339     for(int it=0; it<tca->GetEntriesFast(); ++it){
2340       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
2341       if(!part)continue;
2342       if(type != kTrackAODMCChargedSec  && !part->IsPhysicalPrimary())continue;
2343       if((type == kTrackAODMCChargedSec) && part->IsPhysicalPrimary())continue;
2344
2345       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
2346         if(part->Charge()==0) continue;
2347
2348         if(type==kTrackAODMCChargedSec){
2349
2350           Int_t iMother = part->GetMother();
2351           if(iMother < 0) continue; // throw out PYTHIA stack partons + incoming protons
2352         }
2353         
2354
2355         if(type==kTrackAODMCChargedAcceptance && 
2356            (     part->Eta() > fTrackEtaMax
2357               || part->Eta() < fTrackEtaMin
2358               || part->Phi() > fTrackPhiMax
2359               || part->Phi() < fTrackPhiMin
2360               || part->Pt()  < fTrackPtCut)) continue;
2361       }
2362       
2363       list->Add(part);
2364       iCount++;
2365     }
2366   }
2367   
2368   list->Sort();
2369   return iCount;
2370   
2371 }
2372 // _______________________________________________________________________________
2373 Int_t AliAnalysisTaskIDFFTCF::GetListOfJets(TList *list, Int_t type)
2374 {
2375   // fill list of jets selected according to type
2376
2377   if(!list){
2378     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
2379     return -1;
2380   }
2381
2382   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
2383
2384     if(fBranchRecJets.Length()==0){
2385       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
2386       if(fDebug>1)fAOD->Print();
2387       return 0;
2388     }
2389
2390     TClonesArray *aodRecJets = 0; 
2391     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
2392     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
2393     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
2394
2395     if(!aodRecJets){
2396       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
2397       if(fDebug>1)fAOD->Print();
2398       return 0;
2399     }
2400
2401     // Reorder jet pt and fill new temporary AliAODJet objects
2402     Int_t nRecJets = 0;
2403     
2404     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
2405
2406       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
2407       if(!tmp) continue;
2408
2409       if( tmp->Pt() < fJetPtCut ) continue;
2410       if( type == kJetsRecAcceptance &&
2411           (    tmp->Eta() < fJetEtaMin
2412             || tmp->Eta() > fJetEtaMax
2413             || tmp->Phi() < fJetPhiMin
2414             || tmp->Phi() > fJetPhiMax )) continue;
2415
2416  
2417       list->Add(tmp);
2418       nRecJets++; 
2419     }
2420     
2421     list->Sort();
2422     
2423     return nRecJets;
2424   }
2425   else if(type == kJetsKine || type == kJetsKineAcceptance){
2426     
2427     // generated jets
2428     Int_t nGenJets = 0;
2429     
2430     if(!fMCEvent){
2431       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
2432       return 0;
2433     }
2434    
2435     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
2436     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
2437     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
2438
2439     if(!pythiaGenHeader){
2440       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
2441       
2442       if(!hijingGenHeader){
2443          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
2444          return 0;
2445       }else{
2446          TLorentzVector mom[4];
2447          AliAODJet* jet[4];
2448          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
2449
2450          for(Int_t i=0; i<2; ++i){
2451             if(!mom[i].Pt()) continue;
2452             jet[i] = new AliAODJet(mom[i]);
2453
2454             if( type == kJetsKineAcceptance &&
2455                 (    jet[i]->Eta() < fJetEtaMin
2456                   || jet[i]->Eta() > fJetEtaMax
2457                   || jet[i]->Phi() < fJetPhiMin
2458                   || jet[i]->Phi() > fJetPhiMax )) continue;
2459
2460             list->Add(jet[i]);
2461             nGenJets++;
2462          }
2463          list->Sort();
2464          return nGenJets;
2465       }
2466     }
2467     
2468     // fetch the pythia generated jets
2469     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
2470       
2471       Float_t p[4];
2472       AliAODJet *jet = new AliAODJet();
2473       pythiaGenHeader->TriggerJet(ip, p);
2474       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
2475
2476       if( type == kJetsKineAcceptance &&
2477           (    jet->Eta() < fJetEtaMin
2478             || jet->Eta() > fJetEtaMax
2479             || jet->Phi() < fJetPhiMin
2480             || jet->Phi() > fJetPhiMax )) continue;
2481       
2482         list->Add(jet);
2483         nGenJets++;
2484     }
2485     list->Sort();
2486     return nGenJets;
2487   }
2488   else if(type == kJetsGen || type == kJetsGenAcceptance ){
2489
2490     if(fBranchGenJets.Length()==0){
2491       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
2492       return 0;
2493     }
2494     
2495     TClonesArray *aodGenJets = 0;
2496     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
2497     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
2498     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
2499
2500     if(!aodGenJets){
2501       if(fDebug>0){
2502         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
2503       }
2504       if(fDebug>1)fAOD->Print();
2505       return 0;
2506     }
2507
2508     Int_t nGenJets = 0;
2509     
2510     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
2511           
2512       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
2513       if(!tmp) continue;
2514           
2515       if( tmp->Pt() < fJetPtCut ) continue;
2516       if( type == kJetsGenAcceptance &&
2517           (    tmp->Eta() < fJetEtaMin
2518             || tmp->Eta() > fJetEtaMax
2519             || tmp->Phi() < fJetPhiMin
2520             || tmp->Phi() > fJetPhiMax )) continue;
2521       
2522         list->Add(tmp);
2523         nGenJets++;
2524     }
2525     list->Sort();
2526     return nGenJets;
2527   } 
2528   else{
2529     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
2530     return 0;
2531   }
2532 }
2533
2534 // _________________________________________________________________________________________________________
2535 void AliAnalysisTaskIDFFTCF::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
2536 {
2537   // Set properties of THnSparse 
2538
2539   for(Int_t i=0; i<dim; i++){
2540     h->GetAxis(i)->SetTitle(labels[i]);
2541     h->GetAxis(i)->SetTitleColor(1);
2542   }
2543 }
2544
2545 // __________________________________________________________________________________________
2546 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y)
2547 {
2548   //Set properties of histos (x and y title)
2549
2550   h->SetXTitle(x);
2551   h->SetYTitle(y);
2552   h->GetXaxis()->SetTitleColor(1);
2553   h->GetYaxis()->SetTitleColor(1);
2554 }
2555
2556 // _________________________________________________________________________________________________________
2557 void AliAnalysisTaskIDFFTCF::SetProperties(TH1* h,const char* x, const char* y, const char* z)
2558 {
2559   //Set properties of histos (x,y and z title)
2560
2561   h->SetXTitle(x);
2562   h->SetYTitle(y);
2563   h->SetZTitle(z);
2564   h->GetXaxis()->SetTitleColor(1);
2565   h->GetYaxis()->SetTitleColor(1);
2566   h->GetZaxis()->SetTitleColor(1);
2567 }
2568
2569 // ________________________________________________________________________________________________________________________________________________________
2570 void AliAnalysisTaskIDFFTCF::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
2571                                                   const Double_t radius, Double_t& sumPt, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
2572 {
2573   // fill list of tracks in cone around jet axis  
2574
2575   sumPt = 0;
2576   Bool_t isBadMaxPt = kFALSE;
2577   Bool_t isBadMinPt = kTRUE;
2578
2579   Double_t jetMom[3];
2580   jet->PxPyPz(jetMom);
2581   TVector3 jet3mom(jetMom);
2582
2583   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
2584
2585     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
2586     if(!track)continue;
2587     Double_t trackMom[3];
2588     track->PxPyPz(trackMom);
2589     TVector3 track3mom(trackMom);
2590
2591     Double_t dR = jet3mom.DeltaR(track3mom);
2592
2593     if(dR<radius){
2594
2595       outputlist->Add(track);
2596       
2597       sumPt += track->Pt();
2598
2599       if(maxPt>0  && track->Pt()>maxPt)  isBadMaxPt = kTRUE;
2600       if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2601     }
2602   }
2603   
2604   isBadPt = kFALSE; 
2605   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2606   if(maxPt>0  && isBadMaxPt) isBadPt = kTRUE;  
2607   
2608   outputlist->Sort();
2609 }
2610
2611 // _________________________________________________________________________________________________________________________________________________________________
2612 void AliAnalysisTaskIDFFTCF::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
2613 {
2614   // list of jet tracks from trackrefs
2615   
2616   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
2617
2618   Bool_t isBadMaxPt = kFALSE;
2619   Bool_t isBadMinPt = kTRUE;
2620
2621   for(Int_t itrack=0; itrack<nTracks; itrack++) {
2622     
2623     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
2624     if(!track){
2625       AliError("expected ref track not found ");
2626       continue;
2627     }
2628     
2629     if(track->Pt()  < fTrackPtCut) continue; // track refs may contain low pt cut (bug in AliFastJetInput) 
2630     if(maxPt>0 && track->Pt()>maxPt)   isBadMaxPt = kTRUE;
2631     if(minPtL>0 && track->Pt()>minPtL) isBadMinPt = kFALSE;
2632
2633     list->Add(track);
2634   }
2635   
2636   isBadPt = kFALSE; 
2637   if(minPtL>0 && isBadMinPt) isBadPt = kTRUE;  
2638   if(maxPt>0 && isBadMaxPt)  isBadPt = kTRUE;  
2639
2640   list->Sort();
2641 }
2642
2643 // _ ________________________________________________________________________________________________________________________________
2644 void  AliAnalysisTaskIDFFTCF::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
2645                                               TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
2646 {
2647   // associate generated and reconstructed tracks, fill TArrays of list indices
2648
2649   Int_t nTracksRec  = tracksRec->GetSize();
2650   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
2651   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
2652
2653
2654   if(!nTracksGen) return;
2655   if(!tca)        return;
2656   
2657   // set size
2658   indexAODTr.Set(nTracksGen);
2659   indexMCTr.Set(nTracksRec);
2660   isRefGen.Set(nTracksGen);
2661
2662   indexAODTr.Reset(-1);
2663   indexMCTr.Reset(-1);
2664   isRefGen.Reset(0);
2665
2666   // loop over reconstructed tracks, get generated track 
2667
2668   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
2669       
2670     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2671     if(!rectrack)continue;
2672     Int_t label = TMath::Abs(rectrack->GetLabel());
2673
2674     // find MC track in our list
2675     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
2676    
2677     Int_t listIndex = -1;
2678     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
2679
2680     if(listIndex>=0){
2681
2682       indexAODTr[listIndex] = iRec;
2683       indexMCTr[iRec]       = listIndex;
2684     }
2685   }
2686
2687
2688   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
2689
2690   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2691
2692     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
2693     if(!gentrack)continue;
2694     Int_t pdg = gentrack->GetPdgCode();    
2695
2696     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
2697     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
2698        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
2699       
2700       isRefGen[iGen] = kTRUE;
2701
2702       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2703
2704       if(iRec>=0){
2705         Float_t genPt = gentrack->Pt();
2706         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
2707         if(vt){
2708           Float_t recPt = vt->Pt();
2709           fh2PtRecVsGen->Fill(genPt,recPt);
2710         }
2711       }
2712     }
2713   }
2714 }
2715
2716 // _____________________________________________________________________________________________________________________________________________
2717 void AliAnalysisTaskIDFFTCF::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
2718                                                          const TArrayI& indexAODTr, const TArrayS& isRefGen, const Int_t pdg, const Bool_t scaleGFL, 
2719                                                          const Bool_t scaleStrangeness){
2720
2721   // fill QA for single track reconstruction efficiency
2722
2723   Int_t nTracksGen  = tracksGen->GetSize();
2724
2725   if(!nTracksGen) return;
2726
2727   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
2728
2729     if(isRefGen[iGen] != 1) continue; // select primaries
2730
2731     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
2732     if(!gentrack) continue;
2733     Double_t ptGen  = gentrack->Pt();
2734     Double_t etaGen = gentrack->Eta();
2735     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2736
2737     // apply same acc & pt cuts as for FF 
2738
2739     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
2740     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
2741     if(ptGen  < fTrackPtCut) continue;
2742     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2743
2744     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
2745
2746     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2747
2748     if(iRec>=0 && trackQARec){
2749
2750       if(scaleGFL || scaleStrangeness){ 
2751         
2752         Double_t weight = 1;
2753         
2754         if(scaleGFL){
2755           Double_t GFLcorr = 1; 
2756           if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2757           else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2758           
2759           if(GFLcorr > 0) weight *= 1/GFLcorr;
2760         }       
2761         if(scaleStrangeness){
2762           Double_t strCorr = GetMCStrangenessFactorCMS(gentrack);         
2763           weight *= strCorr;
2764         }
2765
2766         trackQARec->FillTrackQA(etaGen, phiGen, ptGen, kFALSE, 0, kTRUE, weight);
2767       }
2768       else trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
2769     }
2770   }
2771 }
2772
2773 // ______________________________________________________________________________________________________________________________________________________
2774
2775 void  AliAnalysisTaskIDFFTCF::FillJetTrackHistosRec(AliFragFuncHistos* ffhistRec, AliAODJet* jet, 
2776                                                     TList* jetTrackList, const TList* tracksGen, const TList* tracksRec, const TArrayI& indexAODTr,
2777                                                     const TArrayS& isRefGen, TList* jetTrackListTR, const Int_t pdg, 
2778                                                     const Bool_t scaleGFL, const Bool_t scaleStrangeness)
2779 {
2780   // fill objects for jet track reconstruction efficiency or secondaries contamination 
2781   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
2782   // jetTrackListTR pointer: track refs if not NULL  
2783   
2784
2785   // ensure proper normalization, even for secondaries
2786   Double_t jetPtRec = jet->Pt();
2787   //TVector3 jet3Mom = (jet->MomentumVector())->Vect();
2788
2789   ffhistRec->FillFF(-1, -1, jetPtRec, kTRUE);
2790
2791   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
2792   if(nTracksJet == 0) return; 
2793   
2794   TList* listRecTracks = new TList(); 
2795   listRecTracks->Clear();
2796   
2797   for(Int_t iTr=0; iTr<nTracksJet; iTr++){ // jet tracks loop
2798     
2799     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
2800     if(!gentrack)continue;
2801     // find jet track in gen tracks list
2802     Int_t iGen = tracksGen->IndexOf(gentrack); 
2803     
2804     if(iGen<0){
2805       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
2806       continue;
2807     }
2808     
2809     if(isRefGen[iGen] != 1) continue; // select primaries
2810     
2811     Double_t ptGen  = gentrack->Pt();
2812     Double_t etaGen = gentrack->Eta();
2813     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
2814
2815     // gen level acc & pt cuts - skip in case of track refs  
2816     if(!jetTrackListTR && (etaGen < fTrackEtaMin || etaGen > fTrackEtaMax)) continue;
2817     if(!jetTrackListTR && (phiGen < fTrackPhiMin || phiGen > fTrackPhiMax)) continue;
2818     if(!jetTrackListTR &&  ptGen  < fTrackPtCut) continue;
2819     if(pdg && TMath::Abs(gentrack->GetPdgCode()) != pdg) continue;  
2820
2821
2822     Double_t ptRec  = -1;       
2823     Double_t etaRec = -1;       
2824
2825     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
2826     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
2827
2828     Bool_t isJetTrack = kFALSE;
2829     if(!jetTrackListTR) isJetTrack = kTRUE; // skip trackRefs check for tracks in ideal cone 
2830
2831     if(isRec){
2832       
2833       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*> (tracksRec->At(iRec));
2834       if(!rectrack) continue;
2835
2836       ptRec  = rectrack->Pt();  
2837       etaRec = rectrack->Eta(); 
2838      
2839       if(jetTrackListTR){ 
2840         Int_t iRecTR = jetTrackListTR->IndexOf(rectrack); 
2841         if(iRecTR >=0 ) isJetTrack = kTRUE; // rec tracks assigned to jet 
2842       }
2843     
2844       if(isJetTrack){
2845         
2846         Double_t trackPt  = ptRec;
2847         Double_t trackEta = etaRec;
2848         Bool_t incrementJetPt = kFALSE; 
2849         
2850         if(scaleGFL || scaleStrangeness){
2851
2852           Double_t weight = 1;
2853
2854           if(scaleGFL){
2855             Double_t GFLcorr = 1; 
2856             if(gentrack->GetPdgCode() == -2212)      GFLcorr = TrackingPtGeantFlukaCorrectionPrMinus(ptGen);  
2857             else if(gentrack->GetPdgCode() == -321)  GFLcorr = TrackingPtGeantFlukaCorrectionKaMinus(ptGen);  
2858
2859             if(GFLcorr > 0) weight *= 1/GFLcorr;
2860           }
2861           if(scaleStrangeness){
2862             Double_t strCorr = GetMCStrangenessFactorCMS(gentrack);       
2863             weight *= strCorr;
2864           }
2865
2866           ffhistRec->FillFF( trackPt, trackEta, jetPtRec, incrementJetPt, 0, kTRUE, weight );
2867         }
2868         else  ffhistRec->FillFF( trackPt, trackEta, jetPtRec, incrementJetPt);
2869         
2870         listRecTracks->Add(rectrack);   
2871       }
2872     }
2873   }
2874
2875   delete listRecTracks;
2876
2877 }
2878
2879 // ______________________________________________________________________________________________________________________________________________________
2880 Float_t AliAnalysisTaskIDFFTCF::CalcJetArea(const Float_t etaJet, const Float_t rc) const
2881 {
2882   // calculate area of jet with eta etaJet and radius rc
2883
2884   Float_t detamax = etaJet + rc;
2885   Float_t detamin = etaJet - rc;
2886   Float_t accmax = 0.0; Float_t accmin = 0.0;
2887   if(detamax > fTrackEtaMax){ // sector outside etamax
2888     Float_t h = fTrackEtaMax - etaJet;
2889     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2890   }
2891   if(detamin < fTrackEtaMin){ // sector outside etamin
2892     Float_t h = fTrackEtaMax + etaJet;
2893     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
2894   }
2895   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
2896   
2897   return areaJet;
2898
2899 }
2900
2901 //____________________________________________________________________________________________________________________________________________
2902 void AliAnalysisTaskIDFFTCF::BookQAHistos(TList* list, AliFragFuncQATrackHistos** rec, TString strTitRec, AliFragFuncQATrackHistos** gen, TString strTitGen, 
2903                                           AliFragFuncQATrackHistos** sec, TString strTitSec){
2904   
2905   // book QA histos 
2906
2907   if(strTitRec.Length()>0){
2908     
2909     *rec = new AliFragFuncQATrackHistos(strTitRec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2910                                         fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2911                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2912                                         fQATrackHighPtThreshold);
2913
2914     (*rec)->DefineHistos(); 
2915     (*rec)->AddToOutput(list);  
2916   }
2917
2918   if(strTitGen.Length()>0){
2919
2920     *gen = new AliFragFuncQATrackHistos(strTitGen, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2921                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2922                                         fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2923                                        fQATrackHighPtThreshold);
2924     
2925     (*gen)->DefineHistos(); 
2926     (*gen)->AddToOutput(list); 
2927   }
2928
2929   if(strTitSec.Length()>0){
2930     
2931     *sec = new AliFragFuncQATrackHistos(strTitSec, fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2932                                        fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2933                                        fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2934                                        fQATrackHighPtThreshold);
2935
2936     (*sec)->DefineHistos(); 
2937     (*sec)->AddToOutput(list); 
2938   }    
2939   
2940 }
2941
2942 //____________________________________________________________________________________________________________________________________________
2943 void AliAnalysisTaskIDFFTCF::BookFFHistos(TList* list, AliFragFuncHistos** rec, TString strTitRec, AliFragFuncHistos** gen, TString strTitGen, 
2944                                           AliFragFuncHistos** sec, TString strTitSec){
2945   
2946   // book FF histos 
2947
2948   if(strTitRec.Length()>0){
2949
2950     *rec = new AliFragFuncHistos(strTitRec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2951                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2952                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2953                                  fFFNBinsZ , fFFZMin , fFFZMax);
2954
2955     (*rec)->DefineHistos(); 
2956     (*rec)->AddToOutput(list);
2957   }
2958   
2959   if(strTitGen.Length()>0){
2960     
2961     *gen = new AliFragFuncHistos(strTitGen, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2962                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2963                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2964                                  fFFNBinsZ , fFFZMin , fFFZMax);
2965
2966     (*gen)->DefineHistos(); 
2967     (*gen)->AddToOutput(list);
2968   }
2969
2970   if(strTitSec.Length()>0){
2971     
2972     *sec = new AliFragFuncHistos(strTitSec, fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2973                                  fFFNBinsPt, fFFPtMin, fFFPtMax, 
2974                                  fFFNBinsXi, fFFXiMin, fFFXiMax,  
2975                                  fFFNBinsZ , fFFZMin , fFFZMax);
2976
2977     (*sec)->DefineHistos(); 
2978     (*sec)->AddToOutput(list); 
2979   }
2980 }
2981
2982 //____________________________________________________________________________________
2983 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionPrMinus(const Double_t pTmc)
2984 {
2985   // GEANT-FLUKA correction for pbar from Roberto via Benjamin
2986
2987   Double_t corr = 1. - 0.129758 * TMath::Exp(-pTmc * 0.679612);
2988   return corr;
2989 }
2990
2991 //____________________________________________________________________________________
2992 Double_t  AliAnalysisTaskIDFFTCF::TrackingPtGeantFlukaCorrectionKaMinus(const Double_t pTmc)
2993 {
2994
2995   // GEANT-FLUKA correction for K- from Roberto via Benjamin
2996
2997   Double_t corr = TMath::Min((0.972865 + 0.0117093 * pTmc), 1.);
2998   return corr; 
2999 }
3000
3001 //__________________________________________________________________________________________________
3002 Double_t AliAnalysisTaskIDFFTCF::GetMCStrangenessFactorCMS(AliAODMCParticle* daughter)
3003 {
3004   // strangeness ratio MC/data as function of mother pt from CMS data in |eta|<2.0
3005
3006   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
3007   if(!tca) return 1;
3008
3009   AliAODMCParticle* currentMother   = daughter;
3010   AliAODMCParticle* currentDaughter = daughter;
3011
3012
3013   // find first primary mother K0s, Lambda or Xi   
3014   while(1){
3015
3016     Int_t daughterPDG   = currentDaughter->GetPdgCode();        
3017
3018     Int_t motherLabel   = currentDaughter->GetMother();
3019     if(motherLabel >= tca->GetEntriesFast()){ // protection
3020       currentMother = currentDaughter; 
3021       break; 
3022     }
3023
3024     currentMother     = (AliAODMCParticle*) tca->At(motherLabel);
3025
3026     if(!currentMother){ 
3027       currentMother = currentDaughter; 
3028       break; 
3029     }
3030
3031     Int_t motherPDG   = currentMother->GetPdgCode();    
3032  
3033     // phys. primary found ?    
3034     if(currentMother->IsPhysicalPrimary()) break; 
3035
3036     if(TMath::Abs(daughterPDG) == 321){ // K+/K- e.g. from phi (ref data not feeddown corrected)
3037       currentMother = currentDaughter; break; 
3038     }           
3039     if(TMath::Abs(motherPDG) == 310 ){ // K0s e.g. from phi (ref data not feeddown corrected)
3040       break; 
3041     }   
3042     if(TMath::Abs(motherPDG) == 3212 && TMath::Abs(daughterPDG) == 3122){ // mother Sigma0, daughter Lambda (this case not included in feeddown corr.)
3043       currentMother = currentDaughter; break; 
3044     }
3045
3046     currentDaughter = currentMother;
3047   }
3048
3049
3050   Int_t motherPDG   = currentMother->GetPdgCode();      
3051   Double_t motherPt = currentMother->Pt();      
3052
3053   Double_t fac = 1;
3054
3055   if(TMath::Abs(motherPDG) == 310 || TMath::Abs(motherPDG)==321){ // K0s / K+ / K-
3056
3057     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.768049;
3058     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.732933;
3059     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.650298;
3060     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.571332;
3061     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.518734;
3062     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.492543;
3063     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.482704;
3064     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.488056;
3065     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.488861;
3066     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.492862;
3067     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.504332;
3068     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.501858;
3069     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.512970;
3070     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.524131;
3071     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.539130;
3072     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.554101;
3073     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.560348;
3074     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.568869;
3075     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.583310;
3076     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.604818;
3077     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.632630;
3078     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.710070;
3079     else if(6.00 <= motherPt && motherPt < 8.00) fac = 0.736365;
3080     else if(8.00 <= motherPt && motherPt < 10.00) fac = 0.835865;
3081   }
3082
3083   if(TMath::Abs(motherPDG) == 3122){ // Lambda
3084
3085     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.645162;
3086     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.627431;
3087     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.457136;
3088     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.384369;
3089     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.330597;
3090     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.309571;
3091     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.293620;
3092     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.283709;
3093     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.282047;
3094     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.277261;
3095     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.275772;
3096     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.280726;
3097     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.288540;
3098     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.288315;
3099     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.296619;
3100     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.302993;
3101     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.338121;
3102     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.349800;
3103     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.356802;
3104     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.391202;
3105     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.422573;
3106     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.573815;
3107     else if(6.00 <= motherPt && motherPt < 8.00) fac = 0.786984;
3108     else if(8.00 <= motherPt && motherPt < 10.00) fac = 1.020021;
3109   }     
3110   
3111   if(TMath::Abs(motherPDG) == 3312 || TMath::Abs(motherPDG) == 3322){ // xi 
3112
3113     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.666620;
3114     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.575908;
3115     else if(0.40 <= motherPt && motherPt < 0.60) fac = 0.433198;
3116     else if(0.60 <= motherPt && motherPt < 0.80) fac = 0.340901;
3117     else if(0.80 <= motherPt && motherPt < 1.00) fac = 0.290896;
3118     else if(1.00 <= motherPt && motherPt < 1.20) fac = 0.236074;
3119     else if(1.20 <= motherPt && motherPt < 1.40) fac = 0.218681;
3120     else if(1.40 <= motherPt && motherPt < 1.60) fac = 0.207763;
3121     else if(1.60 <= motherPt && motherPt < 1.80) fac = 0.222848;
3122     else if(1.80 <= motherPt && motherPt < 2.00) fac = 0.208806;
3123     else if(2.00 <= motherPt && motherPt < 2.20) fac = 0.197275;
3124     else if(2.20 <= motherPt && motherPt < 2.40) fac = 0.183645;
3125     else if(2.40 <= motherPt && motherPt < 2.60) fac = 0.188788;
3126     else if(2.60 <= motherPt && motherPt < 2.80) fac = 0.188282;
3127     else if(2.80 <= motherPt && motherPt < 3.00) fac = 0.207442;
3128     else if(3.00 <= motherPt && motherPt < 3.20) fac = 0.240388;
3129     else if(3.20 <= motherPt && motherPt < 3.40) fac = 0.241916;
3130     else if(3.40 <= motherPt && motherPt < 3.60) fac = 0.208276;
3131     else if(3.60 <= motherPt && motherPt < 3.80) fac = 0.234550;
3132     else if(3.80 <= motherPt && motherPt < 4.00) fac = 0.251689;
3133     else if(4.00 <= motherPt && motherPt < 5.00) fac = 0.310204;
3134     else if(5.00 <= motherPt && motherPt < 6.00) fac = 0.343492;  
3135   }
3136   
3137   Double_t weight = 1;
3138   if(fac > 0) weight = 1/fac;
3139         
3140   return weight;
3141 }