]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/AliAnalysisTaskFragmentationFunction.cxx
avoid doubled adding of histos for MC (O. Busch)
[u/mrichter/AliRoot.git] / PWGJE / AliAnalysisTaskFragmentationFunction.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
36 #include "AliAODInputHandler.h" 
37 #include "AliAODHandler.h" 
38 #include "AliESDEvent.h"
39 #include "AliAODMCParticle.h"
40 #include "AliAODJet.h"
41 #include "AliAODJetEventBackground.h"
42 #include "AliGenPythiaEventHeader.h"
43 #include "AliGenHijingEventHeader.h"
44 #include "AliInputEventHandler.h"
45
46 #include "AliAnalysisHelperJetTasks.h"
47 #include "AliAnalysisManager.h"
48 #include "AliAnalysisTaskSE.h"
49 #include "AliVParticle.h"
50 #include "AliVEvent.h"
51
52 #include "AliAnalysisTaskFragmentationFunction.h"
53
54 ClassImp(AliAnalysisTaskFragmentationFunction)
55
56 //____________________________________________________________________________
57 AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction()
58    : AliAnalysisTaskSE()
59    ,fESD(0)
60    ,fAOD(0)
61    ,fAODJets(0)  
62    ,fAODExtension(0)
63    ,fNonStdFile("")
64    ,fBranchRecJets("jets")
65    ,fBranchRecBackJets("")
66    ,fBranchRecBckgClusters("")
67    ,fBranchGenJets("")
68    ,fBranchEmbeddedJets("")
69    ,fTrackTypeGen(0)
70    ,fJetTypeGen(0)
71    ,fJetTypeRecEff(0)
72    ,fUseAODInputJets(kTRUE)
73    ,fFilterMask(0)
74    ,fUsePhysicsSelection(kTRUE)
75    ,fEvtSelectionMask(0)
76    ,fEventClass(0)
77    ,fMaxVertexZ(10)
78    ,fTrackPtCut(0)
79    ,fTrackEtaMin(0)
80    ,fTrackEtaMax(0)
81    ,fTrackPhiMin(0)
82    ,fTrackPhiMax(0)
83    ,fUseExtraTracks(0)
84    ,fUseExtraTracksBgr(0)
85    ,fCutFractionPtEmbedded(0)
86    ,fUseEmbeddedJetAxis(0)
87    ,fUseEmbeddedJetPt(0)
88    ,fJetPtCut(0)
89    ,fJetEtaMin(0)
90    ,fJetEtaMax(0)
91    ,fJetPhiMin(0)
92    ,fJetPhiMax(0)
93    ,fDiJetCut(0)
94    ,fDiJetDeltaPhiCut(0)
95    ,fDiJetPtFractionCut(0)
96    ,fDiJetCDFCut(0)
97    ,fDiJetKindBins(0)
98    ,fFFRadius(0)
99    ,fFFMaxTrackPt(-1)
100    ,fFFMinnTracks(0)
101    ,fFFBckgRadius(0)
102    ,fBckgMode(0)
103    ,fIJMode(0)
104    ,fQAMode(0)
105    ,fFFMode(0)
106    ,fDJMode(0)
107    ,fEffMode(0)
108    ,fPhiCorrMode(0)
109    ,fUseRecEffRecJetPtBins(0)
110    ,fUseResponseRecJetPtBins(1)
111    ,fAvgTrials(0)
112    ,fTracksRec(0)
113    ,fTracksRecCuts(0)
114    ,fTracksGen(0)
115    ,fTracksAODMCCharged(0)
116    ,fTracksAODMCChargedSec(0)
117    ,fTracksRecQualityCuts(0)
118    ,fJetsRec(0)
119    ,fJetsRecCuts(0)
120    ,fJetsGen(0)
121    ,fJetsRecEff(0)
122    ,fJetsEmbedded(0)
123    ,fBckgJetsRec(0)
124    ,fBckgJetsRecCuts(0)
125    ,fBckgJetsGen(0)
126    ,fQATrackHistosRec(0)
127    ,fQATrackHistosRecCuts(0)
128    ,fQATrackHistosGen(0)
129    ,fQAJetHistosRec(0)
130    ,fQAJetHistosRecCuts(0)
131    ,fQAJetHistosRecCutsLeading(0)
132    ,fQAJetHistosGen(0)
133    ,fQAJetHistosGenLeading(0)
134    ,fQAJetHistosRecEffLeading(0)
135    ,fFFHistosRecCuts(0)
136    ,fFFHistosRecLeading(0)
137    ,fFFHistosRecLeadingTrack(0)
138    ,fFFHistosGen(0)
139    ,fFFHistosGenLeading(0)
140    ,fFFHistosGenLeadingTrack(0)
141    ,fIJHistosRecCuts(0)
142    ,fIJHistosRecLeading(0)
143    ,fIJHistosRecLeadingTrack(0)
144    ,fIJHistosGen(0)
145    ,fIJHistosGenLeading(0)
146    ,fIJHistosGenLeadingTrack(0)
147    ,fFFDiJetHistosRecCuts(0)
148    ,fFFDiJetHistosRecLeading(0)
149    ,fFFDiJetHistosRecLeadingTrack(0)
150    ,fFFDiJetHistosGen(0)
151    ,fFFDiJetHistosGenLeading(0)
152    ,fFFDiJetHistosGenLeadingTrack(0)
153    ,fQADiJetHistosRecCuts(0)
154    ,fQADiJetHistosGen(0)
155    ,fPhiCorrHistosJetArea(0)
156    ,fPhiCorrHistosTransverseArea(0)
157    ,fPhiCorrHistosAwayArea(0)
158    ,fQATrackHighPtThreshold(0)
159    ,fFFNBinsJetPt(0)    
160    ,fFFJetPtMin(0) 
161    ,fFFJetPtMax(0)
162    ,fFFNBinsPt(0)      
163    ,fFFPtMin(0)        
164    ,fFFPtMax(0)        
165    ,fFFNBinsXi(0)      
166    ,fFFXiMin(0)        
167    ,fFFXiMax(0)        
168    ,fFFNBinsZ(0)       
169    ,fFFZMin(0)         
170    ,fFFZMax(0)
171    ,fFFLogZBins(kTRUE)         
172    ,fQAJetNBinsPt(0)   
173    ,fQAJetPtMin(0)     
174    ,fQAJetPtMax(0)     
175    ,fQAJetNBinsEta(0)  
176    ,fQAJetEtaMin(0)    
177    ,fQAJetEtaMax(0)    
178    ,fQAJetNBinsPhi(0)  
179    ,fQAJetPhiMin(0)    
180    ,fQAJetPhiMax(0)    
181    ,fQATrackNBinsPt(0) 
182    ,fQATrackPtMin(0)   
183    ,fQATrackPtMax(0)   
184    ,fQATrackNBinsEta(0)
185    ,fQATrackEtaMin(0)  
186    ,fQATrackEtaMax(0)  
187    ,fQATrackNBinsPhi(0)
188    ,fQATrackPhiMin(0)  
189    ,fQATrackPhiMax(0)
190    ,fIJNBinsJetPt(0)
191    ,fIJJetPtMin(0)
192    ,fIJJetPtMax(0)
193    ,fIJNBinsPt(0)
194    ,fIJPtMin(0)
195    ,fIJPtMax(0)
196    ,fIJNBinsZ(0)
197    ,fIJZMin(0)
198    ,fIJZMax(0)
199    ,fIJNBinsCosTheta(0)
200    ,fIJCosThetaMin(0)
201    ,fIJCosThetaMax(0)
202    ,fIJNBinsTheta(0)
203    ,fIJThetaMin(0)
204    ,fIJThetaMax(0)
205    ,fIJNBinsJt(0)
206    ,fIJJtMin(0)
207    ,fIJJtMax(0)
208    ,fDiJetNBinsJetInvMass(0)
209    ,fDiJetJetInvMassMin(0)
210    ,fDiJetJetInvMassMax(0)
211    ,fDiJetNBinsJetPt(0)
212    ,fDiJetJetPtMin(0)
213    ,fDiJetJetPtMax(0)
214    ,fDiJetNBinsPt(0)
215    ,fDiJetPtMin(0)
216    ,fDiJetPtMax(0)
217    ,fDiJetNBinsXi(0)
218    ,fDiJetXiMin(0)
219    ,fDiJetXiMax(0)
220    ,fDiJetNBinsZ(0)
221    ,fDiJetZMin(0)
222    ,fDiJetZMax(0)
223    ,fQADiJetNBinsInvMass(0)
224    ,fQADiJetInvMassMin(0)
225    ,fQADiJetInvMassMax(0)
226    ,fQADiJetNBinsJetPt(0)
227    ,fQADiJetJetPtMin(0)
228    ,fQADiJetJetPtMax(0)
229    ,fQADiJetNBinsDeltaPhi(0)
230    ,fQADiJetDeltaPhiMin(0)
231    ,fQADiJetDeltaPhiMax(0)
232    ,fQADiJetNBinsDeltaEta(0)
233    ,fQADiJetDeltaEtaMin(0)
234    ,fQADiJetDeltaEtaMax(0)
235    ,fQADiJetNBinsDeltaPt(0)
236    ,fQADiJetDeltaPtMin(0)
237    ,fQADiJetDeltaPtMax(0)
238    ,fQADiJetNBinsInBal(0)  
239    ,fQADiJetInBalMin(0)    
240    ,fQADiJetInBalMax(0)    
241    ,fPhiCorrNBinsPt(0)
242    ,fPhiCorrPtMin(0)
243    ,fPhiCorrPtMax(0)
244    ,fPhiCorrNBinsEta(0)
245    ,fPhiCorrEtaMin(0)
246    ,fPhiCorrEtaMax(0)
247    ,fPhiCorrNBinsPhi(0)
248    ,fPhiCorrPhiMin(0)
249    ,fPhiCorrPhiMax(0)
250    ,fCommonHistList(0)
251    ,fh1EvtSelection(0)
252    ,fh1VertexNContributors(0)
253    ,fh1VertexZ(0)
254    ,fh1EvtMult(0)
255    ,fh1EvtCent(0)
256    ,fh2TrackPtVsDCAXY(0)
257    ,fh2TrackPtVsDCAZ(0)
258    ,fh1Xsec(0)
259    ,fh1Trials(0)
260    ,fh1PtHard(0)
261    ,fh1PtHardTrials(0)
262    ,fh1nRecJetsCuts(0)
263    ,fh1nGenJets(0)
264    ,fh1nRecEffJets(0)
265    ,fh1nEmbeddedJets(0)
266    ,fh1nRecBckgJetsCuts(0)
267    ,fh1nGenBckgJets(0)
268    ,fh2PtRecVsGenPrim(0)
269    ,fh2PtRecVsGenSec(0)
270    ,fQATrackHistosRecEffGen(0)  
271    ,fQATrackHistosRecEffRec(0)
272    ,fQATrackHistosSecRec(0)   
273    ,fFFHistosRecEffGen(0)    
274    ,fFFHistosRecEffRec(0)
275    ,fFFHistosSecRec(0)
276    ,fhnResponseSinglePt(0)
277    ,fh2SingleInvPtRecMnGenVsPtGen(0)   
278    ,fhnResponseJetTrackPt(0)  
279    ,fhnResponseJetZ(0)        
280    ,fhnResponseJetXi(0)       
281    // Background
282    ,fh1OutLeadingMult(0)
283    ,fh1OutLeadingStatMult(0)
284    ,fh1PerpMult(0)
285    ,fh1ASideMult(0)
286    ,fh1ASideWindowMult(0)
287    ,fh1PerpWindowMult(0)
288    ,fh1Out2JetsMult(0)
289    ,fh1Out3JetsMult(0)
290    ,fh1MedianClustersMult(0)
291    ,fh1OutClustersMult(0)
292    ,fh1FractionPtEmbedded(0)
293    ,fh1IndexEmbedded(0)
294    ,fh2DeltaPtVsJetPtEmbedded(0)
295    ,fh2DeltaPtVsRecJetPtEmbedded(0)
296    ,fh1DeltaREmbedded(0)
297    ,fh2ptVsDistNN_pt50_rec(0) 
298    ,fh2ptVsDistNN_pt50_nonRec(0) 
299    ,fh2ptVsDistNN_pt10_rec(0) 
300    ,fh2ptVsDistNN_pt10_nonRec(0) 
301    ,fQABckgHisto0RecCuts(0)  
302    ,fQABckgHisto0Gen(0)      
303    ,fQABckgHisto1RecCuts(0)  
304    ,fQABckgHisto1Gen(0)      
305    ,fQABckgHisto2RecCuts(0)  
306    ,fQABckgHisto2Gen(0)
307    ,fQABckgHisto3RecCuts(0)
308    ,fQABckgHisto3Gen(0)
309    ,fQABckgHisto4RecCuts(0)
310    ,fQABckgHisto4Gen(0)
311    ,fFFBckgHisto0RecCuts(0)
312    ,fFFBckgHisto0RecLeading(0)
313    ,fFFBckgHisto0Gen(0)       
314    ,fFFBckgHisto0GenLeading(0)
315    ,fFFBckgHisto1RecCuts(0)
316    ,fFFBckgHisto1RecLeading(0)
317    ,fFFBckgHisto1Gen(0)       
318    ,fFFBckgHisto1GenLeading(0)
319    ,fFFBckgHisto2RecCuts(0)
320    ,fFFBckgHisto2RecLeading(0)
321    ,fFFBckgHisto2Gen(0)       
322    ,fFFBckgHisto2GenLeading(0)
323    ,fFFBckgHisto3RecCuts(0)
324    ,fFFBckgHisto3RecLeading(0)
325    ,fFFBckgHisto3Gen(0)       
326    ,fFFBckgHisto3GenLeading(0)
327    ,fFFBckgHisto4RecCuts(0)
328    ,fFFBckgHisto4RecLeading(0)
329    ,fFFBckgHisto4Gen(0)       
330    ,fFFBckgHisto4GenLeading(0)
331    ,fIJBckgHisto0RecCuts(0)   
332    ,fIJBckgHisto0RecLeading(0)
333    ,fIJBckgHisto0Gen(0)       
334    ,fIJBckgHisto0GenLeading(0)
335    ,fIJBckgHisto1RecCuts(0)   
336    ,fIJBckgHisto1RecLeading(0)
337    ,fIJBckgHisto1Gen(0)       
338    ,fIJBckgHisto1GenLeading(0)
339    ,fIJBckgHisto2RecCuts(0)   
340    ,fIJBckgHisto2RecLeading(0)
341    ,fIJBckgHisto2Gen(0)       
342    ,fIJBckgHisto2GenLeading(0)
343    ,fIJBckgHisto3RecCuts(0)   
344    ,fIJBckgHisto3RecLeading(0)
345    ,fIJBckgHisto3Gen(0)       
346    ,fIJBckgHisto3GenLeading(0)
347    ,fIJBckgHisto4RecCuts(0)   
348    ,fIJBckgHisto4RecLeading(0)
349    ,fIJBckgHisto4Gen(0)       
350    ,fIJBckgHisto4GenLeading(0)
351    ,fRandom(0)
352    ,fBckgSubMethod(0)
353 {
354    // default constructor
355   fBckgType[0] = 0;
356   fBckgType[1] = 0;
357   fBckgType[2] = 0;
358   fBckgType[3] = 0;
359   fBckgType[4] = 0;
360 }
361
362 //__________________________________________________________________________________________
363 AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const char *name) 
364   : AliAnalysisTaskSE(name)
365   ,fESD(0)
366   ,fAOD(0)
367   ,fAODJets(0)  
368   ,fAODExtension(0)
369   ,fNonStdFile("")
370   ,fBranchRecJets("jets")
371   ,fBranchRecBackJets("")
372   ,fBranchRecBckgClusters("")
373   ,fBranchGenJets("")
374   ,fBranchEmbeddedJets("")
375   ,fTrackTypeGen(0)
376   ,fJetTypeGen(0)
377   ,fJetTypeRecEff(0)
378   ,fUseAODInputJets(kTRUE)
379   ,fFilterMask(0)
380   ,fUsePhysicsSelection(kTRUE)
381   ,fEvtSelectionMask(0)
382   ,fEventClass(0)
383   ,fMaxVertexZ(10)
384   ,fTrackPtCut(0)
385   ,fTrackEtaMin(0)
386   ,fTrackEtaMax(0)
387   ,fTrackPhiMin(0)
388   ,fTrackPhiMax(0)
389   ,fUseExtraTracks(0)
390   ,fUseExtraTracksBgr(0)
391   ,fCutFractionPtEmbedded(0)
392   ,fUseEmbeddedJetAxis(0)
393   ,fUseEmbeddedJetPt(0)  
394   ,fJetPtCut(0)
395   ,fJetEtaMin(0)
396   ,fJetEtaMax(0)
397   ,fJetPhiMin(0)
398   ,fJetPhiMax(0)
399   ,fDiJetCut(0)
400   ,fDiJetDeltaPhiCut(0)
401   ,fDiJetPtFractionCut(0)
402   ,fDiJetCDFCut(0)
403   ,fDiJetKindBins(0)
404   ,fFFRadius(0)
405   ,fFFMaxTrackPt(-1)
406   ,fFFMinnTracks(0)
407   ,fFFBckgRadius(0)
408   ,fBckgMode(0)
409   ,fIJMode(0)
410   ,fQAMode(0)
411   ,fFFMode(0)
412   ,fDJMode(0)
413   ,fEffMode(0)
414   ,fPhiCorrMode(0)
415   ,fUseRecEffRecJetPtBins(0)
416   ,fUseResponseRecJetPtBins(1)
417   ,fAvgTrials(0)
418   ,fTracksRec(0)
419   ,fTracksRecCuts(0)
420   ,fTracksGen(0)
421   ,fTracksAODMCCharged(0)
422   ,fTracksAODMCChargedSec(0)
423   ,fTracksRecQualityCuts(0)
424   ,fJetsRec(0)
425   ,fJetsRecCuts(0)
426   ,fJetsGen(0)
427   ,fJetsRecEff(0)
428   ,fJetsEmbedded(0)
429   ,fBckgJetsRec(0)
430   ,fBckgJetsRecCuts(0)
431   ,fBckgJetsGen(0)
432   ,fQATrackHistosRec(0)
433   ,fQATrackHistosRecCuts(0)
434   ,fQATrackHistosGen(0)
435   ,fQAJetHistosRec(0)
436   ,fQAJetHistosRecCuts(0)
437   ,fQAJetHistosRecCutsLeading(0)
438   ,fQAJetHistosGen(0)
439   ,fQAJetHistosGenLeading(0)
440   ,fQAJetHistosRecEffLeading(0)
441   ,fFFHistosRecCuts(0)
442   ,fFFHistosRecLeading(0)
443   ,fFFHistosRecLeadingTrack(0)
444   ,fFFHistosGen(0)
445   ,fFFHistosGenLeading(0)
446   ,fFFHistosGenLeadingTrack(0)
447   ,fIJHistosRecCuts(0)
448   ,fIJHistosRecLeading(0)
449   ,fIJHistosRecLeadingTrack(0)
450   ,fIJHistosGen(0)
451   ,fIJHistosGenLeading(0)
452   ,fIJHistosGenLeadingTrack(0)
453   ,fFFDiJetHistosRecCuts(0)
454   ,fFFDiJetHistosRecLeading(0)
455   ,fFFDiJetHistosRecLeadingTrack(0)
456   ,fFFDiJetHistosGen(0)
457   ,fFFDiJetHistosGenLeading(0)
458   ,fFFDiJetHistosGenLeadingTrack(0)
459   ,fQADiJetHistosRecCuts(0)
460   ,fQADiJetHistosGen(0)
461   ,fPhiCorrHistosJetArea(0)
462   ,fPhiCorrHistosTransverseArea(0)
463   ,fPhiCorrHistosAwayArea(0)
464   ,fQATrackHighPtThreshold(0) 
465   ,fFFNBinsJetPt(0)    
466   ,fFFJetPtMin(0) 
467   ,fFFJetPtMax(0)
468   ,fFFNBinsPt(0)      
469   ,fFFPtMin(0)        
470   ,fFFPtMax(0)        
471   ,fFFNBinsXi(0)      
472   ,fFFXiMin(0)        
473   ,fFFXiMax(0)        
474   ,fFFNBinsZ(0)       
475   ,fFFZMin(0)         
476   ,fFFZMax(0)         
477   ,fFFLogZBins(kTRUE)         
478   ,fQAJetNBinsPt(0)   
479   ,fQAJetPtMin(0)     
480   ,fQAJetPtMax(0)     
481   ,fQAJetNBinsEta(0)  
482   ,fQAJetEtaMin(0)    
483   ,fQAJetEtaMax(0)    
484   ,fQAJetNBinsPhi(0)  
485   ,fQAJetPhiMin(0)    
486   ,fQAJetPhiMax(0)    
487   ,fQATrackNBinsPt(0) 
488   ,fQATrackPtMin(0)   
489   ,fQATrackPtMax(0)   
490   ,fQATrackNBinsEta(0)
491   ,fQATrackEtaMin(0)  
492   ,fQATrackEtaMax(0)  
493   ,fQATrackNBinsPhi(0)
494   ,fQATrackPhiMin(0)  
495   ,fQATrackPhiMax(0)  
496   ,fIJNBinsJetPt(0)
497   ,fIJJetPtMin(0)
498   ,fIJJetPtMax(0)
499   ,fIJNBinsPt(0)
500   ,fIJPtMin(0)
501   ,fIJPtMax(0)
502   ,fIJNBinsZ(0)
503   ,fIJZMin(0)
504   ,fIJZMax(0)
505   ,fIJNBinsCosTheta(0)
506   ,fIJCosThetaMin(0)
507   ,fIJCosThetaMax(0)
508   ,fIJNBinsTheta(0)
509   ,fIJThetaMin(0)
510   ,fIJThetaMax(0)
511   ,fIJNBinsJt(0)
512   ,fIJJtMin(0)
513   ,fIJJtMax(0)
514   ,fDiJetNBinsJetInvMass(0)
515   ,fDiJetJetInvMassMin(0)
516   ,fDiJetJetInvMassMax(0)
517   ,fDiJetNBinsJetPt(0)
518   ,fDiJetJetPtMin(0)
519   ,fDiJetJetPtMax(0)
520   ,fDiJetNBinsPt(0)
521   ,fDiJetPtMin(0)
522   ,fDiJetPtMax(0)
523   ,fDiJetNBinsXi(0)
524   ,fDiJetXiMin(0)
525   ,fDiJetXiMax(0)
526   ,fDiJetNBinsZ(0)
527   ,fDiJetZMin(0)
528   ,fDiJetZMax(0)
529   ,fQADiJetNBinsInvMass(0)
530   ,fQADiJetInvMassMin(0)
531   ,fQADiJetInvMassMax(0)
532   ,fQADiJetNBinsJetPt(0)
533   ,fQADiJetJetPtMin(0)
534   ,fQADiJetJetPtMax(0)
535   ,fQADiJetNBinsDeltaPhi(0)
536   ,fQADiJetDeltaPhiMin(0)
537   ,fQADiJetDeltaPhiMax(0)
538   ,fQADiJetNBinsDeltaEta(0)
539   ,fQADiJetDeltaEtaMin(0)
540   ,fQADiJetDeltaEtaMax(0)
541   ,fQADiJetNBinsDeltaPt(0)
542   ,fQADiJetDeltaPtMin(0)
543   ,fQADiJetDeltaPtMax(0)
544   ,fQADiJetNBinsInBal(0)  
545   ,fQADiJetInBalMin(0)    
546   ,fQADiJetInBalMax(0)    
547   ,fPhiCorrNBinsPt(0)
548   ,fPhiCorrPtMin(0)
549   ,fPhiCorrPtMax(0)
550   ,fPhiCorrNBinsEta(0)
551   ,fPhiCorrEtaMin(0)
552   ,fPhiCorrEtaMax(0)
553   ,fPhiCorrNBinsPhi(0)
554   ,fPhiCorrPhiMin(0)
555   ,fPhiCorrPhiMax(0)
556   ,fCommonHistList(0)
557   ,fh1EvtSelection(0)
558   ,fh1VertexNContributors(0)
559   ,fh1VertexZ(0)
560   ,fh1EvtMult(0)
561   ,fh1EvtCent(0)
562   ,fh2TrackPtVsDCAXY(0)
563   ,fh2TrackPtVsDCAZ(0)
564   ,fh1Xsec(0)
565   ,fh1Trials(0)
566   ,fh1PtHard(0)
567   ,fh1PtHardTrials(0)
568   ,fh1nRecJetsCuts(0)
569   ,fh1nGenJets(0)
570   ,fh1nRecEffJets(0)
571   ,fh1nEmbeddedJets(0)
572   ,fh1nRecBckgJetsCuts(0)
573   ,fh1nGenBckgJets(0)
574   ,fh2PtRecVsGenPrim(0)
575   ,fh2PtRecVsGenSec(0)
576   ,fQATrackHistosRecEffGen(0)  
577   ,fQATrackHistosRecEffRec(0)
578   ,fQATrackHistosSecRec(0) 
579   ,fFFHistosRecEffGen(0)    
580   ,fFFHistosRecEffRec(0)
581   ,fFFHistosSecRec(0)
582   ,fhnResponseSinglePt(0)  
583   ,fh2SingleInvPtRecMnGenVsPtGen(0) 
584   ,fhnResponseJetTrackPt(0)  
585   ,fhnResponseJetZ(0)        
586   ,fhnResponseJetXi(0)       
587   // Background
588   ,fh1OutLeadingMult(0)
589   ,fh1OutLeadingStatMult(0)
590   ,fh1PerpMult(0)
591   ,fh1ASideMult(0)
592   ,fh1ASideWindowMult(0)
593   ,fh1PerpWindowMult(0)
594   ,fh1Out2JetsMult(0)
595   ,fh1Out3JetsMult(0)
596   ,fh1MedianClustersMult(0)
597   ,fh1OutClustersMult(0)
598   ,fh1FractionPtEmbedded(0)
599   ,fh1IndexEmbedded(0)
600   ,fh2DeltaPtVsJetPtEmbedded(0)
601   ,fh2DeltaPtVsRecJetPtEmbedded(0)
602   ,fh1DeltaREmbedded(0)
603   ,fh2ptVsDistNN_pt50_rec(0) 
604   ,fh2ptVsDistNN_pt50_nonRec(0) 
605   ,fh2ptVsDistNN_pt10_rec(0) 
606   ,fh2ptVsDistNN_pt10_nonRec(0)
607   ,fQABckgHisto0RecCuts(0)  
608   ,fQABckgHisto0Gen(0)      
609   ,fQABckgHisto1RecCuts(0)  
610   ,fQABckgHisto1Gen(0)      
611   ,fQABckgHisto2RecCuts(0)  
612   ,fQABckgHisto2Gen(0) 
613   ,fQABckgHisto3RecCuts(0)  
614   ,fQABckgHisto3Gen(0)
615   ,fQABckgHisto4RecCuts(0)  
616   ,fQABckgHisto4Gen(0)
617   ,fFFBckgHisto0RecCuts(0)
618   ,fFFBckgHisto0RecLeading(0)
619   ,fFFBckgHisto0Gen(0)       
620   ,fFFBckgHisto0GenLeading(0)
621   ,fFFBckgHisto1RecCuts(0)
622   ,fFFBckgHisto1RecLeading(0)
623   ,fFFBckgHisto1Gen(0)       
624   ,fFFBckgHisto1GenLeading(0)
625   ,fFFBckgHisto2RecCuts(0)
626   ,fFFBckgHisto2RecLeading(0)
627   ,fFFBckgHisto2Gen(0)       
628   ,fFFBckgHisto2GenLeading(0)
629   ,fFFBckgHisto3RecCuts(0)
630   ,fFFBckgHisto3RecLeading(0)
631   ,fFFBckgHisto3Gen(0)       
632   ,fFFBckgHisto3GenLeading(0)
633   ,fFFBckgHisto4RecCuts(0)
634   ,fFFBckgHisto4RecLeading(0)
635   ,fFFBckgHisto4Gen(0)       
636   ,fFFBckgHisto4GenLeading(0)
637   ,fIJBckgHisto0RecCuts(0)   
638   ,fIJBckgHisto0RecLeading(0)
639   ,fIJBckgHisto0Gen(0)       
640   ,fIJBckgHisto0GenLeading(0)
641   ,fIJBckgHisto1RecCuts(0)   
642   ,fIJBckgHisto1RecLeading(0)
643   ,fIJBckgHisto1Gen(0)       
644   ,fIJBckgHisto1GenLeading(0)
645   ,fIJBckgHisto2RecCuts(0)   
646   ,fIJBckgHisto2RecLeading(0)
647   ,fIJBckgHisto2Gen(0)       
648   ,fIJBckgHisto2GenLeading(0)
649   ,fIJBckgHisto3RecCuts(0)   
650   ,fIJBckgHisto3RecLeading(0)
651   ,fIJBckgHisto3Gen(0)       
652   ,fIJBckgHisto3GenLeading(0)
653   ,fIJBckgHisto4RecCuts(0)   
654   ,fIJBckgHisto4RecLeading(0)
655   ,fIJBckgHisto4Gen(0)       
656   ,fIJBckgHisto4GenLeading(0)
657   ,fRandom(0)
658   ,fBckgSubMethod(0)
659 {
660   // constructor
661   fBckgType[0] = 0;
662   fBckgType[1] = 0;
663   fBckgType[2] = 0;
664   fBckgType[3] = 0;
665   fBckgType[4] = 0;
666
667   DefineOutput(1,TList::Class());
668   
669
670 }
671
672 //__________________________________________________________________________________________________________________________
673 AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const  AliAnalysisTaskFragmentationFunction &copy)
674   : AliAnalysisTaskSE()
675   ,fESD(copy.fESD)
676   ,fAOD(copy.fAOD)
677   ,fAODJets(copy.fAODJets)  
678   ,fAODExtension(copy.fAODExtension)
679   ,fNonStdFile(copy.fNonStdFile)
680   ,fBranchRecJets(copy.fBranchRecJets)
681   ,fBranchRecBackJets(copy.fBranchRecBackJets)
682   ,fBranchRecBckgClusters(copy.fBranchRecBckgClusters)
683   ,fBranchGenJets(copy.fBranchGenJets)
684   ,fBranchEmbeddedJets(copy.fBranchEmbeddedJets)
685   ,fTrackTypeGen(copy.fTrackTypeGen)
686   ,fJetTypeGen(copy.fJetTypeGen)
687   ,fJetTypeRecEff(copy.fJetTypeRecEff)
688   ,fUseAODInputJets(copy.fUseAODInputJets)
689   ,fFilterMask(copy.fFilterMask)
690   ,fUsePhysicsSelection(copy.fUsePhysicsSelection)
691   ,fEvtSelectionMask(copy.fEvtSelectionMask)
692   ,fEventClass(copy.fEventClass)
693   ,fMaxVertexZ(copy.fMaxVertexZ)
694   ,fTrackPtCut(copy.fTrackPtCut)
695   ,fTrackEtaMin(copy.fTrackEtaMin)
696   ,fTrackEtaMax(copy.fTrackEtaMax)
697   ,fTrackPhiMin(copy.fTrackPhiMin)
698   ,fTrackPhiMax(copy.fTrackPhiMax)
699   ,fUseExtraTracks(copy.fUseExtraTracks)
700   ,fUseExtraTracksBgr(copy.fUseExtraTracksBgr)
701   ,fCutFractionPtEmbedded(copy.fCutFractionPtEmbedded)
702   ,fUseEmbeddedJetAxis(copy.fUseEmbeddedJetAxis)
703   ,fUseEmbeddedJetPt(copy.fUseEmbeddedJetPt)
704   ,fJetPtCut(copy.fJetPtCut)
705   ,fJetEtaMin(copy.fJetEtaMin)
706   ,fJetEtaMax(copy.fJetEtaMax)
707   ,fJetPhiMin(copy.fJetPhiMin)
708   ,fJetPhiMax(copy.fJetPhiMax)
709   ,fDiJetCut(copy.fDiJetCut)
710   ,fDiJetDeltaPhiCut(copy.fDiJetDeltaPhiCut)
711   ,fDiJetPtFractionCut(copy.fDiJetPtFractionCut)
712   ,fDiJetCDFCut(copy.fDiJetCDFCut)
713   ,fDiJetKindBins(copy.fDiJetKindBins)
714   ,fFFRadius(copy.fFFRadius)
715   ,fFFMaxTrackPt(copy.fFFMaxTrackPt)
716   ,fFFMinnTracks(copy.fFFMinnTracks)
717   ,fFFBckgRadius(copy.fFFBckgRadius)
718   ,fBckgMode(copy.fBckgMode)
719   ,fIJMode(copy.fIJMode)
720   ,fQAMode(copy.fQAMode)
721   ,fFFMode(copy.fFFMode)
722   ,fDJMode(copy.fDJMode)
723   ,fEffMode(copy.fEffMode)
724   ,fPhiCorrMode(copy.fPhiCorrMode)
725   ,fUseRecEffRecJetPtBins(copy.fUseRecEffRecJetPtBins)
726   ,fUseResponseRecJetPtBins(copy.fUseResponseRecJetPtBins)
727   ,fAvgTrials(copy.fAvgTrials)
728   ,fTracksRec(copy.fTracksRec)
729   ,fTracksRecCuts(copy.fTracksRecCuts)
730   ,fTracksGen(copy.fTracksGen)
731   ,fTracksAODMCCharged(copy.fTracksAODMCCharged)
732   ,fTracksAODMCChargedSec(copy.fTracksAODMCChargedSec)
733   ,fTracksRecQualityCuts(copy.fTracksRecQualityCuts)
734   ,fJetsRec(copy.fJetsRec)
735   ,fJetsRecCuts(copy.fJetsRecCuts)
736   ,fJetsGen(copy.fJetsGen)
737   ,fJetsRecEff(copy.fJetsRecEff)
738   ,fJetsEmbedded(copy.fJetsEmbedded)
739   ,fBckgJetsRec(copy.fBckgJetsRec)
740   ,fBckgJetsRecCuts(copy.fBckgJetsRecCuts)
741   ,fBckgJetsGen(copy.fBckgJetsGen)
742   ,fQATrackHistosRec(copy.fQATrackHistosRec)
743   ,fQATrackHistosRecCuts(copy.fQATrackHistosRecCuts)
744   ,fQATrackHistosGen(copy.fQATrackHistosGen)
745   ,fQAJetHistosRec(copy.fQAJetHistosRec)
746   ,fQAJetHistosRecCuts(copy.fQAJetHistosRecCuts)
747   ,fQAJetHistosRecCutsLeading(copy.fQAJetHistosRecCutsLeading)
748   ,fQAJetHistosGen(copy.fQAJetHistosGen)
749   ,fQAJetHistosGenLeading(copy.fQAJetHistosGenLeading)
750   ,fQAJetHistosRecEffLeading(copy.fQAJetHistosRecEffLeading)
751   ,fFFHistosRecCuts(copy.fFFHistosRecCuts)
752   ,fFFHistosRecLeading(copy.fFFHistosRecLeading)
753   ,fFFHistosRecLeadingTrack(copy.fFFHistosRecLeadingTrack)
754   ,fFFHistosGen(copy.fFFHistosGen)
755   ,fFFHistosGenLeading(copy.fFFHistosGenLeading)
756   ,fFFHistosGenLeadingTrack(copy.fFFHistosGenLeadingTrack)
757   ,fIJHistosRecCuts(copy.fIJHistosRecCuts)
758   ,fIJHistosRecLeading(copy.fIJHistosRecLeading)
759   ,fIJHistosRecLeadingTrack(copy.fIJHistosRecLeadingTrack)
760   ,fIJHistosGen(copy.fIJHistosGen)
761   ,fIJHistosGenLeading(copy.fIJHistosGenLeading)
762   ,fIJHistosGenLeadingTrack(copy.fIJHistosGenLeadingTrack)
763   ,fFFDiJetHistosRecCuts(copy.fFFDiJetHistosRecCuts)
764   ,fFFDiJetHistosRecLeading(copy.fFFDiJetHistosRecLeading)
765   ,fFFDiJetHistosRecLeadingTrack(copy.fFFDiJetHistosRecLeadingTrack)
766   ,fFFDiJetHistosGen(copy.fFFDiJetHistosGen)
767   ,fFFDiJetHistosGenLeading(copy.fFFDiJetHistosGenLeading)
768   ,fFFDiJetHistosGenLeadingTrack(copy.fFFDiJetHistosGenLeadingTrack)
769   ,fQADiJetHistosRecCuts(copy.fQADiJetHistosRecCuts)
770   ,fQADiJetHistosGen(copy.fQADiJetHistosGen)
771   ,fPhiCorrHistosJetArea(copy.fPhiCorrHistosJetArea)
772   ,fPhiCorrHistosTransverseArea(copy.fPhiCorrHistosTransverseArea)
773   ,fPhiCorrHistosAwayArea(copy.fPhiCorrHistosAwayArea)
774   ,fQATrackHighPtThreshold(copy.fQATrackHighPtThreshold) 
775   ,fFFNBinsJetPt(copy.fFFNBinsJetPt)    
776   ,fFFJetPtMin(copy.fFFJetPtMin) 
777   ,fFFJetPtMax(copy.fFFJetPtMax)
778   ,fFFNBinsPt(copy.fFFNBinsPt)      
779   ,fFFPtMin(copy.fFFPtMin)        
780   ,fFFPtMax(copy.fFFPtMax)        
781   ,fFFNBinsXi(copy.fFFNBinsXi)      
782   ,fFFXiMin(copy.fFFXiMin)        
783   ,fFFXiMax(copy.fFFXiMax)        
784   ,fFFNBinsZ(copy.fFFNBinsZ)       
785   ,fFFZMin(copy.fFFZMin)         
786   ,fFFZMax(copy.fFFZMax)         
787   ,fFFLogZBins(copy.fFFLogZBins)         
788   ,fQAJetNBinsPt(copy.fQAJetNBinsPt)   
789   ,fQAJetPtMin(copy.fQAJetPtMin)     
790   ,fQAJetPtMax(copy.fQAJetPtMax)     
791   ,fQAJetNBinsEta(copy.fQAJetNBinsEta)  
792   ,fQAJetEtaMin(copy.fQAJetEtaMin)    
793   ,fQAJetEtaMax(copy.fQAJetEtaMax)    
794   ,fQAJetNBinsPhi(copy.fQAJetNBinsPhi)  
795   ,fQAJetPhiMin(copy.fQAJetPhiMin)    
796   ,fQAJetPhiMax(copy.fQAJetPhiMax)    
797   ,fQATrackNBinsPt(copy.fQATrackNBinsPt) 
798   ,fQATrackPtMin(copy.fQATrackPtMin)   
799   ,fQATrackPtMax(copy.fQATrackPtMax)   
800   ,fQATrackNBinsEta(copy.fQATrackNBinsEta)
801   ,fQATrackEtaMin(copy.fQATrackEtaMin)  
802   ,fQATrackEtaMax(copy.fQATrackEtaMax)  
803   ,fQATrackNBinsPhi(copy.fQATrackNBinsPhi)
804   ,fQATrackPhiMin(copy.fQATrackPhiMin)  
805   ,fQATrackPhiMax(copy.fQATrackPhiMax)
806   ,fIJNBinsJetPt(copy.fIJNBinsJetPt)
807   ,fIJJetPtMin(copy.fIJJetPtMin)
808   ,fIJJetPtMax(copy.fIJJetPtMax)
809   ,fIJNBinsPt(copy.fIJNBinsPt)
810   ,fIJPtMin(copy.fIJPtMin)
811   ,fIJPtMax(copy.fIJPtMax)
812   ,fIJNBinsZ(copy.fIJNBinsZ)
813   ,fIJZMin(copy.fIJZMin)
814   ,fIJZMax(copy.fIJZMax)
815   ,fIJNBinsCosTheta(copy.fIJNBinsCosTheta)
816   ,fIJCosThetaMin(copy.fIJCosThetaMin)
817   ,fIJCosThetaMax(copy.fIJCosThetaMax)
818   ,fIJNBinsTheta(copy.fIJNBinsTheta)
819   ,fIJThetaMin(copy.fIJThetaMin)
820   ,fIJThetaMax(copy.fIJThetaMax)
821   ,fIJNBinsJt(copy.fIJNBinsJt)
822   ,fIJJtMin(copy.fIJJtMin)
823   ,fIJJtMax(copy.fIJJtMax)
824   ,fDiJetNBinsJetInvMass(copy.fDiJetNBinsJetInvMass)
825   ,fDiJetJetInvMassMin(copy.fDiJetJetInvMassMin)
826   ,fDiJetJetInvMassMax(copy.fDiJetJetInvMassMax)
827   ,fDiJetNBinsJetPt(copy.fDiJetNBinsJetPt)
828   ,fDiJetJetPtMin(copy.fDiJetJetPtMin)
829   ,fDiJetJetPtMax(copy.fDiJetJetPtMax)
830   ,fDiJetNBinsPt(copy.fDiJetNBinsPt)
831   ,fDiJetPtMin(copy.fDiJetPtMin)
832   ,fDiJetPtMax(copy.fDiJetPtMax)
833   ,fDiJetNBinsXi(copy.fDiJetNBinsXi)
834   ,fDiJetXiMin(copy.fDiJetXiMin)
835   ,fDiJetXiMax(copy.fDiJetXiMax)
836   ,fDiJetNBinsZ(copy.fDiJetNBinsZ)
837   ,fDiJetZMin(copy.fDiJetZMin)
838   ,fDiJetZMax(copy.fDiJetZMax)
839   ,fQADiJetNBinsInvMass(copy.fQADiJetNBinsInvMass)
840   ,fQADiJetInvMassMin(copy.fQADiJetInvMassMin)
841   ,fQADiJetInvMassMax(copy.fQADiJetInvMassMax)
842   ,fQADiJetNBinsJetPt(copy.fQADiJetNBinsJetPt)
843   ,fQADiJetJetPtMin(copy.fQADiJetJetPtMin)
844   ,fQADiJetJetPtMax(copy.fQADiJetJetPtMax)
845   ,fQADiJetNBinsDeltaPhi(copy.fQADiJetNBinsDeltaPhi)
846   ,fQADiJetDeltaPhiMin(copy.fQADiJetDeltaPhiMin)
847   ,fQADiJetDeltaPhiMax(copy.fQADiJetDeltaPhiMax)
848   ,fQADiJetNBinsDeltaEta(copy.fQADiJetNBinsDeltaEta)
849   ,fQADiJetDeltaEtaMin(copy.fQADiJetDeltaEtaMin)
850   ,fQADiJetDeltaEtaMax(copy.fQADiJetDeltaEtaMax)
851   ,fQADiJetNBinsDeltaPt(copy.fQADiJetNBinsDeltaPt)
852   ,fQADiJetDeltaPtMin(copy.fQADiJetDeltaPtMin)
853   ,fQADiJetDeltaPtMax(copy.fQADiJetDeltaPtMax)
854   ,fQADiJetNBinsInBal(copy.fQADiJetNBinsInBal)
855   ,fQADiJetInBalMin(copy.fQADiJetInBalMin)
856   ,fQADiJetInBalMax(copy.fQADiJetInBalMax)
857   ,fPhiCorrNBinsPt(copy.fPhiCorrNBinsPt)
858   ,fPhiCorrPtMin(copy.fPhiCorrPtMin)
859   ,fPhiCorrPtMax(copy.fPhiCorrPtMax)
860   ,fPhiCorrNBinsEta(copy.fPhiCorrNBinsEta)
861   ,fPhiCorrEtaMin(copy.fPhiCorrEtaMin)
862   ,fPhiCorrEtaMax(copy.fPhiCorrEtaMax)
863   ,fPhiCorrNBinsPhi(copy.fPhiCorrNBinsPhi)
864   ,fPhiCorrPhiMin(copy.fPhiCorrPhiMin)
865   ,fPhiCorrPhiMax(copy.fPhiCorrPhiMax)
866   ,fCommonHistList(copy.fCommonHistList)
867   ,fh1EvtSelection(copy.fh1EvtSelection)
868   ,fh1VertexNContributors(copy.fh1VertexNContributors)
869   ,fh1VertexZ(copy.fh1VertexZ)
870   ,fh1EvtMult(copy.fh1EvtMult)
871   ,fh1EvtCent(copy.fh1EvtCent)
872   ,fh2TrackPtVsDCAXY(copy.fh2TrackPtVsDCAXY)
873   ,fh2TrackPtVsDCAZ(copy.fh2TrackPtVsDCAXY)
874   ,fh1Xsec(copy.fh1Xsec)
875   ,fh1Trials(copy.fh1Trials)
876   ,fh1PtHard(copy.fh1PtHard)  
877   ,fh1PtHardTrials(copy.fh1PtHardTrials)  
878   ,fh1nRecJetsCuts(copy.fh1nRecJetsCuts)
879   ,fh1nGenJets(copy.fh1nGenJets)
880   ,fh1nRecEffJets(copy.fh1nRecEffJets)
881   ,fh1nEmbeddedJets(copy.fh1nEmbeddedJets)
882   ,fh1nRecBckgJetsCuts(copy.fh1nRecBckgJetsCuts)
883   ,fh1nGenBckgJets(copy.fh1nGenBckgJets)
884   ,fh2PtRecVsGenPrim(copy.fh2PtRecVsGenPrim)
885   ,fh2PtRecVsGenSec(copy.fh2PtRecVsGenSec)
886   ,fQATrackHistosRecEffGen(copy.fQATrackHistosRecEffGen)  
887   ,fQATrackHistosRecEffRec(copy.fQATrackHistosRecEffRec)  
888   ,fQATrackHistosSecRec(copy.fQATrackHistosSecRec)  
889   ,fFFHistosRecEffGen(copy.fFFHistosRecEffGen)    
890   ,fFFHistosRecEffRec(copy.fFFHistosRecEffRec)  
891   ,fFFHistosSecRec(copy.fFFHistosSecRec)   
892   ,fhnResponseSinglePt(copy.fhnResponseSinglePt)
893   ,fh2SingleInvPtRecMnGenVsPtGen(copy.fh2SingleInvPtRecMnGenVsPtGen) 
894   ,fhnResponseJetTrackPt(copy.fhnResponseJetTrackPt)
895   ,fhnResponseJetZ(copy.fhnResponseJetZ)
896   ,fhnResponseJetXi(copy.fhnResponseJetXi)
897   // Background
898   ,fh1OutLeadingMult(copy.fh1OutLeadingMult)
899   ,fh1OutLeadingStatMult(copy.fh1OutLeadingStatMult)
900   ,fh1PerpMult(copy.fh1PerpMult)
901   ,fh1ASideMult(copy.fh1ASideMult)
902   ,fh1ASideWindowMult(copy.fh1ASideWindowMult)
903   ,fh1PerpWindowMult(copy.fh1PerpWindowMult)
904   ,fh1Out2JetsMult(copy.fh1Out2JetsMult)
905   ,fh1Out3JetsMult(copy.fh1Out3JetsMult)
906   ,fh1MedianClustersMult(copy.fh1MedianClustersMult)
907   ,fh1OutClustersMult(copy.fh1OutClustersMult)
908   ,fh1FractionPtEmbedded(copy.fh1FractionPtEmbedded)
909   ,fh1IndexEmbedded(copy.fh1IndexEmbedded)
910   ,fh2DeltaPtVsJetPtEmbedded(copy.fh2DeltaPtVsJetPtEmbedded)
911   ,fh2DeltaPtVsRecJetPtEmbedded(copy.fh2DeltaPtVsRecJetPtEmbedded)
912   ,fh1DeltaREmbedded(copy.fh1DeltaREmbedded)
913   ,fh2ptVsDistNN_pt50_rec(copy.fh2ptVsDistNN_pt50_rec)    
914   ,fh2ptVsDistNN_pt50_nonRec(copy.fh2ptVsDistNN_pt50_nonRec) 
915   ,fh2ptVsDistNN_pt10_rec(copy.fh2ptVsDistNN_pt10_rec)    
916   ,fh2ptVsDistNN_pt10_nonRec(copy.fh2ptVsDistNN_pt10_nonRec) 
917   ,fQABckgHisto0RecCuts(copy.fQABckgHisto0RecCuts)  
918   ,fQABckgHisto0Gen(copy.fQABckgHisto0Gen)      
919   ,fQABckgHisto1RecCuts(copy.fQABckgHisto1RecCuts)  
920   ,fQABckgHisto1Gen(copy.fQABckgHisto1Gen)      
921   ,fQABckgHisto2RecCuts(copy.fQABckgHisto2RecCuts)  
922   ,fQABckgHisto2Gen(copy.fQABckgHisto2Gen)
923   ,fQABckgHisto3RecCuts(copy.fQABckgHisto3RecCuts)  
924   ,fQABckgHisto3Gen(copy.fQABckgHisto3Gen)     
925   ,fQABckgHisto4RecCuts(copy.fQABckgHisto4RecCuts)  
926   ,fQABckgHisto4Gen(copy.fQABckgHisto4Gen)     
927   ,fFFBckgHisto0RecCuts(copy.fFFBckgHisto0RecCuts)
928   ,fFFBckgHisto0RecLeading(copy.fFFBckgHisto0RecLeading)
929   ,fFFBckgHisto0Gen(copy.fFFBckgHisto0Gen)       
930   ,fFFBckgHisto0GenLeading(copy.fFFBckgHisto0GenLeading)
931   ,fFFBckgHisto1RecCuts(copy.fFFBckgHisto1RecCuts)
932   ,fFFBckgHisto1RecLeading(copy.fFFBckgHisto1RecLeading)
933   ,fFFBckgHisto1Gen(copy.fFFBckgHisto1Gen)       
934   ,fFFBckgHisto1GenLeading(copy.fFFBckgHisto1GenLeading)
935   ,fFFBckgHisto2RecCuts(copy.fFFBckgHisto2RecCuts)
936   ,fFFBckgHisto2RecLeading(copy.fFFBckgHisto2RecLeading)
937   ,fFFBckgHisto2Gen(copy.fFFBckgHisto2Gen)       
938   ,fFFBckgHisto2GenLeading(copy.fFFBckgHisto2GenLeading)
939   ,fFFBckgHisto3RecCuts(copy.fFFBckgHisto3RecCuts)
940   ,fFFBckgHisto3RecLeading(copy.fFFBckgHisto3RecLeading)
941   ,fFFBckgHisto3Gen(copy.fFFBckgHisto3Gen)       
942   ,fFFBckgHisto3GenLeading(copy.fFFBckgHisto3GenLeading)
943   ,fFFBckgHisto4RecCuts(copy.fFFBckgHisto4RecCuts)
944   ,fFFBckgHisto4RecLeading(copy.fFFBckgHisto4RecLeading)
945   ,fFFBckgHisto4Gen(copy.fFFBckgHisto4Gen)       
946   ,fFFBckgHisto4GenLeading(copy.fFFBckgHisto4GenLeading)
947   ,fIJBckgHisto0RecCuts(copy.fIJBckgHisto0RecCuts)   
948   ,fIJBckgHisto0RecLeading(copy.fIJBckgHisto0RecLeading)
949   ,fIJBckgHisto0Gen(copy.fIJBckgHisto0Gen)       
950   ,fIJBckgHisto0GenLeading(copy.fIJBckgHisto0GenLeading)
951   ,fIJBckgHisto1RecCuts(copy.fIJBckgHisto1RecCuts)   
952   ,fIJBckgHisto1RecLeading(copy.fIJBckgHisto1RecLeading)
953   ,fIJBckgHisto1Gen(copy.fIJBckgHisto1Gen)       
954   ,fIJBckgHisto1GenLeading(copy.fIJBckgHisto1GenLeading)
955   ,fIJBckgHisto2RecCuts(copy.fIJBckgHisto2RecCuts)   
956   ,fIJBckgHisto2RecLeading(copy.fIJBckgHisto2RecLeading)
957   ,fIJBckgHisto2Gen(copy.fIJBckgHisto2Gen)       
958   ,fIJBckgHisto2GenLeading(copy.fIJBckgHisto2GenLeading)
959   ,fIJBckgHisto3RecCuts(copy.fIJBckgHisto3RecCuts)   
960   ,fIJBckgHisto3RecLeading(copy.fIJBckgHisto3RecLeading)
961   ,fIJBckgHisto3Gen(copy.fIJBckgHisto3Gen)       
962   ,fIJBckgHisto3GenLeading(copy.fIJBckgHisto3GenLeading)
963   ,fIJBckgHisto4RecCuts(copy.fIJBckgHisto4RecCuts)   
964   ,fIJBckgHisto4RecLeading(copy.fIJBckgHisto4RecLeading)
965   ,fIJBckgHisto4Gen(copy.fIJBckgHisto4Gen)       
966   ,fIJBckgHisto4GenLeading(copy.fIJBckgHisto4GenLeading)
967   ,fRandom(copy.fRandom)
968   ,fBckgSubMethod(copy.fBckgSubMethod)
969 {
970   // copy constructor
971   fBckgType[0] = copy.fBckgType[0];
972   fBckgType[1] = copy.fBckgType[1];
973   fBckgType[2] = copy.fBckgType[2];
974   fBckgType[3] = copy.fBckgType[3];
975   fBckgType[4] = copy.fBckgType[4];
976 }
977
978 // _________________________________________________________________________________________________________________________________
979 AliAnalysisTaskFragmentationFunction& AliAnalysisTaskFragmentationFunction::operator=(const AliAnalysisTaskFragmentationFunction& o)
980 {
981   // assignment
982   
983   if(this!=&o){
984
985     AliAnalysisTaskSE::operator=(o);
986     fESD                          = o.fESD;
987     fAOD                          = o.fAOD;
988     fAODJets                      = o.fAODJets;  
989     fAODExtension                 = o.fAODExtension;
990     fNonStdFile                   = o.fNonStdFile;
991     fBranchRecJets                = o.fBranchRecJets;
992     fBranchRecBackJets            = o.fBranchRecBackJets;
993     fBranchRecBckgClusters        = o.fBranchRecBckgClusters;
994     fBranchGenJets                = o.fBranchGenJets;
995     fBranchEmbeddedJets           = o.fBranchEmbeddedJets;
996     fTrackTypeGen                 = o.fTrackTypeGen;
997     fJetTypeGen                   = o.fJetTypeGen;
998     fJetTypeRecEff                = o.fJetTypeRecEff;
999     fUseAODInputJets              = o.fUseAODInputJets;
1000     fFilterMask                   = o.fFilterMask;
1001     fUsePhysicsSelection          = o.fUsePhysicsSelection;
1002     fEvtSelectionMask             = o.fEvtSelectionMask;
1003     fEventClass                   = o.fEventClass;
1004     fMaxVertexZ                   = o.fMaxVertexZ;
1005     fTrackPtCut                   = o.fTrackPtCut;
1006     fTrackEtaMin                  = o.fTrackEtaMin;
1007     fTrackEtaMax                  = o.fTrackEtaMax;
1008     fTrackPhiMin                  = o.fTrackPhiMin;
1009     fTrackPhiMax                  = o.fTrackPhiMax;
1010     fUseExtraTracks               = o.fUseExtraTracks;
1011     fUseExtraTracksBgr            = o.fUseExtraTracksBgr;
1012     fCutFractionPtEmbedded        = o.fCutFractionPtEmbedded;
1013     fUseEmbeddedJetAxis           = o.fUseEmbeddedJetAxis;
1014     fUseEmbeddedJetPt             = o.fUseEmbeddedJetPt;
1015     fJetPtCut                     = o.fJetPtCut;
1016     fJetEtaMin                    = o.fJetEtaMin;
1017     fJetEtaMax                    = o.fJetEtaMax;
1018     fJetPhiMin                    = o.fJetPhiMin;
1019     fJetPhiMax                    = o.fJetPhiMin;
1020     fDiJetCut                     = o.fDiJetCut;
1021     fDiJetDeltaPhiCut             = o.fDiJetDeltaPhiCut;
1022     fDiJetPtFractionCut           = o.fDiJetPtFractionCut;
1023     fDiJetCDFCut                  = o.fDiJetCDFCut;
1024     fDiJetKindBins                = o.fDiJetKindBins;
1025     fFFRadius                     = o.fFFRadius;
1026     fFFMaxTrackPt                 = o.fFFMaxTrackPt;
1027     fFFMinnTracks                 = o.fFFMinnTracks;
1028     fFFBckgRadius                 = o.fFFBckgRadius;
1029     fBckgMode                     = o.fBckgMode;
1030     fIJMode                       = o.fIJMode;
1031     fQAMode                       = o.fQAMode;
1032     fFFMode                       = o.fFFMode;
1033     fDJMode                       = o.fDJMode;
1034     fEffMode                      = o.fEffMode;
1035     fPhiCorrMode                  = o.fPhiCorrMode;
1036     fBckgType[0]                  = o.fBckgType[0];
1037     fBckgType[1]                  = o.fBckgType[1];
1038     fBckgType[2]                  = o.fBckgType[2];
1039     fBckgType[3]                  = o.fBckgType[3];
1040     fBckgType[4]                  = o.fBckgType[4];
1041     fUseRecEffRecJetPtBins        = o.fUseRecEffRecJetPtBins;
1042     fUseResponseRecJetPtBins      = o.fUseResponseRecJetPtBins;
1043     fAvgTrials                    = o.fAvgTrials;
1044     fTracksRec                    = o.fTracksRec;
1045     fTracksRecCuts                = o.fTracksRecCuts;
1046     fTracksGen                    = o.fTracksGen;
1047     fTracksAODMCCharged           = o.fTracksAODMCCharged;
1048     fTracksAODMCChargedSec        = o.fTracksAODMCChargedSec;
1049     fTracksRecQualityCuts         = o.fTracksRecQualityCuts;
1050     fJetsRec                      = o.fJetsRec;
1051     fJetsRecCuts                  = o.fJetsRecCuts;
1052     fJetsGen                      = o.fJetsGen;
1053     fJetsRecEff                   = o.fJetsRecEff;
1054     fJetsEmbedded                 = o.fJetsEmbedded;
1055     fBckgJetsRec                  = o.fBckgJetsRec;
1056     fBckgJetsRecCuts              = o.fBckgJetsRecCuts;
1057     fBckgJetsGen                  = o.fBckgJetsGen;
1058     fQATrackHistosRec             = o.fQATrackHistosRec;
1059     fQATrackHistosRecCuts         = o.fQATrackHistosRecCuts;
1060     fQATrackHistosGen             = o.fQATrackHistosGen;
1061     fQAJetHistosRec               = o.fQAJetHistosRec;
1062     fQAJetHistosRecCuts           = o.fQAJetHistosRecCuts;
1063     fQAJetHistosRecCutsLeading    = o.fQAJetHistosRecCutsLeading;
1064     fQAJetHistosGen               = o.fQAJetHistosGen;
1065     fQAJetHistosGenLeading        = o.fQAJetHistosGenLeading;
1066     fQAJetHistosRecEffLeading     = o.fQAJetHistosRecEffLeading;
1067     fFFHistosRecCuts              = o.fFFHistosRecCuts;
1068     fFFHistosRecLeading           = o.fFFHistosRecLeading;
1069     fFFHistosRecLeadingTrack      = o.fFFHistosRecLeadingTrack;
1070     fFFHistosGen                  = o.fFFHistosGen;
1071     fFFHistosGenLeading           = o.fFFHistosGenLeading;
1072     fFFHistosGenLeadingTrack      = o.fFFHistosGenLeadingTrack;
1073     fIJHistosRecCuts              = o.fIJHistosRecCuts;
1074     fIJHistosRecLeading           = o.fIJHistosRecLeading;
1075     fIJHistosRecLeadingTrack      = o.fIJHistosRecLeadingTrack;
1076     fIJHistosGen                  = o.fIJHistosGen;
1077     fIJHistosGenLeading           = o.fIJHistosGenLeading;
1078     fIJHistosGenLeadingTrack      = o.fIJHistosGenLeadingTrack;
1079     fFFDiJetHistosRecCuts         = o.fFFDiJetHistosRecCuts;
1080     fFFDiJetHistosRecLeading      = o.fFFDiJetHistosRecLeading;
1081     fFFDiJetHistosRecLeadingTrack = o.fFFDiJetHistosRecLeadingTrack;
1082     fFFDiJetHistosGen             = o.fFFDiJetHistosGen;
1083     fFFDiJetHistosGenLeading      = o.fFFDiJetHistosGenLeading;
1084     fFFDiJetHistosGenLeadingTrack = o.fFFDiJetHistosGenLeadingTrack;
1085     fQADiJetHistosRecCuts         = o.fQADiJetHistosRecCuts;
1086     fQADiJetHistosGen             = o.fQADiJetHistosGen;
1087     fPhiCorrHistosJetArea         = o.fPhiCorrHistosJetArea;
1088     fPhiCorrHistosTransverseArea  = o.fPhiCorrHistosTransverseArea;
1089     fPhiCorrHistosAwayArea        = o.fPhiCorrHistosAwayArea;
1090     fQATrackHighPtThreshold       = o.fQATrackHighPtThreshold; 
1091     fFFNBinsJetPt                 = o.fFFNBinsJetPt;    
1092     fFFJetPtMin                   = o.fFFJetPtMin; 
1093     fFFJetPtMax                   = o.fFFJetPtMax;
1094     fFFNBinsPt                    = o.fFFNBinsPt;      
1095     fFFPtMin                      = o.fFFPtMin;        
1096     fFFPtMax                      = o.fFFPtMax;        
1097     fFFNBinsXi                    = o.fFFNBinsXi;      
1098     fFFXiMin                      = o.fFFXiMin;        
1099     fFFXiMax                      = o.fFFXiMax;        
1100     fFFNBinsZ                     = o.fFFNBinsZ;       
1101     fFFZMin                       = o.fFFZMin;         
1102     fFFZMax                       = o.fFFZMax;         
1103     fFFLogZBins                   = o.fFFLogZBins;         
1104     fQAJetNBinsPt                 = o.fQAJetNBinsPt;   
1105     fQAJetPtMin                   = o.fQAJetPtMin;     
1106     fQAJetPtMax                   = o.fQAJetPtMax;     
1107     fQAJetNBinsEta                = o.fQAJetNBinsEta;  
1108     fQAJetEtaMin                  = o.fQAJetEtaMin;    
1109     fQAJetEtaMax                  = o.fQAJetEtaMax;    
1110     fQAJetNBinsPhi                = o.fQAJetNBinsPhi;  
1111     fQAJetPhiMin                  = o.fQAJetPhiMin;    
1112     fQAJetPhiMax                  = o.fQAJetPhiMax;    
1113     fQATrackNBinsPt               = o.fQATrackNBinsPt; 
1114     fQATrackPtMin                 = o.fQATrackPtMin;   
1115     fQATrackPtMax                 = o.fQATrackPtMax;   
1116     fQATrackNBinsEta              = o.fQATrackNBinsEta;
1117     fQATrackEtaMin                = o.fQATrackEtaMin;  
1118     fQATrackEtaMax                = o.fQATrackEtaMax;  
1119     fQATrackNBinsPhi              = o.fQATrackNBinsPhi;
1120     fQATrackPhiMin                = o.fQATrackPhiMin;  
1121     fQATrackPhiMax                = o.fQATrackPhiMax;  
1122     fIJNBinsJetPt                 = o.fIJNBinsJetPt;
1123     fIJJetPtMin                   = o.fIJJetPtMin;
1124     fIJJetPtMax                   = o.fIJJetPtMax;
1125     fIJNBinsPt                    = o.fIJNBinsPt;
1126     fIJPtMin                      = o.fIJPtMin;
1127     fIJPtMax                      = o.fIJPtMax;
1128     fIJNBinsZ                     = o.fIJNBinsZ;
1129     fIJZMin                       = o.fIJZMin;
1130     fIJZMax                       = o.fIJZMax;
1131     fIJNBinsCosTheta              = o.fIJNBinsCosTheta;
1132     fIJCosThetaMin                = o.fIJCosThetaMin;
1133     fIJCosThetaMax                = o.fIJCosThetaMax;
1134     fIJNBinsTheta                 = o.fIJNBinsTheta;
1135     fIJThetaMin                   = o.fIJThetaMin;
1136     fIJThetaMax                   = o.fIJThetaMax;
1137     fIJNBinsJt                    = o.fIJNBinsJt;
1138     fIJJtMin                      = o.fIJJtMin;
1139     fIJJtMax                      = o.fIJJtMax;
1140     fDiJetNBinsJetInvMass         = o.fDiJetNBinsJetInvMass;
1141     fDiJetJetInvMassMin           = o.fDiJetJetInvMassMin;
1142     fDiJetJetInvMassMax           = o.fDiJetJetInvMassMax;
1143     fDiJetNBinsJetPt              = o.fDiJetNBinsJetPt;
1144     fDiJetJetPtMin                = o.fDiJetJetPtMin;
1145     fDiJetJetPtMax                = o.fDiJetJetPtMax;
1146     fDiJetNBinsPt                 = o.fDiJetNBinsPt;
1147     fDiJetPtMin                   = o.fDiJetPtMin;
1148     fDiJetPtMax                   = o.fDiJetPtMax;
1149     fDiJetNBinsXi                 = o.fDiJetNBinsXi;
1150     fDiJetXiMin                   = o.fDiJetXiMin;
1151     fDiJetXiMax                   = o.fDiJetXiMax;
1152     fDiJetNBinsZ                  = o.fDiJetNBinsZ;
1153     fDiJetZMin                    = o.fDiJetZMin;
1154     fDiJetZMax                    = o.fDiJetZMax;
1155     fQADiJetNBinsInvMass          = o.fQADiJetNBinsInvMass;
1156     fQADiJetInvMassMin            = o.fQADiJetInvMassMin;
1157     fQADiJetInvMassMax            = o.fQADiJetInvMassMax;
1158     fQADiJetNBinsJetPt            = o.fQADiJetNBinsJetPt;
1159     fQADiJetJetPtMin              = o.fQADiJetJetPtMin;
1160     fQADiJetJetPtMax              = o.fQADiJetJetPtMax;
1161     fQADiJetNBinsDeltaPhi         = o.fQADiJetNBinsDeltaPhi;
1162     fQADiJetDeltaPhiMin           = o.fQADiJetDeltaPhiMin;
1163     fQADiJetDeltaPhiMax           = o.fQADiJetDeltaPhiMax;
1164     fQADiJetNBinsDeltaEta         = o.fQADiJetNBinsDeltaEta;
1165     fQADiJetDeltaEtaMin           = o.fQADiJetDeltaEtaMin;
1166     fQADiJetDeltaEtaMax           = o.fQADiJetDeltaEtaMax;
1167     fQADiJetNBinsDeltaPt          = o.fQADiJetNBinsDeltaPt;
1168     fQADiJetDeltaPtMin            = o.fQADiJetDeltaPtMin;
1169     fQADiJetDeltaPtMax            = o.fQADiJetDeltaPtMax;
1170     fQADiJetNBinsInBal            = o.fQADiJetNBinsInBal;
1171     fQADiJetInBalMin              = o.fQADiJetInBalMin;
1172     fQADiJetInBalMax              = o.fQADiJetInBalMax;
1173     fPhiCorrNBinsPt               = o.fPhiCorrNBinsPt;
1174     fPhiCorrPtMin                 = o.fPhiCorrPtMin;
1175     fPhiCorrPtMax                 = o.fPhiCorrPtMax;
1176     fPhiCorrNBinsEta              = o.fPhiCorrNBinsEta;
1177     fPhiCorrEtaMin                = o.fPhiCorrEtaMin;
1178     fPhiCorrEtaMax                = o.fPhiCorrEtaMax;
1179     fPhiCorrNBinsPhi              = o.fPhiCorrNBinsPhi;
1180     fPhiCorrPhiMin                = o.fPhiCorrPhiMin;
1181     fPhiCorrPhiMax                = o.fPhiCorrPhiMax;
1182     fCommonHistList               = o.fCommonHistList;
1183     fh1EvtSelection               = o.fh1EvtSelection;
1184     fh1VertexNContributors        = o.fh1VertexNContributors;
1185     fh1VertexZ                    = o.fh1VertexZ;
1186     fh1EvtMult                    = o.fh1EvtMult;
1187     fh1EvtCent                    = o.fh1EvtCent;
1188     fh2TrackPtVsDCAXY             = o.fh2TrackPtVsDCAXY;
1189     fh2TrackPtVsDCAZ              = o.fh2TrackPtVsDCAXY;
1190     fh1Xsec                       = o.fh1Xsec;
1191     fh1Trials                     = o.fh1Trials;
1192     fh1PtHard                     = o.fh1PtHard;
1193     fh1PtHardTrials               = o.fh1PtHardTrials;
1194     fh1nRecJetsCuts               = o.fh1nRecJetsCuts;
1195     fh1nGenJets                   = o.fh1nGenJets; 
1196     fh1nRecEffJets                = o.fh1nRecEffJets;
1197     fh1nEmbeddedJets              = o.fh1nEmbeddedJets;
1198     fh2PtRecVsGenPrim             = o.fh2PtRecVsGenPrim;
1199     fh2PtRecVsGenSec              = o.fh2PtRecVsGenSec;
1200     fQATrackHistosRecEffGen       = o.fQATrackHistosRecEffGen;  
1201     fQATrackHistosRecEffRec       = o.fQATrackHistosRecEffRec;  
1202     fQATrackHistosSecRec          = o.fQATrackHistosSecRec;  
1203     fFFHistosRecEffGen            = o.fFFHistosRecEffGen;    
1204     fFFHistosRecEffRec            = o.fFFHistosRecEffRec;  
1205     fFFHistosSecRec               = o.fFFHistosSecRec;   
1206     fhnResponseSinglePt           = o.fhnResponseSinglePt;
1207     fh2SingleInvPtRecMnGenVsPtGen = o.fh2SingleInvPtRecMnGenVsPtGen;
1208     fhnResponseJetTrackPt         = o.fhnResponseJetTrackPt;
1209     fhnResponseJetZ               = o.fhnResponseJetZ;
1210     fhnResponseJetXi              = o.fhnResponseJetXi;
1211     // Background
1212     fh1OutLeadingMult             = o.fh1OutLeadingMult;
1213     fh1OutLeadingStatMult         = o.fh1OutLeadingStatMult;
1214     fh1PerpMult                   = o.fh1PerpMult;
1215     fh1ASideMult                  = o.fh1ASideMult;
1216     fh1ASideWindowMult            = o.fh1ASideWindowMult;
1217     fh1PerpWindowMult             = o.fh1PerpWindowMult;
1218     fh1Out2JetsMult               = o.fh1Out2JetsMult;
1219     fh1Out3JetsMult               = o.fh1Out3JetsMult;
1220     fh1MedianClustersMult         = o.fh1MedianClustersMult;
1221     fh1OutClustersMult            = o.fh1OutClustersMult;
1222     fh1FractionPtEmbedded         = o.fh1FractionPtEmbedded;
1223     fh1IndexEmbedded              = o.fh1IndexEmbedded;
1224     fh2DeltaPtVsJetPtEmbedded     = o.fh2DeltaPtVsJetPtEmbedded;
1225     fh2DeltaPtVsRecJetPtEmbedded  = o.fh2DeltaPtVsRecJetPtEmbedded;
1226     fh1DeltaREmbedded             = o.fh1DeltaREmbedded;
1227     fh2ptVsDistNN_pt50_rec        = o.fh2ptVsDistNN_pt50_rec;    
1228     fh2ptVsDistNN_pt50_nonRec     = o.fh2ptVsDistNN_pt50_nonRec; 
1229     fh2ptVsDistNN_pt10_rec        = o.fh2ptVsDistNN_pt10_rec;    
1230     fh2ptVsDistNN_pt10_nonRec     = o.fh2ptVsDistNN_pt10_nonRec; 
1231     fQABckgHisto0RecCuts          = o.fQABckgHisto0RecCuts;  
1232     fQABckgHisto0Gen              = o.fQABckgHisto0Gen;      
1233     fQABckgHisto1RecCuts          = o.fQABckgHisto1RecCuts;  
1234     fQABckgHisto1Gen              = o.fQABckgHisto1Gen;      
1235     fQABckgHisto2RecCuts          = o.fQABckgHisto2RecCuts;  
1236     fQABckgHisto2Gen              = o.fQABckgHisto2Gen;  
1237     fQABckgHisto3RecCuts          = o.fQABckgHisto3RecCuts;  
1238     fQABckgHisto3Gen              = o.fQABckgHisto3Gen;  
1239     fQABckgHisto4RecCuts          = o.fQABckgHisto4RecCuts;  
1240     fQABckgHisto4Gen              = o.fQABckgHisto4Gen;  
1241     fFFBckgHisto0RecCuts          = o.fFFBckgHisto0RecCuts;
1242     fFFBckgHisto0RecLeading       = o.fFFBckgHisto0RecLeading;
1243     fFFBckgHisto0Gen              = o.fFFBckgHisto0Gen;       
1244     fFFBckgHisto0GenLeading       = o.fFFBckgHisto0GenLeading;
1245     fFFBckgHisto1RecCuts          = o.fFFBckgHisto1RecCuts;
1246     fFFBckgHisto1RecLeading       = o.fFFBckgHisto1RecLeading;
1247     fFFBckgHisto1Gen              = o.fFFBckgHisto1Gen;       
1248     fFFBckgHisto1GenLeading       = o.fFFBckgHisto1GenLeading;
1249     fFFBckgHisto2RecCuts          = o.fFFBckgHisto2RecCuts;
1250     fFFBckgHisto2RecLeading       = o.fFFBckgHisto2RecLeading;
1251     fFFBckgHisto2Gen              = o.fFFBckgHisto2Gen;       
1252     fFFBckgHisto2GenLeading       = o.fFFBckgHisto2GenLeading;
1253     fFFBckgHisto3RecCuts          = o.fFFBckgHisto3RecCuts;
1254     fFFBckgHisto3RecLeading       = o.fFFBckgHisto3RecLeading;
1255     fFFBckgHisto3Gen              = o.fFFBckgHisto3Gen;       
1256     fFFBckgHisto3GenLeading       = o.fFFBckgHisto3GenLeading;
1257     fFFBckgHisto4RecCuts          = o.fFFBckgHisto4RecCuts;
1258     fFFBckgHisto4RecLeading       = o.fFFBckgHisto4RecLeading;
1259     fFFBckgHisto4Gen              = o.fFFBckgHisto4Gen;       
1260     fFFBckgHisto4GenLeading       = o.fFFBckgHisto4GenLeading;
1261     fIJBckgHisto0RecCuts          = o.fIJBckgHisto0RecCuts;   
1262     fIJBckgHisto0RecLeading       = o.fIJBckgHisto0RecLeading;
1263     fIJBckgHisto0Gen              = o.fIJBckgHisto0Gen;       
1264     fIJBckgHisto0GenLeading       = o.fIJBckgHisto0GenLeading;
1265     fIJBckgHisto1RecCuts          = o.fIJBckgHisto1RecCuts;   
1266     fIJBckgHisto1RecLeading       = o.fIJBckgHisto1RecLeading;
1267     fIJBckgHisto1Gen              = o.fIJBckgHisto1Gen;       
1268     fIJBckgHisto1GenLeading       = o.fIJBckgHisto1GenLeading;
1269     fIJBckgHisto2RecCuts          = o.fIJBckgHisto2RecCuts;   
1270     fIJBckgHisto2RecLeading       = o.fIJBckgHisto2RecLeading;
1271     fIJBckgHisto2Gen              = o.fIJBckgHisto2Gen;       
1272     fIJBckgHisto2GenLeading       = o.fIJBckgHisto2GenLeading;
1273     fIJBckgHisto3Gen              = o.fIJBckgHisto3Gen;       
1274     fIJBckgHisto3GenLeading       = o.fIJBckgHisto3GenLeading;
1275     fIJBckgHisto4Gen              = o.fIJBckgHisto4Gen;       
1276     fIJBckgHisto4GenLeading       = o.fIJBckgHisto4GenLeading;
1277     fRandom                       = o.fRandom;
1278     fBckgSubMethod                = o.fBckgSubMethod;
1279   }
1280     
1281   return *this;
1282 }
1283
1284 //___________________________________________________________________________
1285 AliAnalysisTaskFragmentationFunction::~AliAnalysisTaskFragmentationFunction()
1286 {
1287   // destructor
1288   
1289   if(fTracksRec)             delete fTracksRec;
1290   if(fTracksRecCuts)         delete fTracksRecCuts;
1291   if(fTracksGen)             delete fTracksGen;
1292   if(fTracksAODMCCharged)    delete fTracksAODMCCharged;  
1293   if(fTracksAODMCChargedSec) delete fTracksAODMCChargedSec;  
1294   if(fTracksRecQualityCuts)  delete fTracksRecQualityCuts; 
1295   if(fJetsRec)               delete fJetsRec;
1296   if(fJetsRecCuts)           delete fJetsRecCuts;
1297   if(fJetsGen)               delete fJetsGen;
1298   if(fJetsRecEff)            delete fJetsRecEff;
1299   if(fJetsEmbedded)          delete fJetsEmbedded;
1300
1301   if(fBckgMode && 
1302      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
1303       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
1304       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
1305
1306     if(fBckgJetsRec)          delete fBckgJetsRec;
1307     if(fBckgJetsRecCuts)      delete fBckgJetsRecCuts;
1308     if(fBckgJetsGen)          delete fBckgJetsGen;
1309   }
1310   if(fRandom)               delete fRandom;
1311 }
1312
1313 //______________________________________________________________________________________________________
1314 AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::AliFragFuncHistos(const char* name, 
1315                                                          Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,  
1316                                                          Int_t nPt, Float_t ptMin, Float_t ptMax,
1317                                                          Int_t nXi, Float_t xiMin, Float_t xiMax,
1318                                                          Int_t nZ , Float_t zMin , Float_t zMax, Bool_t useLogZBins)
1319   : TObject()
1320   ,fNBinsJetPt(nJetPt)
1321   ,fJetPtMin(jetPtMin)
1322   ,fJetPtMax(jetPtMax)
1323   ,fNBinsPt(nPt) 
1324   ,fPtMin(ptMin)   
1325   ,fPtMax(ptMax)   
1326   ,fNBinsXi(nXi) 
1327   ,fXiMin(xiMin)   
1328   ,fXiMax(xiMax)   
1329   ,fNBinsZ(nZ)  
1330   ,fZMin(zMin)    
1331   ,fZMax(zMax)
1332   ,fLogZBins(useLogZBins)
1333   ,fh2TrackPt(0)
1334   ,fh2Xi(0)
1335   ,fh2Z(0)
1336   ,fh1JetPt(0)
1337   ,fNameFF(name)
1338 {
1339   // default constructor
1340
1341 }
1342
1343 //___________________________________________________________________________
1344 AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::AliFragFuncHistos(const AliFragFuncHistos& copy)
1345   : TObject()
1346   ,fNBinsJetPt(copy.fNBinsJetPt)
1347   ,fJetPtMin(copy.fJetPtMin)
1348   ,fJetPtMax(copy.fJetPtMax)
1349   ,fNBinsPt(copy.fNBinsPt) 
1350   ,fPtMin(copy.fPtMin)   
1351   ,fPtMax(copy.fPtMax)   
1352   ,fNBinsXi(copy.fNBinsXi) 
1353   ,fXiMin(copy.fXiMin)   
1354   ,fXiMax(copy.fXiMax)   
1355   ,fNBinsZ(copy.fNBinsZ)  
1356   ,fZMin(copy.fZMin)    
1357   ,fZMax(copy.fZMax)
1358   ,fLogZBins(copy.fLogZBins)
1359   ,fh2TrackPt(copy.fh2TrackPt)
1360   ,fh2Xi(copy.fh2Xi)
1361   ,fh2Z(copy.fh2Z)
1362   ,fh1JetPt(copy.fh1JetPt)
1363   ,fNameFF(copy.fNameFF)
1364 {
1365   // copy constructor
1366 }
1367
1368 //_______________________________________________________________________________________________________________________________________________________________
1369 AliAnalysisTaskFragmentationFunction::AliFragFuncHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncHistos& o)
1370 {
1371   // assignment
1372   
1373   if(this!=&o){
1374     TObject::operator=(o);
1375     fNBinsJetPt = o.fNBinsJetPt;
1376     fJetPtMin   = o.fJetPtMin;
1377     fJetPtMax   = o.fJetPtMax;
1378     fNBinsPt    = o.fNBinsPt; 
1379     fPtMin      = o.fPtMin;   
1380     fPtMax      = o.fPtMax;   
1381     fNBinsXi    = o.fNBinsXi; 
1382     fXiMin      = o.fXiMin;   
1383     fXiMax      = o.fXiMax;   
1384     fNBinsZ     = o.fNBinsZ;  
1385     fZMin       = o.fZMin;    
1386     fZMax       = o.fZMax;    
1387     fLogZBins   = o.fLogZBins;
1388     fh2TrackPt  = o.fh2TrackPt;
1389     fh2Xi       = o.fh2Xi;
1390     fh2Z        = o.fh2Z;
1391     fh1JetPt    = o.fh1JetPt;
1392     fNameFF     = o.fNameFF;
1393   }
1394     
1395   return *this;
1396 }
1397
1398 //_________________________________________________________
1399 AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::~AliFragFuncHistos()
1400 {
1401   // destructor 
1402
1403   if(fh1JetPt)   delete fh1JetPt;
1404   if(fh2TrackPt) delete fh2TrackPt;
1405   if(fh2Xi)      delete fh2Xi;
1406   if(fh2Z)       delete fh2Z;
1407 }
1408
1409 //_________________________________________________________________
1410 void AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::DefineHistos()
1411 {
1412   // book FF histos
1413
1414   fh1JetPt   = new TH1F(Form("fh1FFJetPt%s", fNameFF.Data()),"",fNBinsJetPt,fJetPtMin,fJetPtMax);
1415   fh2TrackPt = new TH2F(Form("fh2FFTrackPt%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax,fNBinsPt, fPtMin, fPtMax);
1416   fh2Xi      = new TH2F(Form("fh2FFXi%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsXi, fXiMin, fXiMax);
1417
1418   if(!fLogZBins) fh2Z       = new TH2F(Form("fh2FFZ%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsZ, fZMin, fZMax);
1419   else{ // logarithmic z binning
1420
1421     fNBinsZ = fNBinsXi;
1422     Double_t binLimsZ[fNBinsXi+1];      
1423
1424     CalcLogZBins(fNBinsXi,fXiMin,fXiMax,binLimsZ);
1425
1426     fh2Z    = new TH2F(Form("fh2FFZ%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsZ, binLimsZ);
1427   }
1428
1429   AliAnalysisTaskFragmentationFunction::SetProperties(fh1JetPt, "p_{T} [GeV/c]", "entries"); 
1430   AliAnalysisTaskFragmentationFunction::SetProperties(fh2TrackPt,"jet p_{T} [GeV/c]","p_{T} [GeV/c]","entries");
1431   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Xi,"jet p_{T} [GeV/c]","#xi", "entries");
1432   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Z,"jet p_{T} [GeV/c]","z","entries");
1433 }
1434
1435 //_______________________________________________________________________________________________________________________________________
1436 void AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::CalcLogZBins(const Int_t nBinsXi,const Double_t xiMin,const Double_t xiMax,Double_t* binLims){
1437   
1438   // calculate logarithmic binning corresponding to equidistant xi bins
1439   // expect binLims vector of size nBinsXi+1
1440
1441   if(nBinsXi == 0){
1442     Printf("%s:%d nBinsXi == 0",(char*)__FILE__,__LINE__); 
1443     return;
1444   }
1445
1446   Double_t step = (xiMax-xiMin)/nBinsXi;
1447   
1448   for(Int_t binZ = 0; binZ<nBinsXi; binZ++){
1449    
1450     Double_t xiUp = xiMax -  binZ*step;
1451     Double_t xiLo = xiMax - (binZ+1)*step;
1452       
1453     Double_t zUp = TMath::Exp(-1*xiLo);
1454     Double_t zLo = TMath::Exp(-1*xiUp);
1455       
1456     if(binZ == 0) binLims[0] = zLo;
1457     binLims[binZ+1] = zUp;   
1458   }
1459 }
1460
1461 //_______________________________________________________________________________________________________________
1462 void AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::FillFF(Float_t trackPt, Float_t jetPt, Bool_t incrementJetPt, Float_t norm)
1463 {
1464   // fill FF
1465  
1466   if(incrementJetPt && norm) fh1JetPt->Fill(jetPt,1/norm);
1467   else if(incrementJetPt) fh1JetPt->Fill(jetPt);
1468
1469  // Added for proper normalization of FF background estimation
1470   // when zero track are found in the background region
1471   if((int)trackPt==-1) return;
1472  
1473   if(norm)fh2TrackPt->Fill(jetPt,trackPt,1/norm);
1474   else fh2TrackPt->Fill(jetPt,trackPt);
1475   
1476   Double_t z = 0.;
1477   if(jetPt>0) z = trackPt / jetPt;
1478   Double_t xi = 0;
1479   if(z>0) xi = TMath::Log(1/z);
1480   
1481   if(norm){
1482     fh2Xi->Fill(jetPt,xi,1/norm);
1483     fh2Z->Fill(jetPt,z,1/norm);
1484   }
1485   else {
1486     fh2Xi->Fill(jetPt,xi);
1487     fh2Z->Fill(jetPt,z);
1488   }
1489 }
1490
1491 //_________________________________________________________________________________
1492 void AliAnalysisTaskFragmentationFunction::AliFragFuncHistos::AddToOutput(TList* list) const
1493 {
1494   // add histos to list
1495
1496   list->Add(fh1JetPt);
1497   
1498   list->Add(fh2TrackPt);
1499   list->Add(fh2Xi);
1500   list->Add(fh2Z);
1501 }
1502
1503 //_________________________________________________________________________________________________________
1504 AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::AliFragFuncQAJetHistos(const char* name,
1505                                                                Int_t nPt,   Float_t ptMin,   Float_t ptMax,
1506                                                                Int_t nEta,  Float_t etaMin,  Float_t etaMax,
1507                                                                Int_t nPhi,  Float_t phiMin,  Float_t phiMax)
1508   : TObject()
1509   ,fNBinsPt(nPt)
1510   ,fPtMin(ptMin)
1511   ,fPtMax(ptMax)
1512   ,fNBinsEta(nEta)
1513   ,fEtaMin(etaMin)
1514   ,fEtaMax(etaMax)
1515   ,fNBinsPhi(nPhi)
1516   ,fPhiMin(phiMin)
1517   ,fPhiMax(phiMax)
1518   ,fh2EtaPhi(0)
1519   ,fh1Pt(0)
1520   ,fNameQAJ(name)
1521 {
1522   // default constructor
1523 }
1524
1525 //____________________________________________________________________________________
1526 AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::AliFragFuncQAJetHistos(const AliFragFuncQAJetHistos& copy)
1527   : TObject()
1528   ,fNBinsPt(copy.fNBinsPt)
1529   ,fPtMin(copy.fPtMin)
1530   ,fPtMax(copy.fPtMax)
1531   ,fNBinsEta(copy.fNBinsEta)
1532   ,fEtaMin(copy.fEtaMin)
1533   ,fEtaMax(copy.fEtaMax)
1534   ,fNBinsPhi(copy.fNBinsPhi)
1535   ,fPhiMin(copy.fPhiMin)
1536   ,fPhiMax(copy.fPhiMax)
1537   ,fh2EtaPhi(copy.fh2EtaPhi)
1538   ,fh1Pt(copy.fh1Pt)
1539   ,fNameQAJ(copy.fNameQAJ)
1540 {
1541   // copy constructor
1542 }
1543
1544 //________________________________________________________________________________________________________________________________________________________________________
1545 AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos& o)
1546 {
1547   // assignment
1548   
1549   if(this!=&o){
1550     TObject::operator=(o);
1551     fNBinsPt  = o.fNBinsPt;
1552     fPtMin    = o.fPtMin;
1553     fPtMax    = o.fPtMax;
1554     fNBinsEta = o.fNBinsEta;
1555     fEtaMin   = o.fEtaMin;
1556     fEtaMax   = o.fEtaMax;
1557     fNBinsPhi = o.fNBinsPhi;
1558     fPhiMin   = o.fPhiMin;
1559     fPhiMax   = o.fPhiMax;
1560     fh2EtaPhi = o.fh2EtaPhi;
1561     fh1Pt     = o.fh1Pt;
1562     fNameQAJ  = o.fNameQAJ;
1563   }
1564   
1565   return *this;
1566 }
1567
1568 //______________________________________________________________
1569 AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::~AliFragFuncQAJetHistos()
1570 {
1571   // destructor 
1572   
1573   if(fh2EtaPhi) delete fh2EtaPhi;
1574   if(fh1Pt)     delete fh1Pt;
1575 }
1576
1577 //____________________________________________________________________
1578 void AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::DefineHistos()
1579 {
1580   // book jet QA histos
1581
1582   fh2EtaPhi  = new TH2F(Form("fh2JetQAEtaPhi%s", fNameQAJ.Data()), Form("%s: #eta - #phi distribution", fNameQAJ.Data()), fNBinsEta, fEtaMin, fEtaMax, fNBinsPhi, fPhiMin, fPhiMax);
1583   fh1Pt      = new TH1F(Form("fh1JetQAPt%s", fNameQAJ.Data()), Form("%s: p_{T} distribution", fNameQAJ.Data()), fNBinsPt, fPtMin, fPtMax);
1584         
1585   AliAnalysisTaskFragmentationFunction::SetProperties(fh2EtaPhi, "#eta", "#phi"); 
1586   AliAnalysisTaskFragmentationFunction::SetProperties(fh1Pt, "p_{T} [GeV/c]", "entries");
1587 }
1588
1589 //____________________________________________________________________________________________________
1590 void AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::FillJetQA(Float_t eta, Float_t phi, Float_t pt)
1591 {
1592   // fill jet QA histos 
1593
1594   fh2EtaPhi->Fill( eta, phi);
1595   fh1Pt->Fill( pt );
1596 }
1597
1598 //____________________________________________________________________________________
1599 void AliAnalysisTaskFragmentationFunction::AliFragFuncQAJetHistos::AddToOutput(TList* list) const 
1600 {
1601   // add histos to list
1602
1603   list->Add(fh2EtaPhi);
1604   list->Add(fh1Pt);
1605 }
1606
1607 //___________________________________________________________________________________________________________
1608 AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::AliFragFuncQATrackHistos(const char* name,
1609                                                                    Int_t nPt, Float_t ptMin, Float_t ptMax,
1610                                                                    Int_t nEta, Float_t etaMin, Float_t etaMax,
1611                                                                    Int_t nPhi, Float_t phiMin, Float_t phiMax,
1612                                                                    Float_t ptThresh) 
1613   : TObject()
1614   ,fNBinsPt(nPt)
1615   ,fPtMin(ptMin)
1616   ,fPtMax(ptMax)
1617   ,fNBinsEta(nEta)
1618   ,fEtaMin(etaMin)
1619   ,fEtaMax(etaMax)
1620   ,fNBinsPhi(nPhi)
1621   ,fPhiMin(phiMin)
1622   ,fPhiMax(phiMax)
1623   ,fHighPtThreshold(ptThresh)
1624   ,fh2EtaPhi(0)
1625   ,fh1Pt(0)
1626   ,fh2HighPtEtaPhi(0)
1627   ,fh2PhiPt(0)
1628   ,fNameQAT(name)
1629 {
1630   // default constructor
1631 }
1632
1633 //__________________________________________________________________________________________
1634 AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::AliFragFuncQATrackHistos(const AliFragFuncQATrackHistos& copy)
1635   : TObject()
1636   ,fNBinsPt(copy.fNBinsPt)
1637   ,fPtMin(copy.fPtMin)
1638   ,fPtMax(copy.fPtMax)
1639   ,fNBinsEta(copy.fNBinsEta)
1640   ,fEtaMin(copy.fEtaMin)
1641   ,fEtaMax(copy.fEtaMax)
1642   ,fNBinsPhi(copy.fNBinsPhi)
1643   ,fPhiMin(copy.fPhiMin)
1644   ,fPhiMax(copy.fPhiMax)
1645   ,fHighPtThreshold(copy.fHighPtThreshold)
1646   ,fh2EtaPhi(copy.fh2EtaPhi)
1647   ,fh1Pt(copy.fh1Pt)
1648   ,fh2HighPtEtaPhi(copy.fh2HighPtEtaPhi)
1649   ,fh2PhiPt(copy.fh2PhiPt)
1650   ,fNameQAT(copy.fNameQAT)
1651 {
1652   // copy constructor
1653 }
1654
1655 // _____________________________________________________________________________________________________________________________________________________________________________
1656 AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos& o)
1657 {
1658   // assignment
1659   
1660   if(this!=&o){
1661     TObject::operator=(o);
1662     fNBinsPt         = o.fNBinsPt;
1663     fPtMin           = o.fPtMin;
1664     fPtMax           = o.fPtMax;
1665     fNBinsEta        = o.fNBinsEta;
1666     fEtaMin          = o.fEtaMin;
1667     fEtaMax          = o.fEtaMax;
1668     fNBinsPhi        = o.fNBinsPhi;
1669     fPhiMin          = o.fPhiMin;
1670     fPhiMax          = o.fPhiMax;
1671     fHighPtThreshold = o.fHighPtThreshold;
1672     fh2EtaPhi        = o.fh2EtaPhi;
1673     fh1Pt            = o.fh1Pt;
1674     fh2HighPtEtaPhi  = o.fh2HighPtEtaPhi;
1675     fh2PhiPt         = o.fh2PhiPt;
1676     fNameQAT         = o.fNameQAT;
1677   }
1678   
1679   return *this;
1680 }
1681
1682 //___________________________________________________________________
1683 AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::~AliFragFuncQATrackHistos()
1684 {
1685   // destructor 
1686   
1687   if(fh2EtaPhi)       delete fh2EtaPhi;
1688   if(fh2HighPtEtaPhi) delete fh2HighPtEtaPhi;
1689   if(fh1Pt)           delete fh1Pt;
1690   if(fh2PhiPt)        delete fh2PhiPt;
1691 }
1692
1693 //______________________________________________________________________
1694 void AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::DefineHistos()
1695 {
1696   // book track QA histos
1697
1698   fh2EtaPhi       = new TH2F(Form("fh2TrackQAEtaPhi%s", fNameQAT.Data()), Form("%s: #eta - #phi distribution", fNameQAT.Data()), fNBinsEta, fEtaMin, fEtaMax, fNBinsPhi, fPhiMin, fPhiMax);
1699   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);
1700   fh1Pt           = new TH1F(Form("fh1TrackQAPt%s", fNameQAT.Data()), Form("%s: p_{T} distribution", fNameQAT.Data()), fNBinsPt, fPtMin, fPtMax);
1701     fh2PhiPt        = new TH2F(Form("fh2TrackQAPhiPt%s", fNameQAT.Data()), Form("%s: #phi - p_{T} distribution", fNameQAT.Data()), fNBinsPhi, fPhiMin, fPhiMax, fNBinsPt, fPtMin, fPtMax);
1702
1703   AliAnalysisTaskFragmentationFunction::SetProperties(fh2EtaPhi, "#eta", "#phi"); 
1704   AliAnalysisTaskFragmentationFunction::SetProperties(fh2HighPtEtaPhi, "#eta", "#phi");
1705   AliAnalysisTaskFragmentationFunction::SetProperties(fh1Pt, "p_{T} [GeV/c]", "entries");
1706   AliAnalysisTaskFragmentationFunction::SetProperties(fh2PhiPt, "#phi", "p_{T} [GeV/c]"); 
1707 }
1708
1709 //________________________________________________________________________________________________________
1710 void AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::FillTrackQA(Float_t eta, Float_t phi, Float_t pt, Bool_t weightPt, Float_t norm)
1711 {
1712   // fill track QA histos
1713   Float_t weight = 1.;
1714   if(weightPt) weight = pt;  
1715   fh2EtaPhi->Fill( eta, phi, weight);
1716   if(pt > fHighPtThreshold) fh2HighPtEtaPhi->Fill( eta, phi, weight);
1717   if(norm) fh1Pt->Fill( pt, 1/norm );
1718   else fh1Pt->Fill( pt );
1719   fh2PhiPt->Fill(phi, pt);
1720 }
1721
1722 //______________________________________________________________________________________
1723 void AliAnalysisTaskFragmentationFunction::AliFragFuncQATrackHistos::AddToOutput(TList* list) const
1724 {
1725   // add histos to list
1726
1727   list->Add(fh2EtaPhi);
1728   list->Add(fh2HighPtEtaPhi);
1729   list->Add(fh1Pt);
1730   list->Add(fh2PhiPt);
1731 }
1732
1733 //______________________________________________________________________________________________________
1734 AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::AliFragFuncIntraJetHistos(const char* name, 
1735                                                          Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,  
1736                                                          Int_t nPt, Float_t ptMin, Float_t ptMax,
1737                                                          Int_t nZ , Float_t zMin , Float_t zMax,
1738                                                          Int_t nCosTheta , Float_t costhetaMin , Float_t costhetaMax,
1739                                                          Int_t nTheta , Float_t thetaMin , Float_t thetaMax,
1740                                                          Int_t nJt , Float_t jtMin , Float_t jtMax)
1741   : TObject()
1742   ,fNBinsJetPt(nJetPt)
1743   ,fJetPtMin(jetPtMin)
1744   ,fJetPtMax(jetPtMax)
1745   ,fNBinsPt(nPt) 
1746   ,fPtMin(ptMin)   
1747   ,fPtMax(ptMax)   
1748   ,fNBinsZ(nZ) 
1749   ,fZMin(zMin)   
1750   ,fZMax(zMax)   
1751   ,fNBinsJt(nJt)
1752   ,fJtMin(jtMin)
1753   ,fJtMax(jtMax)
1754   ,fNBinsTheta(nTheta)
1755   ,fThetaMin(thetaMin)
1756   ,fThetaMax(thetaMax)
1757   ,fNBinsCosTheta(nCosTheta)
1758   ,fCosThetaMin(costhetaMin)
1759   ,fCosThetaMax(costhetaMax)
1760   ,fh2CosTheta(0)
1761   ,fh2PtZ(0)
1762   ,fh3ThetaZ(0)
1763   ,fh3JtTheta(0)
1764   ,fh3JtZ(0)
1765   ,fNameIJ(name)
1766 {
1767   // default constructor
1768
1769 }
1770
1771 //___________________________________________________________________________
1772 AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::AliFragFuncIntraJetHistos(const AliFragFuncIntraJetHistos& copy)
1773   : TObject()
1774   ,fNBinsJetPt(copy.fNBinsJetPt)
1775   ,fJetPtMin(copy.fJetPtMin)
1776   ,fJetPtMax(copy.fJetPtMax)
1777   ,fNBinsPt(copy.fNBinsPt) 
1778   ,fPtMin(copy.fPtMin)   
1779   ,fPtMax(copy.fPtMax)   
1780   ,fNBinsZ(copy.fNBinsZ) 
1781   ,fZMin(copy.fZMin)   
1782   ,fZMax(copy.fZMax)   
1783   ,fNBinsJt(copy.fNBinsJt)
1784   ,fJtMin(copy.fJtMin)
1785   ,fJtMax(copy.fJtMax)
1786   ,fNBinsTheta(copy.fNBinsTheta)
1787   ,fThetaMin(copy.fThetaMin)
1788   ,fThetaMax(copy.fThetaMax)
1789   ,fNBinsCosTheta(copy.fNBinsCosTheta)
1790   ,fCosThetaMin(copy.fCosThetaMin)
1791   ,fCosThetaMax(copy.fCosThetaMax)
1792   ,fh2CosTheta(copy.fh2CosTheta)
1793   ,fh2PtZ(copy.fh2PtZ)
1794   ,fh3ThetaZ(copy.fh3ThetaZ)
1795   ,fh3JtTheta(copy.fh3JtTheta)
1796   ,fh3JtZ(copy.fh3JtZ)
1797   ,fNameIJ(copy.fNameIJ)
1798 {
1799   // copy constructor
1800 }
1801
1802 //_______________________________________________________________________________________________________________________________________________________________
1803 AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos& o)
1804 {
1805   // assignment
1806   
1807   if(this!=&o){
1808     TObject::operator=(o);
1809     fNBinsJetPt       = o.fNBinsJetPt;
1810     fJetPtMin         = o.fJetPtMin;
1811     fJetPtMax         = o.fJetPtMax;
1812     fNBinsPt          = o.fNBinsPt; 
1813     fPtMin            = o.fPtMin;   
1814     fPtMax            = o.fPtMax;   
1815     fNBinsZ           = o.fNBinsZ; 
1816     fZMin             = o.fZMin;   
1817     fZMax             = o.fZMax;   
1818     fNBinsJt          = o.fNBinsJt;
1819     fJtMin            = o.fJtMin;
1820     fJtMax            = o.fJtMax;
1821     fNBinsTheta       = o.fNBinsTheta;
1822     fThetaMin         = o.fThetaMin;
1823     fThetaMax         = o.fThetaMax;
1824     fNBinsCosTheta    = o.fNBinsCosTheta;
1825     fCosThetaMin      = o.fCosThetaMin;
1826     fCosThetaMax      = o.fCosThetaMax;
1827     fh2CosTheta       = o.fh2CosTheta;
1828     fh2PtZ            = o.fh2PtZ;
1829     fh3ThetaZ         = o.fh3ThetaZ;
1830     fh3JtTheta        = o.fh3JtTheta;
1831     fh3JtZ            = o.fh3JtZ;
1832     fNameIJ           = o.fNameIJ;
1833   }
1834     
1835   return *this;
1836 }
1837
1838 //_________________________________________________________
1839 AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::~AliFragFuncIntraJetHistos()
1840 {
1841   // destructor 
1842
1843
1844   if(fh2CosTheta)       delete fh2CosTheta;
1845   if(fh2PtZ)            delete fh2PtZ;
1846   if(fh3ThetaZ)         delete fh3ThetaZ;             
1847   if(fh3JtTheta)        delete fh3JtTheta;
1848   if(fh3JtZ)            delete fh3JtZ;
1849
1850 }
1851
1852 //_________________________________________________________________
1853 void AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::DefineHistos()
1854 {
1855   // book FF histos
1856
1857   fh2CosTheta = new TH2F(Form("fh2IJcosTheta%s",fNameIJ.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax,fNBinsCosTheta, fCosThetaMin, fCosThetaMax);
1858   fh2PtZ      = new TH2F(Form("fh2IJPtZ%s",fNameIJ.Data()),"",fNBinsPt, fPtMin, fPtMax, fNBinsZ, fZMin, fZMax);
1859   fh3ThetaZ   = new TH3F(Form("fh3IJThetaZ%s",fNameIJ.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsTheta, fThetaMin, fThetaMax, fNBinsZ, fZMin, fZMax);
1860   fh3JtTheta  = new TH3F(Form("fh3IJJtTheta%s",fNameIJ.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsJt, fJtMin, fJtMax, fNBinsTheta, fThetaMin, fThetaMax);
1861   fh3JtZ      = new TH3F(Form("fh3IJJtZ%s",fNameIJ.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsJt, fJtMin, fJtMax, fNBinsZ, fZMin, fZMax);
1862   
1863   AliAnalysisTaskFragmentationFunction::SetProperties(fh2CosTheta,"jet p_{T} [GeV/c]","cos(#Theta)", "entries");
1864   AliAnalysisTaskFragmentationFunction::SetProperties(fh2PtZ,"had p_{T} [GeV/c]","z=p_{T}^{had}/p_{T}^{jet}","entries");
1865   AliAnalysisTaskFragmentationFunction::SetProperties(fh3ThetaZ,"jet p_{T} [GeV/c]","#Theta [rad]","z=p_{T}^{had}/p_{T}^{jet}");
1866   AliAnalysisTaskFragmentationFunction::SetProperties(fh3JtTheta,"jet p_{T} [GeV/c]","j_{T} [GeV/c]","#Theta [rad]");
1867   AliAnalysisTaskFragmentationFunction::SetProperties(fh3JtZ,"jet p_{T} [GeV/c]","j_{T} [GeV/c]","z=p_{T}^{had}/p_{T}^{jet}");
1868
1869 }
1870
1871 //_______________________________________________________________________________________________________________
1872 void AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::FillIntraJet(const TLorentzVector* trackV, const TLorentzVector* jetV, Float_t norm)
1873 {
1874   // fill IntraJet histos
1875  
1876   Float_t cosTheta = 0.; Float_t theta = 0.; 
1877   Float_t jt = 0.; Float_t z = 0.; 
1878   // For Theta distribution
1879   Float_t pxT  = trackV->Px();
1880   Float_t pyT  = trackV->Py();
1881   Float_t pzT  = trackV->Pz();
1882   Float_t ptT  = trackV->Pt();
1883   Float_t pT   = trackV->P();
1884   Float_t etaT = trackV->Eta();
1885   Float_t phiT = trackV->Phi(); // Check the value returned
1886   Float_t pxJ = jetV->Px();
1887   Float_t pyJ = jetV->Py();
1888   Float_t pzJ = jetV->Pz();
1889   Float_t ptJ = jetV->Pt();
1890   Float_t pJ  = jetV->P();
1891
1892   // Compute z
1893   if(ptJ>0) z = (Float_t)(ptT/ptJ);
1894
1895   // Compute theta
1896   cosTheta = (pxT*pxJ+pyT*pyJ+pzT*pzJ)/(pT*pJ);
1897   theta = TMath::ACos(cosTheta);
1898
1899   // Compute jt
1900   TVector3 trackP; TVector3 jetP;
1901   jetP[0] = pxJ;
1902   jetP[1] = pyJ;
1903   jetP[2] = pzJ;
1904   trackP.SetPtEtaPhi(ptT,etaT,phiT);
1905   jt = TMath::Sin(trackP.Angle(jetP))*trackP.Mag();
1906
1907   // Fill histos
1908   if(norm){
1909     fh2CosTheta->Fill(ptJ,cosTheta,1/norm);
1910     fh2PtZ->Fill(ptT,z,1/norm);
1911     fh3ThetaZ->Fill(ptJ,theta,z,1/norm);
1912     fh3JtTheta->Fill(ptJ,jt,theta,1/norm);
1913     fh3JtZ->Fill(ptJ,jt,z,1/norm);
1914   }
1915   else {
1916     fh2CosTheta->Fill(ptJ,cosTheta);
1917     fh2PtZ->Fill(ptT,z);
1918     fh3ThetaZ->Fill(ptJ,theta,z);
1919     fh3JtTheta->Fill(ptJ,jt,theta);
1920     fh3JtZ->Fill(ptJ,jt,z);
1921   }
1922
1923 }
1924
1925 //______________________________________________________________________________________________________
1926 AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::AliFragFuncDiJetHistos(const char* name, Int_t kindSlices,
1927                                                          Int_t nJetInvMass, Float_t jetInvMassMin, Float_t jetInvMassMax,  
1928                                                          Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,  
1929                                                          Int_t nPt, Float_t ptMin, Float_t ptMax,
1930                                                          Int_t nXi, Float_t xiMin, Float_t xiMax,
1931                                                          Int_t nZ , Float_t zMin , Float_t zMax)
1932   : TObject()
1933   ,fKindSlices(kindSlices)
1934   ,fNBinsJetInvMass(nJetInvMass)
1935   ,fJetInvMassMin(jetInvMassMin)
1936   ,fJetInvMassMax(jetInvMassMax)
1937   ,fNBinsJetPt(nJetPt)
1938   ,fJetPtMin(jetPtMin)
1939   ,fJetPtMax(jetPtMax)
1940   ,fNBinsPt(nPt) 
1941   ,fPtMin(ptMin)   
1942   ,fPtMax(ptMax)   
1943   ,fNBinsXi(nXi) 
1944   ,fXiMin(xiMin)   
1945   ,fXiMax(xiMax)   
1946   ,fNBinsZ(nZ)  
1947   ,fZMin(zMin)    
1948   ,fZMax(zMax)
1949   ,fh2TrackPtJet1(0)
1950   ,fh2TrackPtJet2(0)
1951   ,fh2TrackPtJet(0)
1952   ,fh1Jet1Pt(0)
1953   ,fh1Jet2Pt(0)
1954   ,fh1JetPt(0)
1955   ,fh2Xi1(0)
1956   ,fh2Xi2(0)
1957   ,fh2Xi(0)
1958   ,fh2Z1(0)
1959   ,fh2Z2(0)
1960   ,fh2Z(0)
1961   ,fh2Pt1(0)
1962   ,fh2Pt2(0)
1963   ,fh2Pt(0)
1964   ,fNameDJ(name)
1965 {
1966   // default constructor
1967
1968 }
1969
1970 //______________________________________________________________________________________________________
1971 AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::AliFragFuncDiJetHistos(const AliFragFuncDiJetHistos& copy)
1972   : TObject()
1973   ,fKindSlices(copy.fKindSlices)
1974   ,fNBinsJetInvMass(copy.fNBinsJetInvMass)
1975   ,fJetInvMassMin(copy.fJetInvMassMin)
1976   ,fJetInvMassMax(copy.fJetInvMassMax)
1977   ,fNBinsJetPt(copy.fNBinsJetPt)
1978   ,fJetPtMin(copy.fJetPtMin)
1979   ,fJetPtMax(copy.fJetPtMax)
1980   ,fNBinsPt(copy.fNBinsPt) 
1981   ,fPtMin(copy.fPtMin)   
1982   ,fPtMax(copy.fPtMax)   
1983   ,fNBinsXi(copy.fNBinsXi) 
1984   ,fXiMin(copy.fXiMin)   
1985   ,fXiMax(copy.fXiMax)   
1986   ,fNBinsZ(copy.fNBinsZ)  
1987   ,fZMin(copy.fZMin)    
1988   ,fZMax(copy.fZMax)
1989   ,fh2TrackPtJet1(copy.fh2TrackPtJet1)
1990   ,fh2TrackPtJet2(copy.fh2TrackPtJet2)
1991   ,fh2TrackPtJet(copy.fh2TrackPtJet)
1992   ,fh1Jet1Pt(copy.fh1Jet1Pt)
1993   ,fh1Jet2Pt(copy.fh1Jet2Pt)
1994   ,fh1JetPt(copy.fh1JetPt)
1995   ,fh2Xi1(copy.fh2Xi1)
1996   ,fh2Xi2(copy.fh2Xi2)
1997   ,fh2Xi(copy.fh2Xi2)
1998   ,fh2Z1(copy.fh2Z1)
1999   ,fh2Z2(copy.fh2Z2)
2000   ,fh2Z(copy.fh2Z)
2001   ,fh2Pt1(copy.fh2Pt1)
2002   ,fh2Pt2(copy.fh2Pt2)
2003   ,fh2Pt(copy.fh2Pt)
2004   ,fNameDJ(copy.fNameDJ)
2005 {
2006   // default constructor
2007
2008 }
2009
2010 //_______________________________________________________________________________________________________________________________________________________________
2011 AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos& o)
2012 {
2013   // assignment
2014   
2015   if(this!=&o){
2016     TObject::operator=(o);
2017     fKindSlices      = o.fKindSlices;
2018     fNBinsJetInvMass = o.fNBinsJetInvMass;
2019     fJetInvMassMin   = o.fJetInvMassMin;
2020     fJetInvMassMax   = o.fJetInvMassMax;
2021     fNBinsJetPt      = o.fNBinsJetPt;
2022     fJetPtMin        = o.fJetPtMin;
2023     fJetPtMax        = o.fJetPtMax;
2024     fNBinsPt         = o.fNBinsPt; 
2025     fPtMin           = o.fPtMin;   
2026     fPtMax           = o.fPtMax;   
2027     fNBinsXi         = o.fNBinsXi; 
2028     fXiMin           = o.fXiMin;   
2029     fXiMax           = o.fXiMax;   
2030     fNBinsZ          = o.fNBinsZ;  
2031     fZMin            = o.fZMin;    
2032     fZMax            = o.fZMax;   
2033     fh2TrackPtJet1   = o.fh2TrackPtJet1;
2034     fh2TrackPtJet2   = o.fh2TrackPtJet2;
2035     fh2TrackPtJet    = o.fh2TrackPtJet;
2036     fh1Jet1Pt        = o.fh1Jet1Pt;
2037     fh1Jet2Pt        = o.fh1Jet2Pt;
2038     fh1JetPt         = o.fh1JetPt;
2039     fh2Xi1           = o.fh2Xi1;
2040     fh2Xi2           = o.fh2Xi2;
2041     fh2Xi            = o.fh2Xi;
2042     fh2Z1            = o.fh2Z1;
2043     fh2Z2            = o.fh2Z2;
2044     fh2Z             = o.fh2Z;
2045     fh2Pt1           = o.fh2Pt1;
2046     fh2Pt2           = o.fh2Pt2;
2047     fh2Pt            = o.fh2Pt;
2048     fNameDJ          = o.fNameDJ;
2049   }
2050     
2051   return *this;
2052 }
2053
2054 //_________________________________________________________
2055 AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::~AliFragFuncDiJetHistos()
2056 {
2057   // destructor 
2058
2059   if(fh2TrackPtJet1) delete fh2TrackPtJet1;
2060   if(fh2TrackPtJet2) delete fh2TrackPtJet2;
2061   if(fh2TrackPtJet ) delete fh2TrackPtJet;
2062   if(fh1Jet1Pt)      delete fh1Jet1Pt;
2063   if(fh1Jet2Pt)      delete fh1Jet2Pt;
2064   if(fh1JetPt)       delete fh1JetPt;
2065   if(fh2Xi1)         delete fh2Xi1;
2066   if(fh2Xi2)         delete fh2Xi2;
2067   if(fh2Xi)          delete fh2Xi;
2068   if(fh2Z1)          delete fh2Z1;
2069   if(fh2Z2)          delete fh2Z2;
2070   if(fh2Z)           delete fh2Z;
2071   if(fh2Pt1)         delete fh2Pt1;
2072   if(fh2Pt2)         delete fh2Pt2;
2073   if(fh2Pt)          delete fh2Pt;
2074 }
2075
2076 //________________________________________________________________________
2077 void AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::DefineDiJetHistos()
2078 {
2079   // book DiJet histos
2080   
2081   Int_t nBins = 0;
2082   Double_t min = 0.;
2083   Double_t max = 0.;
2084   const char *xaxis = "";
2085   if(fKindSlices == 1)
2086     {
2087       nBins = fNBinsJetInvMass;
2088       min   = fJetInvMassMin;
2089       max   = fJetInvMassMax;
2090       xaxis = "M_{JJ} [GeV]";
2091     }
2092   if(fKindSlices == 2 || fKindSlices == 3)
2093     {
2094       nBins = fNBinsJetPt;
2095       min   = fJetPtMin;
2096       max   = fJetPtMax;
2097       if(fKindSlices == 2) xaxis = "E_{Tmean} [GeV]";
2098       if(fKindSlices == 3) xaxis ="leading jet p_{T} [GeV/c]";
2099     }
2100   
2101   fh1Jet1Pt      = new TH1F(Form("fh1DJJet1Pt%s", fNameDJ.Data()), "", fNBinsJetPt, fJetPtMin, fJetPtMax);
2102   fh1Jet2Pt      = new TH1F(Form("fh1DJJet2Pt%s", fNameDJ.Data()), "", fNBinsJetPt, fJetPtMin, fJetPtMax);
2103   fh1JetPt       = new TH1F(Form("fh1DJJetPt%s",  fNameDJ.Data()), "", fNBinsJetPt, fJetPtMin, fJetPtMax);
2104   
2105   fh2TrackPtJet1 = new TH2F(Form("fh2DJTrackPtJet1%s", fNameDJ.Data()), "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2106   fh2TrackPtJet2 = new TH2F(Form("fh2DJTrackPtJet2%s", fNameDJ.Data()), "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2107   fh2TrackPtJet  = new TH2F(Form("fh2DJTrackPtJet%s", fNameDJ.Data()),  "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2108   
2109   fh2Xi1         = new TH2F(Form("fh2DJXi1%s", fNameDJ.Data()), "",nBins, min, max, fNBinsXi, fXiMin, fXiMax);
2110   fh2Xi2         = new TH2F(Form("fh2DJXi2%s", fNameDJ.Data()), "",nBins, min, max, fNBinsXi, fXiMin, fXiMax);
2111   fh2Xi          = new TH2F(Form("fh2DJXi%s", fNameDJ.Data()),  "",nBins, min, max, fNBinsXi, fXiMin, fXiMax);
2112   
2113   fh2Z1          = new TH2F(Form("fh2DJZ1%s", fNameDJ.Data()), "",nBins, min, max, fNBinsZ, fZMin, fZMax);
2114   fh2Z2          = new TH2F(Form("fh2DJZ2%s", fNameDJ.Data()), "",nBins, min, max, fNBinsZ, fZMin, fZMax);
2115   fh2Z           = new TH2F(Form("fh2DJZ%s", fNameDJ.Data()),  "",nBins, min, max, fNBinsZ, fZMin, fZMax);
2116   
2117   fh2Pt1         = new TH2F(Form("fh2DJPt1%s", fNameDJ.Data()), "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2118   fh2Pt2         = new TH2F(Form("fh2DJPt2%s", fNameDJ.Data()), "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2119   fh2Pt          = new TH2F(Form("fh2DJPtZ%s", fNameDJ.Data()),  "",nBins, min, max, fNBinsPt, fPtMin, fPtMax);
2120       
2121   AliAnalysisTaskFragmentationFunction::SetProperties(fh1Jet1Pt, "p_{T} [GeV/c]", "entries");
2122   AliAnalysisTaskFragmentationFunction::SetProperties(fh1Jet2Pt, "p_{T} [GeV/c]", "entries");
2123   AliAnalysisTaskFragmentationFunction::SetProperties(fh1JetPt, "p_{T} [GeV/c]", "entries");
2124
2125   AliAnalysisTaskFragmentationFunction::SetProperties(fh2TrackPtJet1, xaxis, "p_{T} [GeV/c]", "Entries");
2126   AliAnalysisTaskFragmentationFunction::SetProperties(fh2TrackPtJet2, xaxis, "p_{T} [GeV/c]", "Entries");
2127   AliAnalysisTaskFragmentationFunction::SetProperties(fh2TrackPtJet, xaxis, "p_{T} [GeV/c]", "Entries");
2128   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Xi1, xaxis, "#xi", "Entries");
2129   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Xi2, xaxis, "#xi", "Entries");
2130   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Xi, xaxis, "#xi", "Entries");
2131   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Z1, xaxis, "z", "Entries");
2132   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Z2, xaxis, "z", "Entries");
2133   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Z, xaxis, "z", "Entries");
2134   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Pt1, xaxis, "p_{T} [GeV/c]", "Entries");
2135   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Pt2, xaxis, "p_{T} [GeV/c]", "Entries");
2136   AliAnalysisTaskFragmentationFunction::SetProperties(fh2Pt, xaxis, "p_{T} [GeV/c]", "Entries");
2137 }
2138
2139 //________________________________________________________________________
2140 void AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::FillDiJetFF(Int_t jetType, Float_t trackPt, Float_t jetPt, Double_t jetBin, Bool_t incrementJetPt)
2141 {
2142   // fill DiJet FF
2143
2144   if(jetType == 0)
2145     {
2146       if(incrementJetPt) fh1JetPt->Fill(jetPt);  
2147       
2148       fh2TrackPtJet->Fill(jetBin, trackPt);
2149       
2150       Double_t z = trackPt / jetPt;
2151       Double_t xi = 0;
2152       if(z>0) xi = TMath::Log(1/z);
2153       
2154       fh2Xi->Fill(jetBin, xi);
2155       fh2Z->Fill(jetBin, z);
2156     }
2157   if(jetType == 1)
2158     {
2159       if(incrementJetPt) fh1Jet1Pt->Fill(jetPt);
2160       
2161       fh2TrackPtJet1->Fill(jetBin, trackPt);
2162       
2163       Double_t z = trackPt / jetPt;
2164       Double_t xi = 0;
2165       if(z>0) xi = TMath::Log(1/z);
2166       
2167       fh2Xi1->Fill(jetBin, xi);
2168       fh2Z1->Fill(jetBin, z);
2169     }
2170   if(jetType == 2)
2171     {
2172       if(incrementJetPt) fh1Jet2Pt->Fill(jetPt);
2173       
2174       fh2TrackPtJet2->Fill(jetBin, trackPt);
2175       
2176       Double_t z = trackPt / jetPt;
2177       Double_t xi = 0;
2178       if(z>0) xi = TMath::Log(1/z);
2179       
2180       fh2Xi2->Fill(jetBin, xi);
2181       fh2Z2->Fill(jetBin, z);
2182     }
2183
2184
2185 }
2186
2187 //________________________________________________________________________
2188 void AliAnalysisTaskFragmentationFunction::AliFragFuncDiJetHistos::AddToOutput(TList* list)const
2189 {
2190   // add histos to list
2191
2192   list->Add(fh1Jet1Pt);
2193   list->Add(fh1Jet2Pt);
2194   list->Add(fh1JetPt);
2195   list->Add(fh2TrackPtJet1);
2196   list->Add(fh2TrackPtJet2);
2197   list->Add(fh2TrackPtJet);
2198   list->Add(fh2Xi1);
2199   list->Add(fh2Xi2);
2200   list->Add(fh2Xi);
2201   list->Add(fh2Z1);
2202   list->Add(fh2Z2);
2203   list->Add(fh2Z);
2204 }
2205
2206 //______________________________________________________________________________________________________
2207 AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::AliFragFuncQADiJetHistos(const char* name, Int_t kindSlices,
2208                                              Int_t nInvMass, Float_t invMassMin, Float_t invMassMax, 
2209                                              Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,  
2210                                              Int_t nDeltaPhi, Float_t deltaPhiMin, Float_t deltaPhiMax, 
2211                                              Int_t nDeltaEta, Float_t deltaEtaMin, Float_t deltaEtaMax, 
2212                                              Int_t nDeltaPt, Float_t deltaPtMin, Float_t deltaPtMax, 
2213                                              Int_t nInBal, Float_t inBalMin, Float_t inBalMax)
2214   : TObject()
2215   ,fKindSlices(kindSlices)
2216   ,fNBinsJetInvMass(nInvMass)
2217   ,fJetInvMassMin(invMassMin)
2218   ,fJetInvMassMax(invMassMax)
2219   ,fNBinsJetPt(nJetPt)
2220   ,fJetPtMin(jetPtMin)
2221   ,fJetPtMax(jetPtMax)
2222   ,fNBinsDeltaPhi(nDeltaPhi)
2223   ,fDeltaPhiMin(deltaPhiMin)
2224   ,fDeltaPhiMax(deltaPhiMax)
2225   ,fNBinsDeltaEta(nDeltaEta)
2226   ,fDeltaEtaMin(deltaEtaMin)
2227   ,fDeltaEtaMax(deltaEtaMax)
2228   ,fNBinsDeltaPt(nDeltaPt)
2229   ,fDeltaPtMin(deltaPtMin)
2230   ,fDeltaPtMax(deltaPtMax)
2231   ,fNBinsInBal(nInBal)
2232   ,fInBalMin(inBalMin)
2233   ,fInBalMax(inBalMax)
2234   ,fh2InvMass(0)
2235   ,fh2DeltaPhi(0)
2236   ,fh2DeltaEta(0)
2237   ,fh2DeltaPt(0)
2238   ,fh2InBal(0)
2239   ,fNameQADJ(name)
2240 {
2241   // default constructor
2242
2243 }
2244
2245 //______________________________________________________________________________________________________
2246 AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::AliFragFuncQADiJetHistos(const AliFragFuncQADiJetHistos& copy)
2247   : TObject()
2248   ,fKindSlices(copy.fKindSlices)
2249   ,fNBinsJetInvMass(copy.fNBinsJetInvMass)
2250   ,fJetInvMassMin(copy.fJetInvMassMin)
2251   ,fJetInvMassMax(copy.fJetInvMassMax)
2252   ,fNBinsJetPt(copy.fNBinsJetPt)
2253   ,fJetPtMin(copy.fJetPtMin)
2254   ,fJetPtMax(copy.fJetPtMax)
2255   ,fNBinsDeltaPhi(copy.fNBinsDeltaPhi)
2256   ,fDeltaPhiMin(copy.fDeltaPhiMin)
2257   ,fDeltaPhiMax(copy.fDeltaPhiMax)
2258   ,fNBinsDeltaEta(copy.fNBinsDeltaEta)
2259   ,fDeltaEtaMin(copy.fDeltaEtaMin)
2260   ,fDeltaEtaMax(copy.fDeltaEtaMax)
2261   ,fNBinsDeltaPt(copy.fNBinsDeltaPt)
2262   ,fDeltaPtMin(copy.fDeltaPtMin)
2263   ,fDeltaPtMax(copy.fDeltaPtMax)
2264   ,fNBinsInBal(copy.fNBinsInBal)
2265   ,fInBalMin(copy.fInBalMin)
2266   ,fInBalMax(copy.fInBalMax)
2267   ,fh2InvMass(copy.fh2InvMass)
2268   ,fh2DeltaPhi(copy.fh2DeltaPhi)
2269   ,fh2DeltaEta(copy.fh2DeltaEta)
2270   ,fh2DeltaPt(copy.fh2DeltaPt)
2271   ,fh2InBal(copy.fh2InBal)
2272   ,fNameQADJ(copy.fNameQADJ)
2273 {
2274   // default constructor
2275
2276 }
2277
2278 //_______________________________________________________________________________________________________________________________________________________________
2279 AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos& AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::operator=(const AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos& o)
2280 {
2281   // assignment
2282   
2283   if(this!=&o){
2284     TObject::operator=(o);
2285     fKindSlices       = o.fKindSlices;
2286     fNBinsJetInvMass  = o.fNBinsJetInvMass;
2287     fJetInvMassMin    = o.fJetInvMassMin;
2288     fJetInvMassMax    = o.fJetInvMassMax;
2289     fNBinsJetPt       = o.fNBinsJetPt;
2290     fJetPtMin         = o.fJetPtMin;
2291     fJetPtMax         = o.fJetPtMax;
2292     fNBinsDeltaPhi    = o.fNBinsDeltaPhi;
2293     fDeltaPhiMin      = o.fDeltaPhiMin;
2294     fDeltaPhiMax      = o.fDeltaPhiMax;
2295     fNBinsDeltaEta    = o.fNBinsDeltaEta;
2296     fDeltaEtaMin      = o.fDeltaEtaMin;
2297     fDeltaEtaMax      = o.fDeltaEtaMax;
2298     fNBinsDeltaPt     = o.fNBinsDeltaPt;
2299     fDeltaPtMin       = o.fDeltaPtMin;
2300     fDeltaPtMax       = o.fDeltaPtMax;
2301     fNBinsInBal       = o.fNBinsInBal;
2302     fInBalMin         = o.fInBalMin;
2303     fInBalMax         = o.fInBalMax;
2304     fh2InvMass        = o.fh2InvMass;
2305     fh2DeltaPhi       = o.fh2DeltaPhi;
2306     fh2DeltaEta       = o.fh2DeltaEta;
2307     fh2DeltaPt        = o.fh2DeltaPt;
2308     fh2InBal          = o.fh2InBal;
2309     fNameQADJ         = o.fNameQADJ;
2310   }
2311     
2312   return *this;
2313 }
2314
2315 //_________________________________________________________
2316 AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::~AliFragFuncQADiJetHistos()
2317 {
2318   // destructor 
2319
2320   if(fh2InvMass)  delete fh2InvMass;
2321   if(fh2DeltaPhi) delete fh2DeltaPhi;
2322   if(fh2DeltaEta) delete fh2DeltaEta;
2323   if(fh2DeltaPt)  delete fh2DeltaPt;
2324   if(fh2InBal)    delete fh2InBal;
2325 }
2326
2327 //________________________________________________________________________
2328 void AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::DefineQADiJetHistos()
2329 {
2330   // define histos
2331   
2332   Int_t nBins = 0;
2333   Double_t min = 0.;
2334   Double_t max = 0.;
2335   const char *xaxis = "";
2336   if(fKindSlices == 1)
2337     {
2338       nBins = fNBinsJetInvMass;
2339       min   = fJetInvMassMin;
2340       max   = fJetInvMassMax;
2341       xaxis = "M_{JJ} [GeV]";
2342     }
2343   if(fKindSlices == 2 || fKindSlices == 3)
2344     {
2345       nBins = fNBinsJetPt;
2346       min   = fJetPtMin;
2347       max   = fJetPtMax;
2348       if(fKindSlices == 2) xaxis = "E_{Tmean} [GeV]";
2349       if(fKindSlices == 3) xaxis ="leading jet p_{T} [GeV/c]";
2350     }
2351   
2352   
2353   fh2InvMass  = new TH2F(Form("fh2DJInvMassPositionCut%s",  fNameQADJ.Data()), "",nBins, min, max, fNBinsJetInvMass, fJetInvMassMin, fJetInvMassMax);
2354   fh2DeltaPhi = new TH2F(Form("fh2DJDeltaPhiPositionCut%s", fNameQADJ.Data()), "",nBins, min, max, fNBinsDeltaPhi, fDeltaPhiMin, fDeltaPhiMax);
2355   fh2DeltaEta = new TH2F(Form("fh2DJDeltaEtaPositionCut%s", fNameQADJ.Data()), "",nBins, min, max, fNBinsDeltaEta, fDeltaEtaMin, fDeltaEtaMax);
2356   fh2DeltaPt  = new TH2F(Form("fh2DJDeltaPtPositionCut%s",  fNameQADJ.Data()), "",nBins, min, max, fNBinsDeltaPt, fDeltaPtMin, fDeltaPtMax);
2357   fh2InBal  = new TH2F(Form("fh2DJInBalPositionCut%s",  fNameQADJ.Data()), "",nBins, min, max, fNBinsInBal, fInBalMin, fInBalMax);
2358
2359   AliAnalysisTaskFragmentationFunction::SetProperties(fh2InvMass, xaxis, "Invariant Mass", "Entries");
2360   AliAnalysisTaskFragmentationFunction::SetProperties(fh2DeltaPhi, xaxis, "#Delta #phi", "Entries");
2361   AliAnalysisTaskFragmentationFunction::SetProperties(fh2DeltaEta, xaxis, "#Delta #eta", "Entries");
2362   AliAnalysisTaskFragmentationFunction::SetProperties(fh2DeltaPt, xaxis, "#Delta p_{T}", "Entries");
2363   AliAnalysisTaskFragmentationFunction::SetProperties(fh2InBal, xaxis, "(p_{T}^{1}-p_{T}^{2})/(p_{T}^{1}+p_{T}^{2})", "Entries");
2364
2365 }
2366
2367 //________________________________________________________________________
2368 void AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::FillDiJetQA(Double_t invMass, Double_t deltaPhi, Double_t deltaEta,Double_t deltaPt, Double_t inbal, Double_t jetBin)
2369 {
2370   // fill dijet QA
2371
2372   fh2InvMass->Fill(jetBin, invMass);
2373   fh2DeltaPhi->Fill(jetBin, deltaPhi);
2374   fh2DeltaEta->Fill(jetBin, deltaEta);
2375   fh2DeltaPt->Fill(jetBin, deltaPt);
2376   fh2InBal->Fill(jetBin, inbal);
2377 }
2378
2379 //________________________________________________________________________
2380 void AliAnalysisTaskFragmentationFunction::AliFragFuncQADiJetHistos::AddToOutput(TList* list)const
2381 {
2382   // add histos to list
2383
2384   list->Add(fh2InvMass);
2385   list->Add(fh2DeltaPhi);
2386   list->Add(fh2DeltaEta);
2387   list->Add(fh2DeltaPt);
2388   list->Add(fh2InBal);
2389 }
2390
2391 //_________________________________________________________________________________
2392 void AliAnalysisTaskFragmentationFunction::AliFragFuncIntraJetHistos::AddToOutput(TList* list) const
2393 {
2394   // add histos to list
2395
2396   list->Add(fh2CosTheta);
2397   list->Add(fh2PtZ);
2398   list->Add(fh3ThetaZ);
2399   list->Add(fh3JtTheta);
2400   list->Add(fh3JtZ);
2401
2402 }
2403
2404 //_________________________________________________________________________________
2405 Bool_t AliAnalysisTaskFragmentationFunction::Notify()
2406 {
2407   //
2408   // Implemented Notify() to read the cross sections
2409   // and number of trials from pyxsec.root
2410   // (taken from AliAnalysisTaskJetSpectrum2)
2411   // 
2412   TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
2413   Float_t xsection = 0;
2414   Float_t ftrials  = 1;
2415
2416   fAvgTrials = 1;
2417   if(tree){
2418     TFile *curfile = tree->GetCurrentFile();
2419     if (!curfile) {
2420       Error("Notify","No current file");
2421       return kFALSE;
2422     }
2423     if(!fh1Xsec||!fh1Trials){
2424       Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
2425       return kFALSE;
2426     }
2427     AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
2428     fh1Xsec->Fill("<#sigma>",xsection);
2429     // construct a poor man average trials 
2430     Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
2431     if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
2432   }
2433
2434   // Set seed for backg study
2435   fRandom = new TRandom3();
2436   fRandom->SetSeed(0);
2437
2438   return kTRUE;
2439 }
2440
2441 //__________________________________________________________________
2442 void AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()
2443 {
2444   // create output objects
2445
2446   if(fDebug > 1) Printf("AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()");
2447  
2448   // create list of tracks and jets 
2449   
2450   fTracksRec = new TList();
2451   fTracksRec->SetOwner(kFALSE);  
2452
2453   fTracksRecCuts = new TList();
2454   fTracksRecCuts->SetOwner(kFALSE);  
2455
2456   fTracksGen = new TList();
2457   fTracksGen->SetOwner(kFALSE);
2458
2459   fTracksAODMCCharged = new TList();
2460   fTracksAODMCCharged->SetOwner(kFALSE);
2461     
2462   fTracksAODMCChargedSec = new TList();
2463   fTracksAODMCChargedSec->SetOwner(kFALSE);
2464
2465   fTracksRecQualityCuts = new TList(); 
2466   fTracksRecQualityCuts->SetOwner(kFALSE);
2467
2468   fJetsRec = new TList();
2469   fJetsRec->SetOwner(kFALSE);
2470   if(fBranchRecJets.Contains("KT") && fBckgSubMethod) fJetsRec->SetOwner(kTRUE);
2471
2472   fJetsRecCuts = new TList();
2473   fJetsRecCuts->SetOwner(kFALSE);
2474   if(fBranchRecJets.Contains("KT") && fBckgSubMethod) fJetsRecCuts->SetOwner(kTRUE);
2475
2476   fJetsGen = new TList();
2477   fJetsGen->SetOwner(kFALSE);
2478
2479   fJetsRecEff = new TList();
2480   fJetsRecEff->SetOwner(kFALSE);
2481
2482   fJetsEmbedded = new TList();
2483   fJetsEmbedded->SetOwner(kFALSE);
2484
2485
2486   if(fBckgMode && 
2487      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters ||  fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
2488       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
2489       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
2490     
2491     fBckgJetsRec = new TList();
2492     fBckgJetsRec->SetOwner(kFALSE);
2493
2494     fBckgJetsRecCuts = new TList();
2495     fBckgJetsRecCuts->SetOwner(kFALSE);
2496
2497     fBckgJetsGen = new TList();
2498     fBckgJetsGen->SetOwner(kFALSE);
2499   }
2500
2501   //
2502   // Create histograms / output container
2503   //
2504
2505   OpenFile(1);
2506   fCommonHistList = new TList();
2507   fCommonHistList->SetOwner(kTRUE);
2508
2509   Bool_t oldStatus = TH1::AddDirectoryStatus();
2510   TH1::AddDirectory(kFALSE);
2511   
2512   
2513   // Histograms 
2514   fh1EvtSelection            = new TH1F("fh1EvtSelection", "Event Selection", 6, -0.5, 5.5);
2515   fh1EvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
2516   fh1EvtSelection->GetXaxis()->SetBinLabel(2,"event selection: rejected");
2517   fh1EvtSelection->GetXaxis()->SetBinLabel(3,"event class: rejected");
2518   fh1EvtSelection->GetXaxis()->SetBinLabel(4,"vertex Ncontr: rejected");
2519   fh1EvtSelection->GetXaxis()->SetBinLabel(5,"vertex z: rejected");
2520   fh1EvtSelection->GetXaxis()->SetBinLabel(6,"vertex type: rejected");
2521   
2522   fh1VertexNContributors     = new TH1F("fh1VertexNContributors", "Vertex N contributors", 2500,-.5, 2499.5);
2523   fh1VertexZ                 = new TH1F("fh1VertexZ", "Vertex z distribution", 30, -15., 15.);
2524   fh1EvtMult                 = new TH1F("fh1EvtMult","Event multiplicity, track pT cut > 150 MeV/c, |#eta| < 0.9",120,0.,12000.);
2525   fh1EvtCent                 = new TH1F("fh1EvtCent","centrality",100,0.,100.);
2526   fh2TrackPtVsDCAXY          = new TH2F("fh2TrackPtVsDCAXY","",400,-0.02,0.02,100,0.,10.); 
2527   fh2TrackPtVsDCAZ           = new TH2F("fh2TrackPtVsDCAZ","",100,-0.050,0.050,100,0.,10.);
2528
2529   fh1Xsec                    = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
2530   fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
2531   fh1Trials                  = new TH1F("fh1Trials","trials from pyxsec.root",1,0,1);
2532   fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
2533   fh1PtHard                  = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
2534   fh1PtHardTrials            = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
2535
2536   fh1nRecJetsCuts            = new TH1F("fh1nRecJetsCuts","reconstructed jets per event",10,-0.5,9.5);
2537   fh1nGenJets                = new TH1F("fh1nGenJets","generated jets per event",10,-0.5,9.5);
2538   fh1nRecEffJets             = new TH1F("fh1nRecEffJets","reconstruction effiency: jets per event",10,-0.5,9.5);
2539   fh1nEmbeddedJets           = new TH1F("fh1nEmbeddedJets","embedded jets per event",10,-0.5,9.5);
2540
2541   fh2PtRecVsGenPrim          = new TH2F("fh2PtRecVsGenPrim","rec vs gen pt",fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax,fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax);
2542   fh2PtRecVsGenSec           = new TH2F("fh2PtRecVsGenSec","rec vs gen pt",fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax,fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax);
2543
2544
2545   // Background
2546   if(fBckgMode) {
2547     if(fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters || 
2548        fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
2549        fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading){
2550       
2551       fh1nRecBckgJetsCuts        = new TH1F("fh1nRecBckgJetsCuts","reconstructed background jets per event",10,-0.5,9.5);
2552       fh1nGenBckgJets            = new TH1F("fh1nGenBckgJets","generated background jets per event",10,-0.5,9.5);
2553     }
2554
2555     if(fBckgType[0]==kBckgPerp || fBckgType[1]==kBckgPerp || fBckgType[2]==kBckgPerp || fBckgType[3]==kBckgPerp || fBckgType[4]==kBckgPerp )
2556       fh1PerpMult                = new TH1F("fh1PerpMult","Background multiplicity - Cone perpendicular to leading jet axis",500,0.,500.);
2557     if(fBckgType[0]==kBckgASide || fBckgType[1]==kBckgASide || fBckgType[2]==kBckgASide || fBckgType[3]==kBckgASide || fBckgType[4]==kBckgASide)
2558       fh1ASideMult               = new TH1F("fh1ASideMult","Background multiplicity - Cone in the away side of leading jet axis",500,0.,500.);
2559     if(fBckgType[0]==kBckgASideWindow || fBckgType[1]==kBckgASideWindow || fBckgType[2]==kBckgASideWindow || fBckgType[3]==kBckgASideWindow || fBckgType[4]==kBckgASideWindow)
2560       fh1ASideWindowMult         = new TH1F("fh1ASideWindowMult","Background multiplicity - Cone in the away side of leading jet axis",500,0.,500.);
2561     if(fBckgType[0]==kBckgPerpWindow || fBckgType[1]==kBckgPerpWindow || fBckgType[2]==kBckgPerpWindow || fBckgType[3]==kBckgPerpWindow || fBckgType[4]==kBckgPerpWindow)
2562       fh1PerpWindowMult         = new TH1F("fh1PerpWindowMult","Background multiplicity - Cone in the perp direction of leading jet axis",500,0.,500.);
2563     if(fBckgType[0]==kBckgOutLJ || fBckgType[1]==kBckgOutLJ || fBckgType[2]==kBckgOutLJ || fBckgType[3]==kBckgOutLJ || fBckgType[4]==kBckgOutLJ)
2564       fh1OutLeadingMult          = new TH1F("fh1OutLeadingMult","Background multiplicity - Cone outside leading jet",500,0,500.);
2565     if(fBckgType[0]==kBckgOutLJStat || fBckgType[1]==kBckgOutLJStat || fBckgType[2]==kBckgOutLJStat || fBckgType[3]==kBckgOutLJStat || fBckgType[4]==kBckgOutLJStat)
2566       fh1OutLeadingStatMult      = new TH1F("fh1OutLeadingStatMult","Background multiplicity - Cone outside leading jet",3000,0,3000.);
2567     if(fBckgType[0]==kBckgOut2J || fBckgType[1]==kBckgOut2J || fBckgType[2]==kBckgOut2J || fBckgType[3]==kBckgOut2J || fBckgType[4]==kBckgOut2J)
2568       fh1Out2JetsMult            = new TH1F("fh1Out2JetsMult","Background multiplicity - Cone outside 2 jets",500,0.,500.);
2569     if(fBckgType[0]==kBckgOut3J || fBckgType[1]==kBckgOut3J || fBckgType[2]==kBckgOut3J || fBckgType[3]==kBckgOut3J || fBckgType[4]==kBckgOut3J)
2570       fh1Out3JetsMult            = new TH1F("fh1Out3JetsMult","Background multiplicity - Cone outside 3 jets",500,0.,500.);
2571     if(fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters)
2572       fh1MedianClustersMult  = new TH1F("fh1MedianClustersMult","Background multiplicity - median cluster",500,0.,500.);
2573     if(fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || fBckgType[3]==kBckgClustersOutLeading 
2574        || fBckgType[4]==kBckgClustersOutLeading)
2575       fh1OutClustersMult            = new TH1F("fh1OutClustersMult","Background multiplicity - clusters outside leading jet",3000,0.,3000.);
2576   }
2577   
2578   // embedding
2579   if(fBranchEmbeddedJets.Length()){
2580     fh1FractionPtEmbedded         = new TH1F("fh1FractionPtEmbedded","",200,0,2);
2581     fh1IndexEmbedded              = new TH1F("fh1IndexEmbedded","",11,-1,10);
2582     fh2DeltaPtVsJetPtEmbedded     = new TH2F("fh2DeltaPtVsJetPtEmbedded","",250,0,250,200,-100,100);
2583     fh2DeltaPtVsRecJetPtEmbedded  = new TH2F("fh2DeltaPtVsRecJetPtEmbedded","",250,0,250,200,-100,100);
2584     fh1DeltaREmbedded             = new TH1F("fh1DeltaREmbedded","",50,0,0.5);
2585     fh1nEmbeddedJets              = new TH1F("fh1nEmbeddedJets","embedded jets per event",10,-0.5,9.5);
2586   }
2587
2588   if(fEffMode){
2589     fh2ptVsDistNN_pt50_rec          = new TH2F("fh2ptVsDistNN_pt50_rec","",200,0,0.2,500,0.,100);    
2590     fh2ptVsDistNN_pt50_nonRec       = new TH2F("fh2ptVsDistNN_pt50_nonRec","",200,0,0.2,500,0.,100);    
2591     fh2ptVsDistNN_pt10_rec          = new TH2F("fh2ptVsDistNN_pt10_rec","",200,0,0.2,500,0.,100);    
2592     fh2ptVsDistNN_pt10_nonRec       = new TH2F("fh2ptVsDistNN_pt10_nonRec","",200,0,0.2,500,0.,100);    
2593   }
2594
2595   if(fQAMode){
2596     if(fQAMode&1){ // track QA
2597       fQATrackHistosRec          = new AliFragFuncQATrackHistos("Rec", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2598                                                                 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2599                                                                 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2600                                                                 fQATrackHighPtThreshold);
2601       fQATrackHistosRecCuts      = new AliFragFuncQATrackHistos("RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2602                                                                 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2603                                                                 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2604                                                                 fQATrackHighPtThreshold);
2605       fQATrackHistosGen          = new AliFragFuncQATrackHistos("Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2606                                                                 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2607                                                                 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2608                                                                 fQATrackHighPtThreshold);
2609     }
2610
2611     if(fQAMode&2){ // jet QA
2612       fQAJetHistosRec            = new AliFragFuncQAJetHistos("Rec", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2613                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
2614                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
2615       fQAJetHistosRecCuts        = new AliFragFuncQAJetHistos("RecCuts", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2616                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
2617                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
2618       fQAJetHistosRecCutsLeading = new AliFragFuncQAJetHistos("RecCutsLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2619                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
2620                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
2621       fQAJetHistosGen            = new AliFragFuncQAJetHistos("Gen", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2622                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
2623                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
2624       fQAJetHistosGenLeading     = new AliFragFuncQAJetHistos("GenLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2625                                                               fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,
2626                                                               fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);  
2627       if(fEffMode) fQAJetHistosRecEffLeading  = new AliFragFuncQAJetHistos("RecEffLeading", fQAJetNBinsPt, fQAJetPtMin, fQAJetPtMax, 
2628                                                                            fQAJetNBinsEta, fQAJetEtaMin, fQAJetEtaMax,fQAJetNBinsPhi, fQAJetPhiMin, fQAJetPhiMax);
2629     }
2630   } // end: QA
2631
2632   if(fFFMode){
2633
2634     fFFHistosRecCuts         = new AliFragFuncHistos("RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2635                                                      fFFNBinsPt, fFFPtMin, fFFPtMax, 
2636                                                      fFFNBinsXi, fFFXiMin, fFFXiMax,  
2637                                                      fFFNBinsZ , fFFZMin , fFFZMax , fFFLogZBins);
2638     fFFHistosRecLeading        = new AliFragFuncHistos("RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2639                                                        fFFNBinsPt, fFFPtMin, fFFPtMax, 
2640                                                        fFFNBinsXi, fFFXiMin, fFFXiMax,  
2641                                                        fFFNBinsZ , fFFZMin , fFFZMax, fFFLogZBins);
2642     fFFHistosRecLeadingTrack   = new AliFragFuncHistos("RecLeadingTrack", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2643                                                        fFFNBinsPt, fFFPtMin, fFFPtMax, 
2644                                                        fFFNBinsXi, fFFXiMin, fFFXiMax,  
2645                                                        fFFNBinsZ , fFFZMin , fFFZMax, fFFLogZBins);
2646     fFFHistosGen             = new AliFragFuncHistos("Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2647                                                      fFFNBinsPt, fFFPtMin, fFFPtMax, 
2648                                                      fFFNBinsXi, fFFXiMin, fFFXiMax,  
2649                                                      fFFNBinsZ , fFFZMin , fFFZMax, fFFLogZBins);
2650     fFFHistosGenLeading        = new AliFragFuncHistos("GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2651                                                        fFFNBinsPt, fFFPtMin, fFFPtMax, 
2652                                                        fFFNBinsXi, fFFXiMin, fFFXiMax,  
2653                                                        fFFNBinsZ , fFFZMin , fFFZMax, fFFLogZBins);
2654     fFFHistosGenLeadingTrack   = new AliFragFuncHistos("GenLeadingTrack", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2655                                                        fFFNBinsPt, fFFPtMin, fFFPtMax, 
2656                                                        fFFNBinsXi, fFFXiMin, fFFXiMax,  
2657                                                        fFFNBinsZ , fFFZMin , fFFZMax, fFFLogZBins);
2658   } // end: FF
2659
2660   if(fIJMode)
2661     {
2662       fIJHistosRecCuts               = new AliFragFuncIntraJetHistos("RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2663                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
2664                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
2665                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2666                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
2667                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
2668       fIJHistosRecLeading        = new AliFragFuncIntraJetHistos("RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2669                                                                  fIJNBinsPt, fIJPtMin, fIJPtMax, 
2670                                                                  fIJNBinsZ, fIJZMin, fIJZMax,  
2671                                                                  fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2672                                                                  fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
2673                                                                  fIJNBinsJt , fIJJtMin , fIJJtMax);
2674       fIJHistosRecLeadingTrack   = new AliFragFuncIntraJetHistos("RecLeadingTrack", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2675                                                                  fIJNBinsPt, fIJPtMin, fIJPtMax, 
2676                                                                  fIJNBinsZ, fIJZMin, fIJZMax,  
2677                                                                  fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2678                                                                  fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
2679                                                                  fIJNBinsJt , fIJJtMin , fIJJtMax);
2680       fIJHistosGen           = new AliFragFuncIntraJetHistos("Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2681                                                              fIJNBinsPt, fIJPtMin, fIJPtMax, 
2682                                                              fIJNBinsZ, fIJZMin, fIJZMax,  
2683                                                              fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2684                                                              fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
2685                                                              fIJNBinsJt , fIJJtMin , fIJJtMax);
2686       fIJHistosGenLeading        = new AliFragFuncIntraJetHistos("GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2687                                                                  fIJNBinsPt, fIJPtMin, fIJPtMax, 
2688                                                                  fIJNBinsZ, fIJZMin, fIJZMax,  
2689                                                                  fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2690                                                                  fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
2691                                                                  fIJNBinsJt , fIJJtMin , fIJJtMax);
2692       fIJHistosGenLeadingTrack   = new AliFragFuncIntraJetHistos("GenLeadingTrack", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
2693                                                                  fIJNBinsPt, fIJPtMin, fIJPtMax, 
2694                                                                  fIJNBinsZ, fIJZMin, fIJZMax,  
2695                                                                  fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
2696                                                                  fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
2697                                                                  fIJNBinsJt , fIJJtMin , fIJJtMax);
2698     } // end: intra-jet
2699   
2700   if(fDJMode){
2701     if(fDJMode&1){
2702       fFFDiJetHistosRecCuts         = new AliFragFuncDiJetHistos("RecCuts", fDiJetKindBins, 
2703                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2704                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax,
2705                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax, 
2706                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax, 
2707                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax);
2708       fFFDiJetHistosRecLeading      = new AliFragFuncDiJetHistos("RecLeading", fDiJetKindBins, 
2709                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2710                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax, 
2711                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax, 
2712                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax, 
2713                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax); 
2714       fFFDiJetHistosRecLeadingTrack = new AliFragFuncDiJetHistos("RecLeadingTrack", fDiJetKindBins, 
2715                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2716                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax, 
2717                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax, 
2718                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax, 
2719                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax);
2720       
2721       fFFDiJetHistosGen             = new AliFragFuncDiJetHistos("Gen", fDiJetKindBins, 
2722                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2723                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax,
2724                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax, 
2725                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax,
2726                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax);
2727       fFFDiJetHistosGenLeading      = new AliFragFuncDiJetHistos("GenLeading", fDiJetKindBins, 
2728                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2729                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax,
2730                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax,
2731                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax,
2732                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax);
2733       fFFDiJetHistosGenLeadingTrack = new AliFragFuncDiJetHistos("GenLeadingTrack", fDiJetKindBins, 
2734                                                                  fDiJetNBinsJetInvMass, fDiJetJetInvMassMin, fDiJetJetInvMassMax,
2735                                                                  fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax, 
2736                                                                  fDiJetNBinsPt, fDiJetPtMin, fDiJetPtMax, 
2737                                                                  fDiJetNBinsXi, fDiJetXiMin, fDiJetXiMax, 
2738                                                                  fDiJetNBinsZ, fDiJetZMin, fDiJetZMax);
2739     }
2740     
2741     if(fDJMode&2){
2742       fQADiJetHistosRecCuts = new AliFragFuncQADiJetHistos("RecCuts", fDiJetKindBins, 
2743                                                            fQADiJetNBinsInvMass, fQADiJetInvMassMin, fQADiJetInvMassMax,
2744                                                            fQADiJetNBinsJetPt, fQADiJetJetPtMin, fQADiJetJetPtMax,
2745                                                            fQADiJetNBinsDeltaPhi, fQADiJetDeltaPhiMin, fQADiJetDeltaPhiMax , 
2746                                                            fQADiJetNBinsDeltaEta, fQADiJetDeltaEtaMin, fQADiJetDeltaEtaMax , 
2747                                                            fQADiJetNBinsDeltaPt, fQADiJetDeltaPtMin, fQADiJetDeltaPtMax,
2748                                                            fQADiJetNBinsInBal, fQADiJetInBalMin, fQADiJetInBalMax);
2749       fQADiJetHistosGen     = new AliFragFuncQADiJetHistos("Gen", fDiJetKindBins, 
2750                                                            fQADiJetNBinsInvMass, fQADiJetInvMassMin,  fQADiJetInvMassMax, 
2751                                                            fDiJetNBinsJetPt, fDiJetJetPtMin, fDiJetJetPtMax,
2752                                                            fQADiJetNBinsDeltaPhi, fQADiJetDeltaPhiMin, fQADiJetDeltaPhiMax,
2753                                                            fQADiJetNBinsDeltaEta, fQADiJetDeltaEtaMin, fQADiJetDeltaEtaMax,
2754                                                            fQADiJetNBinsDeltaPt, fQADiJetDeltaPtMin, fQADiJetDeltaPtMax,
2755                                                            fQADiJetNBinsInBal, fQADiJetInBalMin, fQADiJetInBalMax);
2756     }
2757   } // end: di-jet
2758
2759   // efficiency
2760
2761   if(fEffMode){
2762     if(fQAMode&1){
2763       fQATrackHistosRecEffGen = new AliFragFuncQATrackHistos("RecEffGen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2764                                                              fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2765                                                              fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2766                                                              fQATrackHighPtThreshold);
2767       
2768       fQATrackHistosRecEffRec = new AliFragFuncQATrackHistos("RecEffRec", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2769                                                              fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2770                                                              fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2771                                                              fQATrackHighPtThreshold);
2772
2773       fQATrackHistosSecRec    = new AliFragFuncQATrackHistos("SecRec", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2774                                                              fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2775                                                              fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2776                                                              fQATrackHighPtThreshold);
2777
2778
2779       Int_t    nBinsResponseSinglePt[2]     = {fFFNBinsPt, fFFNBinsPt};
2780       Double_t binMinResponseSinglePt[2]    = {fFFPtMin, fFFPtMin};
2781       Double_t binMaxResponseSinglePt[2]    = {fFFPtMax, fFFPtMax};
2782       const char* labelsResponseSinglePt[2] = {"rec p_{T} [GeV/c]", "gen p_{T} [GeV/c]"};
2783
2784       fhnResponseSinglePt  = new THnSparseF("fhnResponseSinglePt","track pt gen : track pt rec",2,
2785                                             nBinsResponseSinglePt,binMinResponseSinglePt,binMaxResponseSinglePt);
2786      
2787       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseSinglePt,2,labelsResponseSinglePt);
2788
2789       // TH2F inv pt diff
2790       fh2SingleInvPtRecMnGenVsPtGen = new TH2F("fh2SingleInvPtRecMnGenVsPtGen","",fQATrackNBinsPt,fQATrackPtMin,fQATrackPtMax,200,-1,1);
2791     }
2792     if(fFFMode){
2793       fFFHistosRecEffGen      = new AliFragFuncHistos("RecEffGen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2794                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2795                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2796                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2797       
2798       fFFHistosRecEffRec      = new AliFragFuncHistos("RecEffRec", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2799                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2800                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2801                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2802
2803       fFFHistosSecRec         = new AliFragFuncHistos("SecRec", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2804                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2805                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2806                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2807
2808
2809       Int_t    nBinsResponseJetTrackPt[3]     = {fFFNBinsJetPt,fFFNBinsPt,fFFNBinsPt};
2810       Double_t binMinResponseJetTrackPt[3]    = {fFFJetPtMin,fFFPtMin, fFFPtMin};
2811       Double_t binMaxResponseJetTrackPt[3]    = {fFFJetPtMax,fFFPtMax,fFFPtMax};
2812       const char* labelsResponseJetTrackPt[3] = { "jet p_{T} [GeV/c]","rec p_{T} [GeV/c]", "gen p_{T} [GeV/c]"};
2813
2814       fhnResponseJetTrackPt  = new THnSparseF("fhnResponseJetTrackPt","jet pt:track pt rec:track pt gen",3,
2815                                               nBinsResponseJetTrackPt,binMinResponseJetTrackPt,binMaxResponseJetTrackPt);
2816      
2817       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseJetTrackPt,3,labelsResponseJetTrackPt);
2818
2819       if(!fFFLogZBins){
2820
2821         Int_t    nBinsResponseJetZ[3]     = {fFFNBinsJetPt, fFFNBinsZ,fFFNBinsZ};
2822         Double_t binMinResponseJetZ[3]    = {fFFJetPtMin, fFFZMin, fFFZMin};
2823         Double_t binMaxResponseJetZ[3]    = {fFFJetPtMax, fFFZMax, fFFZMax};
2824
2825         fhnResponseJetZ  = new THnSparseF("fhnResponseJetZ","jet pt:rec z rec:gen z",3,
2826                                           nBinsResponseJetZ,binMinResponseJetZ,binMaxResponseJetZ);
2827       }
2828       else{
2829         
2830         Double_t binLims[fFFNBinsXi+1];
2831         fFFHistosRecEffGen->CalcLogZBins(fFFNBinsXi,fFFXiMin,fFFXiMax,binLims);
2832         
2833         Int_t binsZ   = fFFNBinsXi;
2834         Double_t zMin = binLims[0];
2835         Double_t zMax = binLims[fFFNBinsXi];
2836         
2837         Int_t    nBinsResponseJetZ[3]     = {fFFNBinsJetPt, binsZ, binsZ};
2838         Double_t binMinResponseJetZ[3]    = {fFFJetPtMin,   zMin,  zMin};
2839         Double_t binMaxResponseJetZ[3]    = {fFFJetPtMax,   zMax,  zMax};
2840         //      const char* labelsResponseJetZ[3] = { "jet p_{T} [GeV/c]","rec z","gen z"};
2841         
2842         fhnResponseJetZ  = new THnSparseF("fhnResponseJetZ","jet pt:rec z rec:gen z",3,
2843                                           nBinsResponseJetZ,binMinResponseJetZ,binMaxResponseJetZ);
2844         
2845         fhnResponseJetZ->SetBinEdges(1,binLims);
2846         fhnResponseJetZ->SetBinEdges(2,binLims);
2847       }
2848       
2849       const char* labelsResponseJetZ[3] = { "jet p_{T} [GeV/c]","rec z","gen z"};
2850       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseJetZ,3,labelsResponseJetZ);
2851       
2852       Int_t    nBinsResponseJetXi[3]     = {fFFNBinsJetPt, fFFNBinsXi,fFFNBinsXi};
2853       Double_t binMinResponseJetXi[3]    = {fFFJetPtMin, fFFXiMin, fFFXiMin};
2854       Double_t binMaxResponseJetXi[3]    = {fFFJetPtMax, fFFXiMax, fFFXiMax};
2855       const char* labelsResponseJetXi[3] = { "jet p_{T} [GeV/c]","rec xi","gen xi"};
2856
2857       fhnResponseJetXi  = new THnSparseF("fhnResponseJetXi","jet pt:track xi rec:track xi gen",3,
2858                                         nBinsResponseJetXi,binMinResponseJetXi,binMaxResponseJetXi);
2859       
2860       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseJetXi,3,labelsResponseJetXi);
2861
2862     }
2863   } // end: efficiency
2864
2865   // Background
2866   if(fBckgMode){
2867     // Track QA
2868     TString title[5];
2869     for(Int_t i=0; i<5; i++){
2870       if(fBckgType[i]==kBckgPerp) title[i]="Perp";
2871       else if(fBckgType[i]==kBckgPerpWindow) title[i]="PerpW";
2872       else if(fBckgType[i]==kBckgASide) title[i]="ASide";
2873       else if(fBckgType[i]==kBckgASideWindow) title[i]="ASideW";
2874       else if(fBckgType[i]==kBckgOutLJ) title[i]="OutLeadingJet";
2875       else if(fBckgType[i]==kBckgOut2J) title[i]="Out2Jets";
2876       else if(fBckgType[i]==kBckgOut3J) title[i]="Out3Jets";
2877       else if(fBckgType[i]==kBckgOutAJ) title[i]="AllJets";
2878       else if(fBckgType[i]==kBckgOutLJStat) title[i]="OutLeadingJetStat";
2879       else if(fBckgType[i]==kBckgOut2JStat) title[i]="Out2JetsStat";
2880       else if(fBckgType[i]==kBckgOut3JStat) title[i]="Out3JetsStat";
2881       else if(fBckgType[i]==kBckgOutAJStat) title[i]="AllJetsStat";
2882       else if(fBckgType[i]==kBckgClustersOutLeading) title[i]="OutClusters";
2883       else if(fBckgType[i]==kBckgClusters) title[i]="MedianClusters";
2884       else printf("Please chose background method number %d!",i);
2885     }
2886
2887     if(fQAMode&1){
2888       fQABckgHisto0RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[0]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2889                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2890                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2891                                                                fQATrackHighPtThreshold);
2892       fQABckgHisto0Gen          = new AliFragFuncQATrackHistos("Bckg"+title[0]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2893                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2894                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2895                                                                fQATrackHighPtThreshold);
2896       fQABckgHisto1RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[1]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2897                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2898                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2899                                                                fQATrackHighPtThreshold);
2900       fQABckgHisto1Gen          = new AliFragFuncQATrackHistos("Bckg"+title[1]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2901                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2902                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2903                                                                fQATrackHighPtThreshold);
2904       fQABckgHisto2RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[2]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2905                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2906                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2907                                                                fQATrackHighPtThreshold);
2908       fQABckgHisto2Gen          = new AliFragFuncQATrackHistos("Bckg"+title[2]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2909                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2910                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2911                                                                fQATrackHighPtThreshold);
2912       fQABckgHisto3RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[3]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2913                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2914                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2915                                                                fQATrackHighPtThreshold);
2916       fQABckgHisto3Gen          = new AliFragFuncQATrackHistos("Bckg"+title[3]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2917                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2918                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2919                                                                fQATrackHighPtThreshold);
2920       fQABckgHisto4RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[4]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2921                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2922                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2923                                                                fQATrackHighPtThreshold);
2924       fQABckgHisto4Gen          = new AliFragFuncQATrackHistos("Bckg"+title[4]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2925                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2926                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2927                                                                fQATrackHighPtThreshold);
2928
2929
2930     } // end: background QA
2931
2932     if(fFFMode){
2933       // outside leading jet or 2 jets or more
2934       fFFBckgHisto0RecCuts    = new AliFragFuncHistos("Bckg"+title[0]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2935                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2936                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2937                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2938       fFFBckgHisto0RecLeading = new AliFragFuncHistos("Bckg"+title[0]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2939                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2940                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2941                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2942       fFFBckgHisto0Gen        = new AliFragFuncHistos("Bckg"+title[0]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2943                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2944                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2945                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2946       fFFBckgHisto0GenLeading = new AliFragFuncHistos("Bckg"+title[0]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2947                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2948                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2949                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2950       
2951       fFFBckgHisto1RecCuts    = new AliFragFuncHistos("Bckg"+title[1]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2952                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2953                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2954                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2955       fFFBckgHisto1RecLeading = new AliFragFuncHistos("Bckg"+title[1]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2956                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2957                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2958                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2959       fFFBckgHisto1Gen        = new AliFragFuncHistos("Bckg"+title[1]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2960                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2961                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2962                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2963       fFFBckgHisto1GenLeading = new AliFragFuncHistos("Bckg"+title[1]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2964                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2965                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2966                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2967       
2968       fFFBckgHisto2RecCuts    = new AliFragFuncHistos("Bckg"+title[2]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2969                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2970                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2971                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2972       fFFBckgHisto2RecLeading = new AliFragFuncHistos("Bckg"+title[2]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2973                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2974                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2975                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2976       fFFBckgHisto2Gen        = new AliFragFuncHistos("Bckg"+title[2]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2977                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2978                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2979                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2980       fFFBckgHisto2GenLeading = new AliFragFuncHistos("Bckg"+title[2]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2981                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2982                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2983                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2984       fFFBckgHisto3RecCuts    = new AliFragFuncHistos("Bckg"+title[3]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2985                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2986                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2987                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2988       fFFBckgHisto3RecLeading = new AliFragFuncHistos("Bckg"+title[3]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2989                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2990                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2991                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2992       fFFBckgHisto3Gen        = new AliFragFuncHistos("Bckg"+title[3]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2993                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2994                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2995                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2996       fFFBckgHisto3GenLeading = new AliFragFuncHistos("Bckg"+title[3]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2997                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2998                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2999                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3000       fFFBckgHisto4RecCuts    = new AliFragFuncHistos("Bckg"+title[4]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3001                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3002                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3003                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3004       fFFBckgHisto4RecLeading = new AliFragFuncHistos("Bckg"+title[4]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3005                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3006                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3007                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3008       fFFBckgHisto4Gen        = new AliFragFuncHistos("Bckg"+title[4]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3009                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3010                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3011                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3012       fFFBckgHisto4GenLeading = new AliFragFuncHistos("Bckg"+title[4]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3013                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3014                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3015                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3016
3017     } // end: background FF
3018
3019     if(fIJMode){    
3020       fIJBckgHisto0RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3021                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3022                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3023                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3024                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3025                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3026       fIJBckgHisto0RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3027                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3028                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3029                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3030                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3031                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3032       fIJBckgHisto0Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3033                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3034                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3035                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3036                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3037                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3038       fIJBckgHisto0GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3039                                                                        fIJNBinsPt, fIJPtMin, fIJPtMax, 
3040                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3041                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3042                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3043                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3044       
3045       
3046       fIJBckgHisto1RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3047                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3048                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3049                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3050                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3051                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3052       fIJBckgHisto1RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3053                                                                        fIJNBinsPt, fIJPtMin, fIJPtMax, 
3054                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3055                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3056                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3057                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3058       fIJBckgHisto1Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3059                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3060                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3061                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3062                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3063                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3064       fIJBckgHisto1GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3065                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3066                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3067                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3068                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3069                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3070       
3071       fIJBckgHisto2RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3072                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3073                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3074                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3075                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3076                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3077       fIJBckgHisto2RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3078                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3079                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3080                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3081                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3082                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3083       fIJBckgHisto2Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3084                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3085                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3086                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3087                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3088                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3089       fIJBckgHisto2GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3090                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3091                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3092                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3093                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3094                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3095     } // end: background intra-jet
3096   } // end: background
3097
3098   if(fPhiCorrMode){
3099       fPhiCorrHistosJetArea = new AliFragFuncQATrackHistos("JetArea",  fPhiCorrNBinsPt,  fPhiCorrPtMin,  fPhiCorrPtMax,
3100               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3101               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3102               fQATrackHighPtThreshold);
3103
3104       fPhiCorrHistosTransverseArea = new AliFragFuncQATrackHistos("TransverseArea", fPhiCorrNBinsPt, fPhiCorrPtMin, fPhiCorrPtMax,
3105               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3106               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3107               fQATrackHighPtThreshold);
3108
3109       fPhiCorrHistosAwayArea = new AliFragFuncQATrackHistos("AwayArea", fPhiCorrNBinsPt, fPhiCorrPtMin, fPhiCorrPtMax,
3110               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3111               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3112               fQATrackHighPtThreshold);
3113   } // end: phi correlation
3114
3115   
3116   // ____________ define histograms ____________________
3117   
3118   if(fQAMode){
3119     if(fQAMode&1){ // track QA
3120       fQATrackHistosRec->DefineHistos();
3121       fQATrackHistosRecCuts->DefineHistos();
3122       fQATrackHistosGen->DefineHistos();
3123     }
3124
3125     if(fQAMode&2){ // jet QA
3126       fQAJetHistosRec->DefineHistos();
3127       fQAJetHistosRecCuts->DefineHistos();
3128       fQAJetHistosRecCutsLeading->DefineHistos();
3129       fQAJetHistosGen->DefineHistos();
3130       fQAJetHistosGenLeading->DefineHistos();
3131       if(fEffMode) fQAJetHistosRecEffLeading->DefineHistos();
3132     }
3133   }
3134
3135   if(fFFMode){
3136     fFFHistosRecCuts->DefineHistos();
3137     fFFHistosRecLeading->DefineHistos();
3138     fFFHistosRecLeadingTrack->DefineHistos();
3139     fFFHistosGen->DefineHistos();
3140     fFFHistosGenLeading->DefineHistos();
3141     fFFHistosGenLeadingTrack->DefineHistos();
3142   }
3143
3144   if(fIJMode){
3145     fIJHistosRecCuts->DefineHistos();
3146     fIJHistosRecLeading->DefineHistos();
3147     fIJHistosRecLeadingTrack->DefineHistos();
3148     fIJHistosGen->DefineHistos();
3149     fIJHistosGenLeading->DefineHistos();
3150     fIJHistosGenLeadingTrack->DefineHistos();
3151   }
3152
3153   if(fDJMode){
3154     if(fDJMode&1){
3155       fFFDiJetHistosRecCuts->DefineDiJetHistos();
3156       fFFDiJetHistosRecLeading->DefineDiJetHistos();
3157       fFFDiJetHistosRecLeadingTrack->DefineDiJetHistos();
3158       fFFDiJetHistosGen->DefineDiJetHistos();
3159       fFFDiJetHistosGenLeading->DefineDiJetHistos();
3160       fFFDiJetHistosGenLeadingTrack->DefineDiJetHistos();
3161     }
3162     
3163     if(fDJMode&2){
3164       fQADiJetHistosRecCuts->DefineQADiJetHistos();
3165       fQADiJetHistosGen->DefineQADiJetHistos();
3166     }
3167   } // end: di-jet
3168
3169   if(fEffMode){
3170     if(fQAMode&1){
3171       fQATrackHistosRecEffGen->DefineHistos();
3172       fQATrackHistosRecEffRec->DefineHistos(); 
3173       fQATrackHistosSecRec->DefineHistos(); 
3174     }
3175     if(fFFMode){
3176       fFFHistosRecEffGen->DefineHistos();
3177       fFFHistosRecEffRec->DefineHistos();
3178       fFFHistosSecRec->DefineHistos();
3179     }
3180   } // end: efficiency
3181
3182   // Background
3183   if(fBckgMode){
3184     if(fFFMode){
3185       fFFBckgHisto0RecCuts->DefineHistos();
3186       fFFBckgHisto0RecLeading->DefineHistos();
3187       fFFBckgHisto0Gen->DefineHistos();
3188       fFFBckgHisto0GenLeading->DefineHistos();
3189       fFFBckgHisto1RecCuts->DefineHistos();
3190       fFFBckgHisto1RecLeading->DefineHistos();
3191       fFFBckgHisto1Gen->DefineHistos();
3192       fFFBckgHisto1GenLeading->DefineHistos();
3193       fFFBckgHisto2RecCuts->DefineHistos();
3194       fFFBckgHisto2RecLeading->DefineHistos();
3195       fFFBckgHisto2Gen->DefineHistos();
3196       fFFBckgHisto2GenLeading->DefineHistos();
3197       fFFBckgHisto3RecCuts->DefineHistos();
3198       fFFBckgHisto3RecLeading->DefineHistos();
3199       fFFBckgHisto3Gen->DefineHistos();
3200       fFFBckgHisto3GenLeading->DefineHistos();
3201       fFFBckgHisto4RecCuts->DefineHistos();
3202       fFFBckgHisto4RecLeading->DefineHistos();
3203       fFFBckgHisto4Gen->DefineHistos();
3204       fFFBckgHisto4GenLeading->DefineHistos();
3205     }
3206
3207     if(fIJMode){
3208       fIJBckgHisto0RecCuts->DefineHistos();
3209       fIJBckgHisto0RecLeading->DefineHistos();
3210       fIJBckgHisto0Gen->DefineHistos();
3211       fIJBckgHisto0GenLeading->DefineHistos();
3212       fIJBckgHisto1RecCuts->DefineHistos();
3213       fIJBckgHisto1RecLeading->DefineHistos();
3214       fIJBckgHisto1Gen->DefineHistos();
3215       fIJBckgHisto1GenLeading->DefineHistos();
3216       fIJBckgHisto2RecCuts->DefineHistos();
3217       fIJBckgHisto2RecLeading->DefineHistos();
3218       fIJBckgHisto2Gen->DefineHistos();
3219       fIJBckgHisto2GenLeading->DefineHistos();
3220     }
3221
3222     if(fQAMode&1){
3223       fQABckgHisto0RecCuts->DefineHistos();
3224       fQABckgHisto0Gen->DefineHistos();
3225       fQABckgHisto1RecCuts->DefineHistos();
3226       fQABckgHisto1Gen->DefineHistos();
3227       fQABckgHisto2RecCuts->DefineHistos();
3228       fQABckgHisto2Gen->DefineHistos();
3229       fQABckgHisto3RecCuts->DefineHistos();
3230       fQABckgHisto3Gen->DefineHistos();
3231       fQABckgHisto4RecCuts->DefineHistos();
3232       fQABckgHisto4Gen->DefineHistos();
3233     }
3234   } // end: background
3235   
3236   if(fPhiCorrMode){
3237       fPhiCorrHistosJetArea->DefineHistos();
3238       fPhiCorrHistosTransverseArea->DefineHistos();
3239       fPhiCorrHistosAwayArea->DefineHistos();
3240   }
3241
3242   Bool_t genJets    = (fJetTypeGen != kJetsUndef) ? kTRUE : kFALSE;
3243   Bool_t genTracks  = (fTrackTypeGen != kTrackUndef) ? kTRUE : kFALSE;
3244   Bool_t recJetsEff = (fJetTypeRecEff != kJetsUndef) ? kTRUE : kFALSE;
3245
3246   fCommonHistList->Add(fh1EvtSelection);
3247   fCommonHistList->Add(fh1EvtMult);
3248   fCommonHistList->Add(fh1EvtCent);
3249   fCommonHistList->Add(fh2TrackPtVsDCAXY);
3250   fCommonHistList->Add(fh2TrackPtVsDCAZ);
3251   fCommonHistList->Add(fh1VertexNContributors);
3252   fCommonHistList->Add(fh1VertexZ);    
3253   fCommonHistList->Add(fh1nRecJetsCuts);
3254   fCommonHistList->Add(fh1Xsec);
3255   fCommonHistList->Add(fh1Trials);
3256   fCommonHistList->Add(fh1PtHard);
3257   fCommonHistList->Add(fh1PtHardTrials);
3258   if(genJets) fCommonHistList->Add(fh1nGenJets);
3259
3260   // FF histograms
3261   if(fFFMode){
3262     fFFHistosRecCuts->AddToOutput(fCommonHistList);
3263     fFFHistosRecLeading->AddToOutput(fCommonHistList);
3264     fFFHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3265     if(genJets && genTracks){
3266       fFFHistosGen->AddToOutput(fCommonHistList);
3267       fFFHistosGenLeading->AddToOutput(fCommonHistList);
3268       fFFHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3269     }
3270   }
3271
3272   // Background
3273   if(fBckgMode){
3274     if(fFFMode){
3275       fFFBckgHisto0RecCuts->AddToOutput(fCommonHistList);
3276       fFFBckgHisto0RecLeading->AddToOutput(fCommonHistList);
3277       fFFBckgHisto1RecCuts->AddToOutput(fCommonHistList);
3278       fFFBckgHisto1RecLeading->AddToOutput(fCommonHistList);
3279       fFFBckgHisto2RecCuts->AddToOutput(fCommonHistList);
3280       fFFBckgHisto2RecLeading->AddToOutput(fCommonHistList);
3281       fFFBckgHisto3RecCuts->AddToOutput(fCommonHistList);
3282       fFFBckgHisto3RecLeading->AddToOutput(fCommonHistList);
3283       fFFBckgHisto4RecCuts->AddToOutput(fCommonHistList);
3284       fFFBckgHisto4RecLeading->AddToOutput(fCommonHistList);
3285
3286       if(genJets && genTracks){
3287         fFFBckgHisto0Gen->AddToOutput(fCommonHistList);
3288         fFFBckgHisto0GenLeading->AddToOutput(fCommonHistList);
3289         fFFBckgHisto1Gen->AddToOutput(fCommonHistList);
3290         fFFBckgHisto1GenLeading->AddToOutput(fCommonHistList);
3291         fFFBckgHisto2Gen->AddToOutput(fCommonHistList);
3292         fFFBckgHisto2GenLeading->AddToOutput(fCommonHistList);
3293         fFFBckgHisto3Gen->AddToOutput(fCommonHistList);
3294         fFFBckgHisto3GenLeading->AddToOutput(fCommonHistList);
3295         fFFBckgHisto4Gen->AddToOutput(fCommonHistList);
3296         fFFBckgHisto4GenLeading->AddToOutput(fCommonHistList);
3297       }
3298     }
3299
3300     if(fQAMode&1){
3301       fQABckgHisto0RecCuts->AddToOutput(fCommonHistList);
3302       fQABckgHisto1RecCuts->AddToOutput(fCommonHistList);
3303       fQABckgHisto2RecCuts->AddToOutput(fCommonHistList);
3304       fQABckgHisto3RecCuts->AddToOutput(fCommonHistList);
3305       fQABckgHisto4RecCuts->AddToOutput(fCommonHistList);
3306       if(genJets && genTracks){
3307         fQABckgHisto0Gen->AddToOutput(fCommonHistList);
3308         fQABckgHisto1Gen->AddToOutput(fCommonHistList);
3309         fQABckgHisto2Gen->AddToOutput(fCommonHistList);
3310         fQABckgHisto3Gen->AddToOutput(fCommonHistList);
3311         fQABckgHisto4Gen->AddToOutput(fCommonHistList);
3312       }
3313     }
3314
3315     if(fBckgType[0]==kBckgOutLJ || fBckgType[1]==kBckgOutLJ || fBckgType[2]==kBckgOutLJ || fBckgType[3]==kBckgOutLJ || fBckgType[4]==kBckgOutLJ)
3316       fCommonHistList->Add(fh1OutLeadingMult);
3317     if(fBckgType[0]==kBckgOutLJStat || fBckgType[1]==kBckgOutLJStat || fBckgType[2]==kBckgOutLJStat || fBckgType[3]==kBckgOutLJStat || fBckgType[4]==kBckgOutLJStat)
3318       fCommonHistList->Add(fh1OutLeadingStatMult);
3319     if(fBckgType[0]==kBckgPerp || fBckgType[1]==kBckgPerp || fBckgType[2]==kBckgPerp || fBckgType[3]==kBckgPerp || fBckgType[4]==kBckgPerp)
3320       fCommonHistList->Add(fh1PerpMult);
3321     if(fBckgType[0]==kBckgASide || fBckgType[1]==kBckgASide || fBckgType[2]==kBckgASide || fBckgType[3]==kBckgASide || fBckgType[4]==kBckgASide)
3322       fCommonHistList->Add(fh1ASideMult);
3323     if(fBckgType[0]==kBckgASideWindow || fBckgType[1]==kBckgASideWindow || fBckgType[2]==kBckgASideWindow || fBckgType[3]==kBckgASideWindow || fBckgType[4]==kBckgASideWindow)
3324       fCommonHistList->Add(fh1ASideWindowMult);
3325     if(fBckgType[0]==kBckgPerpWindow || fBckgType[1]==kBckgPerpWindow || fBckgType[2]==kBckgPerpWindow || fBckgType[3]==kBckgPerpWindow || fBckgType[4]==kBckgPerpWindow)
3326       fCommonHistList->Add(fh1PerpWindowMult);
3327     if(fBckgType[0]==kBckgOut2J || fBckgType[1]==kBckgOut2J || fBckgType[2]==kBckgOut2J || fBckgType[3]==kBckgOut2J || fBckgType[4]==kBckgOut2J)
3328       fCommonHistList->Add(fh1Out2JetsMult);
3329     if(fBckgType[0]==kBckgOut3J || fBckgType[1]==kBckgOut3J || fBckgType[2]==kBckgOut3J || fBckgType[3]==kBckgOut3J || fBckgType[4]==kBckgOut3J)
3330       fCommonHistList->Add(fh1Out3JetsMult);
3331     if(fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters)
3332       fCommonHistList->Add(fh1MedianClustersMult);
3333     if(fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading 
3334        || fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)
3335       fCommonHistList->Add(fh1OutClustersMult);
3336   }
3337
3338
3339   if(fBranchEmbeddedJets.Length()){ 
3340     fCommonHistList->Add(fh1FractionPtEmbedded);
3341     fCommonHistList->Add(fh1IndexEmbedded);
3342     fCommonHistList->Add(fh2DeltaPtVsJetPtEmbedded);      
3343     fCommonHistList->Add(fh2DeltaPtVsRecJetPtEmbedded);      
3344     fCommonHistList->Add(fh1DeltaREmbedded);
3345     fCommonHistList->Add(fh1nEmbeddedJets);  
3346   }
3347
3348   if(fEffMode){
3349     fCommonHistList->Add(fh2ptVsDistNN_pt50_rec);
3350     fCommonHistList->Add(fh2ptVsDistNN_pt50_nonRec);
3351     fCommonHistList->Add(fh2ptVsDistNN_pt10_rec);
3352     fCommonHistList->Add(fh2ptVsDistNN_pt10_nonRec);
3353   }
3354
3355   // QA  
3356   if(fQAMode){
3357     if(fQAMode&1){ // track QA
3358       fQATrackHistosRec->AddToOutput(fCommonHistList);
3359       fQATrackHistosRecCuts->AddToOutput(fCommonHistList);
3360       if(genTracks) fQATrackHistosGen->AddToOutput(fCommonHistList);
3361     }
3362
3363     if(fQAMode&2){ // jet QA
3364       fQAJetHistosRec->AddToOutput(fCommonHistList);
3365       fQAJetHistosRecCuts->AddToOutput(fCommonHistList);
3366       fQAJetHistosRecCutsLeading->AddToOutput(fCommonHistList);
3367       if(recJetsEff && fEffMode) fQAJetHistosRecEffLeading->AddToOutput(fCommonHistList); 
3368       if(genJets){
3369         fQAJetHistosGen->AddToOutput(fCommonHistList);
3370         fQAJetHistosGenLeading->AddToOutput(fCommonHistList);
3371       }
3372     }
3373   }
3374
3375   if(fBckgMode && 
3376      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
3377       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
3378       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)) {
3379     fCommonHistList->Add(fh1nRecBckgJetsCuts);
3380     if(genJets) fCommonHistList->Add(fh1nGenBckgJets);
3381   }
3382     
3383   // phi correlation
3384   if(fPhiCorrMode){
3385     fPhiCorrHistosJetArea->AddToOutput(fCommonHistList);
3386     fPhiCorrHistosTransverseArea->AddToOutput(fCommonHistList);
3387     fPhiCorrHistosAwayArea->AddToOutput(fCommonHistList);
3388   }
3389
3390   // intra-jet
3391   if(fIJMode){
3392     fIJHistosRecCuts->AddToOutput(fCommonHistList);
3393     fIJHistosRecLeading->AddToOutput(fCommonHistList);
3394     fIJHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3395       
3396     // Background
3397     if(fBckgMode){
3398       fIJBckgHisto0RecCuts->AddToOutput(fCommonHistList);
3399       fIJBckgHisto0RecLeading->AddToOutput(fCommonHistList);
3400       fIJBckgHisto1RecCuts->AddToOutput(fCommonHistList);
3401       fIJBckgHisto1RecLeading->AddToOutput(fCommonHistList);
3402       fIJBckgHisto2RecCuts->AddToOutput(fCommonHistList);
3403       fIJBckgHisto2RecLeading->AddToOutput(fCommonHistList);
3404     }
3405       
3406     if(genJets && genTracks){
3407       fIJHistosGen->AddToOutput(fCommonHistList);
3408       fIJHistosGenLeading->AddToOutput(fCommonHistList);
3409       fIJHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3410       
3411       // Background
3412       if(fBckgMode){
3413         fIJBckgHisto0Gen->AddToOutput(fCommonHistList);
3414         fIJBckgHisto0GenLeading->AddToOutput(fCommonHistList);
3415         fIJBckgHisto1Gen->AddToOutput(fCommonHistList);
3416         fIJBckgHisto1GenLeading->AddToOutput(fCommonHistList);
3417         fIJBckgHisto2Gen->AddToOutput(fCommonHistList);
3418         fIJBckgHisto2GenLeading->AddToOutput(fCommonHistList);
3419       }
3420     } // end: gen
3421   } // end: intra-jet
3422   
3423   if(fDJMode){
3424     if(fDJMode&1){
3425       fFFDiJetHistosRecCuts->AddToOutput(fCommonHistList);
3426       fFFDiJetHistosRecLeading->AddToOutput(fCommonHistList);
3427       fFFDiJetHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3428       if(genJets && genTracks){
3429         fFFDiJetHistosGen->AddToOutput(fCommonHistList);
3430         fFFDiJetHistosGenLeading->AddToOutput(fCommonHistList);
3431         fFFDiJetHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3432       }
3433     } // end: di-jet
3434     if(fDJMode&2){
3435       fQADiJetHistosRecCuts->AddToOutput(fCommonHistList);
3436       if(genJets && genTracks){
3437         fQADiJetHistosGen->AddToOutput(fCommonHistList);
3438       }
3439     } // end: di-jet QA
3440   } // end: di-jet
3441   
3442   if(fEffMode && recJetsEff && genTracks){
3443     if(fQAMode&1){
3444       fQATrackHistosRecEffGen->AddToOutput(fCommonHistList);
3445       fQATrackHistosRecEffRec->AddToOutput(fCommonHistList);
3446       fQATrackHistosSecRec->AddToOutput(fCommonHistList);
3447       fCommonHistList->Add(fhnResponseSinglePt);
3448       fCommonHistList->Add(fh2SingleInvPtRecMnGenVsPtGen); 
3449     }
3450     if(fFFMode){
3451       fFFHistosRecEffGen->AddToOutput(fCommonHistList);
3452       fFFHistosRecEffRec->AddToOutput(fCommonHistList);
3453       fFFHistosSecRec->AddToOutput(fCommonHistList);
3454       fCommonHistList->Add(fhnResponseJetTrackPt);
3455       fCommonHistList->Add(fhnResponseJetZ);
3456       fCommonHistList->Add(fhnResponseJetXi);
3457     }
3458     fCommonHistList->Add(fh1nRecEffJets);
3459     fCommonHistList->Add(fh2PtRecVsGenPrim); 
3460     fCommonHistList->Add(fh2PtRecVsGenSec); 
3461   }
3462   
3463
3464   // =========== Switch on Sumw2 for all histos ===========
3465   for (Int_t i=0; i<fCommonHistList->GetEntries(); ++i){
3466     TH1 *h1 = dynamic_cast<TH1*>(fCommonHistList->At(i));
3467     if (h1) h1->Sumw2();
3468     else{
3469       THnSparse *hnSparse = dynamic_cast<THnSparse*>(fCommonHistList->At(i));
3470       if(hnSparse) hnSparse->Sumw2();
3471     }
3472   }
3473   
3474   TH1::AddDirectory(oldStatus);
3475
3476   PostData(1, fCommonHistList);
3477
3478 }
3479
3480 //_______________________________________________
3481 void AliAnalysisTaskFragmentationFunction::Init()
3482 {
3483   // Initialization
3484   if(fDebug > 1) Printf("AliAnalysisTaskFragmentationFunction::Init()");
3485
3486 }
3487
3488 //_____________________________________________________________
3489 void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *) 
3490 {
3491   // Main loop
3492   // Called for each event
3493   if(fDebug > 1) Printf("AliAnalysisTaskFragmentationFunction::UserExec()");
3494         
3495
3496   if(fDebug > 1) Printf("Analysis event #%5d", (Int_t) fEntry);
3497
3498   // Trigger selection
3499   AliInputEventHandler* inputHandler = (AliInputEventHandler*)
3500     ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
3501
3502   if(!(inputHandler->IsEventSelected() & fEvtSelectionMask)){
3503       fh1EvtSelection->Fill(1.);
3504       if (fDebug > 1 ) Printf(" Trigger Selection: event REJECTED ... ");
3505       PostData(1, fCommonHistList);
3506       return;
3507   }
3508    
3509   fESD = dynamic_cast<AliESDEvent*>(InputEvent());
3510   if(!fESD){
3511     if(fDebug>3) Printf("%s:%d ESDEvent not found in the input", (char*)__FILE__,__LINE__);
3512   }
3513   
3514   fMCEvent = MCEvent();
3515   if(!fMCEvent){
3516     if(fDebug>3) Printf("%s:%d MCEvent not found in the input", (char*)__FILE__,__LINE__);
3517   }
3518   
3519   // get AOD event from input/ouput
3520   TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
3521   if( handler && handler->InheritsFrom("AliAODInputHandler") ) {
3522     fAOD  =  ((AliAODInputHandler*)handler)->GetEvent();
3523     if(fUseAODInputJets) fAODJets = fAOD;
3524     if (fDebug > 1)  Printf("%s:%d AOD event from input", (char*)__FILE__,__LINE__);
3525   }
3526   else {
3527     handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
3528     if( handler && handler->InheritsFrom("AliAODHandler") ) {
3529       fAOD = ((AliAODHandler*)handler)->GetAOD();
3530       fAODJets = fAOD;
3531       if (fDebug > 1)  Printf("%s:%d AOD event from output", (char*)__FILE__,__LINE__);
3532     }
3533   }
3534   
3535   if(!fAODJets && !fUseAODInputJets){ // case we have AOD in input & output and want jets from output
3536     TObject* outHandler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
3537     if( outHandler && outHandler->InheritsFrom("AliAODHandler") ) {
3538       fAODJets = ((AliAODHandler*)outHandler)->GetAOD();
3539       if (fDebug > 1)  Printf("%s:%d jets from output AOD", (char*)__FILE__,__LINE__);
3540     }
3541   }
3542   
3543   if(fNonStdFile.Length()!=0){
3544     // case we have an AOD extension - fetch the jets from the extended output
3545     
3546     AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
3547     fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);    
3548     if(!fAODExtension){
3549       if(fDebug>1)Printf("AODExtension not found for %s",fNonStdFile.Data());
3550     }
3551   }
3552   
3553   if(!fAOD){
3554     Printf("%s:%d AODEvent not found", (char*)__FILE__,__LINE__);
3555     return;
3556   }
3557   if(!fAODJets){
3558     Printf("%s:%d AODEvent with jet branch not found", (char*)__FILE__,__LINE__);
3559     return;
3560   }
3561
3562   
3563   // event selection **************************************************
3564   // *** event class ***
3565   Double_t centPercent = -1;
3566   if(fEventClass>0){
3567     Int_t cl = 0;
3568     if(handler->InheritsFrom("AliAODInputHandler")){ 
3569       // since it is not supported by the helper task define own classes
3570       centPercent = fAOD->GetHeader()->GetCentrality();
3571       cl = 1;
3572       if(centPercent>10) cl = 2;
3573       if(centPercent>30) cl = 3;
3574       if(centPercent>50) cl = 4;
3575     }
3576     else {
3577       cl = AliAnalysisHelperJetTasks::EventClass();
3578       if(fESD) centPercent = fESD->GetCentrality()->GetCentralityPercentile("V0M"); // retrieve value 'by hand'
3579     }
3580     
3581     if(cl!=fEventClass){
3582       // event not in selected event class, reject event
3583       if (fDebug > 1) Printf("%s:%d event not in selected event class: event REJECTED ...",(char*)__FILE__,__LINE__);
3584       fh1EvtSelection->Fill(2.);
3585       PostData(1, fCommonHistList);
3586       return;
3587     }
3588   }
3589
3590   // *** vertex cut ***
3591   AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
3592   Int_t nTracksPrim = primVtx->GetNContributors();
3593   fh1VertexNContributors->Fill(nTracksPrim);
3594   
3595
3596   if (fDebug > 1) Printf("%s:%d primary vertex selection: %d", (char*)__FILE__,__LINE__,nTracksPrim);
3597   if(!nTracksPrim){
3598     if (fDebug > 1) Printf("%s:%d primary vertex selection: event REJECTED...",(char*)__FILE__,__LINE__); 
3599     fh1EvtSelection->Fill(3.);
3600     PostData(1, fCommonHistList);
3601     return;
3602   }
3603   
3604   fh1VertexZ->Fill(primVtx->GetZ());
3605   
3606   if(TMath::Abs(primVtx->GetZ())>fMaxVertexZ){
3607     if (fDebug > 1) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ()); 
3608     fh1EvtSelection->Fill(4.);
3609     PostData(1, fCommonHistList);
3610     return; 
3611   }
3612   
3613   TString primVtxName(primVtx->GetName());
3614
3615   if(primVtxName.CompareTo("TPCVertex",TString::kIgnoreCase) == 1){
3616     if (fDebug > 1) Printf("%s:%d primary vertex selection: TPC vertex, event REJECTED...",(char*)__FILE__,__LINE__);
3617     fh1EvtSelection->Fill(5.);
3618     PostData(1, fCommonHistList);
3619     return;
3620   }
3621
3622   if (fDebug > 1) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__); 
3623   fh1EvtSelection->Fill(0.);
3624   fh1EvtCent->Fill(centPercent);
3625
3626
3627   //___ get MC information __________________________________________________________________
3628
3629   fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
3630
3631   Double_t ptHard = 0.;
3632   Double_t nTrials = 1; // trials for MC trigger weight for real data
3633
3634   if(fMCEvent){
3635     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
3636
3637     if(genHeader){
3638       
3639       AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
3640       AliGenHijingEventHeader*  hijingGenHeader = 0x0;
3641       
3642       if(pythiaGenHeader){
3643         if(fDebug>3) Printf("%s:%d pythiaGenHeader found", (char*)__FILE__,__LINE__);
3644         nTrials = pythiaGenHeader->Trials();
3645         ptHard  = pythiaGenHeader->GetPtHard();
3646         
3647         fh1PtHard->Fill(ptHard);
3648         fh1PtHardTrials->Fill(ptHard,nTrials);
3649         
3650         
3651       } else { // no pythia, hijing?
3652         
3653         if(fDebug>3) Printf("%s:%d no pythiaGenHeader found", (char*)__FILE__,__LINE__);
3654         
3655         hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
3656         if(!hijingGenHeader){
3657           Printf("%s:%d no pythiaGenHeader or hjingGenHeader found", (char*)__FILE__,__LINE__);
3658         } else {
3659           if(fDebug>3) Printf("%s:%d hijingGenHeader found", (char*)__FILE__,__LINE__);
3660         }
3661       }
3662       
3663       //fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
3664     }
3665
3666   }
3667   
3668   //___ fetch jets __________________________________________________________________________
3669  
3670   Int_t nJ = GetListOfJets(fJetsRec, kJetsRec);
3671   Int_t nRecJets = 0;
3672   if(nJ>=0) nRecJets = fJetsRec->GetEntries();
3673   if(fDebug>2)Printf("%s:%d Selected Rec jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
3674   if(nJ != nRecJets) Printf("%s:%d Mismatch Selected Rec Jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
3675
3676   Int_t nJCuts = GetListOfJets(fJetsRecCuts, kJetsRecAcceptance);
3677   Int_t nRecJetsCuts = 0;
3678   if(nJCuts>=0) nRecJetsCuts = fJetsRecCuts->GetEntries();
3679   if(fDebug>2)Printf("%s:%d Selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3680   if(nRecJetsCuts != nJCuts) Printf("%s:%d Mismatch selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3681   fh1nRecJetsCuts->Fill(nRecJetsCuts);
3682
3683   if(fJetTypeGen==kJetsKine || fJetTypeGen == kJetsKineAcceptance) fJetsGen->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
3684
3685   Int_t nJGen  = GetListOfJets(fJetsGen, fJetTypeGen);
3686   Int_t nGenJets = 0;
3687   if(nJGen>=0) nGenJets = fJetsGen->GetEntries();
3688   if(fDebug>2)Printf("%s:%d Selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
3689
3690   if(nJGen != nGenJets) Printf("%s:%d Mismatch selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
3691   fh1nGenJets->Fill(nGenJets);
3692
3693
3694   if(fJetTypeRecEff==kJetsKine || fJetTypeRecEff == kJetsKineAcceptance) fJetsRecEff->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
3695   Int_t nJRecEff  = GetListOfJets(fJetsRecEff, fJetTypeRecEff);
3696   Int_t nRecEffJets = 0;
3697   if(nJRecEff>=0) nRecEffJets = fJetsRecEff->GetEntries();
3698   if(fDebug>2)Printf("%s:%d Selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
3699   if(nJRecEff != nRecEffJets) Printf("%s:%d Mismatch selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
3700   fh1nRecEffJets->Fill(nRecEffJets);
3701
3702
3703   Int_t nEmbeddedJets =  0; 
3704   TArrayI iEmbeddedMatchIndex; 
3705   TArrayF fEmbeddedPtFraction; 
3706     
3707
3708   if(fBranchEmbeddedJets.Length()){ 
3709     Int_t nJEmbedded = GetListOfJets(fJetsEmbedded, kJetsEmbedded);
3710     if(nJEmbedded>=0) nEmbeddedJets = fJetsEmbedded->GetEntries();
3711     if(fDebug>2)Printf("%s:%d Selected Embedded jets: %d %d",(char*)__FILE__,__LINE__,nJEmbedded,nEmbeddedJets);
3712     if(nJEmbedded != nEmbeddedJets) Printf("%s:%d Mismatch Selected Embedded Jets: %d %d",(char*)__FILE__,__LINE__,nJEmbedded,nEmbeddedJets);
3713     fh1nEmbeddedJets->Fill(nEmbeddedJets);
3714      
3715     Float_t maxDist = 0.3;
3716
3717     iEmbeddedMatchIndex.Set(nEmbeddedJets); 
3718     fEmbeddedPtFraction.Set(nEmbeddedJets); 
3719     
3720     iEmbeddedMatchIndex.Reset(-1);
3721     fEmbeddedPtFraction.Reset(0);
3722
3723     AliAnalysisHelperJetTasks::GetJetMatching(fJetsEmbedded, nEmbeddedJets, 
3724                                               fJetsRecCuts, nRecJetsCuts, 
3725                                               iEmbeddedMatchIndex, fEmbeddedPtFraction,
3726                                               fDebug, maxDist);
3727    
3728   }
3729   
3730   //____ fetch background jets ___________________________________________________
3731   if(fBckgMode && 
3732      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
3733       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
3734       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
3735
3736     Int_t nBJ = GetListOfBckgJets(fBckgJetsRec, kJetsRec);
3737     Int_t nRecBckgJets = 0;
3738     if(nBJ>=0) nRecBckgJets = fBckgJetsRec->GetEntries();
3739     if(fDebug>2)Printf("%s:%d Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
3740     if(nBJ != nRecBckgJets) Printf("%s:%d Mismatch Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
3741
3742     Int_t nBJCuts = GetListOfBckgJets(fBckgJetsRecCuts, kJetsRecAcceptance);
3743     Int_t nRecBckgJetsCuts = 0;
3744     if(nBJCuts>=0) nRecBckgJetsCuts = fBckgJetsRecCuts->GetEntries();
3745     if(fDebug>2)Printf("%s:%d Selected Rec background jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3746     if(nRecBckgJetsCuts != nBJCuts) Printf("%s:%d Mismatch selected Rec background jets after cuts: %d %d",(char*)__FILE__,__LINE__,nBJCuts,nRecBckgJetsCuts);
3747     fh1nRecBckgJetsCuts->Fill(nRecBckgJetsCuts);
3748
3749     if(0){ // protection OB - not yet implemented 
3750       if(fJetTypeGen==kJetsKine || fJetTypeGen == kJetsKineAcceptance) fBckgJetsGen->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear()
3751       Int_t nBJGen  = GetListOfBckgJets(fBckgJetsGen, fJetTypeGen);
3752       Int_t nGenBckgJets = 0;
3753       if(nBJGen>=0) nGenBckgJets = fBckgJetsGen->GetEntries();
3754       if(fDebug>2)Printf("%s:%d Selected Gen background jets: %d %d",(char*)__FILE__,__LINE__,nBJGen,nGenBckgJets);
3755       if(nBJGen != nGenBckgJets) Printf("%s:%d Mismatch selected Gen background jets: %d %d",(char*)__FILE__,__LINE__,nBJGen,nGenBckgJets);
3756       fh1nGenBckgJets->Fill(nGenBckgJets);
3757     }
3758   }
3759
3760
3761   //____ fetch particles __________________________________________________________
3762   
3763   Int_t nT;
3764   if(fUseExtraTracks ==  1)       nT = GetListOfTracks(fTracksRec, kTrackAODExtra);
3765   else if(fUseExtraTracks ==  -1) nT = GetListOfTracks(fTracksRec, kTrackAODExtraonly);
3766   else                            nT = GetListOfTracks(fTracksRec, kTrackAOD);
3767
3768   Int_t nRecPart = 0;
3769   if(nT>=0) nRecPart = fTracksRec->GetEntries();
3770   if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,nRecPart);
3771   if(nRecPart != nT) Printf("%s:%d Mismatch selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,nRecPart);
3772   
3773
3774   Int_t nTCuts;
3775   if(fUseExtraTracks ==  1)      nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODExtraCuts);
3776   else if(fUseExtraTracks == -1) nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODExtraonlyCuts);
3777   else                           nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODCuts);
3778   
3779   Int_t nRecPartCuts = 0;
3780   if(nTCuts>=0) nRecPartCuts = fTracksRecCuts->GetEntries();
3781   if(fDebug>2)Printf("%s:%d Selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
3782   if(nRecPartCuts != nTCuts) Printf("%s:%d Mismatch selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
3783   fh1EvtMult->Fill(nRecPartCuts);
3784
3785
3786
3787   Int_t nTGen = GetListOfTracks(fTracksGen,fTrackTypeGen);
3788   Int_t nGenPart = 0;
3789   if(nTGen>=0) nGenPart = fTracksGen->GetEntries();
3790   if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
3791   if(nGenPart != nTGen) Printf("%s:%d Mismatch selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
3792   
3793   
3794   //____ analysis, fill histos ___________________________________________________
3795   
3796   if(fQAMode){
3797     // loop over tracks
3798     if(fQAMode&1){
3799       for(Int_t it=0; it<nRecPart; ++it){
3800         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksRec->At(it));
3801         if(part)fQATrackHistosRec->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt());
3802       }
3803       for(Int_t it=0; it<nRecPartCuts; ++it){
3804         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksRecCuts->At(it));
3805         if(part)fQATrackHistosRecCuts->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt() );
3806       }      
3807       for(Int_t it=0; it<nGenPart; ++it){
3808         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksGen->At(it));
3809         if(part)fQATrackHistosGen->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt());
3810       }
3811
3812       // fill DCA to prim vertex
3813       for(Int_t it=0; it<nRecPartCuts; ++it){
3814         AliAODTrack *aodtr = dynamic_cast<AliAODTrack*>(fTracksRecCuts->At(it));
3815         
3816         if(!aodtr) continue;
3817         if(!primVtx) continue; 
3818         
3819         Double_t bfield = fAOD->GetMagneticField();
3820         Double_t dz[2];
3821         Double_t cov[3];
3822         
3823         AliAODTrack tmp(*aodtr); 
3824         tmp.PropagateToDCA(primVtx, bfield, 5., dz, cov);
3825         
3826         Double_t dcaXY = dz[0];
3827         Double_t dcaZ  = dz[1];
3828
3829         fh2TrackPtVsDCAXY->Fill(dcaXY,tmp.Pt());
3830         fh2TrackPtVsDCAZ->Fill(dcaZ,tmp.Pt());
3831       }
3832     }
3833
3834     // loop over jets
3835     
3836     if(fQAMode&2){
3837       for(Int_t ij=0; ij<nRecJets; ++ij){
3838         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRec->At(ij));
3839         if(jet)fQAJetHistosRec->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3840       }
3841     }
3842   }
3843
3844   if(fQAMode || fFFMode || fIJMode || fPhiCorrMode){
3845     for(Int_t ij=0; ij<nRecJetsCuts; ++ij){
3846       
3847       AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
3848       if(fQAMode&2) fQAJetHistosRecCuts->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3849       
3850       if(ij==0){ // leading jet
3851         
3852         if(fQAMode&2) fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
3853         
3854
3855         Double_t ptFractionEmbedded = 0; 
3856         AliAODJet* embeddedJet = 0; 
3857
3858         if(fBranchEmbeddedJets.Length()){ // find embedded jet
3859
3860           Int_t indexEmbedded = -1;
3861           for(Int_t i=0; i<nEmbeddedJets; i++){
3862             if(iEmbeddedMatchIndex[i] == ij){
3863               indexEmbedded      = i;
3864               ptFractionEmbedded = fEmbeddedPtFraction[i];
3865             }
3866           }
3867
3868           fh1IndexEmbedded->Fill(indexEmbedded);
3869           fh1FractionPtEmbedded->Fill(ptFractionEmbedded);
3870
3871           if(indexEmbedded>-1){ 
3872             
3873             embeddedJet = dynamic_cast<AliAODJet*>(fJetsEmbedded->At(indexEmbedded));
3874             if(!embeddedJet) continue;
3875
3876             Double_t deltaPt = jet->Pt() - embeddedJet->Pt();
3877             Double_t deltaR  = jet->DeltaR((AliVParticle*) (embeddedJet)); 
3878             
3879             fh2DeltaPtVsJetPtEmbedded->Fill(embeddedJet->Pt(),deltaPt);
3880             fh2DeltaPtVsRecJetPtEmbedded->Fill(jet->Pt(),deltaPt);
3881             fh1DeltaREmbedded->Fill(deltaR);
3882           }
3883         }
3884
3885         // get tracks in jet
3886         TList* jettracklist = new TList();
3887         Double_t sumPt      = 0.;
3888         Bool_t isBadJet     = kFALSE;
3889         Float_t leadTrackPt = 0.;
3890         TLorentzVector* leadTrackV = new TLorentzVector();
3891
3892
3893         if(GetFFRadius()<=0){
3894           GetJetTracksTrackrefs(jettracklist, jet, GetFFMaxTrackPt(), isBadJet);
3895         } else {
3896           if(fUseEmbeddedJetAxis){
3897             if(embeddedJet) GetJetTracksPointing(fTracksRecCuts, jettracklist, embeddedJet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
3898           }
3899           else              GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
3900         }
3901         
3902         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
3903         
3904         if(isBadJet) continue; 
3905
3906         if(ptFractionEmbedded>=fCutFractionPtEmbedded){ // if no embedding: ptFraction = cutFraction = 0
3907           
3908           for(Int_t it=0; it<jettracklist->GetSize(); ++it){
3909
3910             AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
3911             if(!trackVP)continue;
3912             TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3913             
3914             Float_t jetPt   = jet->Pt();
3915             if(fUseEmbeddedJetPt){
3916               if(embeddedJet) jetPt = embeddedJet->Pt();
3917               else jetPt = 0;
3918             }
3919             Float_t trackPt = trackV->Pt();
3920
3921
3922             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3923             
3924             if(fFFMode) fFFHistosRecCuts->FillFF( trackPt, jetPt, incrementJetPt);
3925             if(fIJMode) fIJHistosRecCuts->FillIntraJet( trackV, jet->MomentumVector() );
3926             
3927             if(it==0){ // leading track 
3928               leadTrackPt = trackPt;
3929               leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3930               
3931               if(fFFMode) fFFHistosRecLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE);
3932               if(fIJMode) fIJHistosRecLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
3933             }
3934             if(fFFMode) fFFHistosRecLeading->FillFF( trackPt, leadTrackPt , incrementJetPt);
3935             if(fIJMode) fIJHistosRecLeading->FillIntraJet( trackV, leadTrackV );
3936             
3937             delete trackV;
3938           }
3939           
3940           // ff and ij for background study
3941           if(fBckgMode){
3942             if(fBckgType[0]!=-1)
3943               FillBckgHistos(fBckgType[0], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV, 
3944                              fFFBckgHisto0RecCuts, fFFBckgHisto0RecLeading,
3945                              fIJBckgHisto0RecCuts, fIJBckgHisto0RecLeading,
3946                              fQABckgHisto0RecCuts);
3947             if(fBckgType[1]!=-1)
3948               FillBckgHistos(fBckgType[1], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3949                              fFFBckgHisto1RecCuts, fFFBckgHisto1RecLeading,
3950                              fIJBckgHisto1RecCuts, fIJBckgHisto1RecLeading,
3951                              fQABckgHisto1RecCuts);
3952             if(fBckgType[2]!=-1)
3953               FillBckgHistos(fBckgType[2], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3954                              fFFBckgHisto2RecCuts, fFFBckgHisto2RecLeading,
3955                              fIJBckgHisto2RecCuts, fIJBckgHisto2RecLeading,
3956                              fQABckgHisto2RecCuts);
3957             if(fBckgType[3]!=-1)
3958               FillBckgHistos(fBckgType[3], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3959                              fFFBckgHisto3RecCuts, fFFBckgHisto3RecLeading,
3960                              fIJBckgHisto3RecCuts, fIJBckgHisto3RecLeading,
3961                              fQABckgHisto3RecCuts);
3962             if(fBckgType[4]!=-1)
3963               FillBckgHistos(fBckgType[4], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3964                              fFFBckgHisto4RecCuts, fFFBckgHisto4RecLeading,
3965                            fIJBckgHisto4RecCuts, fIJBckgHisto4RecLeading,
3966                              fQABckgHisto4RecCuts);
3967           } // end if(fBckgMode)
3968
3969
3970           // phi correlation
3971           if(fPhiCorrMode){
3972             for(Int_t it=0; it<nRecPartCuts; ++it){
3973               AliVParticle *part = (AliVParticle*)(fTracksRecCuts->At(it));
3974               
3975               Float_t partEta = part->Eta();
3976               Float_t partPhi = part->Phi();
3977               Float_t partPt  = part->Pt();
3978               
3979               fPhiCorrHistosJetArea->FillTrackQA( partEta, 
3980                                                   TVector2::Phi_mpi_pi( jet->Phi() - partPhi ),
3981                                                   partPt,
3982                                                   kTRUE);
3983               
3984               fPhiCorrHistosTransverseArea->FillTrackQA( partEta, 
3985                                                          TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()/2),
3986                                                          partPt,
3987                                                          kTRUE);
3988               
3989               fPhiCorrHistosAwayArea->FillTrackQA( partEta, 
3990                                                    TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()),
3991                                                    partPt,
3992                                                    kTRUE);
3993             }
3994           } // end: phi-correlation
3995           
3996           delete leadTrackV;
3997           delete jettracklist;  
3998
3999         } // end: cut embedded ratio
4000       } // end: leading jet
4001     } // end: rec. jets after cuts
4002     
4003     // generated jets
4004     for(Int_t ij=0; ij<nGenJets; ++ij){
4005       
4006       AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
4007       if(!jet)continue;
4008       if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
4009       
4010       if(ij==0){ // leading jet
4011         
4012         if(fQAMode&2) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
4013         
4014         TList* jettracklist = new TList();
4015         Double_t sumPt      = 0.;
4016         Bool_t isBadJet     = kFALSE;
4017         Float_t leadTrackPt = 0.;
4018         TLorentzVector* leadTrackV = new TLorentzVector();
4019         
4020         if(GetFFRadius()<=0){
4021           GetJetTracksTrackrefs(jettracklist, jet, GetFFMaxTrackPt(), isBadJet);
4022         } else {
4023           GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
4024         }
4025         
4026         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
4027         if(isBadJet) continue; 
4028
4029         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
4030           
4031           AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
4032           if(!trackVP)continue;
4033           TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
4034           
4035           Float_t jetPt   = jet->Pt();
4036           Float_t trackPt = trackV->Pt();
4037           
4038           Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4039           
4040           if(fFFMode) fFFHistosGen->FillFF( trackPt, jetPt, incrementJetPt );
4041           if(fIJMode) fIJHistosGen->FillIntraJet( trackV, jet->MomentumVector() );
4042           
4043           if(it==0){ // leading track
4044             leadTrackPt = trackPt;
4045             leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
4046             
4047             if(fFFMode) fFFHistosGenLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE );    
4048             if(fIJMode) fIJHistosGenLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
4049           }
4050           if(fFFMode) fFFHistosGenLeading->FillFF( trackPt, leadTrackPt, incrementJetPt );
4051           if(fIJMode) fIJHistosGenLeading->FillIntraJet( trackV, leadTrackV );
4052           
4053           delete trackV;
4054         }
4055         
4056         delete leadTrackV;
4057         delete jettracklist;
4058       }
4059     }
4060   } // end: QA, FF and intra-jet
4061
4062   //_______ DiJet part _____________________________________________________
4063   if(fDJMode){
4064     if (nRecJetsCuts > 1) 
4065       {
4066         AliAODJet* jet1 = (AliAODJet*)(fJetsRecCuts->At(0));
4067         AliAODJet* jet2 = (AliAODJet*)(fJetsRecCuts->At(1));
4068         
4069         // DiJet deltaphi calculation
4070         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4071         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4072         Double_t deltaPhi = TMath::Abs(phi1-phi2); 
4073         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4074         
4075         // DiJet CDF cut calculation
4076         Double_t et1     = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4077         Double_t et2     = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4078         Double_t sumEt   = et1 + et2;
4079         Double_t normEt1PlusEt2   = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4080         Double_t ratio = (Double_t)(normEt1PlusEt2/sumEt);
4081         
4082         // DiJet events selection
4083         Bool_t positionCut       = 0;
4084         Bool_t positionEnergyCut = 0;
4085         Bool_t cdfCut            = 0; 
4086         
4087         // Position cut :
4088         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4089         // Position-Energy cut :
4090         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4091         // CDF cut :
4092         if (ratio < fDiJetCDFCut) cdfCut = 1;
4093         
4094         Int_t go = 0;
4095         
4096         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4097         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4098         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4099         
4100         if (go)
4101           {
4102             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4103             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4104             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4105             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4106             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4107             
4108             Double_t  jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4109             
4110             if (jetBin > 0)
4111               {
4112                 if(fDJMode&2) fQADiJetHistosRecCuts->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4113                 
4114                 if(fDJMode&1){
4115                   TList* jettracklist1 = new TList();
4116                   Double_t sumPt1      = 0.;
4117                   Bool_t isBadJet1     = kFALSE;
4118                   Float_t leadTrackPt1 = 0;
4119                   
4120
4121                   TList* jettracklist2 = new TList();
4122                   Double_t sumPt2      = 0.;
4123                   Bool_t isBadJet2     = kFALSE;
4124                   Float_t leadTrackPt2 = 0;
4125                   
4126                   if(GetFFRadius()<=0)
4127                     {
4128                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4129                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4130                     }
4131                   else
4132                     {
4133                       GetJetTracksPointing(fTracksRecCuts, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4134                       GetJetTracksPointing(fTracksRecCuts, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4135                     }
4136                   
4137
4138                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4139                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4140
4141                   if(!(isBadJet1 || isBadJet2)){ // good jets
4142
4143                     Int_t nTracks = jettracklist1->GetSize(); 
4144                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4145                   
4146                     for(Int_t it=0; it<nTracks; ++it)
4147                       {
4148                         if (it < jettracklist1->GetSize())
4149                           { 
4150                             AliVParticle *vp = (dynamic_cast<AliVParticle*> (jettracklist1->At(it)));
4151                             Float_t trackPt1 = (vp?vp->Pt():0);
4152                             Float_t jetPt1   = jet1->Pt();
4153                             
4154                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4155                           
4156                             fFFDiJetHistosRecCuts->FillDiJetFF(1, trackPt1, jetPt1, jetBin, incrementJetPt);
4157                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt1, jetPt1, jetBin, incrementJetPt);
4158                             
4159                             if (it == 0)
4160                               {
4161                                 leadTrackPt1 = trackPt1;
4162                                 
4163                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(1, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4164                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4165                               }
4166                             
4167                             fFFDiJetHistosRecLeading->FillDiJetFF(1, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4168                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4169                           }
4170                         
4171                         if (it < jettracklist2->GetSize())
4172                           { 
4173                             Float_t trackPt2   = ((AliVParticle*)(jettracklist2->At(it)))->Pt();
4174                             Float_t jetPt2     = jet2->Pt();
4175                             
4176                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4177                             
4178                             fFFDiJetHistosRecCuts->FillDiJetFF(2, trackPt2, jetPt2, jetBin, incrementJetPt);
4179                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt2, jetPt2, jetBin, incrementJetPt);
4180                             
4181                             if (it == 0)
4182                               {
4183                                 leadTrackPt2 = trackPt2;
4184                                 
4185                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4186                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4187                               }
4188                             
4189                             fFFDiJetHistosRecLeading->FillDiJetFF(2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4190                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4191                           }
4192                       } // End loop on tracks
4193                   }
4194                   
4195                   delete jettracklist1;
4196                   delete jettracklist2;
4197                 }
4198               } // End if(jetBin > 0)
4199             else { Printf("Jet bins for di-jet studies not set !");}
4200           } // End if(go)
4201       } // End if(nRecJets > 1)
4202     
4203     if (nGenJets > 1)
4204       {
4205         AliAODJet* jet1 = dynamic_cast<AliAODJet*>(fJetsGen->At(0));
4206         AliAODJet* jet2 = dynamic_cast<AliAODJet*>(fJetsGen->At(1));
4207         if(jet1&&jet2){
4208         
4209         Double_t deltaPhi = 0;
4210         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4211         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4212         deltaPhi      = TMath::Abs(phi1-phi2); 
4213         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4214         
4215         Double_t et1            = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4216         Double_t et2            = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4217         Double_t sumEt          = et1 + et2;
4218         Double_t normEt1PlusEt2 = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4219         Double_t ratio          = (Double_t)(normEt1PlusEt2/sumEt);
4220         
4221         // DiJet events selection
4222         Bool_t positionCut       = 0;
4223         Bool_t positionEnergyCut = 0;
4224         Bool_t cdfCut            = 0; 
4225         
4226         // Position cut :
4227         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4228         // Position-Energy cut :
4229         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4230         // CDF cut :
4231         if (ratio < fDiJetCDFCut) cdfCut = 1;    
4232         
4233         Int_t go = 0;
4234         
4235         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4236         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4237         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4238         
4239         if (go)
4240           {
4241             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4242             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4243             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4244             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4245             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4246             
4247             Double_t jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4248             
4249             if(jetBin > 0)
4250               {
4251                 if(fDJMode&2) fQADiJetHistosGen->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4252                 
4253                 if(fDJMode&1){
4254                   TList* jettracklist1 = new TList();
4255                   Double_t sumPt1 = 0.;
4256                   Bool_t isBadJet1     = kFALSE;
4257                   Float_t leadTrackPt1 = 0.;
4258
4259                   TList* jettracklist2 = new TList();
4260                   Double_t sumPt2 = 0.;
4261                   Bool_t isBadJet2     = kFALSE;
4262                   Float_t leadTrackPt2 = 0.;
4263                   
4264                   if(GetFFRadius()<=0)
4265                     {
4266                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4267                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4268                     }
4269                   else
4270                     {
4271                       GetJetTracksPointing(fTracksGen, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4272                       GetJetTracksPointing(fTracksGen, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4273                     }
4274                   
4275                   
4276                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4277                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4278                   
4279                   if(!(isBadJet1 || isBadJet2)){ // good jets
4280
4281                     Int_t nTracks = jettracklist1->GetSize(); 
4282                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4283                   
4284                     for(Int_t it=0; it<nTracks; ++it)
4285                       {
4286                         if (it < jettracklist1->GetSize())
4287                           { 
4288                             Float_t trackPt1 = ((AliVParticle*)jettracklist1->At(it))->Pt();
4289                             Float_t jetPt1 = jet1->Pt();
4290                             
4291                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4292                             
4293                             fFFDiJetHistosGen->FillDiJetFF( 1, trackPt1, jetPt1, jetBin, incrementJetPt);
4294                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt1, jetPt1, jetBin, incrementJetPt);
4295                             
4296                             if(it==0)
4297                               { 
4298                                 leadTrackPt1 = trackPt1;
4299                                 
4300                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 1, leadTrackPt1, jetPt1, jetBin, kTRUE);
4301                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt1, jetPt1, jetBin, kTRUE);
4302                               }
4303                             
4304                             fFFDiJetHistosGenLeading->FillDiJetFF( 1, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4305                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4306                           }
4307                         
4308                         if (it < jettracklist2->GetSize())
4309                           { 
4310                             Float_t trackPt2 = ((AliVParticle*)jettracklist2->At(it))->Pt();
4311                             Float_t jetPt2 = jet2->Pt();
4312                             
4313                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4314                             
4315                             fFFDiJetHistosGen->FillDiJetFF( 2, trackPt2, jetPt2, jetBin, incrementJetPt);
4316                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt2, jetPt2, jetBin, incrementJetPt);
4317                           
4318                             if (it==0)
4319                               { 
4320                                 leadTrackPt2 = trackPt2;
4321                                 
4322                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4323                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4324                               }
4325                           
4326                             fFFDiJetHistosGenLeading->FillDiJetFF( 2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4327                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4328                           }
4329                       } // End loop on tracks
4330                   }               
4331
4332                   delete jettracklist1;
4333                   delete jettracklist2;
4334                 }
4335               } // End if(jetBin > 0)
4336             else { Printf("Jet bins for di-jet studies not set !");}
4337           } // End if (go)
4338         }// end if jet1 and jet2
4339       } // End if(nGenJets > 1)
4340   } // end: di-jet
4341   
4342   // ____ efficiency _______________________________
4343
4344   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
4345
4346     // arrays holding for each generated particle the reconstructed AOD track index & isPrimary flag, are initialized in AssociateGenRec(...) function
4347     TArrayI indexAODTr; 
4348     TArrayS isGenPrim; 
4349
4350     // array holding for each reconstructed AOD track generated particle index, initialized in AssociateGenRec(...) function
4351     TArrayI indexMCTr; 
4352
4353     // ... and another set for secondaries (secondary MC tracks are stored in a different list)
4354     TArrayI indexAODTrSec; 
4355     TArrayS isGenSec; 
4356     TArrayI indexMCTrSec; 
4357    
4358     Int_t  nTracksAODMCCharged = GetListOfTracks(fTracksAODMCCharged, kTrackAODMCCharged);
4359     if(fDebug>2)Printf("%s:%d selected AODMC tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCCharged);
4360   
4361     Int_t  nTracksAODMCChargedSec = GetListOfTracks(fTracksAODMCChargedSec, kTrackAODMCChargedSec);
4362     if(fDebug>2)Printf("%s:%d selected AODMC secondary tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCChargedSec);
4363   
4364     Int_t  nTracksRecQualityCuts = GetListOfTracks(fTracksRecQualityCuts, kTrackAODQualityCuts);
4365     if(fDebug>2)Printf("%s:%d selected rec tracks quality after cuts, full acceptance/pt : %d ",(char*)__FILE__,__LINE__,nTracksRecQualityCuts);
4366   
4367     // associate gen and rec tracks, store indices in TArrays 
4368     AssociateGenRec(fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,indexMCTr,isGenPrim,fh2PtRecVsGenPrim); 
4369     AssociateGenRec(fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,indexMCTrSec,isGenSec,fh2PtRecVsGenSec);
4370   
4371     // single track eff
4372     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGen,fQATrackHistosRecEffRec,fTracksAODMCCharged,indexAODTr,isGenPrim);
4373     if(fQAMode&1) FillSingleTrackResponse(fhnResponseSinglePt,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim);
4374
4375     // secondaries
4376     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec);
4377
4378     // high-pt occupancy effect 
4379     FillTwoTrackHistosRecGen(fTracksAODMCCharged, /*fTracksRecQualityCuts,indexAODTr,*/ isGenPrim);
4380
4381     // jet track eff
4382     
4383     Double_t sumPtGenLeadingJetRecEff = 0;
4384     Double_t sumPtGenLeadingJetSec    = 0;
4385     Double_t sumPtRecLeadingJetRecEff = 0;
4386     
4387     for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4388     
4389       AliAODJet* jet = (AliAODJet*)(fJetsRecEff->At(ij));
4390       Bool_t isBadJetGenPrim = kFALSE;
4391       Bool_t isBadJetGenSec  = kFALSE;
4392       Bool_t isBadJetRec     = kFALSE;
4393     
4394
4395       if(ij==0){ // leading jet
4396         
4397         // for efficiency: gen tracks from pointing with gen/rec jet
4398         TList* jettracklistGenPrim = new TList();
4399         GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, GetFFRadius(), sumPtGenLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetGenPrim); 
4400
4401         TList* jettracklistGenSec = new TList();
4402         GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, GetFFRadius(), sumPtGenLeadingJetSec, GetFFMaxTrackPt(), isBadJetGenSec); 
4403
4404         // bin efficiency in jet pt bins using rec tracks  
4405         TList* jettracklistRec = new TList();
4406         GetJetTracksPointing(fTracksRecCuts,jettracklistRec, jet, GetFFRadius(), sumPtRecLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetRec); 
4407         
4408         Double_t jetEta   = jet->Eta();
4409         Double_t jetPhi   = TVector2::Phi_0_2pi(jet->Phi());
4410         
4411         if(GetFFMinNTracks()>0 && jettracklistGenPrim->GetSize()<=GetFFMinNTracks()) isBadJetGenPrim = kTRUE;
4412         if(GetFFMinNTracks()>0 && jettracklistGenSec->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
4413         if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())     isBadJetRec     = kTRUE;
4414
4415         if(isBadJetRec) continue;
4416
4417         if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
4418         
4419         if(fFFMode) FillJetTrackHistosRecGen(fFFHistosRecEffGen,fFFHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4420                                              jettracklistGenPrim,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins); 
4421
4422         if(fFFMode) FillJetTrackResponse(fhnResponseJetTrackPt,fhnResponseJetZ,fhnResponseJetXi,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4423                                          jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,fUseResponseRecJetPtBins);
4424
4425         // secondaries: use jet pt from primaries 
4426         if(fFFMode) FillJetTrackHistosRecGen(0x0,fFFHistosSecRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4427                                              jettracklistGenSec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,fUseRecEffRecJetPtBins); 
4428
4429         delete jettracklistGenPrim;
4430         delete jettracklistGenSec;
4431         delete jettracklistRec;
4432       }
4433     }
4434     
4435
4436     // bckgr eff: complementary cones 
4437
4438     if(0){
4439       
4440       for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4441         
4442         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRecEff->At(ij));
4443         
4444         if(ij==0){ // leading jet
4445           
4446           TList* perpjettracklistGen = new TList();
4447           Double_t sumPtGen = 0.; 
4448           
4449           GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksGen, perpjettracklistGen, jet, GetFFRadius() , sumPtGen); // for efficiency: gen tracks perp to gen/rec jet
4450           
4451           // here could be your histos !!! 
4452           // FillJetTrackRecEffHisto(fFFBckgrPerpHistosRecEffGen,fFFBckgrPerpHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,perpjettracklistGen,
4453           //                     fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4454           
4455           delete perpjettracklistGen;
4456         }
4457       }
4458     }
4459
4460     // bgr eff: outside N leading jets
4461
4462     if(0){
4463       
4464       Int_t nCases = 1;
4465       
4466       TList* outjettracklistGen = new TList();
4467       Double_t sumPtGen = 0.;
4468       
4469       GetTracksOutOfNJets(nCases, fTracksGen, outjettracklistGen, fJetsRecEff, sumPtGen); // for efficiency: gen tracks outide n gen/rec jets 
4470       
4471       // here could be your histos !!! 
4472       // FillJetTrackRecEffHisto(fFFBckgrOutHistosRecEffGen,fFFBckgrOutHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4473       //                         outjettracklistGen,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4474       
4475       delete outjettracklistGen;
4476     }
4477   }     
4478
4479   //___________________
4480   
4481   fTracksRec->Clear();
4482   fTracksRecCuts->Clear();
4483   fTracksGen->Clear();
4484   fTracksAODMCCharged->Clear();
4485   fTracksAODMCChargedSec->Clear();
4486   fTracksRecQualityCuts->Clear();
4487
4488   fJetsRec->Clear();
4489   fJetsRecCuts->Clear();
4490   fJetsGen->Clear();
4491   fJetsRecEff->Clear();
4492   fJetsEmbedded->Clear();
4493
4494
4495   if(fBckgMode && 
4496      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
4497       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
4498       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
4499
4500     fBckgJetsRec->Clear();
4501     fBckgJetsRecCuts->Clear();
4502     fBckgJetsGen->Clear();
4503   }
4504
4505
4506   //Post output data.
4507   PostData(1, fCommonHistList);
4508 }
4509
4510 //________________________________________________________________________________________
4511 Double_t AliAnalysisTaskFragmentationFunction::InvMass(const AliAODJet* jet1, const AliAODJet* jet2)
4512 {
4513   // cald DiJet inv mass
4514
4515   Double_t invMass = 0.;
4516   invMass = TMath::Sqrt(pow(jet1->E()+jet2->E(),2) - pow(jet1->Px()+jet2->Px(),2) - 
4517                         pow(jet1->Py()+jet2->Py(),2) - pow(jet1->Pz()+jet2->Pz(),2));
4518
4519   return invMass;
4520
4521 }
4522
4523 //________________________________________________________________________________________
4524 Double_t AliAnalysisTaskFragmentationFunction::GetDiJetBin(Double_t invMass, Double_t leadingJetPt, Double_t EtMean, Int_t kindBins)
4525 {
4526   // calc DiJet bin according to kindBins parameter
4527
4528   Double_t jetBinOk = 0.;
4529   Double_t jetBin = 0.;
4530
4531   Float_t stepInvMass = (fDiJetJetInvMassMax - fDiJetJetInvMassMin)/fDiJetNBinsJetInvMass;
4532   Float_t stepPt = (fDiJetJetPtMax - fDiJetJetPtMin)/fDiJetNBinsJetPt;
4533
4534   if (kindBins == 1)
4535     {
4536       for(Int_t i=0; i<fDiJetNBinsJetInvMass; ++i)
4537         {
4538           jetBin = fDiJetJetInvMassMin + i*stepInvMass + stepInvMass/2.;
4539           if(((fDiJetJetInvMassMin+i*stepInvMass) <= invMass) &&
4540              (fDiJetJetInvMassMin + (i+1)*stepInvMass) > invMass) {jetBinOk = jetBin; break;}
4541           else jetBinOk = -1.;
4542         }
4543     }
4544   else if (kindBins == 3)
4545     {
4546       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4547         {
4548           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4549           if(((fDiJetJetPtMin+i*stepPt) <= EtMean) &&
4550              (fDiJetJetPtMin + (i+1)*stepPt) > EtMean) {jetBinOk = jetBin; break;}
4551           else jetBinOk = -1.;
4552         }
4553     }
4554   else if (kindBins == 2)
4555     {
4556       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4557         {
4558           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4559           if(((fDiJetJetPtMin+i*stepPt) <= leadingJetPt) &&
4560              (fDiJetJetPtMin + (i+1)*stepPt) > leadingJetPt) {jetBinOk = jetBin; break;}
4561           else jetBinOk = -1.;
4562         }
4563     }
4564   else {Printf("WARNING: kindBins wrongly set ! Please make sure to call SetKindSlices() and set the kind parameter to 1, 2 or 3.\n");}
4565
4566   return jetBinOk;
4567
4568 }
4569
4570
4571 //______________________________________________________________
4572 void AliAnalysisTaskFragmentationFunction::Terminate(Option_t *) 
4573 {
4574   // terminated
4575
4576   if(fDebug > 1) printf("AliAnalysisTaskFragmentationFunction::Terminate() \n");
4577 }  
4578
4579 //_________________________________________________________________________________
4580 Int_t AliAnalysisTaskFragmentationFunction::GetListOfTracks(TList *list, Int_t type)
4581 {
4582   // fill list of tracks selected according to type
4583
4584   if(fDebug > 2) Printf("%s:%d Selecting tracks with %d", (char*)__FILE__,__LINE__,type);
4585   
4586   if(!list){
4587     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4588     return -1;
4589   }
4590
4591   if(!fAOD) return -1;
4592
4593   if(!fAOD->GetTracks()) return 0;
4594
4595   if(type==kTrackUndef) return 0;
4596   
4597   Int_t iCount = 0;
4598
4599   if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts || type==kTrackAODExtra || type==kTrackAODExtraonly){
4600     
4601     TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(fAOD->FindListObject("aodExtraTracks"));
4602     if(!aodExtraTracks)return iCount;
4603     for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
4604       AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
4605       if (!track) continue;
4606       
4607       AliAODTrack *tr = dynamic_cast<AliAODTrack*> (track);
4608       if(!tr)continue;
4609
4610       if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts){
4611
4612         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4613         
4614         if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4615         if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4616         if(tr->Pt()  < fTrackPtCut) continue;
4617       }    
4618
4619       list->Add(tr);
4620       iCount++;
4621     }
4622   }
4623
4624   if(type==kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAOD || type==kTrackAODExtraCuts || type==kTrackAODExtra){
4625
4626     // all rec. tracks, esd filter mask, eta range
4627     
4628     for(Int_t it=0; it<fAOD->GetNumberOfTracks(); ++it){
4629       AliAODTrack *tr = fAOD->GetTrack(it);
4630       
4631       if(type == kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAODExtraCuts){
4632
4633         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4634         if(type == kTrackAODCuts){
4635           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4636           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4637           if(tr->Pt()  < fTrackPtCut) continue;
4638         }
4639       }
4640       list->Add(tr);
4641       iCount++;
4642     }
4643   }
4644   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
4645     // kine particles, all or rather charged
4646     if(!fMCEvent) return iCount;
4647     
4648     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
4649       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
4650       
4651       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
4652         if(part->Charge()==0) continue;
4653         
4654         if(type == kTrackKineChargedAcceptance && 
4655            (       part->Eta() < fTrackEtaMin
4656                 || part->Eta() > fTrackEtaMax
4657                 || part->Phi() < fTrackPhiMin
4658                 || part->Phi() > fTrackPhiMax 
4659                 || part->Pt()  < fTrackPtCut)) continue;
4660       }
4661       
4662       list->Add(part);
4663       iCount++;
4664     }
4665   }
4666   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec) {
4667     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
4668     if(!fAOD) return -1;
4669     
4670     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
4671     if(!tca)return iCount;
4672     
4673     for(int it=0; it<tca->GetEntriesFast(); ++it){
4674       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
4675       if(!part)continue;
4676       if(type != kTrackAODMCChargedSec && !part->IsPhysicalPrimary())continue;
4677       if(type == kTrackAODMCChargedSec && part->IsPhysicalPrimary())continue;
4678       
4679       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
4680         if(part->Charge()==0) continue;
4681         if(type==kTrackAODMCChargedAcceptance && 
4682            (     part->Eta() > fTrackEtaMax
4683               || part->Eta() < fTrackEtaMin
4684               || part->Phi() > fTrackPhiMax
4685               || part->Phi() < fTrackPhiMin
4686               || part->Pt()  < fTrackPtCut)) continue;
4687       }
4688       
4689       list->Add(part);
4690       iCount++;
4691     }
4692   }
4693   
4694   list->Sort();
4695   return iCount;
4696   
4697 }
4698 // _______________________________________________________________________________
4699 Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t type)
4700 {
4701   // fill list of jets selected according to type
4702
4703   if(!list){
4704     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4705     return -1;
4706   }
4707
4708   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4709
4710     if(fBranchRecJets.Length()==0){
4711       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4712       if(fDebug>1)fAOD->Print();
4713       return 0;
4714     }
4715
4716     TClonesArray *aodRecJets = 0; 
4717     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
4718     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
4719     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
4720
4721     if(!aodRecJets){
4722       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
4723       if(fDebug>1)fAOD->Print();
4724       return 0;
4725     }
4726
4727     // Reorder jet pt and fill new temporary AliAODJet objects
4728     Int_t nRecJets = 0;
4729     
4730     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4731
4732       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4733       if(!tmp) continue;
4734
4735       if( tmp->Pt() < fJetPtCut ) continue;
4736       if( type == kJetsRecAcceptance &&
4737           (    tmp->Eta() < fJetEtaMin
4738             || tmp->Eta() > fJetEtaMax
4739             || tmp->Phi() < fJetPhiMin
4740             || tmp->Phi() > fJetPhiMax )) continue;
4741
4742       if(fBckgSubMethod && fBranchRecJets.Contains("B0") &&
4743          fBranchRecJets.Contains("KT")) {
4744
4745         AliAODJet *tmpJet = GetAODBckgSubJet(tmp, fBckgSubMethod);
4746         
4747         if(!tmpJet) continue;
4748
4749         list->Add(tmpJet);
4750
4751         nRecJets++;
4752       }
4753       else {
4754         list->Add(tmp);
4755         
4756         nRecJets++;
4757       }
4758     }
4759     
4760     list->Sort();
4761     
4762     return nRecJets;
4763   }
4764   else if(type == kJetsKine || type == kJetsKineAcceptance){
4765     
4766     // generated jets
4767     Int_t nGenJets = 0;
4768     
4769     if(!fMCEvent){
4770       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
4771       return 0;
4772     }
4773    
4774     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
4775     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
4776     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
4777
4778     if(!pythiaGenHeader){
4779       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
4780       
4781       if(!hijingGenHeader){
4782          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
4783          return 0;
4784       }else{
4785          TLorentzVector mom[4];
4786          AliAODJet* jet[4];
4787          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
4788
4789          for(Int_t i=0; i<2; ++i){
4790             if(!mom[i].Pt()) continue;
4791             jet[i] = new AliAODJet(mom[i]);
4792
4793             if( type == kJetsKineAcceptance &&
4794                 (    jet[i]->Eta() < fJetEtaMin
4795                   || jet[i]->Eta() > fJetEtaMax
4796                   || jet[i]->Phi() < fJetPhiMin
4797                   || jet[i]->Phi() > fJetPhiMax )) continue;
4798
4799             list->Add(jet[i]);
4800             nGenJets++;
4801          }
4802          list->Sort();
4803          return nGenJets;
4804       }
4805     }
4806     
4807     // fetch the pythia generated jets
4808     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
4809       
4810       Float_t p[4];
4811       AliAODJet *jet = new AliAODJet();
4812       pythiaGenHeader->TriggerJet(ip, p);
4813       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
4814
4815       if( type == kJetsKineAcceptance &&
4816           (    jet->Eta() < fJetEtaMin
4817             || jet->Eta() > fJetEtaMax
4818             || jet->Phi() < fJetPhiMin
4819             || jet->Phi() > fJetPhiMax )) continue;
4820       
4821         list->Add(jet);
4822         nGenJets++;
4823     }
4824     list->Sort();
4825     return nGenJets;
4826   }
4827   else if(type == kJetsGen || type == kJetsGenAcceptance ){
4828
4829     if(fBranchGenJets.Length()==0){
4830       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
4831       return 0;
4832     }
4833     
4834     TClonesArray *aodGenJets = 0;
4835     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
4836     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
4837     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
4838
4839     if(!aodGenJets){
4840       if(fDebug>0){
4841         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
4842       }
4843       if(fDebug>1)fAOD->Print();
4844       return 0;
4845     }
4846
4847     Int_t nGenJets = 0;
4848     
4849     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
4850           
4851       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
4852       if(!tmp) continue;
4853           
4854       if( tmp->Pt() < fJetPtCut ) continue;
4855       if( type == kJetsGenAcceptance &&
4856           (    tmp->Eta() < fJetEtaMin
4857             || tmp->Eta() > fJetEtaMax
4858             || tmp->Phi() < fJetPhiMin
4859             || tmp->Phi() > fJetPhiMax )) continue;
4860       
4861         list->Add(tmp);
4862         nGenJets++;
4863     }
4864     list->Sort();
4865     return nGenJets;
4866   } 
4867   else if(type == kJetsEmbedded){ // embedded jets
4868
4869     if(fBranchEmbeddedJets.Length()==0){
4870       Printf("%s:%d no embedded jet branch specified", (char*)__FILE__,__LINE__);
4871       if(fDebug>1)fAOD->Print();
4872       return 0;
4873     }
4874
4875     TClonesArray *aodEmbeddedJets = 0; 
4876     if(fBranchEmbeddedJets.Length())      aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchEmbeddedJets.Data()));
4877     if(!aodEmbeddedJets)                  aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchEmbeddedJets.Data()));
4878     if(fAODExtension&&!aodEmbeddedJets)   aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchEmbeddedJets.Data()));
4879
4880     if(!aodEmbeddedJets){
4881       if(fBranchEmbeddedJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchEmbeddedJets.Data());
4882       if(fDebug>1)fAOD->Print();
4883       return 0;
4884     }
4885
4886     // Reorder jet pt and fill new temporary AliAODJet objects
4887     Int_t nEmbeddedJets = 0;
4888     
4889     for(Int_t ij=0; ij<aodEmbeddedJets->GetEntries(); ++ij){
4890
4891       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodEmbeddedJets->At(ij));
4892       if(!tmp) continue;
4893
4894       if( tmp->Pt() < fJetPtCut ) continue;
4895       if(    tmp->Eta() < fJetEtaMin
4896           || tmp->Eta() > fJetEtaMax
4897           || tmp->Phi() < fJetPhiMin
4898           || tmp->Phi() > fJetPhiMax ) continue;
4899       
4900       list->Add(tmp);
4901       nEmbeddedJets++;
4902     }
4903     
4904     list->Sort();
4905     
4906     return nEmbeddedJets;
4907   }
4908   else{
4909     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
4910     return 0;
4911   }
4912 }
4913
4914 // ___________________________________________________________________________________
4915 Int_t AliAnalysisTaskFragmentationFunction::GetListOfBckgJets(TList *list, Int_t type)  
4916 {
4917   // fill list of bgr clusters selected according to type
4918
4919   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4920
4921     if(fBranchRecBckgClusters.Length()==0){ 
4922       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4923       if(fDebug>1)fAOD->Print();
4924       return 0;
4925     }
4926     
4927     TClonesArray *aodRecJets = 0; 
4928     if(fBranchRecBckgClusters.Length()) aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecBckgClusters.Data()));
4929     if(!aodRecJets)                     aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecBckgClusters.Data()));
4930     if(fAODExtension&&!aodRecJets)      aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecBckgClusters.Data()));    
4931
4932     if(!aodRecJets){
4933       if(fBranchRecBckgClusters.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecBckgClusters.Data());
4934       if(fDebug>1)fAOD->Print();
4935       return 0;
4936     }
4937     
4938     // Reorder jet pt and fill new temporary AliAODJet objects
4939     Int_t nRecJets = 0;
4940     
4941     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4942       
4943       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4944       if(!tmp) continue;
4945
4946       // if( tmp->Pt() < fJetPtCut ) continue; // no pt cut on bckg clusters !
4947       if( type == kJetsRecAcceptance &&
4948           (    tmp->Eta() < fJetEtaMin
4949                || tmp->Eta() > fJetEtaMax
4950                || tmp->Phi() < fJetPhiMin
4951                || tmp->Phi() > fJetPhiMax )) continue;
4952             
4953       list->Add(tmp);
4954         
4955       nRecJets++;
4956       
4957     }
4958     
4959     list->Sort();
4960     
4961     return nRecJets;
4962   }
4963
4964   //  /*
4965   // MC clusters still Under construction
4966   //  */
4967
4968   return 0;
4969
4970
4971 // _________________________________________________________________________________________________________
4972 void AliAnalysisTaskFragmentationFunction::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
4973 {
4974   // Set properties of THnSparse 
4975
4976   for(Int_t i=0; i<dim; i++){
4977     h->GetAxis(i)->SetTitle(labels[i]);
4978     h->GetAxis(i)->SetTitleColor(1);
4979   }
4980 }
4981
4982 // __________________________________________________________________________________________
4983 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y)
4984 {
4985   //Set properties of histos (x and y title)
4986
4987   h->SetXTitle(x);
4988   h->SetYTitle(y);
4989   h->GetXaxis()->SetTitleColor(1);
4990   h->GetYaxis()->SetTitleColor(1);
4991 }
4992
4993 // _________________________________________________________________________________________________________
4994 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y, const char* z)
4995 {
4996   //Set properties of histos (x,y and z title)
4997
4998   h->SetXTitle(x);
4999   h->SetYTitle(y);
5000   h->SetZTitle(z);
5001   h->GetXaxis()->SetTitleColor(1);
5002   h->GetYaxis()->SetTitleColor(1);
5003   h->GetZaxis()->SetTitleColor(1);
5004 }
5005
5006 // ________________________________________________________________________________________________________________________________________________________
5007 void AliAnalysisTaskFragmentationFunction::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
5008                                                                 const Double_t radius, Double_t& sumPt, const Double_t maxPt, Bool_t& isBadMaxPt)
5009 {
5010   // fill list of tracks in cone around jet axis  
5011
5012   sumPt = 0;
5013   isBadMaxPt = kFALSE;
5014
5015   Double_t jetMom[3];
5016   jet->PxPyPz(jetMom);
5017   TVector3 jet3mom(jetMom);
5018
5019   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5020
5021     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5022     if(!track)continue;
5023     Double_t trackMom[3];
5024     track->PxPyPz(trackMom);
5025     TVector3 track3mom(trackMom);
5026
5027     Double_t dR = jet3mom.DeltaR(track3mom);
5028
5029     if(dR<radius){
5030
5031       outputlist->Add(track);
5032       
5033       sumPt += track->Pt();
5034
5035       if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
5036     }
5037   }
5038
5039   outputlist->Sort();
5040 }
5041
5042 // ___________________________________________________________________________________________
5043 void AliAnalysisTaskFragmentationFunction::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t maxPt, Bool_t& isBadMaxPt)
5044 {
5045   // list of jet tracks from trackrefs
5046   
5047   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
5048
5049   for (Int_t itrack=0; itrack<nTracks; itrack++) {
5050     
5051     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
5052     if(!track){
5053       AliError("expected ref track not found ");
5054       continue;
5055     }
5056         
5057     if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
5058     list->Add(track);
5059   }
5060   
5061   list->Sort();
5062 }
5063
5064 // _ ________________________________________________________________________________________________________________________________
5065 void  AliAnalysisTaskFragmentationFunction::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
5066                                                             TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
5067 {
5068   // associate generated and reconstructed tracks, fill TArrays of list indices
5069
5070   Int_t nTracksRec  = tracksRec->GetSize();
5071   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
5072   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
5073
5074
5075   if(!nTracksGen) return;
5076   if(!tca)        return;
5077   
5078   // set size
5079   indexAODTr.Set(nTracksGen);
5080   indexMCTr.Set(nTracksRec);
5081   isRefGen.Set(nTracksGen);
5082
5083   indexAODTr.Reset(-1);
5084   indexMCTr.Reset(-1);
5085   isRefGen.Reset(0);
5086
5087   // loop over reconstructed tracks, get generated track 
5088
5089   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
5090       
5091     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5092     if(!rectrack)continue;
5093     Int_t label = TMath::Abs(rectrack->GetLabel());
5094
5095     // find MC track in our list
5096     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
5097    
5098     Int_t listIndex = -1;
5099     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
5100
5101     if(listIndex>=0){
5102
5103       indexAODTr[listIndex] = iRec;
5104       indexMCTr[iRec]       = listIndex;
5105     }
5106   }
5107
5108
5109   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
5110
5111   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5112
5113     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
5114     if(!gentrack)continue;
5115     Int_t pdg = gentrack->GetPdgCode();    
5116
5117     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
5118     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
5119        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
5120       
5121       isRefGen[iGen] = kTRUE;
5122
5123       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5124
5125       if(iRec>=0){
5126         Float_t genPt = gentrack->Pt();
5127         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5128         if(vt){
5129           Float_t recPt = vt->Pt();
5130           fh2PtRecVsGen->Fill(genPt,recPt);
5131         }
5132       }
5133     }
5134   }
5135 }
5136
5137 // _____________________________________________________________________________________________________________________________________________
5138 void AliAnalysisTaskFragmentationFunction::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
5139                                                                        const TArrayI& indexAODTr, const TArrayS& isRefGen){
5140
5141   // fill QA for single track reconstruction efficiency
5142   
5143   Int_t nTracksGen  = tracksGen->GetSize();
5144
5145   if(!nTracksGen) return;
5146
5147   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5148
5149     if(isRefGen[iGen] != 1) continue; // select primaries
5150
5151     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5152     if(!gentrack) continue;
5153     Double_t ptGen  = gentrack->Pt();
5154     Double_t etaGen = gentrack->Eta();
5155     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5156
5157     // apply same acc & pt cuts as for FF 
5158
5159     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5160     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5161     if(ptGen  < fTrackPtCut) continue;
5162
5163     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
5164    
5165
5166     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5167     if(iRec>=0 && trackQARec) trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
5168   }
5169 }
5170
5171 // ______________________________________________________________________________________________________________________________________________________
5172
5173 void  AliAnalysisTaskFragmentationFunction::FillJetTrackHistosRecGen(TObject* histGen,TObject* histRec,Double_t jetPtGen,Double_t jetPtRec, TList* jetTrackList, const TList* tracksGen,
5174                                                                      const TArrayI& indexAODTr,const TArrayS& isRefGen, const Bool_t useRecJetPt)
5175 {
5176   // fill objects for jet track reconstruction efficiency or secondaries contamination 
5177   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
5178
5179   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5180
5181   if(!nTracksJet) return; 
5182
5183   Bool_t incrementJetPtGenFF = kTRUE; // needed in case we fill FFHistos
5184   Bool_t incrementJetPtRecFF = kTRUE; // needed in case we fill FFHistos
5185
5186   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5187
5188     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5189     if(!gentrack)continue;
5190     // find jet track in gen tracks list
5191     Int_t iGen = tracksGen->IndexOf(gentrack); 
5192
5193     if(iGen<0){
5194       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5195       continue;
5196     }
5197
5198
5199     if(isRefGen[iGen] != 1) continue; // select primaries
5200
5201     Double_t ptGen  = gentrack->Pt();
5202     Double_t etaGen = gentrack->Eta();
5203     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5204
5205     // apply same acc & pt cuts as for FF 
5206
5207     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5208     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5209     if(ptGen  < fTrackPtCut) continue;
5210
5211     Double_t z = ptGen / jetPtGen;
5212     Double_t xi = 0;
5213     if(z>0) xi = TMath::Log(1/z);
5214
5215     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5216     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
5217
5218     if(dynamic_cast<AliFragFuncHistos*>(histGen) || dynamic_cast<AliFragFuncHistos*>(histRec)){ // histGen can be NULL for secondaries -> ||
5219       
5220       // after checking can afford normal cast
5221       AliFragFuncHistos* ffhistGen =  (AliFragFuncHistos*) (histGen); 
5222       AliFragFuncHistos* ffhistRec =  (AliFragFuncHistos*) (histRec); 
5223
5224       if(ffhistGen){
5225         if(useRecJetPt) ffhistGen->FillFF( ptGen, jetPtRec, incrementJetPtGenFF );
5226         else            ffhistGen->FillFF( ptGen, jetPtGen, incrementJetPtGenFF );
5227         
5228         incrementJetPtGenFF = kFALSE;
5229       }
5230
5231       
5232       if(ffhistRec && isRec){
5233         
5234         if(useRecJetPt) ffhistRec->FillFF( ptGen, jetPtRec, incrementJetPtRecFF );
5235         else            ffhistRec->FillFF( ptGen, jetPtGen, incrementJetPtRecFF );
5236         
5237         incrementJetPtRecFF = kFALSE;
5238       }
5239     }
5240     else if(dynamic_cast<AliFragFuncIntraJetHistos*>(histGen) && dynamic_cast<AliFragFuncIntraJetHistos*>(histRec)){
5241       
5242       // eff for IJ histos ...
5243       
5244     }
5245   }
5246 }
5247
5248 // _____________________________________________________________________________________________________________________________________________
5249 void AliAnalysisTaskFragmentationFunction::FillTwoTrackHistosRecGen(TList* tracksGen, /*TList* tracksRec, const TArrayI& indexAODTr, */ const TArrayS& isRefGen){
5250
5251   Int_t nTracksGen  = tracksGen->GetSize();
5252   
5253   if(!nTracksGen) return;
5254   
5255   Int_t highPtIndices[nTracksGen];
5256   Int_t nHighPt = 0;
5257   
5258   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5259     
5260     if(isRefGen[iGen] != 1) continue; // select primaries
5261     
5262     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5263     if(!gentrack) continue;
5264     Double_t ptGen  = gentrack->Pt();
5265     Double_t etaGen = gentrack->Eta();
5266     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5267     
5268     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5269     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5270      
5271     if(ptGen>10 ){ 
5272       highPtIndices[nHighPt++] = iGen;
5273     }
5274   }
5275   
5276
5277   for(Int_t nHPT = 0; nHPT<nHighPt; nHPT++){ // high pt tracks loop
5278     
5279     Int_t indexHPT = highPtIndices[nHPT];
5280     
5281     AliAODMCParticle* genHPTtrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(indexHPT));
5282     if(!genHPTtrack) continue;
5283     
5284     Double_t trackMomHPT[3];
5285     genHPTtrack->PxPyPz(trackMomHPT);
5286     TVector3 track3MomHPT(trackMomHPT);
5287
5288     
5289     Double_t distNN   = 10;
5290     Double_t ptNN     = 0;
5291     Int_t    indexNN  = -1;
5292
5293     for(Int_t iGen=0; iGen<nTracksGen; iGen++){ // all gen tracks loop
5294       
5295       if(isRefGen[iGen] != 1) continue; // select primaries
5296       
5297       AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5298       if(!gentrack) continue;
5299       
5300       Double_t ptGen  = gentrack->Pt();
5301       Double_t etaGen = gentrack->Eta();
5302       Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5303       
5304       if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5305       if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5306       if(ptGen  < fTrackPtCut) continue;
5307       
5308       
5309       Double_t gentrackMom[3];
5310       gentrack->PxPyPz(gentrackMom);
5311       TVector3 gentrack3Mom(gentrackMom);
5312       
5313       Double_t dR = gentrack3Mom.DeltaR(track3MomHPT);
5314       
5315       if(iGen != indexHPT && dR<distNN){
5316         distNN   = dR;
5317         ptNN     = ptGen;
5318         indexNN  = iGen;
5319       }
5320     }
5321   }
5322 }
5323
5324 // _____________________________________________________________________________________________________________________________________________
5325 void AliAnalysisTaskFragmentationFunction::FillSingleTrackResponse(THnSparse* hnResponse, TList* tracksGen,  TList* tracksRec,
5326                                                                    const TArrayI& indexAODTr, const TArrayS& isGenPrim)
5327 {
5328   // fill response matrix for single tracks 
5329   
5330
5331   Int_t nTracksGen  = tracksGen->GetSize();
5332
5333   if(!nTracksGen) return;
5334
5335   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5336
5337     if(isGenPrim[iGen] != 1) continue; // select primaries
5338
5339     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5340     if(!gentrack)continue;
5341     Double_t ptGen  = gentrack->Pt();
5342     Double_t etaGen = gentrack->Eta();
5343     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5344
5345     // apply same acc & pt cuts as for FF 
5346     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5347     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5348     if(ptGen  < fTrackPtCut) continue;
5349
5350     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5351     if(iRec>=0){ 
5352       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5353       if(!rectrack)continue;
5354       Double_t ptRec = rectrack->Pt();
5355       
5356       Double_t entries[2] = {ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5357       hnResponse->Fill(entries);
5358
5359       Double_t invPtGen = 0;
5360       if(ptGen) invPtGen = 1/ptGen;
5361
5362       Double_t invPtRec = 0;
5363       if(ptRec) invPtRec = 1/ptRec;
5364
5365       fh2SingleInvPtRecMnGenVsPtGen->Fill(ptGen,invPtRec - invPtGen);
5366     }
5367   }
5368 }
5369
5370
5371 // ______________________________________________________________________________________________________________________________________________________
5372 void AliAnalysisTaskFragmentationFunction::FillJetTrackResponse(THnSparse* hnResponsePt, THnSparse* hnResponseZ, THnSparse* hnResponseXi, 
5373                                                                 Double_t jetPtGen, Double_t jetPtRec, TList* jetTrackList, 
5374                                                                 const TList* tracksGen, TList* tracksRec, const TArrayI& indexAODTr, const TArrayS& isGenPrim,const Bool_t useRecJetPt)
5375 {
5376   // fill response matrix for tracks in jets
5377   
5378   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5379
5380   if(!nTracksJet) return; 
5381
5382   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5383
5384     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5385     if(!gentrack)continue;
5386     // find jet track in gen tracks list
5387     Int_t iGen = tracksGen->IndexOf(gentrack); 
5388
5389     if(iGen<0){
5390       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5391       continue;
5392     }
5393
5394     if(isGenPrim[iGen] != 1) continue; // select primaries
5395     
5396     Double_t ptGen  = gentrack->Pt();
5397     Double_t etaGen = gentrack->Eta();
5398     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5399
5400     // apply same acc & pt cuts as for FF 
5401
5402     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5403     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5404     if(ptGen  < fTrackPtCut) continue;
5405
5406     Double_t zGen = ptGen / jetPtRec;
5407     Double_t xiGen = 0;
5408     if(zGen>0) xiGen = TMath::Log(1/zGen);
5409
5410     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5411
5412     if(iRec>=0){
5413
5414       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5415       if(rectrack){
5416         Double_t ptRec = rectrack->Pt();
5417         
5418         Double_t zRec    = ptRec / jetPtRec;
5419         Double_t xiRec   = 0;
5420         if(zRec>0) xiRec = TMath::Log(1/zRec);
5421       
5422         Double_t jetPt = useRecJetPt ? jetPtRec : jetPtGen;
5423         
5424         Double_t entriesPt[3] = {jetPt,ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5425         Double_t entriesZ[3]  = {jetPt,zRec,zGen}; 
5426         Double_t entriesXi[3] = {jetPt,xiRec,xiGen}; 
5427         
5428         hnResponsePt->Fill(entriesPt);
5429         hnResponseZ->Fill(entriesZ);
5430         hnResponseXi->Fill(entriesXi);
5431       }
5432     } 
5433   }
5434 }
5435
5436 // _____________________________________________________________________________________________________________________________________________________________________
5437 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxis(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt)
5438 {
5439   // List of tracks in cone perpendicular to the jet azimuthal direction
5440
5441   Double_t jetMom[3];
5442   jet->PxPyPz(jetMom);
5443
5444   TVector3 jet3mom(jetMom);
5445   // Rotate phi and keep eta unchanged
5446   Double_t etaTilted = jet3mom.Eta();
5447   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5448   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5449
5450   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5451
5452     // embedded tracks
5453     if( fUseExtraTracksBgr != 1){
5454       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5455         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5456         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5457       }
5458     }
5459     
5460     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5461     if(!track)continue;
5462     Double_t trackMom[3];
5463     track->PxPyPz(trackMom);
5464     TVector3 track3mom(trackMom);
5465
5466     Double_t deta = track3mom.Eta() - etaTilted;
5467     Double_t dphi = TMath::Abs(track3mom.Phi() - phiTilted);
5468     if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
5469     Double_t dR = TMath::Sqrt(deta * deta + dphi * dphi);
5470
5471     if(dR<=radius){
5472       outputlist->Add(track);
5473       sumPt += track->Pt();
5474     }
5475   }
5476
5477 }
5478
5479 // ________________________________________________________________________________________________________________________________________________________
5480 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxisWindow(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt,Double_t &normFactor)
5481 {
5482   // List of tracks in cone perpendicular to the jet azimuthal direction
5483
5484   Double_t jetMom[3];
5485   jet->PxPyPz(jetMom);
5486
5487   TVector3 jet3mom(jetMom);
5488   // Rotate phi and keep eta unchanged
5489   Double_t etaTilted = jet3mom.Eta();
5490   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5491   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5492
5493   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++)
5494     {
5495
5496       // embedded tracks
5497       if( fUseExtraTracksBgr != 1){
5498         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5499           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5500           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5501         }
5502       }
5503       
5504       AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5505       if(!track)continue;
5506       Float_t trackEta = track->Eta();
5507       Float_t trackPhi = track->Phi();
5508
5509       if( ( phiTilted-radius >= 0 ) && ( phiTilted+radius <= 2*TMath::Pi()))
5510         {
5511           if((trackPhi<=phiTilted+radius) && 
5512              (trackPhi>=phiTilted-radius) &&
5513              (trackEta<=fTrackEtaMax)&&(trackEta>=fTrackEtaMin)) // 0.9 and - 0.9
5514             {
5515               outputlist->Add(track);
5516               sumPt += track->Pt();
5517             }
5518         }
5519       else if( phiTilted-radius < 0 ) 
5520         {
5521           if((( trackPhi < phiTilted+radius ) ||
5522               ( trackPhi > 2*TMath::Pi()-(radius-phiTilted) )) &&
5523              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5524             {
5525               outputlist->Add(track);
5526               sumPt += track->Pt();
5527             }
5528         }
5529       else if( phiTilted+radius > 2*TMath::Pi() )
5530         {
5531           if((( trackPhi > phiTilted-radius ) ||
5532               ( trackPhi < phiTilted+radius-2*TMath::Pi() )) &&
5533              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5534             {
5535               outputlist->Add(track);
5536               sumPt += track->Pt();
5537             }
5538         }
5539     }
5540
5541   // Jet area - Temporarily added should be modified with the proper jet area value
5542   Float_t areaJet = CalcJetArea(etaTilted,radius);
5543   Float_t areaTilted = 2*radius*(fTrackEtaMax-fTrackEtaMin);
5544
5545   normFactor = (Float_t) 1. / (areaJet / areaTilted);
5546
5547 }
5548
5549
5550 // ________________________________________________________________________________________________________________________________________________________
5551 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJets(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt)
5552 {
5553   // List of tracks outside cone around N jet axis  
5554   // Particles taken randomly
5555
5556   sumPt = 0;
5557   //  Int_t   nj  = jetlist->GetSize();
5558   Float_t rc  = GetFFRadius();
5559   Float_t rcl = GetFFBckgRadius();
5560
5561   // Estimate jet and background areas
5562   Float_t* areaJet = new Float_t[nCases];
5563   memset(areaJet, 0, sizeof(Float_t) * nCases);
5564   Float_t* areaJetLarge = new Float_t[nCases];
5565   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5566   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5567   Float_t areaOut = areaFull;
5568
5569   //estimate jets and background areas
5570   Int_t nOut = 0;
5571   Int_t ijet = 0;
5572   TList* templist = new TList();
5573   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5574
5575   for(Int_t ij=0; ij<nCases; ++ij) 
5576     {
5577       // Get jet information
5578       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5579       if(!jet)continue;
5580       TVector3 jet3mom;
5581       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5582       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5583       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5584
5585       // Jet area
5586       areaJet[ij] = CalcJetArea(etaJet,rc);
5587
5588       // Area jet larger angle
5589       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5590
5591       // Outside jet area
5592       areaOut = areaOut - areaJetLarge[ij];
5593       ijet++;
5594     }
5595
5596   // List of all tracks outside jet areas
5597   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5598     
5599     // embedded tracks
5600     if( fUseExtraTracksBgr != 1){
5601       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5602         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5603         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5604       }
5605     }
5606
5607     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5608     if(!track)continue;
5609     Double_t trackMom[3];
5610     track->PxPyPz(trackMom);
5611     TVector3 track3mom(trackMom);
5612     
5613     Double_t *dR = new Double_t[nCases];
5614     for(Int_t ij=0; ij<nCases; ij++)
5615         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5616
5617     if((nCases==1 && (dR[0]>rcl)) ||
5618        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5619        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5620       {
5621         templist->Add(track);
5622         nOut++;
5623       }
5624     delete [] dR;
5625   }
5626
5627   // Take tracks randomly
5628   Int_t nScaled = (Int_t) (nOut * areaJet[0] / areaOut + 0.5);
5629   TArrayI* ar = new TArrayI(nOut);
5630
5631   for(Int_t init=0; init<nOut; init++)
5632     (*ar)[init] = init;
5633
5634   Int_t *randIndex = new Int_t[nScaled];
5635   for(Int_t init2=0; init2<nScaled; init2++)
5636     randIndex[init2] = -1;
5637
5638   // Select nScaled different random numbers in nOut
5639   for(Int_t i=0; i<nScaled; i++)
5640     {
5641       Int_t* tmpArr = new Int_t[nOut-i];
5642       Int_t temp = fRandom->Integer(nOut-i);
5643       for(Int_t ind = 0; ind< ar->GetSize()-1; ind++)
5644         {
5645           if(ind<temp) tmpArr[ind] = (*ar)[ind];
5646           else tmpArr[ind] = (*ar)[ind+1];
5647         }
5648       randIndex[i] = (*ar)[temp];
5649
5650       ar->Set(nOut-i-1,tmpArr);
5651
5652       delete [] tmpArr;
5653
5654     }
5655
5656   for(Int_t ipart=0; ipart<nScaled; ipart++)
5657     {
5658       AliVParticle* track = (AliVParticle*)(templist->At(randIndex[ipart]));
5659       outputlist->Add(track);
5660       sumPt += track->Pt();
5661     }
5662
5663   outputlist->Sort();
5664
5665   delete vect3Jet;
5666   delete templist;
5667   delete [] areaJetLarge;
5668   delete [] areaJet;
5669   delete ar;
5670   delete [] randIndex;
5671
5672 }
5673
5674 // ________________________________________________________________________________________________________________________________________________________
5675 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJetsStat(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt, Double_t &normFactor)
5676 {
5677   // List of tracks outside cone around N jet axis  
5678   // All particles taken + final scaling factor 
5679
5680   sumPt = 0;
5681   Float_t rc  = GetFFRadius();
5682   Float_t rcl = GetFFBckgRadius();
5683
5684   // Estimate jet and background areas
5685   Float_t* areaJet = new Float_t[nCases];
5686   memset(areaJet, 0, sizeof(Float_t) * nCases);
5687   Float_t* areaJetLarge = new Float_t[nCases];
5688   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5689   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5690   Float_t areaOut = areaFull;
5691
5692   //estimate jets and background areas
5693   Int_t nOut = 0;
5694   Int_t ijet = 0;
5695   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5696
5697   for(Int_t ij=0; ij<nCases; ++ij) 
5698     {
5699       // Get jet information
5700       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5701       if(!jet)continue;
5702       TVector3 jet3mom;
5703       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5704       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5705       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5706
5707       // Jet area
5708       areaJet[ij] = CalcJetArea(etaJet,rc);
5709
5710       // Area jet larger angle
5711       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5712
5713       // Outside jets area
5714       areaOut = areaOut - areaJetLarge[ij];
5715       ijet++;
5716     }
5717
5718   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5719     
5720     // embedded tracks
5721     if( fUseExtraTracksBgr != 1){
5722       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5723         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5724         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5725       }
5726     }
5727
5728     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5729     if(!track)continue;
5730     Double_t trackMom[3];
5731     track->PxPyPz(trackMom);
5732     TVector3 track3mom(trackMom);
5733     
5734     Double_t *dR = new Double_t[nCases];
5735     for(Int_t ij=0; ij<nCases; ij++)
5736         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5737
5738     if((nCases==0) ||
5739        (nCases==1 && (dR[0]>rcl)) ||
5740        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5741        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5742       {
5743         outputlist->Add(track);
5744         sumPt += track->Pt();
5745         nOut++;
5746       }
5747     delete [] dR;
5748   }
5749
5750   if(nCases==0) areaJet[0] = TMath::Pi()*rc*rc;
5751   normFactor = (Float_t) 1./(areaJet[0] / areaOut); 
5752
5753   outputlist->Sort();
5754
5755   delete vect3Jet;
5756   delete [] areaJetLarge;
5757   delete [] areaJet;
5758
5759 }
5760
5761 // ______________________________________________________________________________________________________________________________________________________
5762 Float_t AliAnalysisTaskFragmentationFunction::CalcJetArea(const Float_t etaJet, const Float_t rc) const
5763 {
5764   // calculate area of jet with eta etaJet and radius rc
5765
5766   Float_t detamax = etaJet + rc;
5767   Float_t detamin = etaJet - rc;
5768   Float_t accmax = 0.0; Float_t accmin = 0.0;
5769   if(detamax > fTrackEtaMax){ // sector outside etamax
5770     Float_t h = fTrackEtaMax - etaJet;
5771     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5772   }
5773   if(detamin < fTrackEtaMin){ // sector outside etamin
5774     Float_t h = fTrackEtaMax + etaJet;
5775     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5776   }
5777   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
5778   
5779   return areaJet;
5780
5781 }
5782
5783 // ___________________________________________________________________________________________________________________________
5784 void AliAnalysisTaskFragmentationFunction::GetClusterTracksOutOf1Jet(AliAODJet* jet, TList* outputlist, Double_t &normFactor)
5785 {
5786   // fill tracks from bckgCluster branch in list, 
5787   // for all clusters outside jet cone 
5788   // sum up total area of clusters
5789
5790   Double_t rc  = GetFFRadius();
5791   Double_t rcl = GetFFBckgRadius();
5792     
5793   Double_t areaTotal   = 0;
5794   Double_t sumPtTotal  = 0;
5795
5796   for(Int_t ij=0; ij<fBckgJetsRec->GetEntries(); ++ij){
5797       
5798     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij)); // not 'recCuts': use all clusters in full eta range
5799     
5800     Double_t dR = jet->DeltaR(bgrCluster);  
5801          
5802     if(dR<rcl) continue;
5803          
5804     Double_t clusterPt = bgrCluster->Pt();
5805     Double_t area      = bgrCluster->EffectiveAreaCharged();
5806     areaTotal  += area;
5807     sumPtTotal += clusterPt;
5808     
5809     Int_t nTracksJet = bgrCluster->GetRefTracks()->GetEntries();
5810
5811     for(Int_t it = 0; it<nTracksJet; it++){
5812         
5813       // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5814       if( fUseExtraTracksBgr != 1){
5815         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (bgrCluster->GetTrack(it))){
5816           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5817           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5818         }
5819       }
5820
5821       AliVParticle*   track = dynamic_cast<AliVParticle*>(bgrCluster->GetTrack(it));
5822       if(!track) continue;
5823         
5824       Float_t trackPt  = track->Pt();
5825       Float_t trackEta = track->Eta();
5826       Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5827         
5828       if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5829       if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5830       if(trackPt  < fTrackPtCut) continue;
5831         
5832       outputlist->Add(track);
5833     }
5834   }
5835     
5836   Double_t areaJet = TMath::Pi()*rc*rc;
5837   if(areaTotal) normFactor = (Float_t) 1./(areaJet / areaTotal); 
5838
5839   outputlist->Sort();
5840 }    
5841
5842 // _______________________________________________________________________________________________________________________
5843 void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputlist, Double_t &normFactor)
5844 {
5845   // fill tracks from bckgCluster branch, 
5846   // using cluster with median density (odd number of clusters) 
5847   // or picking randomly one of the two closest to median (even number)
5848   
5849   normFactor = 0;
5850
5851   Int_t nBckgClusters = fBckgJetsRec->GetEntries(); // not 'recCuts': use all clusters in full eta range
5852
5853   if(nBckgClusters<3) return; // need at least 3 clusters (skipping 2 highest)
5854
5855   Double_t* bgrDensity = new Double_t[nBckgClusters];
5856   Int_t*    indices    = new Int_t[nBckgClusters];
5857     
5858   for(Int_t ij=0; ij<nBckgClusters; ++ij){
5859       
5860     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij));
5861     Double_t clusterPt    = bgrCluster->Pt();
5862     Double_t area         = bgrCluster->EffectiveAreaCharged();
5863       
5864     Double_t density = 0;
5865     if(area>0) density = clusterPt/area;
5866
5867     bgrDensity[ij] = density;
5868     indices[ij]    = ij;
5869   }
5870    
5871   TMath::Sort(nBckgClusters, bgrDensity, indices); 
5872   
5873   // get median cluster
5874
5875   AliAODJet* medianCluster = 0;
5876   Double_t   medianDensity = 0;
5877
5878   if(TMath::Odd(nBckgClusters)){
5879     
5880     Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters-1))];
5881     medianCluster = (AliAODJet*)(fBckgJetsRec->At(medianIndex));
5882     
5883     Double_t clusterPt = medianCluster->Pt();
5884     Double_t area      = medianCluster->EffectiveAreaCharged();
5885     
5886     if(area>0) medianDensity = clusterPt/area;
5887   }
5888   else{
5889
5890     Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters-1)];
5891     Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters)];
5892
5893     AliAODJet* medianCluster1 = (AliAODJet*)(fBckgJetsRec->At(medianIndex1));
5894     AliAODJet* medianCluster2 = (AliAODJet*)(fBckgJetsRec->At(medianIndex2));
5895     
5896     Double_t density1 = 0;
5897     Double_t clusterPt1 = medianCluster1->Pt();
5898     Double_t area1      = medianCluster1->EffectiveAreaCharged();
5899     if(area1>0) density1 = clusterPt1/area1;
5900     
5901     Double_t density2 = 0;
5902     Double_t clusterPt2 = medianCluster2->Pt();
5903     Double_t area2      = medianCluster2->EffectiveAreaCharged();
5904     if(area2>0) density2 = clusterPt2/area2;
5905     
5906     medianDensity = 0.5*(density1+density2);
5907     
5908     medianCluster = ( (fRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 );  // select one randomly to avoid adding areas
5909   }
5910     
5911   Int_t nTracksJet = medianCluster->GetRefTracks()->GetEntries();
5912
5913   for(Int_t it = 0; it<nTracksJet; it++){
5914         
5915     // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5916     if( fUseExtraTracksBgr != 1){
5917       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (medianCluster->GetTrack(it))){
5918         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5919         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5920       }
5921     }
5922
5923     AliVParticle* track = dynamic_cast<AliVParticle*>(medianCluster->GetTrack(it));
5924     if(!track) continue;
5925         
5926     Float_t trackPt  = track->Pt();
5927     Float_t trackEta = track->Eta();
5928     Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5929     
5930     if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5931     if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5932     if(trackPt  < fTrackPtCut) continue;
5933         
5934     outputlist->Add(track);
5935   }     
5936     
5937   Double_t areaMedian = medianCluster->EffectiveAreaCharged();
5938   Double_t areaJet = TMath::Pi()*GetFFRadius()*GetFFRadius();
5939   
5940   if(areaMedian) normFactor = (Float_t) 1./(areaJet / areaMedian); 
5941   
5942   outputlist->Sort();
5943
5944   delete[] bgrDensity;
5945   delete[] indices; 
5946 }    
5947
5948 // ______________________________________________________________________________________________________________________________________________________
5949 void AliAnalysisTaskFragmentationFunction::FillBckgHistos(Int_t type, TList* inputtracklist, TList* inputjetlist, AliAODJet* jet, Float_t leadTrackPt, TLorentzVector* leadTrackV,
5950                                                           AliFragFuncHistos* ffbckghistocuts, AliFragFuncHistos* ffbckghistoleading, 
5951                                                           AliFragFuncIntraJetHistos* ijbckghistocuts, AliFragFuncIntraJetHistos* ijbckghistoleading,   
5952                                                           AliFragFuncQATrackHistos* qabckghistocuts){
5953
5954   // List of tracks outside jets for background study
5955   TList* tracklistout2jets     = new TList();
5956   TList* tracklistout3jets     = new TList();
5957   TList* tracklistout2jetsStat = new TList();
5958   TList* tracklistout3jetsStat = new TList();
5959   Double_t sumPtOut2Jets       = 0.;
5960   Double_t sumPtOut3Jets       = 0.;
5961   Double_t sumPtOut2JetsStat   = 0.;
5962   Double_t sumPtOut3JetsStat   = 0.;
5963   Double_t normFactor2Jets     = 0.;
5964   Double_t normFactor3Jets     = 0.;
5965
5966   Int_t nRecJetsCuts = fJetsRecCuts->GetEntries();
5967
5968   if(nRecJetsCuts>1) {
5969     GetTracksOutOfNJets(2,inputtracklist, tracklistout2jets, inputjetlist, sumPtOut2Jets);
5970     GetTracksOutOfNJetsStat(2,inputtracklist, tracklistout2jetsStat, inputjetlist,sumPtOut2JetsStat, normFactor2Jets);
5971
5972   }
5973   if(nRecJetsCuts>2) {
5974     GetTracksOutOfNJets(3,inputtracklist, tracklistout3jets, inputjetlist, sumPtOut3Jets);
5975     GetTracksOutOfNJetsStat(3,inputtracklist, tracklistout3jetsStat, inputjetlist, sumPtOut3JetsStat, normFactor3Jets);
5976   }
5977
5978   if(type==kBckgOutLJ || type==kBckgOutAJ)
5979     {
5980       TList* tracklistoutleading   = new TList();
5981       Double_t sumPtOutLeading     = 0.; 
5982       GetTracksOutOfNJets(1,inputtracklist, tracklistoutleading, inputjetlist, sumPtOutLeading);
5983       if(type==kBckgOutLJ) fh1OutLeadingMult->Fill(tracklistoutleading->GetSize());
5984       
5985       for(Int_t it=0; it<tracklistoutleading->GetSize(); ++it){
5986
5987         AliVParticle* trackVP   = (AliVParticle*)(tracklistoutleading->At(it));
5988         if(!trackVP) continue;
5989         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
5990         
5991         Float_t jetPt   = jet->Pt();
5992         Float_t trackPt = trackV->Pt();
5993         
5994         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
5995
5996         if(type==kBckgOutLJ)
5997           {
5998             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt);
5999             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6000             
6001             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt);
6002             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6003             
6004             // Fill track QA for background
6005             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6006           }
6007
6008         // All cases included
6009         if(nRecJetsCuts==1 && type==kBckgOutAJ)
6010           {
6011             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6012             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6013             
6014             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6015             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6016           }
6017         delete trackV;
6018       }
6019       // Increment jet pt with one entry in case #tracks outside jets = 0
6020       if(tracklistoutleading->GetSize()==0) {
6021          Float_t jetPt = jet->Pt();
6022          Bool_t incrementJetPt = kTRUE;
6023          if(type==kBckgOutLJ)
6024           {
6025             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6026             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6027           }
6028         // All cases included
6029         if(nRecJetsCuts==1 && type==kBckgOutAJ)
6030           {
6031             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6032             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6033           }
6034       }
6035       delete tracklistoutleading;
6036     }
6037   if(type==kBckgOutLJStat || type==kBckgOutAJStat)
6038     { 
6039       TList* tracklistoutleadingStat   = new TList();
6040       Double_t sumPtOutLeadingStat = 0.; 
6041       Double_t normFactorLeading   = 0.;
6042
6043       GetTracksOutOfNJetsStat(1,inputtracklist, tracklistoutleadingStat, inputjetlist, sumPtOutLeadingStat, normFactorLeading);
6044       if(type==kBckgOutLJStat) fh1OutLeadingStatMult->Fill(tracklistoutleadingStat->GetSize());
6045
6046       for(Int_t it=0; it<tracklistoutleadingStat->GetSize(); ++it){
6047
6048         AliVParticle* trackVP   = dynamic_cast<AliVParticle*>(tracklistoutleadingStat->At(it));
6049         if(!trackVP) continue;
6050         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6051         
6052         Float_t jetPt   = jet->Pt();
6053         Float_t trackPt = trackV->Pt();
6054         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6055         
6056         // Stat plots
6057         if(type==kBckgOutLJStat)
6058           {
6059             if(fFFMode)ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6060             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading);
6061             
6062             if(fFFMode)ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6063             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading);
6064             
6065             // Fill track QA for background
6066             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt); // OB added bgr QA
6067           }
6068
6069         // All cases included
6070         if(nRecJetsCuts==1 && type==kBckgOutAJStat)
6071           {
6072             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6073             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading );
6074             
6075             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6076             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading );
6077
6078             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6079
6080           }
6081         delete trackV;
6082       }
6083       // Increment jet pt with one entry in case #tracks outside jets = 0
6084       if(tracklistoutleadingStat->GetSize()==0) {
6085          Float_t jetPt = jet->Pt();
6086          Bool_t incrementJetPt = kTRUE;
6087          if(type==kBckgOutLJStat)
6088           {
6089             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6090             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading);
6091           }
6092         // All cases included
6093         if(nRecJetsCuts==1 && type==kBckgOutLJStat)
6094           {
6095             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6096             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading );
6097           }
6098       }
6099
6100       delete tracklistoutleadingStat;
6101     }
6102
6103   if(type==kBckgPerp)
6104     {
6105       Double_t sumPtPerp = 0.;
6106       TList* tracklistperp = new TList();
6107       GetTracksTiltedwrpJetAxis(TMath::Pi()/2., inputtracklist,tracklistperp,jet,GetFFRadius(),sumPtPerp);
6108       fh1PerpMult->Fill(tracklistperp->GetSize());
6109       
6110       for(Int_t it=0; it<tracklistperp->GetSize(); ++it){
6111         
6112         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperp->At(it));
6113         if(!trackVP)continue;
6114         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6115         
6116         Float_t jetPt   = jet->Pt();
6117         Float_t trackPt = trackV->Pt();
6118         
6119         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6120
6121         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6122         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6123         
6124         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6125         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6126         
6127         // Fill track QA for background
6128         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6129         
6130         delete trackV;
6131       }
6132       // Increment jet pt with one entry in case #tracks outside jets = 0
6133       if(tracklistperp->GetSize()==0) {
6134          Float_t jetPt = jet->Pt();
6135          Bool_t incrementJetPt = kTRUE;
6136          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6137          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6138       }
6139
6140       delete tracklistperp;
6141     }
6142
6143  if(type==kBckgASide)
6144     {
6145       Double_t sumPtASide = 0.;
6146       TList* tracklistaside = new TList();
6147       GetTracksTiltedwrpJetAxis(TMath::Pi(),inputtracklist,tracklistaside,jet,GetFFRadius(),sumPtASide);
6148       fh1ASideMult->Fill(tracklistaside->GetSize());
6149
6150       for(Int_t it=0; it<tracklistaside->GetSize(); ++it){
6151         
6152         AliVParticle*   trackVP = (AliVParticle*)(tracklistaside->At(it));
6153         if(!trackVP) continue;
6154         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6155
6156         Float_t jetPt   = jet->Pt();
6157         Float_t trackPt = trackV->Pt();
6158
6159         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6160
6161         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6162         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6163
6164         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6165         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6166
6167         // Fill track QA for background
6168         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6169
6170         delete trackV;
6171       }
6172       if(tracklistaside->GetSize()==0) {
6173          Float_t jetPt = jet->Pt();
6174          Bool_t incrementJetPt = kTRUE;
6175          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6176          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6177       }
6178
6179       delete tracklistaside;
6180     }
6181
6182   if(type==kBckgASideWindow)
6183     {
6184       Double_t normFactorASide = 0.;
6185       Double_t sumPtASideW = 0.;
6186       TList* tracklistasidew = new TList();
6187       GetTracksTiltedwrpJetAxisWindow(TMath::Pi(),inputtracklist,tracklistasidew,jet,GetFFRadius(),sumPtASideW,normFactorASide);
6188       fh1ASideWindowMult->Fill(tracklistasidew->GetSize());
6189
6190       for(Int_t it=0; it<tracklistasidew->GetSize(); ++it){
6191
6192         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistasidew->At(it));
6193         if(!trackVP) continue;
6194         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6195
6196         Float_t jetPt   = jet->Pt();
6197         Float_t trackPt = trackV->Pt();
6198         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6199
6200         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorASide);
6201         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorASide);
6202
6203         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorASide );
6204         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorASide );
6205
6206         // Fill track QA for background
6207         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorASide);
6208
6209         delete trackV;
6210       }
6211       if(tracklistasidew->GetSize()==0) {
6212          Float_t jetPt = jet->Pt();
6213          Bool_t incrementJetPt = kTRUE;
6214          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorASide);
6215          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorASide);
6216       }
6217
6218       delete tracklistasidew;
6219     }
6220
6221   if(type==kBckgPerpWindow)
6222     {
6223       Double_t normFactorPerp = 0.;
6224       Double_t sumPtPerpW = 0.;
6225       TList* tracklistperpw = new TList();
6226       GetTracksTiltedwrpJetAxisWindow(TMath::Pi()/2.,inputtracklist,tracklistperpw,jet,GetFFRadius(),sumPtPerpW,normFactorPerp);
6227       fh1PerpWindowMult->Fill(tracklistperpw->GetSize());
6228
6229       for(Int_t it=0; it<tracklistperpw->GetSize(); ++it){
6230         
6231         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperpw->At(it));
6232         if(!trackVP) continue;
6233         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6234
6235         Float_t jetPt   = jet->Pt();
6236         Float_t trackPt = trackV->Pt();
6237         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6238
6239         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorPerp);
6240         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorPerp);
6241
6242         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorPerp );
6243         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorPerp );
6244
6245         // Fill track QA for background
6246         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorPerp);
6247
6248         delete trackV;
6249       }
6250       if(tracklistperpw->GetSize()==0) {
6251          Float_t jetPt = jet->Pt();
6252          Bool_t incrementJetPt = kTRUE;
6253          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorPerp);
6254          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorPerp);
6255       }
6256
6257       delete tracklistperpw;
6258     }
6259
6260
6261   if(type==kBckgOut2J || type==kBckgOutAJ)
6262     {
6263       if(type==kBckgOut2J) fh1Out2JetsMult->Fill(tracklistout2jets->GetSize());
6264       for(Int_t it=0; it<tracklistout2jets->GetSize(); ++it){
6265
6266         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jets->At(it));
6267         if(!trackVP) continue;
6268         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6269         
6270         Float_t jetPt   = jet->Pt();
6271         Float_t trackPt = trackV->Pt();
6272         
6273         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6274
6275         if(type==kBckgOut2J)
6276           {
6277             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6278             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6279             
6280             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6281             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6282             
6283             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6284           }
6285
6286         // All cases included
6287         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6288           {
6289             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6290             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6291             
6292             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6293             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6294           }
6295         delete trackV;
6296       }
6297       // Increment jet pt with one entry in case #tracks outside jets = 0
6298       if(tracklistout2jets->GetSize()==0) {
6299          Float_t jetPt = jet->Pt();
6300          Bool_t incrementJetPt = kTRUE;
6301          if(type==kBckgOut2J)
6302           {
6303             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6304             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6305           }
6306         // All cases included
6307         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6308           {
6309             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6310             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6311           }
6312       }
6313
6314     }
6315
6316   if(type==kBckgOut2JStat || type==kBckgOutAJStat)
6317     {
6318       for(Int_t it=0; it<tracklistout2jetsStat->GetSize(); ++it){
6319         
6320         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jetsStat->At(it));
6321         if(!trackVP) continue;
6322         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6323         
6324         Float_t jetPt   = jet->Pt();
6325         Float_t trackPt = trackV->Pt();
6326         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6327         
6328         if(type==kBckgOut2JStat)
6329           {
6330             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6331             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6332             
6333             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6334             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6335             
6336             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6337           }
6338
6339         // All cases included
6340         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6341           {
6342             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6343             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6344             
6345             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6346             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6347
6348             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6349           }
6350         delete trackV;
6351       }
6352       // Increment jet pt with one entry in case #tracks outside jets = 0
6353       if(tracklistout2jetsStat->GetSize()==0) {
6354          Float_t jetPt = jet->Pt();
6355          Bool_t incrementJetPt = kTRUE;
6356          if(type==kBckgOut2JStat)
6357            {
6358             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6359             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets);
6360           }
6361         // All cases included
6362         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6363           {
6364             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6365             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets );
6366           }
6367       }
6368       
6369     }
6370
6371   if(type==kBckgOut3J || type==kBckgOutAJ)
6372     {
6373       if(type==kBckgOut3J) fh1Out3JetsMult->Fill(tracklistout3jets->GetSize());
6374       
6375       for(Int_t it=0; it<tracklistout3jets->GetSize(); ++it){
6376         
6377         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jets->At(it));
6378         if(!trackVP) continue;
6379         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6380         
6381         Float_t jetPt   = jet->Pt();
6382         Float_t trackPt = trackV->Pt();
6383         
6384         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6385         
6386         if(type==kBckgOut3J)
6387           {
6388             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6389             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6390             
6391             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6392             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6393             
6394             qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6395           }
6396
6397         // All cases included
6398         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6399           {
6400             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6401             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6402             
6403             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6404             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6405           }
6406         delete trackV;
6407       }
6408       // Increment jet pt with one entry in case #tracks outside jets = 0
6409       if(tracklistout3jets->GetSize()==0) {
6410          Float_t jetPt = jet->Pt();
6411          Bool_t incrementJetPt = kTRUE;
6412          if(type==kBckgOut3J)
6413           {
6414             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6415             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6416           }
6417         // All cases included
6418         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6419           {
6420             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6421             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6422           }
6423       }
6424     }
6425
6426   if(type==kBckgOut3JStat || type==kBckgOutAJStat)
6427     {
6428       for(Int_t it=0; it<tracklistout3jetsStat->GetSize(); ++it){
6429         
6430         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jetsStat->At(it));
6431         if(!trackVP) continue;
6432         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6433         
6434         Float_t jetPt   = jet->Pt();
6435         Float_t trackPt = trackV->Pt();
6436         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6437
6438         if(type==kBckgOut3JStat)
6439           {
6440             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets);
6441             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6442             
6443             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets);
6444             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets);
6445             
6446             //if(fQAMode&1)     qabckghistocuts->FillTrackQA( trackEta, TVector2::Phi_0_2pi(trackPhi), trackPt);
6447           }
6448
6449         // All cases included
6450         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6451           {
6452             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets );
6453             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6454             
6455             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets );
6456             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets );
6457
6458             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6459
6460           }
6461         delete trackV;
6462       }
6463       // Increment jet pt with one entry in case #tracks outside jets = 0
6464       if(tracklistout3jetsStat->GetSize()==0) {
6465          Float_t jetPt = jet->Pt();
6466          Bool_t incrementJetPt = kTRUE;
6467          if(type==kBckgOut3JStat)
6468           {
6469             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6470             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets);
6471           }
6472         // All cases included
6473         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6474           {
6475             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6476             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets );
6477           }
6478       }
6479
6480     }
6481
6482   if(type==kBckgClustersOutLeading){ // clusters bgr: all tracks in clusters out of leading jet
6483     
6484     TList* tracklistClustersOutLeading = new TList();
6485     Double_t normFactorClusters = 0;
6486     Float_t jetPt   = jet->Pt();
6487     
6488     GetClusterTracksOutOf1Jet(jet, tracklistClustersOutLeading, normFactorClusters);
6489     fh1OutClustersMult->Fill(tracklistClustersOutLeading->GetSize());
6490     
6491     for(Int_t it=0; it<tracklistClustersOutLeading->GetSize(); ++it){
6492       
6493       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersOutLeading->At(it));
6494       if(!trackVP) continue;
6495       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6496       
6497       Float_t trackPt = trackVP->Pt();
6498       
6499       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6500       
6501       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6502       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); 
6503
6504       delete trackV;
6505     }
6506     
6507     delete tracklistClustersOutLeading;
6508     
6509   }
6510   
6511   if(type == kBckgClusters){ // clusters bgr: all tracks in 'median cluster' 
6512     
6513     TList* tracklistClustersMedian = new TList();
6514     Double_t normFactorClusters = 0;
6515     Float_t jetPt = jet->Pt();
6516     
6517     GetClusterTracksMedian(tracklistClustersMedian, normFactorClusters); 
6518     fh1MedianClustersMult->Fill(tracklistClustersMedian->GetSize());
6519
6520     for(Int_t it=0; it<tracklistClustersMedian->GetSize(); ++it){
6521       
6522       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersMedian->At(it));
6523       if(!trackVP) continue;
6524       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6525       
6526       Float_t trackPt = trackVP->Pt();
6527       
6528       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6529       
6530       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6531       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt );
6532       
6533       delete trackV;
6534     }
6535     
6536     delete tracklistClustersMedian;
6537   }
6538   
6539   delete tracklistout2jets;
6540   delete tracklistout3jets;
6541   delete tracklistout2jetsStat;
6542   delete tracklistout3jetsStat;
6543   
6544 }
6545
6546 // ______________________________________________________________________________________________________________________________________________________
6547 AliAODJet* AliAnalysisTaskFragmentationFunction::GetAODBckgSubJet(AliAODJet* jet, Int_t method)
6548 {
6549   // correct jet pt for (mean bgr energy density) x (jet area) 
6550
6551   if(!fBranchRecBackJets.Length()){
6552     if(fDebug>0)Printf("%s:%d background branch name not set",(char*)__FILE__,__LINE__);
6553     return 0;
6554   }
6555
6556   static AliAODJetEventBackground*   externalBackground =  (AliAODJetEventBackground*)(fAOD->FindListObject(fBranchRecBackJets.Data()));
6557
6558   if(!externalBackground){
6559     if(fDebug>0)Printf("%s:%d no external background object found in %s",(char*)__FILE__,__LINE__,fBranchRecBackJets.Data());
6560     return 0;
6561   }
6562
6563   Float_t rho = externalBackground->GetBackground(method);
6564
6565   // Calculate background and subtract it from jet pt
6566   Float_t ptBack = rho*jet->EffectiveAreaCharged();
6567   Float_t ptSub = jet->Pt()-ptBack;
6568
6569   // Get px, py, pz from eta, phi, pt
6570   TLorentzVector vecSub;
6571   AliAODJet *tmpJet = 0;
6572   if(ptSub>=0){
6573     vecSub.SetPtEtaPhiM(ptSub,jet->Eta(),jet->Phi(),0.);
6574     tmpJet = new AliAODJet(vecSub.Px(),vecSub.Py(),vecSub.Pz(),vecSub.P());
6575   }
6576
6577   return tmpJet;
6578 }