]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/AliAnalysisTaskFragmentationFunction.cxx
added protection
[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         
2841         fhnResponseJetZ  = new THnSparseF("fhnResponseJetZ","jet pt:rec z rec:gen z",3,
2842                                           nBinsResponseJetZ,binMinResponseJetZ,binMaxResponseJetZ);
2843         
2844         fhnResponseJetZ->SetBinEdges(1,binLims);
2845         fhnResponseJetZ->SetBinEdges(2,binLims);
2846       }
2847       
2848       const char* labelsResponseJetZ[3] = { "jet p_{T} [GeV/c]","rec z","gen z"};
2849       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseJetZ,3,labelsResponseJetZ);
2850       
2851       Int_t    nBinsResponseJetXi[3]     = {fFFNBinsJetPt, fFFNBinsXi,fFFNBinsXi};
2852       Double_t binMinResponseJetXi[3]    = {fFFJetPtMin, fFFXiMin, fFFXiMin};
2853       Double_t binMaxResponseJetXi[3]    = {fFFJetPtMax, fFFXiMax, fFFXiMax};
2854       const char* labelsResponseJetXi[3] = { "jet p_{T} [GeV/c]","rec xi","gen xi"};
2855
2856       fhnResponseJetXi  = new THnSparseF("fhnResponseJetXi","jet pt:track xi rec:track xi gen",3,
2857                                         nBinsResponseJetXi,binMinResponseJetXi,binMaxResponseJetXi);
2858       
2859       AliAnalysisTaskFragmentationFunction::SetProperties(fhnResponseJetXi,3,labelsResponseJetXi);
2860
2861     }
2862   } // end: efficiency
2863
2864   // Background
2865   if(fBckgMode){
2866     // Track QA
2867     TString title[5];
2868     for(Int_t i=0; i<5; i++){
2869       if(fBckgType[i]==kBckgPerp) title[i]="Perp";
2870       else if(fBckgType[i]==kBckgPerpWindow) title[i]="PerpW";
2871       else if(fBckgType[i]==kBckgASide) title[i]="ASide";
2872       else if(fBckgType[i]==kBckgASideWindow) title[i]="ASideW";
2873       else if(fBckgType[i]==kBckgOutLJ) title[i]="OutLeadingJet";
2874       else if(fBckgType[i]==kBckgOut2J) title[i]="Out2Jets";
2875       else if(fBckgType[i]==kBckgOut3J) title[i]="Out3Jets";
2876       else if(fBckgType[i]==kBckgOutAJ) title[i]="AllJets";
2877       else if(fBckgType[i]==kBckgOutLJStat) title[i]="OutLeadingJetStat";
2878       else if(fBckgType[i]==kBckgOut2JStat) title[i]="Out2JetsStat";
2879       else if(fBckgType[i]==kBckgOut3JStat) title[i]="Out3JetsStat";
2880       else if(fBckgType[i]==kBckgOutAJStat) title[i]="AllJetsStat";
2881       else if(fBckgType[i]==kBckgClustersOutLeading) title[i]="OutClusters";
2882       else if(fBckgType[i]==kBckgClusters) title[i]="MedianClusters";
2883       else printf("Please chose background method number %d!",i);
2884     }
2885
2886     if(fQAMode&1){
2887       fQABckgHisto0RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[0]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2888                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2889                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2890                                                                fQATrackHighPtThreshold);
2891       fQABckgHisto0Gen          = new AliFragFuncQATrackHistos("Bckg"+title[0]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2892                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2893                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2894                                                                fQATrackHighPtThreshold);
2895       fQABckgHisto1RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[1]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2896                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2897                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2898                                                                fQATrackHighPtThreshold);
2899       fQABckgHisto1Gen          = new AliFragFuncQATrackHistos("Bckg"+title[1]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2900                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2901                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2902                                                                fQATrackHighPtThreshold);
2903       fQABckgHisto2RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[2]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2904                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2905                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2906                                                                fQATrackHighPtThreshold);
2907       fQABckgHisto2Gen          = new AliFragFuncQATrackHistos("Bckg"+title[2]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2908                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2909                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2910                                                                fQATrackHighPtThreshold);
2911       fQABckgHisto3RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[3]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2912                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2913                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2914                                                                fQATrackHighPtThreshold);
2915       fQABckgHisto3Gen          = new AliFragFuncQATrackHistos("Bckg"+title[3]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2916                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2917                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2918                                                                fQATrackHighPtThreshold);
2919       fQABckgHisto4RecCuts      = new AliFragFuncQATrackHistos("Bckg"+title[4]+"RecCuts", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2920                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2921                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2922                                                                fQATrackHighPtThreshold);
2923       fQABckgHisto4Gen          = new AliFragFuncQATrackHistos("Bckg"+title[4]+"Gen", fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax, 
2924                                                                fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
2925                                                                fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax, 
2926                                                                fQATrackHighPtThreshold);
2927
2928
2929     } // end: background QA
2930
2931     if(fFFMode){
2932       // outside leading jet or 2 jets or more
2933       fFFBckgHisto0RecCuts    = new AliFragFuncHistos("Bckg"+title[0]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2934                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2935                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2936                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2937       fFFBckgHisto0RecLeading = new AliFragFuncHistos("Bckg"+title[0]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2938                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2939                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2940                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2941       fFFBckgHisto0Gen        = new AliFragFuncHistos("Bckg"+title[0]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2942                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2943                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2944                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2945       fFFBckgHisto0GenLeading = new AliFragFuncHistos("Bckg"+title[0]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2946                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2947                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2948                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2949       
2950       fFFBckgHisto1RecCuts    = new AliFragFuncHistos("Bckg"+title[1]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2951                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2952                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2953                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2954       fFFBckgHisto1RecLeading = new AliFragFuncHistos("Bckg"+title[1]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2955                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2956                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2957                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2958       fFFBckgHisto1Gen        = new AliFragFuncHistos("Bckg"+title[1]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2959                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2960                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2961                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2962       fFFBckgHisto1GenLeading = new AliFragFuncHistos("Bckg"+title[1]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2963                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2964                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2965                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2966       
2967       fFFBckgHisto2RecCuts    = new AliFragFuncHistos("Bckg"+title[2]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2968                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2969                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2970                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2971       fFFBckgHisto2RecLeading = new AliFragFuncHistos("Bckg"+title[2]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2972                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2973                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2974                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2975       fFFBckgHisto2Gen        = new AliFragFuncHistos("Bckg"+title[2]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2976                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2977                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2978                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2979       fFFBckgHisto2GenLeading = new AliFragFuncHistos("Bckg"+title[2]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2980                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2981                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2982                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2983       fFFBckgHisto3RecCuts    = new AliFragFuncHistos("Bckg"+title[3]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2984                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2985                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2986                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2987       fFFBckgHisto3RecLeading = new AliFragFuncHistos("Bckg"+title[3]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2988                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2989                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2990                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2991       fFFBckgHisto3Gen        = new AliFragFuncHistos("Bckg"+title[3]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2992                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2993                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2994                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2995       fFFBckgHisto3GenLeading = new AliFragFuncHistos("Bckg"+title[3]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
2996                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
2997                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
2998                                                       fFFNBinsZ , fFFZMin , fFFZMax);
2999       fFFBckgHisto4RecCuts    = new AliFragFuncHistos("Bckg"+title[4]+"RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3000                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3001                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3002                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3003       fFFBckgHisto4RecLeading = new AliFragFuncHistos("Bckg"+title[4]+"RecLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3004                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3005                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3006                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3007       fFFBckgHisto4Gen        = new AliFragFuncHistos("Bckg"+title[4]+"Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3008                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3009                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3010                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3011       fFFBckgHisto4GenLeading = new AliFragFuncHistos("Bckg"+title[4]+"GenLeading", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
3012                                                       fFFNBinsPt, fFFPtMin, fFFPtMax, 
3013                                                       fFFNBinsXi, fFFXiMin, fFFXiMax,  
3014                                                       fFFNBinsZ , fFFZMin , fFFZMax);
3015
3016     } // end: background FF
3017
3018     if(fIJMode){    
3019       fIJBckgHisto0RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3020                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3021                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3022                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3023                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3024                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3025       fIJBckgHisto0RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3026                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3027                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3028                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3029                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3030                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3031       fIJBckgHisto0Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3032                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3033                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3034                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3035                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3036                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3037       fIJBckgHisto0GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[0]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3038                                                                        fIJNBinsPt, fIJPtMin, fIJPtMax, 
3039                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3040                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3041                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3042                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3043       
3044       
3045       fIJBckgHisto1RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3046                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3047                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3048                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3049                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3050                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3051       fIJBckgHisto1RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3052                                                                        fIJNBinsPt, fIJPtMin, fIJPtMax, 
3053                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3054                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3055                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3056                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3057       fIJBckgHisto1Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3058                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3059                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3060                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3061                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3062                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3063       fIJBckgHisto1GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[1]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3064                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3065                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3066                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3067                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3068                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3069       
3070       fIJBckgHisto2RecCuts           = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"RecCuts", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3071                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3072                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3073                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3074                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax,
3075                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3076       fIJBckgHisto2RecLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"RecLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3077                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3078                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3079                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3080                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3081                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3082       fIJBckgHisto2Gen               = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"Gen", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3083                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3084                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3085                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3086                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3087                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3088       fIJBckgHisto2GenLeading        = new AliFragFuncIntraJetHistos("Bckg"+title[2]+"GenLeading", fIJNBinsJetPt, fIJJetPtMin, fIJJetPtMax, 
3089                                                                      fIJNBinsPt, fIJPtMin, fIJPtMax, 
3090                                                                      fIJNBinsZ, fIJZMin, fIJZMax,  
3091                                                                      fIJNBinsCosTheta , fIJCosThetaMin , fIJCosThetaMax, 
3092                                                                      fIJNBinsTheta , fIJThetaMin , fIJThetaMax, 
3093                                                                      fIJNBinsJt , fIJJtMin , fIJJtMax);
3094     } // end: background intra-jet
3095   } // end: background
3096
3097   if(fPhiCorrMode){
3098       fPhiCorrHistosJetArea = new AliFragFuncQATrackHistos("JetArea",  fPhiCorrNBinsPt,  fPhiCorrPtMin,  fPhiCorrPtMax,
3099               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3100               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3101               fQATrackHighPtThreshold);
3102
3103       fPhiCorrHistosTransverseArea = new AliFragFuncQATrackHistos("TransverseArea", fPhiCorrNBinsPt, fPhiCorrPtMin, fPhiCorrPtMax,
3104               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3105               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3106               fQATrackHighPtThreshold);
3107
3108       fPhiCorrHistosAwayArea = new AliFragFuncQATrackHistos("AwayArea", fPhiCorrNBinsPt, fPhiCorrPtMin, fPhiCorrPtMax,
3109               fPhiCorrNBinsEta, fPhiCorrEtaMin, fPhiCorrEtaMax,
3110               fPhiCorrNBinsPhi, fPhiCorrPhiMin, fPhiCorrPhiMax,
3111               fQATrackHighPtThreshold);
3112   } // end: phi correlation
3113
3114   
3115   // ____________ define histograms ____________________
3116   
3117   if(fQAMode){
3118     if(fQAMode&1){ // track QA
3119       fQATrackHistosRec->DefineHistos();
3120       fQATrackHistosRecCuts->DefineHistos();
3121       fQATrackHistosGen->DefineHistos();
3122     }
3123
3124     if(fQAMode&2){ // jet QA
3125       fQAJetHistosRec->DefineHistos();
3126       fQAJetHistosRecCuts->DefineHistos();
3127       fQAJetHistosRecCutsLeading->DefineHistos();
3128       fQAJetHistosGen->DefineHistos();
3129       fQAJetHistosGenLeading->DefineHistos();
3130       if(fEffMode) fQAJetHistosRecEffLeading->DefineHistos();
3131     }
3132   }
3133
3134   if(fFFMode){
3135     fFFHistosRecCuts->DefineHistos();
3136     fFFHistosRecLeading->DefineHistos();
3137     fFFHistosRecLeadingTrack->DefineHistos();
3138     fFFHistosGen->DefineHistos();
3139     fFFHistosGenLeading->DefineHistos();
3140     fFFHistosGenLeadingTrack->DefineHistos();
3141   }
3142
3143   if(fIJMode){
3144     fIJHistosRecCuts->DefineHistos();
3145     fIJHistosRecLeading->DefineHistos();
3146     fIJHistosRecLeadingTrack->DefineHistos();
3147     fIJHistosGen->DefineHistos();
3148     fIJHistosGenLeading->DefineHistos();
3149     fIJHistosGenLeadingTrack->DefineHistos();
3150   }
3151
3152   if(fDJMode){
3153     if(fDJMode&1){
3154       fFFDiJetHistosRecCuts->DefineDiJetHistos();
3155       fFFDiJetHistosRecLeading->DefineDiJetHistos();
3156       fFFDiJetHistosRecLeadingTrack->DefineDiJetHistos();
3157       fFFDiJetHistosGen->DefineDiJetHistos();
3158       fFFDiJetHistosGenLeading->DefineDiJetHistos();
3159       fFFDiJetHistosGenLeadingTrack->DefineDiJetHistos();
3160     }
3161     
3162     if(fDJMode&2){
3163       fQADiJetHistosRecCuts->DefineQADiJetHistos();
3164       fQADiJetHistosGen->DefineQADiJetHistos();
3165     }
3166   } // end: di-jet
3167
3168   if(fEffMode){
3169     if(fQAMode&1){
3170       fQATrackHistosRecEffGen->DefineHistos();
3171       fQATrackHistosRecEffRec->DefineHistos(); 
3172       fQATrackHistosSecRec->DefineHistos(); 
3173     }
3174     if(fFFMode){
3175       fFFHistosRecEffGen->DefineHistos();
3176       fFFHistosRecEffRec->DefineHistos();
3177       fFFHistosSecRec->DefineHistos();
3178     }
3179   } // end: efficiency
3180
3181   // Background
3182   if(fBckgMode){
3183     if(fFFMode){
3184       fFFBckgHisto0RecCuts->DefineHistos();
3185       fFFBckgHisto0RecLeading->DefineHistos();
3186       fFFBckgHisto0Gen->DefineHistos();
3187       fFFBckgHisto0GenLeading->DefineHistos();
3188       fFFBckgHisto1RecCuts->DefineHistos();
3189       fFFBckgHisto1RecLeading->DefineHistos();
3190       fFFBckgHisto1Gen->DefineHistos();
3191       fFFBckgHisto1GenLeading->DefineHistos();
3192       fFFBckgHisto2RecCuts->DefineHistos();
3193       fFFBckgHisto2RecLeading->DefineHistos();
3194       fFFBckgHisto2Gen->DefineHistos();
3195       fFFBckgHisto2GenLeading->DefineHistos();
3196       fFFBckgHisto3RecCuts->DefineHistos();
3197       fFFBckgHisto3RecLeading->DefineHistos();
3198       fFFBckgHisto3Gen->DefineHistos();
3199       fFFBckgHisto3GenLeading->DefineHistos();
3200       fFFBckgHisto4RecCuts->DefineHistos();
3201       fFFBckgHisto4RecLeading->DefineHistos();
3202       fFFBckgHisto4Gen->DefineHistos();
3203       fFFBckgHisto4GenLeading->DefineHistos();
3204     }
3205
3206     if(fIJMode){
3207       fIJBckgHisto0RecCuts->DefineHistos();
3208       fIJBckgHisto0RecLeading->DefineHistos();
3209       fIJBckgHisto0Gen->DefineHistos();
3210       fIJBckgHisto0GenLeading->DefineHistos();
3211       fIJBckgHisto1RecCuts->DefineHistos();
3212       fIJBckgHisto1RecLeading->DefineHistos();
3213       fIJBckgHisto1Gen->DefineHistos();
3214       fIJBckgHisto1GenLeading->DefineHistos();
3215       fIJBckgHisto2RecCuts->DefineHistos();
3216       fIJBckgHisto2RecLeading->DefineHistos();
3217       fIJBckgHisto2Gen->DefineHistos();
3218       fIJBckgHisto2GenLeading->DefineHistos();
3219     }
3220
3221     if(fQAMode&1){
3222       fQABckgHisto0RecCuts->DefineHistos();
3223       fQABckgHisto0Gen->DefineHistos();
3224       fQABckgHisto1RecCuts->DefineHistos();
3225       fQABckgHisto1Gen->DefineHistos();
3226       fQABckgHisto2RecCuts->DefineHistos();
3227       fQABckgHisto2Gen->DefineHistos();
3228       fQABckgHisto3RecCuts->DefineHistos();
3229       fQABckgHisto3Gen->DefineHistos();
3230       fQABckgHisto4RecCuts->DefineHistos();
3231       fQABckgHisto4Gen->DefineHistos();
3232     }
3233   } // end: background
3234   
3235   if(fPhiCorrMode){
3236       fPhiCorrHistosJetArea->DefineHistos();
3237       fPhiCorrHistosTransverseArea->DefineHistos();
3238       fPhiCorrHistosAwayArea->DefineHistos();
3239   }
3240
3241   Bool_t genJets    = (fJetTypeGen != kJetsUndef) ? kTRUE : kFALSE;
3242   Bool_t genTracks  = (fTrackTypeGen != kTrackUndef) ? kTRUE : kFALSE;
3243   Bool_t recJetsEff = (fJetTypeRecEff != kJetsUndef) ? kTRUE : kFALSE;
3244
3245   fCommonHistList->Add(fh1EvtSelection);
3246   fCommonHistList->Add(fh1EvtMult);
3247   fCommonHistList->Add(fh1EvtCent);
3248   fCommonHistList->Add(fh2TrackPtVsDCAXY);
3249   fCommonHistList->Add(fh2TrackPtVsDCAZ);
3250   fCommonHistList->Add(fh1VertexNContributors);
3251   fCommonHistList->Add(fh1VertexZ);    
3252   fCommonHistList->Add(fh1nRecJetsCuts);
3253   fCommonHistList->Add(fh1Xsec);
3254   fCommonHistList->Add(fh1Trials);
3255   fCommonHistList->Add(fh1PtHard);
3256   fCommonHistList->Add(fh1PtHardTrials);
3257   if(genJets) fCommonHistList->Add(fh1nGenJets);
3258
3259   // FF histograms
3260   if(fFFMode){
3261     fFFHistosRecCuts->AddToOutput(fCommonHistList);
3262     fFFHistosRecLeading->AddToOutput(fCommonHistList);
3263     fFFHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3264     if(genJets && genTracks){
3265       fFFHistosGen->AddToOutput(fCommonHistList);
3266       fFFHistosGenLeading->AddToOutput(fCommonHistList);
3267       fFFHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3268     }
3269   }
3270
3271   // Background
3272   if(fBckgMode){
3273     if(fFFMode){
3274       fFFBckgHisto0RecCuts->AddToOutput(fCommonHistList);
3275       fFFBckgHisto0RecLeading->AddToOutput(fCommonHistList);
3276       fFFBckgHisto1RecCuts->AddToOutput(fCommonHistList);
3277       fFFBckgHisto1RecLeading->AddToOutput(fCommonHistList);
3278       fFFBckgHisto2RecCuts->AddToOutput(fCommonHistList);
3279       fFFBckgHisto2RecLeading->AddToOutput(fCommonHistList);
3280       fFFBckgHisto3RecCuts->AddToOutput(fCommonHistList);
3281       fFFBckgHisto3RecLeading->AddToOutput(fCommonHistList);
3282       fFFBckgHisto4RecCuts->AddToOutput(fCommonHistList);
3283       fFFBckgHisto4RecLeading->AddToOutput(fCommonHistList);
3284
3285       if(genJets && genTracks){
3286         fFFBckgHisto0Gen->AddToOutput(fCommonHistList);
3287         fFFBckgHisto0GenLeading->AddToOutput(fCommonHistList);
3288         fFFBckgHisto1Gen->AddToOutput(fCommonHistList);
3289         fFFBckgHisto1GenLeading->AddToOutput(fCommonHistList);
3290         fFFBckgHisto2Gen->AddToOutput(fCommonHistList);
3291         fFFBckgHisto2GenLeading->AddToOutput(fCommonHistList);
3292         fFFBckgHisto3Gen->AddToOutput(fCommonHistList);
3293         fFFBckgHisto3GenLeading->AddToOutput(fCommonHistList);
3294         fFFBckgHisto4Gen->AddToOutput(fCommonHistList);
3295         fFFBckgHisto4GenLeading->AddToOutput(fCommonHistList);
3296       }
3297     }
3298
3299     if(fQAMode&1){
3300       fQABckgHisto0RecCuts->AddToOutput(fCommonHistList);
3301       fQABckgHisto1RecCuts->AddToOutput(fCommonHistList);
3302       fQABckgHisto2RecCuts->AddToOutput(fCommonHistList);
3303       fQABckgHisto3RecCuts->AddToOutput(fCommonHistList);
3304       fQABckgHisto4RecCuts->AddToOutput(fCommonHistList);
3305       if(genJets && genTracks){
3306         fQABckgHisto0Gen->AddToOutput(fCommonHistList);
3307         fQABckgHisto1Gen->AddToOutput(fCommonHistList);
3308         fQABckgHisto2Gen->AddToOutput(fCommonHistList);
3309         fQABckgHisto3Gen->AddToOutput(fCommonHistList);
3310         fQABckgHisto4Gen->AddToOutput(fCommonHistList);
3311       }
3312     }
3313
3314     if(fBckgType[0]==kBckgOutLJ || fBckgType[1]==kBckgOutLJ || fBckgType[2]==kBckgOutLJ || fBckgType[3]==kBckgOutLJ || fBckgType[4]==kBckgOutLJ)
3315       fCommonHistList->Add(fh1OutLeadingMult);
3316     if(fBckgType[0]==kBckgOutLJStat || fBckgType[1]==kBckgOutLJStat || fBckgType[2]==kBckgOutLJStat || fBckgType[3]==kBckgOutLJStat || fBckgType[4]==kBckgOutLJStat)
3317       fCommonHistList->Add(fh1OutLeadingStatMult);
3318     if(fBckgType[0]==kBckgPerp || fBckgType[1]==kBckgPerp || fBckgType[2]==kBckgPerp || fBckgType[3]==kBckgPerp || fBckgType[4]==kBckgPerp)
3319       fCommonHistList->Add(fh1PerpMult);
3320     if(fBckgType[0]==kBckgASide || fBckgType[1]==kBckgASide || fBckgType[2]==kBckgASide || fBckgType[3]==kBckgASide || fBckgType[4]==kBckgASide)
3321       fCommonHistList->Add(fh1ASideMult);
3322     if(fBckgType[0]==kBckgASideWindow || fBckgType[1]==kBckgASideWindow || fBckgType[2]==kBckgASideWindow || fBckgType[3]==kBckgASideWindow || fBckgType[4]==kBckgASideWindow)
3323       fCommonHistList->Add(fh1ASideWindowMult);
3324     if(fBckgType[0]==kBckgPerpWindow || fBckgType[1]==kBckgPerpWindow || fBckgType[2]==kBckgPerpWindow || fBckgType[3]==kBckgPerpWindow || fBckgType[4]==kBckgPerpWindow)
3325       fCommonHistList->Add(fh1PerpWindowMult);
3326     if(fBckgType[0]==kBckgOut2J || fBckgType[1]==kBckgOut2J || fBckgType[2]==kBckgOut2J || fBckgType[3]==kBckgOut2J || fBckgType[4]==kBckgOut2J)
3327       fCommonHistList->Add(fh1Out2JetsMult);
3328     if(fBckgType[0]==kBckgOut3J || fBckgType[1]==kBckgOut3J || fBckgType[2]==kBckgOut3J || fBckgType[3]==kBckgOut3J || fBckgType[4]==kBckgOut3J)
3329       fCommonHistList->Add(fh1Out3JetsMult);
3330     if(fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters)
3331       fCommonHistList->Add(fh1MedianClustersMult);
3332     if(fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading 
3333        || fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)
3334       fCommonHistList->Add(fh1OutClustersMult);
3335   }
3336
3337
3338   if(fBranchEmbeddedJets.Length()){ 
3339     fCommonHistList->Add(fh1FractionPtEmbedded);
3340     fCommonHistList->Add(fh1IndexEmbedded);
3341     fCommonHistList->Add(fh2DeltaPtVsJetPtEmbedded);      
3342     fCommonHistList->Add(fh2DeltaPtVsRecJetPtEmbedded);      
3343     fCommonHistList->Add(fh1DeltaREmbedded);
3344     fCommonHistList->Add(fh1nEmbeddedJets);  
3345   }
3346
3347   if(fEffMode){
3348     fCommonHistList->Add(fh2ptVsDistNN_pt50_rec);
3349     fCommonHistList->Add(fh2ptVsDistNN_pt50_nonRec);
3350     fCommonHistList->Add(fh2ptVsDistNN_pt10_rec);
3351     fCommonHistList->Add(fh2ptVsDistNN_pt10_nonRec);
3352   }
3353
3354   // QA  
3355   if(fQAMode){
3356     if(fQAMode&1){ // track QA
3357       fQATrackHistosRec->AddToOutput(fCommonHistList);
3358       fQATrackHistosRecCuts->AddToOutput(fCommonHistList);
3359       if(genTracks) fQATrackHistosGen->AddToOutput(fCommonHistList);
3360     }
3361
3362     if(fQAMode&2){ // jet QA
3363       fQAJetHistosRec->AddToOutput(fCommonHistList);
3364       fQAJetHistosRecCuts->AddToOutput(fCommonHistList);
3365       fQAJetHistosRecCutsLeading->AddToOutput(fCommonHistList);
3366       if(recJetsEff && fEffMode) fQAJetHistosRecEffLeading->AddToOutput(fCommonHistList); 
3367       if(genJets){
3368         fQAJetHistosGen->AddToOutput(fCommonHistList);
3369         fQAJetHistosGenLeading->AddToOutput(fCommonHistList);
3370       }
3371     }
3372   }
3373
3374   if(fBckgMode && 
3375      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
3376       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
3377       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)) {
3378     fCommonHistList->Add(fh1nRecBckgJetsCuts);
3379     if(genJets) fCommonHistList->Add(fh1nGenBckgJets);
3380   }
3381     
3382   // phi correlation
3383   if(fPhiCorrMode){
3384     fPhiCorrHistosJetArea->AddToOutput(fCommonHistList);
3385     fPhiCorrHistosTransverseArea->AddToOutput(fCommonHistList);
3386     fPhiCorrHistosAwayArea->AddToOutput(fCommonHistList);
3387   }
3388
3389   // intra-jet
3390   if(fIJMode){
3391     fIJHistosRecCuts->AddToOutput(fCommonHistList);
3392     fIJHistosRecLeading->AddToOutput(fCommonHistList);
3393     fIJHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3394       
3395     // Background
3396     if(fBckgMode){
3397       fIJBckgHisto0RecCuts->AddToOutput(fCommonHistList);
3398       fIJBckgHisto0RecLeading->AddToOutput(fCommonHistList);
3399       fIJBckgHisto1RecCuts->AddToOutput(fCommonHistList);
3400       fIJBckgHisto1RecLeading->AddToOutput(fCommonHistList);
3401       fIJBckgHisto2RecCuts->AddToOutput(fCommonHistList);
3402       fIJBckgHisto2RecLeading->AddToOutput(fCommonHistList);
3403     }
3404       
3405     if(genJets && genTracks){
3406       fIJHistosGen->AddToOutput(fCommonHistList);
3407       fIJHistosGenLeading->AddToOutput(fCommonHistList);
3408       fIJHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3409       
3410       // Background
3411       if(fBckgMode){
3412         fIJBckgHisto0Gen->AddToOutput(fCommonHistList);
3413         fIJBckgHisto0GenLeading->AddToOutput(fCommonHistList);
3414         fIJBckgHisto1Gen->AddToOutput(fCommonHistList);
3415         fIJBckgHisto1GenLeading->AddToOutput(fCommonHistList);
3416         fIJBckgHisto2Gen->AddToOutput(fCommonHistList);
3417         fIJBckgHisto2GenLeading->AddToOutput(fCommonHistList);
3418       }
3419     } // end: gen
3420   } // end: intra-jet
3421   
3422   if(fDJMode){
3423     if(fDJMode&1){
3424       fFFDiJetHistosRecCuts->AddToOutput(fCommonHistList);
3425       fFFDiJetHistosRecLeading->AddToOutput(fCommonHistList);
3426       fFFDiJetHistosRecLeadingTrack->AddToOutput(fCommonHistList);
3427       if(genJets && genTracks){
3428         fFFDiJetHistosGen->AddToOutput(fCommonHistList);
3429         fFFDiJetHistosGenLeading->AddToOutput(fCommonHistList);
3430         fFFDiJetHistosGenLeadingTrack->AddToOutput(fCommonHistList);
3431       }
3432     } // end: di-jet
3433     if(fDJMode&2){
3434       fQADiJetHistosRecCuts->AddToOutput(fCommonHistList);
3435       if(genJets && genTracks){
3436         fQADiJetHistosGen->AddToOutput(fCommonHistList);
3437       }
3438     } // end: di-jet QA
3439   } // end: di-jet
3440   
3441   if(fEffMode && recJetsEff && genTracks){
3442     if(fQAMode&1){
3443       fQATrackHistosRecEffGen->AddToOutput(fCommonHistList);
3444       fQATrackHistosRecEffRec->AddToOutput(fCommonHistList);
3445       fQATrackHistosSecRec->AddToOutput(fCommonHistList);
3446       fCommonHistList->Add(fhnResponseSinglePt);
3447       fCommonHistList->Add(fh2SingleInvPtRecMnGenVsPtGen); 
3448     }
3449     if(fFFMode){
3450       fFFHistosRecEffGen->AddToOutput(fCommonHistList);
3451       fFFHistosRecEffRec->AddToOutput(fCommonHistList);
3452       fFFHistosSecRec->AddToOutput(fCommonHistList);
3453       fCommonHistList->Add(fhnResponseJetTrackPt);
3454       fCommonHistList->Add(fhnResponseJetZ);
3455       fCommonHistList->Add(fhnResponseJetXi);
3456     }
3457     fCommonHistList->Add(fh1nRecEffJets);
3458     fCommonHistList->Add(fh2PtRecVsGenPrim); 
3459     fCommonHistList->Add(fh2PtRecVsGenSec); 
3460   }
3461   
3462
3463   // =========== Switch on Sumw2 for all histos ===========
3464   for (Int_t i=0; i<fCommonHistList->GetEntries(); ++i){
3465     TH1 *h1 = dynamic_cast<TH1*>(fCommonHistList->At(i));
3466     if (h1) h1->Sumw2();
3467     else{
3468       THnSparse *hnSparse = dynamic_cast<THnSparse*>(fCommonHistList->At(i));
3469       if(hnSparse) hnSparse->Sumw2();
3470     }
3471   }
3472   
3473   TH1::AddDirectory(oldStatus);
3474
3475   PostData(1, fCommonHistList);
3476
3477 }
3478
3479 //_______________________________________________
3480 void AliAnalysisTaskFragmentationFunction::Init()
3481 {
3482   // Initialization
3483   if(fDebug > 1) Printf("AliAnalysisTaskFragmentationFunction::Init()");
3484
3485 }
3486
3487 //_____________________________________________________________
3488 void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *) 
3489 {
3490   // Main loop
3491   // Called for each event
3492   if(fDebug > 1) Printf("AliAnalysisTaskFragmentationFunction::UserExec()");
3493         
3494
3495   if(fDebug > 1) Printf("Analysis event #%5d", (Int_t) fEntry);
3496
3497   // Trigger selection
3498   AliInputEventHandler* inputHandler = (AliInputEventHandler*)
3499     ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
3500
3501   if(!(inputHandler->IsEventSelected() & fEvtSelectionMask)){
3502       fh1EvtSelection->Fill(1.);
3503       if (fDebug > 1 ) Printf(" Trigger Selection: event REJECTED ... ");
3504       PostData(1, fCommonHistList);
3505       return;
3506   }
3507    
3508   fESD = dynamic_cast<AliESDEvent*>(InputEvent());
3509   if(!fESD){
3510     if(fDebug>3) Printf("%s:%d ESDEvent not found in the input", (char*)__FILE__,__LINE__);
3511   }
3512   
3513   fMCEvent = MCEvent();
3514   if(!fMCEvent){
3515     if(fDebug>3) Printf("%s:%d MCEvent not found in the input", (char*)__FILE__,__LINE__);
3516   }
3517   
3518   // get AOD event from input/ouput
3519   TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
3520   if( handler && handler->InheritsFrom("AliAODInputHandler") ) {
3521     fAOD  =  ((AliAODInputHandler*)handler)->GetEvent();
3522     if(fUseAODInputJets) fAODJets = fAOD;
3523     if (fDebug > 1)  Printf("%s:%d AOD event from input", (char*)__FILE__,__LINE__);
3524   }
3525   else {
3526     handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
3527     if( handler && handler->InheritsFrom("AliAODHandler") ) {
3528       fAOD = ((AliAODHandler*)handler)->GetAOD();
3529       fAODJets = fAOD;
3530       if (fDebug > 1)  Printf("%s:%d AOD event from output", (char*)__FILE__,__LINE__);
3531     }
3532   }
3533   
3534   if(!fAODJets && !fUseAODInputJets){ // case we have AOD in input & output and want jets from output
3535     TObject* outHandler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
3536     if( outHandler && outHandler->InheritsFrom("AliAODHandler") ) {
3537       fAODJets = ((AliAODHandler*)outHandler)->GetAOD();
3538       if (fDebug > 1)  Printf("%s:%d jets from output AOD", (char*)__FILE__,__LINE__);
3539     }
3540   }
3541   
3542   if(fNonStdFile.Length()!=0){
3543     // case we have an AOD extension - fetch the jets from the extended output
3544     
3545     AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
3546     fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);    
3547     if(!fAODExtension){
3548       if(fDebug>1)Printf("AODExtension not found for %s",fNonStdFile.Data());
3549     }
3550   }
3551   
3552   if(!fAOD){
3553     Printf("%s:%d AODEvent not found", (char*)__FILE__,__LINE__);
3554     return;
3555   }
3556   if(!fAODJets){
3557     Printf("%s:%d AODEvent with jet branch not found", (char*)__FILE__,__LINE__);
3558     return;
3559   }
3560
3561   
3562   // event selection **************************************************
3563   // *** event class ***
3564   Double_t centPercent = -1;
3565   if(fEventClass>0){
3566     Int_t cl = 0;
3567     if(handler->InheritsFrom("AliAODInputHandler")){ 
3568       // since it is not supported by the helper task define own classes
3569       centPercent = fAOD->GetHeader()->GetCentrality();
3570       cl = 1;
3571       if(centPercent>10) cl = 2;
3572       if(centPercent>30) cl = 3;
3573       if(centPercent>50) cl = 4;
3574     }
3575     else {
3576       cl = AliAnalysisHelperJetTasks::EventClass();
3577       if(fESD) centPercent = fESD->GetCentrality()->GetCentralityPercentile("V0M"); // retrieve value 'by hand'
3578     }
3579     
3580     if(cl!=fEventClass){
3581       // event not in selected event class, reject event
3582       if (fDebug > 1) Printf("%s:%d event not in selected event class: event REJECTED ...",(char*)__FILE__,__LINE__);
3583       fh1EvtSelection->Fill(2.);
3584       PostData(1, fCommonHistList);
3585       return;
3586     }
3587   }
3588
3589   // *** vertex cut ***
3590   AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
3591   Int_t nTracksPrim = primVtx->GetNContributors();
3592   fh1VertexNContributors->Fill(nTracksPrim);
3593   
3594
3595   if (fDebug > 1) Printf("%s:%d primary vertex selection: %d", (char*)__FILE__,__LINE__,nTracksPrim);
3596   if(!nTracksPrim){
3597     if (fDebug > 1) Printf("%s:%d primary vertex selection: event REJECTED...",(char*)__FILE__,__LINE__); 
3598     fh1EvtSelection->Fill(3.);
3599     PostData(1, fCommonHistList);
3600     return;
3601   }
3602   
3603   fh1VertexZ->Fill(primVtx->GetZ());
3604   
3605   if(TMath::Abs(primVtx->GetZ())>fMaxVertexZ){
3606     if (fDebug > 1) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ()); 
3607     fh1EvtSelection->Fill(4.);
3608     PostData(1, fCommonHistList);
3609     return; 
3610   }
3611   
3612   TString primVtxName(primVtx->GetName());
3613
3614   if(primVtxName.CompareTo("TPCVertex",TString::kIgnoreCase) == 1){
3615     if (fDebug > 1) Printf("%s:%d primary vertex selection: TPC vertex, event REJECTED...",(char*)__FILE__,__LINE__);
3616     fh1EvtSelection->Fill(5.);
3617     PostData(1, fCommonHistList);
3618     return;
3619   }
3620
3621   if (fDebug > 1) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__); 
3622   fh1EvtSelection->Fill(0.);
3623   fh1EvtCent->Fill(centPercent);
3624
3625
3626   //___ get MC information __________________________________________________________________
3627
3628   fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
3629
3630   Double_t ptHard = 0.;
3631   Double_t nTrials = 1; // trials for MC trigger weight for real data
3632
3633   if(fMCEvent){
3634     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
3635
3636     if(genHeader){
3637       
3638       AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
3639       AliGenHijingEventHeader*  hijingGenHeader = 0x0;
3640       
3641       if(pythiaGenHeader){
3642         if(fDebug>3) Printf("%s:%d pythiaGenHeader found", (char*)__FILE__,__LINE__);
3643         nTrials = pythiaGenHeader->Trials();
3644         ptHard  = pythiaGenHeader->GetPtHard();
3645         
3646         fh1PtHard->Fill(ptHard);
3647         fh1PtHardTrials->Fill(ptHard,nTrials);
3648         
3649         
3650       } else { // no pythia, hijing?
3651         
3652         if(fDebug>3) Printf("%s:%d no pythiaGenHeader found", (char*)__FILE__,__LINE__);
3653         
3654         hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
3655         if(!hijingGenHeader){
3656           Printf("%s:%d no pythiaGenHeader or hjingGenHeader found", (char*)__FILE__,__LINE__);
3657         } else {
3658           if(fDebug>3) Printf("%s:%d hijingGenHeader found", (char*)__FILE__,__LINE__);
3659         }
3660       }
3661       
3662       //fh1Trials->Fill("#sum{ntrials}",fAvgTrials); 
3663     }
3664
3665   }
3666   
3667   //___ fetch jets __________________________________________________________________________
3668  
3669   Int_t nJ = GetListOfJets(fJetsRec, kJetsRec);
3670   Int_t nRecJets = 0;
3671   if(nJ>=0) nRecJets = fJetsRec->GetEntries();
3672   if(fDebug>2)Printf("%s:%d Selected Rec jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
3673   if(nJ != nRecJets) Printf("%s:%d Mismatch Selected Rec Jets: %d %d",(char*)__FILE__,__LINE__,nJ,nRecJets);
3674
3675   Int_t nJCuts = GetListOfJets(fJetsRecCuts, kJetsRecAcceptance);
3676   Int_t nRecJetsCuts = 0;
3677   if(nJCuts>=0) nRecJetsCuts = fJetsRecCuts->GetEntries();
3678   if(fDebug>2)Printf("%s:%d Selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3679   if(nRecJetsCuts != nJCuts) Printf("%s:%d Mismatch selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3680   fh1nRecJetsCuts->Fill(nRecJetsCuts);
3681
3682   if(fJetTypeGen==kJetsKine || fJetTypeGen == kJetsKineAcceptance) fJetsGen->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
3683
3684   Int_t nJGen  = GetListOfJets(fJetsGen, fJetTypeGen);
3685   Int_t nGenJets = 0;
3686   if(nJGen>=0) nGenJets = fJetsGen->GetEntries();
3687   if(fDebug>2)Printf("%s:%d Selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
3688
3689   if(nJGen != nGenJets) Printf("%s:%d Mismatch selected Gen jets: %d %d",(char*)__FILE__,__LINE__,nJGen,nGenJets);
3690   fh1nGenJets->Fill(nGenJets);
3691
3692
3693   if(fJetTypeRecEff==kJetsKine || fJetTypeRecEff == kJetsKineAcceptance) fJetsRecEff->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear() 
3694   Int_t nJRecEff  = GetListOfJets(fJetsRecEff, fJetTypeRecEff);
3695   Int_t nRecEffJets = 0;
3696   if(nJRecEff>=0) nRecEffJets = fJetsRecEff->GetEntries();
3697   if(fDebug>2)Printf("%s:%d Selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
3698   if(nJRecEff != nRecEffJets) Printf("%s:%d Mismatch selected RecEff jets: %d %d",(char*)__FILE__,__LINE__,nJRecEff,nRecEffJets);
3699   fh1nRecEffJets->Fill(nRecEffJets);
3700
3701
3702   Int_t nEmbeddedJets =  0; 
3703   TArrayI iEmbeddedMatchIndex; 
3704   TArrayF fEmbeddedPtFraction; 
3705     
3706
3707   if(fBranchEmbeddedJets.Length()){ 
3708     Int_t nJEmbedded = GetListOfJets(fJetsEmbedded, kJetsEmbedded);
3709     if(nJEmbedded>=0) nEmbeddedJets = fJetsEmbedded->GetEntries();
3710     if(fDebug>2)Printf("%s:%d Selected Embedded jets: %d %d",(char*)__FILE__,__LINE__,nJEmbedded,nEmbeddedJets);
3711     if(nJEmbedded != nEmbeddedJets) Printf("%s:%d Mismatch Selected Embedded Jets: %d %d",(char*)__FILE__,__LINE__,nJEmbedded,nEmbeddedJets);
3712     fh1nEmbeddedJets->Fill(nEmbeddedJets);
3713      
3714     Float_t maxDist = 0.3;
3715
3716     iEmbeddedMatchIndex.Set(nEmbeddedJets); 
3717     fEmbeddedPtFraction.Set(nEmbeddedJets); 
3718     
3719     iEmbeddedMatchIndex.Reset(-1);
3720     fEmbeddedPtFraction.Reset(0);
3721
3722     AliAnalysisHelperJetTasks::GetJetMatching(fJetsEmbedded, nEmbeddedJets, 
3723                                               fJetsRecCuts, nRecJetsCuts, 
3724                                               iEmbeddedMatchIndex, fEmbeddedPtFraction,
3725                                               fDebug, maxDist);
3726    
3727   }
3728   
3729   //____ fetch background jets ___________________________________________________
3730   if(fBckgMode && 
3731      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
3732       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
3733       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
3734
3735     Int_t nBJ = GetListOfBckgJets(fBckgJetsRec, kJetsRec);
3736     Int_t nRecBckgJets = 0;
3737     if(nBJ>=0) nRecBckgJets = fBckgJetsRec->GetEntries();
3738     if(fDebug>2)Printf("%s:%d Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
3739     if(nBJ != nRecBckgJets) Printf("%s:%d Mismatch Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
3740
3741     Int_t nBJCuts = GetListOfBckgJets(fBckgJetsRecCuts, kJetsRecAcceptance);
3742     Int_t nRecBckgJetsCuts = 0;
3743     if(nBJCuts>=0) nRecBckgJetsCuts = fBckgJetsRecCuts->GetEntries();
3744     if(fDebug>2)Printf("%s:%d Selected Rec background jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
3745     if(nRecBckgJetsCuts != nBJCuts) Printf("%s:%d Mismatch selected Rec background jets after cuts: %d %d",(char*)__FILE__,__LINE__,nBJCuts,nRecBckgJetsCuts);
3746     fh1nRecBckgJetsCuts->Fill(nRecBckgJetsCuts);
3747
3748     if(0){ // protection OB - not yet implemented 
3749       if(fJetTypeGen==kJetsKine || fJetTypeGen == kJetsKineAcceptance) fBckgJetsGen->SetOwner(kTRUE); // kine aod jets allocated on heap, delete them with TList::Clear()
3750       Int_t nBJGen  = GetListOfBckgJets(fBckgJetsGen, fJetTypeGen);
3751       Int_t nGenBckgJets = 0;
3752       if(nBJGen>=0) nGenBckgJets = fBckgJetsGen->GetEntries();
3753       if(fDebug>2)Printf("%s:%d Selected Gen background jets: %d %d",(char*)__FILE__,__LINE__,nBJGen,nGenBckgJets);
3754       if(nBJGen != nGenBckgJets) Printf("%s:%d Mismatch selected Gen background jets: %d %d",(char*)__FILE__,__LINE__,nBJGen,nGenBckgJets);
3755       fh1nGenBckgJets->Fill(nGenBckgJets);
3756     }
3757   }
3758
3759
3760   //____ fetch particles __________________________________________________________
3761   
3762   Int_t nT;
3763   if(fUseExtraTracks ==  1)       nT = GetListOfTracks(fTracksRec, kTrackAODExtra);
3764   else if(fUseExtraTracks ==  -1) nT = GetListOfTracks(fTracksRec, kTrackAODExtraonly);
3765   else                            nT = GetListOfTracks(fTracksRec, kTrackAOD);
3766
3767   Int_t nRecPart = 0;
3768   if(nT>=0) nRecPart = fTracksRec->GetEntries();
3769   if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,nRecPart);
3770   if(nRecPart != nT) Printf("%s:%d Mismatch selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,nRecPart);
3771   
3772
3773   Int_t nTCuts;
3774   if(fUseExtraTracks ==  1)      nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODExtraCuts);
3775   else if(fUseExtraTracks == -1) nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODExtraonlyCuts);
3776   else                           nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODCuts);
3777   
3778   Int_t nRecPartCuts = 0;
3779   if(nTCuts>=0) nRecPartCuts = fTracksRecCuts->GetEntries();
3780   if(fDebug>2)Printf("%s:%d Selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
3781   if(nRecPartCuts != nTCuts) Printf("%s:%d Mismatch selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,nRecPartCuts);
3782   fh1EvtMult->Fill(nRecPartCuts);
3783
3784
3785
3786   Int_t nTGen = GetListOfTracks(fTracksGen,fTrackTypeGen);
3787   Int_t nGenPart = 0;
3788   if(nTGen>=0) nGenPart = fTracksGen->GetEntries();
3789   if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
3790   if(nGenPart != nTGen) Printf("%s:%d Mismatch selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nTGen,nGenPart);
3791   
3792   
3793   //____ analysis, fill histos ___________________________________________________
3794   
3795   if(fQAMode){
3796     // loop over tracks
3797     if(fQAMode&1){
3798       for(Int_t it=0; it<nRecPart; ++it){
3799         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksRec->At(it));
3800         if(part)fQATrackHistosRec->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt());
3801       }
3802       for(Int_t it=0; it<nRecPartCuts; ++it){
3803         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksRecCuts->At(it));
3804         if(part)fQATrackHistosRecCuts->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt() );
3805       }      
3806       for(Int_t it=0; it<nGenPart; ++it){
3807         AliVParticle *part = dynamic_cast<AliVParticle*>(fTracksGen->At(it));
3808         if(part)fQATrackHistosGen->FillTrackQA( part->Eta(), TVector2::Phi_0_2pi(part->Phi()), part->Pt());
3809       }
3810
3811       // fill DCA to prim vertex
3812       for(Int_t it=0; it<nRecPartCuts; ++it){
3813         AliAODTrack *aodtr = dynamic_cast<AliAODTrack*>(fTracksRecCuts->At(it));
3814         
3815         if(!aodtr) continue;
3816         if(!primVtx) continue; 
3817         
3818         Double_t bfield = fAOD->GetMagneticField();
3819         Double_t dz[2];
3820         Double_t cov[3];
3821         
3822         AliAODTrack tmp(*aodtr); 
3823         tmp.PropagateToDCA(primVtx, bfield, 5., dz, cov);
3824         
3825         Double_t dcaXY = dz[0];
3826         Double_t dcaZ  = dz[1];
3827
3828         fh2TrackPtVsDCAXY->Fill(dcaXY,tmp.Pt());
3829         fh2TrackPtVsDCAZ->Fill(dcaZ,tmp.Pt());
3830       }
3831     }
3832
3833     // loop over jets
3834     
3835     if(fQAMode&2){
3836       for(Int_t ij=0; ij<nRecJets; ++ij){
3837         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRec->At(ij));
3838         if(jet)fQAJetHistosRec->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3839       }
3840     }
3841   }
3842
3843   if(fQAMode || fFFMode || fIJMode || fPhiCorrMode){
3844     for(Int_t ij=0; ij<nRecJetsCuts; ++ij){
3845       
3846       AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
3847       if(fQAMode&2) fQAJetHistosRecCuts->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3848       
3849       if(ij==0){ // leading jet
3850         
3851         if(fQAMode&2) fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
3852         
3853
3854         Double_t ptFractionEmbedded = 0; 
3855         AliAODJet* embeddedJet = 0; 
3856
3857         if(fBranchEmbeddedJets.Length()){ // find embedded jet
3858
3859           Int_t indexEmbedded = -1;
3860           for(Int_t i=0; i<nEmbeddedJets; i++){
3861             if(iEmbeddedMatchIndex[i] == ij){
3862               indexEmbedded      = i;
3863               ptFractionEmbedded = fEmbeddedPtFraction[i];
3864             }
3865           }
3866
3867           fh1IndexEmbedded->Fill(indexEmbedded);
3868           fh1FractionPtEmbedded->Fill(ptFractionEmbedded);
3869
3870           if(indexEmbedded>-1){ 
3871             
3872             embeddedJet = dynamic_cast<AliAODJet*>(fJetsEmbedded->At(indexEmbedded));
3873             if(!embeddedJet) continue;
3874
3875             Double_t deltaPt = jet->Pt() - embeddedJet->Pt();
3876             Double_t deltaR  = jet->DeltaR((AliVParticle*) (embeddedJet)); 
3877             
3878             fh2DeltaPtVsJetPtEmbedded->Fill(embeddedJet->Pt(),deltaPt);
3879             fh2DeltaPtVsRecJetPtEmbedded->Fill(jet->Pt(),deltaPt);
3880             fh1DeltaREmbedded->Fill(deltaR);
3881           }
3882         }
3883
3884         // get tracks in jet
3885         TList* jettracklist = new TList();
3886         Double_t sumPt      = 0.;
3887         Bool_t isBadJet     = kFALSE;
3888         Float_t leadTrackPt = 0.;
3889         TLorentzVector* leadTrackV = new TLorentzVector();
3890
3891
3892         if(GetFFRadius()<=0){
3893           GetJetTracksTrackrefs(jettracklist, jet, GetFFMaxTrackPt(), isBadJet);
3894         } else {
3895           if(fUseEmbeddedJetAxis){
3896             if(embeddedJet) GetJetTracksPointing(fTracksRecCuts, jettracklist, embeddedJet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
3897           }
3898           else              GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
3899         }
3900         
3901         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
3902         
3903         if(isBadJet) continue; 
3904
3905         if(ptFractionEmbedded>=fCutFractionPtEmbedded){ // if no embedding: ptFraction = cutFraction = 0
3906           
3907           for(Int_t it=0; it<jettracklist->GetSize(); ++it){
3908
3909             AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
3910             if(!trackVP)continue;
3911             TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3912             
3913             Float_t jetPt   = jet->Pt();
3914             if(fUseEmbeddedJetPt){
3915               if(embeddedJet) jetPt = embeddedJet->Pt();
3916               else jetPt = 0;
3917             }
3918             Float_t trackPt = trackV->Pt();
3919
3920
3921             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3922             
3923             if(fFFMode) fFFHistosRecCuts->FillFF( trackPt, jetPt, incrementJetPt);
3924             if(fIJMode) fIJHistosRecCuts->FillIntraJet( trackV, jet->MomentumVector() );
3925             
3926             if(it==0){ // leading track 
3927               leadTrackPt = trackPt;
3928               leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3929               
3930               if(fFFMode) fFFHistosRecLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE);
3931               if(fIJMode) fIJHistosRecLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
3932             }
3933             if(fFFMode) fFFHistosRecLeading->FillFF( trackPt, leadTrackPt , incrementJetPt);
3934             if(fIJMode) fIJHistosRecLeading->FillIntraJet( trackV, leadTrackV );
3935             
3936             delete trackV;
3937           }
3938           
3939           // ff and ij for background study
3940           if(fBckgMode){
3941             if(fBckgType[0]!=-1)
3942               FillBckgHistos(fBckgType[0], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV, 
3943                              fFFBckgHisto0RecCuts, fFFBckgHisto0RecLeading,
3944                              fIJBckgHisto0RecCuts, fIJBckgHisto0RecLeading,
3945                              fQABckgHisto0RecCuts);
3946             if(fBckgType[1]!=-1)
3947               FillBckgHistos(fBckgType[1], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3948                              fFFBckgHisto1RecCuts, fFFBckgHisto1RecLeading,
3949                              fIJBckgHisto1RecCuts, fIJBckgHisto1RecLeading,
3950                              fQABckgHisto1RecCuts);
3951             if(fBckgType[2]!=-1)
3952               FillBckgHistos(fBckgType[2], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3953                              fFFBckgHisto2RecCuts, fFFBckgHisto2RecLeading,
3954                              fIJBckgHisto2RecCuts, fIJBckgHisto2RecLeading,
3955                              fQABckgHisto2RecCuts);
3956             if(fBckgType[3]!=-1)
3957               FillBckgHistos(fBckgType[3], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3958                              fFFBckgHisto3RecCuts, fFFBckgHisto3RecLeading,
3959                              fIJBckgHisto3RecCuts, fIJBckgHisto3RecLeading,
3960                              fQABckgHisto3RecCuts);
3961             if(fBckgType[4]!=-1)
3962               FillBckgHistos(fBckgType[4], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3963                              fFFBckgHisto4RecCuts, fFFBckgHisto4RecLeading,
3964                            fIJBckgHisto4RecCuts, fIJBckgHisto4RecLeading,
3965                              fQABckgHisto4RecCuts);
3966           } // end if(fBckgMode)
3967
3968
3969           // phi correlation
3970           if(fPhiCorrMode){
3971             for(Int_t it=0; it<nRecPartCuts; ++it){
3972               AliVParticle *part = (AliVParticle*)(fTracksRecCuts->At(it));
3973               
3974               Float_t partEta = part->Eta();
3975               Float_t partPhi = part->Phi();
3976               Float_t partPt  = part->Pt();
3977               
3978               fPhiCorrHistosJetArea->FillTrackQA( partEta, 
3979                                                   TVector2::Phi_mpi_pi( jet->Phi() - partPhi ),
3980                                                   partPt,
3981                                                   kTRUE);
3982               
3983               fPhiCorrHistosTransverseArea->FillTrackQA( partEta, 
3984                                                          TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()/2),
3985                                                          partPt,
3986                                                          kTRUE);
3987               
3988               fPhiCorrHistosAwayArea->FillTrackQA( partEta, 
3989                                                    TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()),
3990                                                    partPt,
3991                                                    kTRUE);
3992             }
3993           } // end: phi-correlation
3994           
3995           delete leadTrackV;
3996           delete jettracklist;  
3997
3998         } // end: cut embedded ratio
3999       } // end: leading jet
4000     } // end: rec. jets after cuts
4001     
4002     // generated jets
4003     for(Int_t ij=0; ij<nGenJets; ++ij){
4004       
4005       AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
4006       if(!jet)continue;
4007       if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
4008       
4009       if(ij==0){ // leading jet
4010         
4011         if(fQAMode&2) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
4012         
4013         TList* jettracklist = new TList();
4014         Double_t sumPt      = 0.;
4015         Bool_t isBadJet     = kFALSE;
4016         Float_t leadTrackPt = 0.;
4017         TLorentzVector* leadTrackV = new TLorentzVector();
4018         
4019         if(GetFFRadius()<=0){
4020           GetJetTracksTrackrefs(jettracklist, jet, GetFFMaxTrackPt(), isBadJet);
4021         } else {
4022           GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
4023         }
4024         
4025         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
4026         if(isBadJet) continue; 
4027
4028         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
4029           
4030           AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
4031           if(!trackVP)continue;
4032           TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
4033           
4034           Float_t jetPt   = jet->Pt();
4035           Float_t trackPt = trackV->Pt();
4036           
4037           Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4038           
4039           if(fFFMode) fFFHistosGen->FillFF( trackPt, jetPt, incrementJetPt );
4040           if(fIJMode) fIJHistosGen->FillIntraJet( trackV, jet->MomentumVector() );
4041           
4042           if(it==0){ // leading track
4043             leadTrackPt = trackPt;
4044             leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
4045             
4046             if(fFFMode) fFFHistosGenLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE );    
4047             if(fIJMode) fIJHistosGenLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
4048           }
4049           if(fFFMode) fFFHistosGenLeading->FillFF( trackPt, leadTrackPt, incrementJetPt );
4050           if(fIJMode) fIJHistosGenLeading->FillIntraJet( trackV, leadTrackV );
4051           
4052           delete trackV;
4053         }
4054         
4055         delete leadTrackV;
4056         delete jettracklist;
4057       }
4058     }
4059   } // end: QA, FF and intra-jet
4060
4061   //_______ DiJet part _____________________________________________________
4062   if(fDJMode){
4063     if (nRecJetsCuts > 1) 
4064       {
4065         AliAODJet* jet1 = (AliAODJet*)(fJetsRecCuts->At(0));
4066         AliAODJet* jet2 = (AliAODJet*)(fJetsRecCuts->At(1));
4067         
4068         // DiJet deltaphi calculation
4069         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4070         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4071         Double_t deltaPhi = TMath::Abs(phi1-phi2); 
4072         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4073         
4074         // DiJet CDF cut calculation
4075         Double_t et1     = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4076         Double_t et2     = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4077         Double_t sumEt   = et1 + et2;
4078         Double_t normEt1PlusEt2   = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4079         Double_t ratio = (Double_t)(normEt1PlusEt2/sumEt);
4080         
4081         // DiJet events selection
4082         Bool_t positionCut       = 0;
4083         Bool_t positionEnergyCut = 0;
4084         Bool_t cdfCut            = 0; 
4085         
4086         // Position cut :
4087         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4088         // Position-Energy cut :
4089         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4090         // CDF cut :
4091         if (ratio < fDiJetCDFCut) cdfCut = 1;
4092         
4093         Int_t go = 0;
4094         
4095         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4096         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4097         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4098         
4099         if (go)
4100           {
4101             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4102             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4103             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4104             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4105             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4106             
4107             Double_t  jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4108             
4109             if (jetBin > 0)
4110               {
4111                 if(fDJMode&2) fQADiJetHistosRecCuts->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4112                 
4113                 if(fDJMode&1){
4114                   TList* jettracklist1 = new TList();
4115                   Double_t sumPt1      = 0.;
4116                   Bool_t isBadJet1     = kFALSE;
4117                   Float_t leadTrackPt1 = 0;
4118                   
4119
4120                   TList* jettracklist2 = new TList();
4121                   Double_t sumPt2      = 0.;
4122                   Bool_t isBadJet2     = kFALSE;
4123                   Float_t leadTrackPt2 = 0;
4124                   
4125                   if(GetFFRadius()<=0)
4126                     {
4127                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4128                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4129                     }
4130                   else
4131                     {
4132                       GetJetTracksPointing(fTracksRecCuts, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4133                       GetJetTracksPointing(fTracksRecCuts, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4134                     }
4135                   
4136
4137                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4138                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4139
4140                   if(!(isBadJet1 || isBadJet2)){ // good jets
4141
4142                     Int_t nTracks = jettracklist1->GetSize(); 
4143                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4144                   
4145                     for(Int_t it=0; it<nTracks; ++it)
4146                       {
4147                         if (it < jettracklist1->GetSize())
4148                           { 
4149                             AliVParticle *vp = (dynamic_cast<AliVParticle*> (jettracklist1->At(it)));
4150                             Float_t trackPt1 = (vp?vp->Pt():0);
4151                             Float_t jetPt1   = jet1->Pt();
4152                             
4153                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4154                           
4155                             fFFDiJetHistosRecCuts->FillDiJetFF(1, trackPt1, jetPt1, jetBin, incrementJetPt);
4156                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt1, jetPt1, jetBin, incrementJetPt);
4157                             
4158                             if (it == 0)
4159                               {
4160                                 leadTrackPt1 = trackPt1;
4161                                 
4162                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(1, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4163                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4164                               }
4165                             
4166                             fFFDiJetHistosRecLeading->FillDiJetFF(1, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4167                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4168                           }
4169                         
4170                         if (it < jettracklist2->GetSize())
4171                           { 
4172                             Float_t trackPt2   = ((AliVParticle*)(jettracklist2->At(it)))->Pt();
4173                             Float_t jetPt2     = jet2->Pt();
4174                             
4175                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4176                             
4177                             fFFDiJetHistosRecCuts->FillDiJetFF(2, trackPt2, jetPt2, jetBin, incrementJetPt);
4178                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt2, jetPt2, jetBin, incrementJetPt);
4179                             
4180                             if (it == 0)
4181                               {
4182                                 leadTrackPt2 = trackPt2;
4183                                 
4184                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4185                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4186                               }
4187                             
4188                             fFFDiJetHistosRecLeading->FillDiJetFF(2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4189                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4190                           }
4191                       } // End loop on tracks
4192                   }
4193                   
4194                   delete jettracklist1;
4195                   delete jettracklist2;
4196                 }
4197               } // End if(jetBin > 0)
4198             else { Printf("Jet bins for di-jet studies not set !");}
4199           } // End if(go)
4200       } // End if(nRecJets > 1)
4201     
4202     if (nGenJets > 1)
4203       {
4204         AliAODJet* jet1 = dynamic_cast<AliAODJet*>(fJetsGen->At(0));
4205         AliAODJet* jet2 = dynamic_cast<AliAODJet*>(fJetsGen->At(1));
4206         if(jet1&&jet2){
4207         
4208         Double_t deltaPhi = 0;
4209         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4210         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4211         deltaPhi      = TMath::Abs(phi1-phi2); 
4212         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4213         
4214         Double_t et1            = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4215         Double_t et2            = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4216         Double_t sumEt          = et1 + et2;
4217         Double_t normEt1PlusEt2 = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4218         Double_t ratio          = (Double_t)(normEt1PlusEt2/sumEt);
4219         
4220         // DiJet events selection
4221         Bool_t positionCut       = 0;
4222         Bool_t positionEnergyCut = 0;
4223         Bool_t cdfCut            = 0; 
4224         
4225         // Position cut :
4226         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4227         // Position-Energy cut :
4228         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4229         // CDF cut :
4230         if (ratio < fDiJetCDFCut) cdfCut = 1;    
4231         
4232         Int_t go = 0;
4233         
4234         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4235         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4236         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4237         
4238         if (go)
4239           {
4240             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4241             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4242             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4243             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4244             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4245             
4246             Double_t jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4247             
4248             if(jetBin > 0)
4249               {
4250                 if(fDJMode&2) fQADiJetHistosGen->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4251                 
4252                 if(fDJMode&1){
4253                   TList* jettracklist1 = new TList();
4254                   Double_t sumPt1 = 0.;
4255                   Bool_t isBadJet1     = kFALSE;
4256                   Float_t leadTrackPt1 = 0.;
4257
4258                   TList* jettracklist2 = new TList();
4259                   Double_t sumPt2 = 0.;
4260                   Bool_t isBadJet2     = kFALSE;
4261                   Float_t leadTrackPt2 = 0.;
4262                   
4263                   if(GetFFRadius()<=0)
4264                     {
4265                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4266                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4267                     }
4268                   else
4269                     {
4270                       GetJetTracksPointing(fTracksGen, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4271                       GetJetTracksPointing(fTracksGen, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4272                     }
4273                   
4274                   
4275                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4276                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4277                   
4278                   if(!(isBadJet1 || isBadJet2)){ // good jets
4279
4280                     Int_t nTracks = jettracklist1->GetSize(); 
4281                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4282                   
4283                     for(Int_t it=0; it<nTracks; ++it)
4284                       {
4285                         if (it < jettracklist1->GetSize())
4286                           { 
4287                             Float_t trackPt1 = ((AliVParticle*)jettracklist1->At(it))->Pt();
4288                             Float_t jetPt1 = jet1->Pt();
4289                             
4290                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4291                             
4292                             fFFDiJetHistosGen->FillDiJetFF( 1, trackPt1, jetPt1, jetBin, incrementJetPt);
4293                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt1, jetPt1, jetBin, incrementJetPt);
4294                             
4295                             if(it==0)
4296                               { 
4297                                 leadTrackPt1 = trackPt1;
4298                                 
4299                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 1, leadTrackPt1, jetPt1, jetBin, kTRUE);
4300                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt1, jetPt1, jetBin, kTRUE);
4301                               }
4302                             
4303                             fFFDiJetHistosGenLeading->FillDiJetFF( 1, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4304                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4305                           }
4306                         
4307                         if (it < jettracklist2->GetSize())
4308                           { 
4309                             Float_t trackPt2 = ((AliVParticle*)jettracklist2->At(it))->Pt();
4310                             Float_t jetPt2 = jet2->Pt();
4311                             
4312                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4313                             
4314                             fFFDiJetHistosGen->FillDiJetFF( 2, trackPt2, jetPt2, jetBin, incrementJetPt);
4315                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt2, jetPt2, jetBin, incrementJetPt);
4316                           
4317                             if (it==0)
4318                               { 
4319                                 leadTrackPt2 = trackPt2;
4320                                 
4321                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4322                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4323                               }
4324                           
4325                             fFFDiJetHistosGenLeading->FillDiJetFF( 2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4326                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4327                           }
4328                       } // End loop on tracks
4329                   }               
4330
4331                   delete jettracklist1;
4332                   delete jettracklist2;
4333                 }
4334               } // End if(jetBin > 0)
4335             else { Printf("Jet bins for di-jet studies not set !");}
4336           } // End if (go)
4337         }// end if jet1 and jet2
4338       } // End if(nGenJets > 1)
4339   } // end: di-jet
4340   
4341   // ____ efficiency _______________________________
4342
4343   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
4344
4345     // arrays holding for each generated particle the reconstructed AOD track index & isPrimary flag, are initialized in AssociateGenRec(...) function
4346     TArrayI indexAODTr; 
4347     TArrayS isGenPrim; 
4348
4349     // array holding for each reconstructed AOD track generated particle index, initialized in AssociateGenRec(...) function
4350     TArrayI indexMCTr; 
4351
4352     // ... and another set for secondaries (secondary MC tracks are stored in a different list)
4353     TArrayI indexAODTrSec; 
4354     TArrayS isGenSec; 
4355     TArrayI indexMCTrSec; 
4356    
4357     Int_t  nTracksAODMCCharged = GetListOfTracks(fTracksAODMCCharged, kTrackAODMCCharged);
4358     if(fDebug>2)Printf("%s:%d selected AODMC tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCCharged);
4359   
4360     Int_t  nTracksAODMCChargedSec = GetListOfTracks(fTracksAODMCChargedSec, kTrackAODMCChargedSec);
4361     if(fDebug>2)Printf("%s:%d selected AODMC secondary tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCChargedSec);
4362   
4363     Int_t  nTracksRecQualityCuts = GetListOfTracks(fTracksRecQualityCuts, kTrackAODQualityCuts);
4364     if(fDebug>2)Printf("%s:%d selected rec tracks quality after cuts, full acceptance/pt : %d ",(char*)__FILE__,__LINE__,nTracksRecQualityCuts);
4365   
4366     // associate gen and rec tracks, store indices in TArrays 
4367     AssociateGenRec(fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,indexMCTr,isGenPrim,fh2PtRecVsGenPrim); 
4368     AssociateGenRec(fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,indexMCTrSec,isGenSec,fh2PtRecVsGenSec);
4369   
4370     // single track eff
4371     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGen,fQATrackHistosRecEffRec,fTracksAODMCCharged,indexAODTr,isGenPrim);
4372     if(fQAMode&1) FillSingleTrackResponse(fhnResponseSinglePt,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim);
4373
4374     // secondaries
4375     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec);
4376
4377     // high-pt occupancy effect 
4378     FillTwoTrackHistosRecGen(fTracksAODMCCharged, /*fTracksRecQualityCuts,indexAODTr,*/ isGenPrim);
4379
4380     // jet track eff
4381     
4382     Double_t sumPtGenLeadingJetRecEff = 0;
4383     Double_t sumPtGenLeadingJetSec    = 0;
4384     Double_t sumPtRecLeadingJetRecEff = 0;
4385     
4386     for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4387     
4388       AliAODJet* jet = (AliAODJet*)(fJetsRecEff->At(ij));
4389       Bool_t isBadJetGenPrim = kFALSE;
4390       Bool_t isBadJetGenSec  = kFALSE;
4391       Bool_t isBadJetRec     = kFALSE;
4392     
4393
4394       if(ij==0){ // leading jet
4395         
4396         // for efficiency: gen tracks from pointing with gen/rec jet
4397         TList* jettracklistGenPrim = new TList();
4398         GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, GetFFRadius(), sumPtGenLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetGenPrim); 
4399
4400         TList* jettracklistGenSec = new TList();
4401         GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, GetFFRadius(), sumPtGenLeadingJetSec, GetFFMaxTrackPt(), isBadJetGenSec); 
4402
4403         // bin efficiency in jet pt bins using rec tracks  
4404         TList* jettracklistRec = new TList();
4405         GetJetTracksPointing(fTracksRecCuts,jettracklistRec, jet, GetFFRadius(), sumPtRecLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetRec); 
4406         
4407         Double_t jetEta   = jet->Eta();
4408         Double_t jetPhi   = TVector2::Phi_0_2pi(jet->Phi());
4409         
4410         if(GetFFMinNTracks()>0 && jettracklistGenPrim->GetSize()<=GetFFMinNTracks()) isBadJetGenPrim = kTRUE;
4411         if(GetFFMinNTracks()>0 && jettracklistGenSec->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
4412         if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())     isBadJetRec     = kTRUE;
4413
4414         if(isBadJetRec) continue;
4415
4416         if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
4417         
4418         if(fFFMode) FillJetTrackHistosRecGen(fFFHistosRecEffGen,fFFHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4419                                              jettracklistGenPrim,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins); 
4420
4421         if(fFFMode) FillJetTrackResponse(fhnResponseJetTrackPt,fhnResponseJetZ,fhnResponseJetXi,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4422                                          jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,fUseResponseRecJetPtBins);
4423
4424         // secondaries: use jet pt from primaries 
4425         if(fFFMode) FillJetTrackHistosRecGen(0x0,fFFHistosSecRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4426                                              jettracklistGenSec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,fUseRecEffRecJetPtBins); 
4427
4428         delete jettracklistGenPrim;
4429         delete jettracklistGenSec;
4430         delete jettracklistRec;
4431       }
4432     }
4433     
4434
4435     // bckgr eff: complementary cones 
4436
4437     if(0){
4438       
4439       for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4440         
4441         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRecEff->At(ij));
4442         
4443         if(ij==0){ // leading jet
4444           
4445           TList* perpjettracklistGen = new TList();
4446           Double_t sumPtGen = 0.; 
4447           
4448           GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksGen, perpjettracklistGen, jet, GetFFRadius() , sumPtGen); // for efficiency: gen tracks perp to gen/rec jet
4449           
4450           // here could be your histos !!! 
4451           // FillJetTrackRecEffHisto(fFFBckgrPerpHistosRecEffGen,fFFBckgrPerpHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,perpjettracklistGen,
4452           //                     fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4453           
4454           delete perpjettracklistGen;
4455         }
4456       }
4457     }
4458
4459     // bgr eff: outside N leading jets
4460
4461     if(0){
4462       
4463       Int_t nCases = 1;
4464       
4465       TList* outjettracklistGen = new TList();
4466       Double_t sumPtGen = 0.;
4467       
4468       GetTracksOutOfNJets(nCases, fTracksGen, outjettracklistGen, fJetsRecEff, sumPtGen); // for efficiency: gen tracks outide n gen/rec jets 
4469       
4470       // here could be your histos !!! 
4471       // FillJetTrackRecEffHisto(fFFBckgrOutHistosRecEffGen,fFFBckgrOutHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4472       //                         outjettracklistGen,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4473       
4474       delete outjettracklistGen;
4475     }
4476   }     
4477
4478   //___________________
4479   
4480   fTracksRec->Clear();
4481   fTracksRecCuts->Clear();
4482   fTracksGen->Clear();
4483   fTracksAODMCCharged->Clear();
4484   fTracksAODMCChargedSec->Clear();
4485   fTracksRecQualityCuts->Clear();
4486
4487   fJetsRec->Clear();
4488   fJetsRecCuts->Clear();
4489   fJetsGen->Clear();
4490   fJetsRecEff->Clear();
4491   fJetsEmbedded->Clear();
4492
4493
4494   if(fBckgMode && 
4495      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
4496       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
4497       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
4498
4499     fBckgJetsRec->Clear();
4500     fBckgJetsRecCuts->Clear();
4501     fBckgJetsGen->Clear();
4502   }
4503
4504
4505   //Post output data.
4506   PostData(1, fCommonHistList);
4507 }
4508
4509 //________________________________________________________________________________________
4510 Double_t AliAnalysisTaskFragmentationFunction::InvMass(const AliAODJet* jet1, const AliAODJet* jet2)
4511 {
4512   // cald DiJet inv mass
4513
4514   Double_t invMass = 0.;
4515   invMass = TMath::Sqrt(pow(jet1->E()+jet2->E(),2) - pow(jet1->Px()+jet2->Px(),2) - 
4516                         pow(jet1->Py()+jet2->Py(),2) - pow(jet1->Pz()+jet2->Pz(),2));
4517
4518   return invMass;
4519
4520 }
4521
4522 //________________________________________________________________________________________
4523 Double_t AliAnalysisTaskFragmentationFunction::GetDiJetBin(Double_t invMass, Double_t leadingJetPt, Double_t EtMean, Int_t kindBins)
4524 {
4525   // calc DiJet bin according to kindBins parameter
4526
4527   Double_t jetBinOk = 0.;
4528   Double_t jetBin = 0.;
4529
4530   Float_t stepInvMass = (fDiJetJetInvMassMax - fDiJetJetInvMassMin)/fDiJetNBinsJetInvMass;
4531   Float_t stepPt = (fDiJetJetPtMax - fDiJetJetPtMin)/fDiJetNBinsJetPt;
4532
4533   if (kindBins == 1)
4534     {
4535       for(Int_t i=0; i<fDiJetNBinsJetInvMass; ++i)
4536         {
4537           jetBin = fDiJetJetInvMassMin + i*stepInvMass + stepInvMass/2.;
4538           if(((fDiJetJetInvMassMin+i*stepInvMass) <= invMass) &&
4539              (fDiJetJetInvMassMin + (i+1)*stepInvMass) > invMass) {jetBinOk = jetBin; break;}
4540           else jetBinOk = -1.;
4541         }
4542     }
4543   else if (kindBins == 3)
4544     {
4545       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4546         {
4547           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4548           if(((fDiJetJetPtMin+i*stepPt) <= EtMean) &&
4549              (fDiJetJetPtMin + (i+1)*stepPt) > EtMean) {jetBinOk = jetBin; break;}
4550           else jetBinOk = -1.;
4551         }
4552     }
4553   else if (kindBins == 2)
4554     {
4555       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4556         {
4557           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4558           if(((fDiJetJetPtMin+i*stepPt) <= leadingJetPt) &&
4559              (fDiJetJetPtMin + (i+1)*stepPt) > leadingJetPt) {jetBinOk = jetBin; break;}
4560           else jetBinOk = -1.;
4561         }
4562     }
4563   else {Printf("WARNING: kindBins wrongly set ! Please make sure to call SetKindSlices() and set the kind parameter to 1, 2 or 3.\n");}
4564
4565   return jetBinOk;
4566
4567 }
4568
4569
4570 //______________________________________________________________
4571 void AliAnalysisTaskFragmentationFunction::Terminate(Option_t *) 
4572 {
4573   // terminated
4574
4575   if(fDebug > 1) printf("AliAnalysisTaskFragmentationFunction::Terminate() \n");
4576 }  
4577
4578 //_________________________________________________________________________________
4579 Int_t AliAnalysisTaskFragmentationFunction::GetListOfTracks(TList *list, Int_t type)
4580 {
4581   // fill list of tracks selected according to type
4582
4583   if(fDebug > 2) Printf("%s:%d Selecting tracks with %d", (char*)__FILE__,__LINE__,type);
4584   
4585   if(!list){
4586     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4587     return -1;
4588   }
4589
4590   if(!fAOD) return -1;
4591
4592   if(!fAOD->GetTracks()) return 0;
4593
4594   if(type==kTrackUndef) return 0;
4595   
4596   Int_t iCount = 0;
4597
4598   if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts || type==kTrackAODExtra || type==kTrackAODExtraonly){
4599     
4600     TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(fAOD->FindListObject("aodExtraTracks"));
4601     if(!aodExtraTracks)return iCount;
4602     for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
4603       AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
4604       if (!track) continue;
4605       
4606       AliAODTrack *tr = dynamic_cast<AliAODTrack*> (track);
4607       if(!tr)continue;
4608
4609       if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts){
4610
4611         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4612         
4613         if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4614         if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4615         if(tr->Pt()  < fTrackPtCut) continue;
4616       }    
4617
4618       list->Add(tr);
4619       iCount++;
4620     }
4621   }
4622
4623   if(type==kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAOD || type==kTrackAODExtraCuts || type==kTrackAODExtra){
4624
4625     // all rec. tracks, esd filter mask, eta range
4626     
4627     for(Int_t it=0; it<fAOD->GetNumberOfTracks(); ++it){
4628       AliAODTrack *tr = fAOD->GetTrack(it);
4629       
4630       if(type == kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAODExtraCuts){
4631
4632         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4633         if(type == kTrackAODCuts){
4634           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4635           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4636           if(tr->Pt()  < fTrackPtCut) continue;
4637         }
4638       }
4639       list->Add(tr);
4640       iCount++;
4641     }
4642   }
4643   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
4644     // kine particles, all or rather charged
4645     if(!fMCEvent) return iCount;
4646     
4647     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
4648       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
4649       
4650       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
4651         if(part->Charge()==0) continue;
4652         
4653         if(type == kTrackKineChargedAcceptance && 
4654            (       part->Eta() < fTrackEtaMin
4655                 || part->Eta() > fTrackEtaMax
4656                 || part->Phi() < fTrackPhiMin
4657                 || part->Phi() > fTrackPhiMax 
4658                 || part->Pt()  < fTrackPtCut)) continue;
4659       }
4660       
4661       list->Add(part);
4662       iCount++;
4663     }
4664   }
4665   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec) {
4666     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
4667     if(!fAOD) return -1;
4668     
4669     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
4670     if(!tca)return iCount;
4671     
4672     for(int it=0; it<tca->GetEntriesFast(); ++it){
4673       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
4674       if(!part)continue;
4675       if(type != kTrackAODMCChargedSec && !part->IsPhysicalPrimary())continue;
4676       if(type == kTrackAODMCChargedSec && part->IsPhysicalPrimary())continue;
4677       
4678       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
4679         if(part->Charge()==0) continue;
4680         if(type==kTrackAODMCChargedAcceptance && 
4681            (     part->Eta() > fTrackEtaMax
4682               || part->Eta() < fTrackEtaMin
4683               || part->Phi() > fTrackPhiMax
4684               || part->Phi() < fTrackPhiMin
4685               || part->Pt()  < fTrackPtCut)) continue;
4686       }
4687       
4688       list->Add(part);
4689       iCount++;
4690     }
4691   }
4692   
4693   list->Sort();
4694   return iCount;
4695   
4696 }
4697 // _______________________________________________________________________________
4698 Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t type)
4699 {
4700   // fill list of jets selected according to type
4701
4702   if(!list){
4703     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4704     return -1;
4705   }
4706
4707   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4708
4709     if(fBranchRecJets.Length()==0){
4710       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4711       if(fDebug>1)fAOD->Print();
4712       return 0;
4713     }
4714
4715     TClonesArray *aodRecJets = 0; 
4716     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
4717     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
4718     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
4719
4720     if(!aodRecJets){
4721       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
4722       if(fDebug>1)fAOD->Print();
4723       return 0;
4724     }
4725
4726     // Reorder jet pt and fill new temporary AliAODJet objects
4727     Int_t nRecJets = 0;
4728     
4729     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4730
4731       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4732       if(!tmp) continue;
4733
4734       if( tmp->Pt() < fJetPtCut ) continue;
4735       if( type == kJetsRecAcceptance &&
4736           (    tmp->Eta() < fJetEtaMin
4737             || tmp->Eta() > fJetEtaMax
4738             || tmp->Phi() < fJetPhiMin
4739             || tmp->Phi() > fJetPhiMax )) continue;
4740
4741       if(fBckgSubMethod && fBranchRecJets.Contains("B0") &&
4742          fBranchRecJets.Contains("KT")) {
4743
4744         AliAODJet *tmpJet = GetAODBckgSubJet(tmp, fBckgSubMethod);
4745         
4746         if(!tmpJet) continue;
4747
4748         list->Add(tmpJet);
4749
4750         nRecJets++;
4751       }
4752       else {
4753         list->Add(tmp);
4754         
4755         nRecJets++;
4756       }
4757     }
4758     
4759     list->Sort();
4760     
4761     return nRecJets;
4762   }
4763   else if(type == kJetsKine || type == kJetsKineAcceptance){
4764     
4765     // generated jets
4766     Int_t nGenJets = 0;
4767     
4768     if(!fMCEvent){
4769       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
4770       return 0;
4771     }
4772    
4773     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
4774     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
4775     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
4776
4777     if(!pythiaGenHeader){
4778       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
4779       
4780       if(!hijingGenHeader){
4781          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
4782          return 0;
4783       }else{
4784          TLorentzVector mom[4];
4785          AliAODJet* jet[4];
4786          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
4787
4788          for(Int_t i=0; i<2; ++i){
4789             if(!mom[i].Pt()) continue;
4790             jet[i] = new AliAODJet(mom[i]);
4791
4792             if( type == kJetsKineAcceptance &&
4793                 (    jet[i]->Eta() < fJetEtaMin
4794                   || jet[i]->Eta() > fJetEtaMax
4795                   || jet[i]->Phi() < fJetPhiMin
4796                   || jet[i]->Phi() > fJetPhiMax )) continue;
4797
4798             list->Add(jet[i]);
4799             nGenJets++;
4800          }
4801          list->Sort();
4802          return nGenJets;
4803       }
4804     }
4805     
4806     // fetch the pythia generated jets
4807     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
4808       
4809       Float_t p[4];
4810       AliAODJet *jet = new AliAODJet();
4811       pythiaGenHeader->TriggerJet(ip, p);
4812       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
4813
4814       if( type == kJetsKineAcceptance &&
4815           (    jet->Eta() < fJetEtaMin
4816             || jet->Eta() > fJetEtaMax
4817             || jet->Phi() < fJetPhiMin
4818             || jet->Phi() > fJetPhiMax )) continue;
4819       
4820         list->Add(jet);
4821         nGenJets++;
4822     }
4823     list->Sort();
4824     return nGenJets;
4825   }
4826   else if(type == kJetsGen || type == kJetsGenAcceptance ){
4827
4828     if(fBranchGenJets.Length()==0){
4829       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
4830       return 0;
4831     }
4832     
4833     TClonesArray *aodGenJets = 0;
4834     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
4835     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
4836     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
4837
4838     if(!aodGenJets){
4839       if(fDebug>0){
4840         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
4841       }
4842       if(fDebug>1)fAOD->Print();
4843       return 0;
4844     }
4845
4846     Int_t nGenJets = 0;
4847     
4848     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
4849           
4850       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
4851       if(!tmp) continue;
4852           
4853       if( tmp->Pt() < fJetPtCut ) continue;
4854       if( type == kJetsGenAcceptance &&
4855           (    tmp->Eta() < fJetEtaMin
4856             || tmp->Eta() > fJetEtaMax
4857             || tmp->Phi() < fJetPhiMin
4858             || tmp->Phi() > fJetPhiMax )) continue;
4859       
4860         list->Add(tmp);
4861         nGenJets++;
4862     }
4863     list->Sort();
4864     return nGenJets;
4865   } 
4866   else if(type == kJetsEmbedded){ // embedded jets
4867
4868     if(fBranchEmbeddedJets.Length()==0){
4869       Printf("%s:%d no embedded jet branch specified", (char*)__FILE__,__LINE__);
4870       if(fDebug>1)fAOD->Print();
4871       return 0;
4872     }
4873
4874     TClonesArray *aodEmbeddedJets = 0; 
4875     if(fBranchEmbeddedJets.Length())      aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchEmbeddedJets.Data()));
4876     if(!aodEmbeddedJets)                  aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchEmbeddedJets.Data()));
4877     if(fAODExtension&&!aodEmbeddedJets)   aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchEmbeddedJets.Data()));
4878
4879     if(!aodEmbeddedJets){
4880       if(fBranchEmbeddedJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchEmbeddedJets.Data());
4881       if(fDebug>1)fAOD->Print();
4882       return 0;
4883     }
4884
4885     // Reorder jet pt and fill new temporary AliAODJet objects
4886     Int_t nEmbeddedJets = 0;
4887     
4888     for(Int_t ij=0; ij<aodEmbeddedJets->GetEntries(); ++ij){
4889
4890       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodEmbeddedJets->At(ij));
4891       if(!tmp) continue;
4892
4893       if( tmp->Pt() < fJetPtCut ) continue;
4894       if(    tmp->Eta() < fJetEtaMin
4895           || tmp->Eta() > fJetEtaMax
4896           || tmp->Phi() < fJetPhiMin
4897           || tmp->Phi() > fJetPhiMax ) continue;
4898       
4899       list->Add(tmp);
4900       nEmbeddedJets++;
4901     }
4902     
4903     list->Sort();
4904     
4905     return nEmbeddedJets;
4906   }
4907   else{
4908     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
4909     return 0;
4910   }
4911 }
4912
4913 // ___________________________________________________________________________________
4914 Int_t AliAnalysisTaskFragmentationFunction::GetListOfBckgJets(TList *list, Int_t type)  
4915 {
4916   // fill list of bgr clusters selected according to type
4917
4918   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4919
4920     if(fBranchRecBckgClusters.Length()==0){ 
4921       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4922       if(fDebug>1)fAOD->Print();
4923       return 0;
4924     }
4925     
4926     TClonesArray *aodRecJets = 0; 
4927     if(fBranchRecBckgClusters.Length()) aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecBckgClusters.Data()));
4928     if(!aodRecJets)                     aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecBckgClusters.Data()));
4929     if(fAODExtension&&!aodRecJets)      aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecBckgClusters.Data()));    
4930
4931     if(!aodRecJets){
4932       if(fBranchRecBckgClusters.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecBckgClusters.Data());
4933       if(fDebug>1)fAOD->Print();
4934       return 0;
4935     }
4936     
4937     // Reorder jet pt and fill new temporary AliAODJet objects
4938     Int_t nRecJets = 0;
4939     
4940     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4941       
4942       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4943       if(!tmp) continue;
4944
4945       // if( tmp->Pt() < fJetPtCut ) continue; // no pt cut on bckg clusters !
4946       if( type == kJetsRecAcceptance &&
4947           (    tmp->Eta() < fJetEtaMin
4948                || tmp->Eta() > fJetEtaMax
4949                || tmp->Phi() < fJetPhiMin
4950                || tmp->Phi() > fJetPhiMax )) continue;
4951             
4952       list->Add(tmp);
4953         
4954       nRecJets++;
4955       
4956     }
4957     
4958     list->Sort();
4959     
4960     return nRecJets;
4961   }
4962
4963   //  /*
4964   // MC clusters still Under construction
4965   //  */
4966
4967   return 0;
4968
4969
4970 // _________________________________________________________________________________________________________
4971 void AliAnalysisTaskFragmentationFunction::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
4972 {
4973   // Set properties of THnSparse 
4974
4975   for(Int_t i=0; i<dim; i++){
4976     h->GetAxis(i)->SetTitle(labels[i]);
4977     h->GetAxis(i)->SetTitleColor(1);
4978   }
4979 }
4980
4981 // __________________________________________________________________________________________
4982 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y)
4983 {
4984   //Set properties of histos (x and y title)
4985
4986   h->SetXTitle(x);
4987   h->SetYTitle(y);
4988   h->GetXaxis()->SetTitleColor(1);
4989   h->GetYaxis()->SetTitleColor(1);
4990 }
4991
4992 // _________________________________________________________________________________________________________
4993 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y, const char* z)
4994 {
4995   //Set properties of histos (x,y and z title)
4996
4997   h->SetXTitle(x);
4998   h->SetYTitle(y);
4999   h->SetZTitle(z);
5000   h->GetXaxis()->SetTitleColor(1);
5001   h->GetYaxis()->SetTitleColor(1);
5002   h->GetZaxis()->SetTitleColor(1);
5003 }
5004
5005 // ________________________________________________________________________________________________________________________________________________________
5006 void AliAnalysisTaskFragmentationFunction::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
5007                                                                 const Double_t radius, Double_t& sumPt, const Double_t maxPt, Bool_t& isBadMaxPt)
5008 {
5009   // fill list of tracks in cone around jet axis  
5010
5011   sumPt = 0;
5012   isBadMaxPt = kFALSE;
5013
5014   Double_t jetMom[3];
5015   jet->PxPyPz(jetMom);
5016   TVector3 jet3mom(jetMom);
5017
5018   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5019
5020     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5021     if(!track)continue;
5022     Double_t trackMom[3];
5023     track->PxPyPz(trackMom);
5024     TVector3 track3mom(trackMom);
5025
5026     Double_t dR = jet3mom.DeltaR(track3mom);
5027
5028     if(dR<radius){
5029
5030       outputlist->Add(track);
5031       
5032       sumPt += track->Pt();
5033
5034       if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
5035     }
5036   }
5037
5038   outputlist->Sort();
5039 }
5040
5041 // ___________________________________________________________________________________________
5042 void AliAnalysisTaskFragmentationFunction::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t maxPt, Bool_t& isBadMaxPt)
5043 {
5044   // list of jet tracks from trackrefs
5045   
5046   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
5047
5048   for (Int_t itrack=0; itrack<nTracks; itrack++) {
5049     
5050     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
5051     if(!track){
5052       AliError("expected ref track not found ");
5053       continue;
5054     }
5055         
5056     if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
5057     list->Add(track);
5058   }
5059   
5060   list->Sort();
5061 }
5062
5063 // _ ________________________________________________________________________________________________________________________________
5064 void  AliAnalysisTaskFragmentationFunction::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
5065                                                             TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
5066 {
5067   // associate generated and reconstructed tracks, fill TArrays of list indices
5068
5069   Int_t nTracksRec  = tracksRec->GetSize();
5070   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
5071   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
5072
5073
5074   if(!nTracksGen) return;
5075   if(!tca)        return;
5076   
5077   // set size
5078   indexAODTr.Set(nTracksGen);
5079   indexMCTr.Set(nTracksRec);
5080   isRefGen.Set(nTracksGen);
5081
5082   indexAODTr.Reset(-1);
5083   indexMCTr.Reset(-1);
5084   isRefGen.Reset(0);
5085
5086   // loop over reconstructed tracks, get generated track 
5087
5088   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
5089       
5090     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5091     if(!rectrack)continue;
5092     Int_t label = TMath::Abs(rectrack->GetLabel());
5093
5094     // find MC track in our list
5095     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
5096    
5097     Int_t listIndex = -1;
5098     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
5099
5100     if(listIndex>=0){
5101
5102       indexAODTr[listIndex] = iRec;
5103       indexMCTr[iRec]       = listIndex;
5104     }
5105   }
5106
5107
5108   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
5109
5110   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5111
5112     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
5113     if(!gentrack)continue;
5114     Int_t pdg = gentrack->GetPdgCode();    
5115
5116     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
5117     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
5118        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
5119       
5120       isRefGen[iGen] = kTRUE;
5121
5122       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5123
5124       if(iRec>=0){
5125         Float_t genPt = gentrack->Pt();
5126         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5127         if(vt){
5128           Float_t recPt = vt->Pt();
5129           fh2PtRecVsGen->Fill(genPt,recPt);
5130         }
5131       }
5132     }
5133   }
5134 }
5135
5136 // _____________________________________________________________________________________________________________________________________________
5137 void AliAnalysisTaskFragmentationFunction::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
5138                                                                        const TArrayI& indexAODTr, const TArrayS& isRefGen){
5139
5140   // fill QA for single track reconstruction efficiency
5141   
5142   Int_t nTracksGen  = tracksGen->GetSize();
5143
5144   if(!nTracksGen) return;
5145
5146   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5147
5148     if(isRefGen[iGen] != 1) continue; // select primaries
5149
5150     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5151     if(!gentrack) continue;
5152     Double_t ptGen  = gentrack->Pt();
5153     Double_t etaGen = gentrack->Eta();
5154     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5155
5156     // apply same acc & pt cuts as for FF 
5157
5158     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5159     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5160     if(ptGen  < fTrackPtCut) continue;
5161
5162     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
5163    
5164
5165     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5166     if(iRec>=0 && trackQARec) trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
5167   }
5168 }
5169
5170 // ______________________________________________________________________________________________________________________________________________________
5171
5172 void  AliAnalysisTaskFragmentationFunction::FillJetTrackHistosRecGen(TObject* histGen,TObject* histRec,Double_t jetPtGen,Double_t jetPtRec, TList* jetTrackList, const TList* tracksGen,
5173                                                                      const TArrayI& indexAODTr,const TArrayS& isRefGen, const Bool_t useRecJetPt)
5174 {
5175   // fill objects for jet track reconstruction efficiency or secondaries contamination 
5176   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
5177
5178   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5179
5180   if(!nTracksJet) return; 
5181   if(jetPtGen<1e-03){ // check for 0 
5182     if(fDebug>0) Printf("%s:%d gen jet pt 0 - return ",(char*)__FILE__,__LINE__);
5183     return; 
5184   }
5185   
5186   Bool_t incrementJetPtGenFF = kTRUE; // needed in case we fill FFHistos
5187   Bool_t incrementJetPtRecFF = kTRUE; // needed in case we fill FFHistos
5188
5189   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5190
5191     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5192     if(!gentrack)continue;
5193     // find jet track in gen tracks list
5194     Int_t iGen = tracksGen->IndexOf(gentrack); 
5195
5196     if(iGen<0){
5197       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5198       continue;
5199     }
5200
5201
5202     if(isRefGen[iGen] != 1) continue; // select primaries
5203
5204     Double_t ptGen  = gentrack->Pt();
5205     Double_t etaGen = gentrack->Eta();
5206     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5207
5208     // apply same acc & pt cuts as for FF 
5209
5210     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5211     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5212     if(ptGen  < fTrackPtCut) continue;
5213
5214     Double_t z = ptGen / jetPtGen;
5215     Double_t xi = 0;
5216     if(z>0) xi = TMath::Log(1/z);
5217
5218     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5219     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
5220
5221     if(dynamic_cast<AliFragFuncHistos*>(histGen) || dynamic_cast<AliFragFuncHistos*>(histRec)){ // histGen can be NULL for secondaries -> ||
5222       
5223       // after checking can afford normal cast
5224       AliFragFuncHistos* ffhistGen =  (AliFragFuncHistos*) (histGen); 
5225       AliFragFuncHistos* ffhistRec =  (AliFragFuncHistos*) (histRec); 
5226
5227       if(ffhistGen){
5228         if(useRecJetPt) ffhistGen->FillFF( ptGen, jetPtRec, incrementJetPtGenFF );
5229         else            ffhistGen->FillFF( ptGen, jetPtGen, incrementJetPtGenFF );
5230         
5231         incrementJetPtGenFF = kFALSE;
5232       }
5233
5234       
5235       if(ffhistRec && isRec){
5236         
5237         if(useRecJetPt) ffhistRec->FillFF( ptGen, jetPtRec, incrementJetPtRecFF );
5238         else            ffhistRec->FillFF( ptGen, jetPtGen, incrementJetPtRecFF );
5239         
5240         incrementJetPtRecFF = kFALSE;
5241       }
5242     }
5243     else if(dynamic_cast<AliFragFuncIntraJetHistos*>(histGen) && dynamic_cast<AliFragFuncIntraJetHistos*>(histRec)){
5244       
5245       // eff for IJ histos ...
5246       
5247     }
5248   }
5249 }
5250
5251 // _____________________________________________________________________________________________________________________________________________
5252 void AliAnalysisTaskFragmentationFunction::FillTwoTrackHistosRecGen(TList* tracksGen, /*TList* tracksRec, const TArrayI& indexAODTr, */ const TArrayS& isRefGen){
5253
5254   Int_t nTracksGen  = tracksGen->GetSize();
5255   
5256   if(!nTracksGen) return;
5257   
5258   Int_t highPtIndices[nTracksGen];
5259   Int_t nHighPt = 0;
5260   
5261   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5262     
5263     if(isRefGen[iGen] != 1) continue; // select primaries
5264     
5265     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5266     if(!gentrack) continue;
5267     Double_t ptGen  = gentrack->Pt();
5268     Double_t etaGen = gentrack->Eta();
5269     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5270     
5271     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5272     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5273      
5274     if(ptGen>10 ){ 
5275       highPtIndices[nHighPt++] = iGen;
5276     }
5277   }
5278   
5279
5280   for(Int_t nHPT = 0; nHPT<nHighPt; nHPT++){ // high pt tracks loop
5281     
5282     Int_t indexHPT = highPtIndices[nHPT];
5283     
5284     AliAODMCParticle* genHPTtrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(indexHPT));
5285     if(!genHPTtrack) continue;
5286     
5287     Double_t trackMomHPT[3];
5288     genHPTtrack->PxPyPz(trackMomHPT);
5289     TVector3 track3MomHPT(trackMomHPT);
5290
5291     
5292     Double_t distNN   = 10;
5293     Double_t ptNN     = 0;
5294     Int_t    indexNN  = -1;
5295
5296     for(Int_t iGen=0; iGen<nTracksGen; iGen++){ // all gen tracks loop
5297       
5298       if(isRefGen[iGen] != 1) continue; // select primaries
5299       
5300       AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5301       if(!gentrack) continue;
5302       
5303       Double_t ptGen  = gentrack->Pt();
5304       Double_t etaGen = gentrack->Eta();
5305       Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5306       
5307       if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5308       if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5309       if(ptGen  < fTrackPtCut) continue;
5310       
5311       
5312       Double_t gentrackMom[3];
5313       gentrack->PxPyPz(gentrackMom);
5314       TVector3 gentrack3Mom(gentrackMom);
5315       
5316       Double_t dR = gentrack3Mom.DeltaR(track3MomHPT);
5317       
5318       if(iGen != indexHPT && dR<distNN){
5319         distNN   = dR;
5320         ptNN     = ptGen;
5321         indexNN  = iGen;
5322       }
5323     }
5324   }
5325 }
5326
5327 // _____________________________________________________________________________________________________________________________________________
5328 void AliAnalysisTaskFragmentationFunction::FillSingleTrackResponse(THnSparse* hnResponse, TList* tracksGen,  TList* tracksRec,
5329                                                                    const TArrayI& indexAODTr, const TArrayS& isGenPrim)
5330 {
5331   // fill response matrix for single tracks 
5332   
5333
5334   Int_t nTracksGen  = tracksGen->GetSize();
5335
5336   if(!nTracksGen) return;
5337
5338   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5339
5340     if(isGenPrim[iGen] != 1) continue; // select primaries
5341
5342     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5343     if(!gentrack)continue;
5344     Double_t ptGen  = gentrack->Pt();
5345     Double_t etaGen = gentrack->Eta();
5346     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5347
5348     // apply same acc & pt cuts as for FF 
5349     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5350     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5351     if(ptGen  < fTrackPtCut) continue;
5352
5353     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5354     if(iRec>=0){ 
5355       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5356       if(!rectrack)continue;
5357       Double_t ptRec = rectrack->Pt();
5358       
5359       Double_t entries[2] = {ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5360       hnResponse->Fill(entries);
5361
5362       Double_t invPtGen = 0;
5363       if(ptGen) invPtGen = 1/ptGen;
5364
5365       Double_t invPtRec = 0;
5366       if(ptRec) invPtRec = 1/ptRec;
5367
5368       fh2SingleInvPtRecMnGenVsPtGen->Fill(ptGen,invPtRec - invPtGen);
5369     }
5370   }
5371 }
5372
5373
5374 // ______________________________________________________________________________________________________________________________________________________
5375 void AliAnalysisTaskFragmentationFunction::FillJetTrackResponse(THnSparse* hnResponsePt, THnSparse* hnResponseZ, THnSparse* hnResponseXi, 
5376                                                                 Double_t jetPtGen, Double_t jetPtRec, TList* jetTrackList, 
5377                                                                 const TList* tracksGen, TList* tracksRec, const TArrayI& indexAODTr, const TArrayS& isGenPrim,const Bool_t useRecJetPt)
5378 {
5379   // fill response matrix for tracks in jets
5380   
5381   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5382
5383   if(!nTracksJet) return; 
5384
5385   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5386
5387     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5388     if(!gentrack)continue;
5389     // find jet track in gen tracks list
5390     Int_t iGen = tracksGen->IndexOf(gentrack); 
5391
5392     if(iGen<0){
5393       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5394       continue;
5395     }
5396
5397     if(isGenPrim[iGen] != 1) continue; // select primaries
5398     
5399     Double_t ptGen  = gentrack->Pt();
5400     Double_t etaGen = gentrack->Eta();
5401     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5402
5403     // apply same acc & pt cuts as for FF 
5404
5405     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5406     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5407     if(ptGen  < fTrackPtCut) continue;
5408
5409     Double_t zGen = ptGen / jetPtRec;
5410     Double_t xiGen = 0;
5411     if(zGen>0) xiGen = TMath::Log(1/zGen);
5412
5413     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5414
5415     if(iRec>=0){
5416
5417       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5418       if(rectrack){
5419         Double_t ptRec = rectrack->Pt();
5420         
5421         Double_t zRec    = ptRec / jetPtRec;
5422         Double_t xiRec   = 0;
5423         if(zRec>0) xiRec = TMath::Log(1/zRec);
5424       
5425         Double_t jetPt = useRecJetPt ? jetPtRec : jetPtGen;
5426         
5427         Double_t entriesPt[3] = {jetPt,ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5428         Double_t entriesZ[3]  = {jetPt,zRec,zGen}; 
5429         Double_t entriesXi[3] = {jetPt,xiRec,xiGen}; 
5430         
5431         hnResponsePt->Fill(entriesPt);
5432         hnResponseZ->Fill(entriesZ);
5433         hnResponseXi->Fill(entriesXi);
5434       }
5435     } 
5436   }
5437 }
5438
5439 // _____________________________________________________________________________________________________________________________________________________________________
5440 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxis(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt)
5441 {
5442   // List of tracks in cone perpendicular to the jet azimuthal direction
5443
5444   Double_t jetMom[3];
5445   jet->PxPyPz(jetMom);
5446
5447   TVector3 jet3mom(jetMom);
5448   // Rotate phi and keep eta unchanged
5449   Double_t etaTilted = jet3mom.Eta();
5450   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5451   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5452
5453   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5454
5455     // embedded tracks
5456     if( fUseExtraTracksBgr != 1){
5457       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5458         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5459         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5460       }
5461     }
5462     
5463     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5464     if(!track)continue;
5465     Double_t trackMom[3];
5466     track->PxPyPz(trackMom);
5467     TVector3 track3mom(trackMom);
5468
5469     Double_t deta = track3mom.Eta() - etaTilted;
5470     Double_t dphi = TMath::Abs(track3mom.Phi() - phiTilted);
5471     if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
5472     Double_t dR = TMath::Sqrt(deta * deta + dphi * dphi);
5473
5474     if(dR<=radius){
5475       outputlist->Add(track);
5476       sumPt += track->Pt();
5477     }
5478   }
5479
5480 }
5481
5482 // ________________________________________________________________________________________________________________________________________________________
5483 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxisWindow(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt,Double_t &normFactor)
5484 {
5485   // List of tracks in cone perpendicular to the jet azimuthal direction
5486
5487   Double_t jetMom[3];
5488   jet->PxPyPz(jetMom);
5489
5490   TVector3 jet3mom(jetMom);
5491   // Rotate phi and keep eta unchanged
5492   Double_t etaTilted = jet3mom.Eta();
5493   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5494   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5495
5496   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++)
5497     {
5498
5499       // embedded tracks
5500       if( fUseExtraTracksBgr != 1){
5501         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5502           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5503           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5504         }
5505       }
5506       
5507       AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5508       if(!track)continue;
5509       Float_t trackEta = track->Eta();
5510       Float_t trackPhi = track->Phi();
5511
5512       if( ( phiTilted-radius >= 0 ) && ( phiTilted+radius <= 2*TMath::Pi()))
5513         {
5514           if((trackPhi<=phiTilted+radius) && 
5515              (trackPhi>=phiTilted-radius) &&
5516              (trackEta<=fTrackEtaMax)&&(trackEta>=fTrackEtaMin)) // 0.9 and - 0.9
5517             {
5518               outputlist->Add(track);
5519               sumPt += track->Pt();
5520             }
5521         }
5522       else if( phiTilted-radius < 0 ) 
5523         {
5524           if((( trackPhi < phiTilted+radius ) ||
5525               ( trackPhi > 2*TMath::Pi()-(radius-phiTilted) )) &&
5526              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5527             {
5528               outputlist->Add(track);
5529               sumPt += track->Pt();
5530             }
5531         }
5532       else if( phiTilted+radius > 2*TMath::Pi() )
5533         {
5534           if((( trackPhi > phiTilted-radius ) ||
5535               ( trackPhi < phiTilted+radius-2*TMath::Pi() )) &&
5536              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5537             {
5538               outputlist->Add(track);
5539               sumPt += track->Pt();
5540             }
5541         }
5542     }
5543
5544   // Jet area - Temporarily added should be modified with the proper jet area value
5545   Float_t areaJet = CalcJetArea(etaTilted,radius);
5546   Float_t areaTilted = 2*radius*(fTrackEtaMax-fTrackEtaMin);
5547
5548   normFactor = (Float_t) 1. / (areaJet / areaTilted);
5549
5550 }
5551
5552
5553 // ________________________________________________________________________________________________________________________________________________________
5554 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJets(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt)
5555 {
5556   // List of tracks outside cone around N jet axis  
5557   // Particles taken randomly
5558
5559   sumPt = 0;
5560   //  Int_t   nj  = jetlist->GetSize();
5561   Float_t rc  = GetFFRadius();
5562   Float_t rcl = GetFFBckgRadius();
5563
5564   // Estimate jet and background areas
5565   Float_t* areaJet = new Float_t[nCases];
5566   memset(areaJet, 0, sizeof(Float_t) * nCases);
5567   Float_t* areaJetLarge = new Float_t[nCases];
5568   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5569   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5570   Float_t areaOut = areaFull;
5571
5572   //estimate jets and background areas
5573   Int_t nOut = 0;
5574   Int_t ijet = 0;
5575   TList* templist = new TList();
5576   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5577
5578   for(Int_t ij=0; ij<nCases; ++ij) 
5579     {
5580       // Get jet information
5581       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5582       if(!jet)continue;
5583       TVector3 jet3mom;
5584       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5585       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5586       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5587
5588       // Jet area
5589       areaJet[ij] = CalcJetArea(etaJet,rc);
5590
5591       // Area jet larger angle
5592       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5593
5594       // Outside jet area
5595       areaOut = areaOut - areaJetLarge[ij];
5596       ijet++;
5597     }
5598
5599   // List of all tracks outside jet areas
5600   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5601     
5602     // embedded tracks
5603     if( fUseExtraTracksBgr != 1){
5604       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5605         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5606         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5607       }
5608     }
5609
5610     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5611     if(!track)continue;
5612     Double_t trackMom[3];
5613     track->PxPyPz(trackMom);
5614     TVector3 track3mom(trackMom);
5615     
5616     Double_t *dR = new Double_t[nCases];
5617     for(Int_t ij=0; ij<nCases; ij++)
5618         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5619
5620     if((nCases==1 && (dR[0]>rcl)) ||
5621        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5622        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5623       {
5624         templist->Add(track);
5625         nOut++;
5626       }
5627     delete [] dR;
5628   }
5629
5630   // Take tracks randomly
5631   Int_t nScaled = (Int_t) (nOut * areaJet[0] / areaOut + 0.5);
5632   TArrayI* ar = new TArrayI(nOut);
5633
5634   for(Int_t init=0; init<nOut; init++)
5635     (*ar)[init] = init;
5636
5637   Int_t *randIndex = new Int_t[nScaled];
5638   for(Int_t init2=0; init2<nScaled; init2++)
5639     randIndex[init2] = -1;
5640
5641   // Select nScaled different random numbers in nOut
5642   for(Int_t i=0; i<nScaled; i++)
5643     {
5644       Int_t* tmpArr = new Int_t[nOut-i];
5645       Int_t temp = fRandom->Integer(nOut-i);
5646       for(Int_t ind = 0; ind< ar->GetSize()-1; ind++)
5647         {
5648           if(ind<temp) tmpArr[ind] = (*ar)[ind];
5649           else tmpArr[ind] = (*ar)[ind+1];
5650         }
5651       randIndex[i] = (*ar)[temp];
5652
5653       ar->Set(nOut-i-1,tmpArr);
5654
5655       delete [] tmpArr;
5656
5657     }
5658
5659   for(Int_t ipart=0; ipart<nScaled; ipart++)
5660     {
5661       AliVParticle* track = (AliVParticle*)(templist->At(randIndex[ipart]));
5662       outputlist->Add(track);
5663       sumPt += track->Pt();
5664     }
5665
5666   outputlist->Sort();
5667
5668   delete vect3Jet;
5669   delete templist;
5670   delete [] areaJetLarge;
5671   delete [] areaJet;
5672   delete ar;
5673   delete [] randIndex;
5674
5675 }
5676
5677 // ________________________________________________________________________________________________________________________________________________________
5678 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJetsStat(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt, Double_t &normFactor)
5679 {
5680   // List of tracks outside cone around N jet axis  
5681   // All particles taken + final scaling factor 
5682
5683   sumPt = 0;
5684   Float_t rc  = GetFFRadius();
5685   Float_t rcl = GetFFBckgRadius();
5686
5687   // Estimate jet and background areas
5688   Float_t* areaJet = new Float_t[nCases];
5689   memset(areaJet, 0, sizeof(Float_t) * nCases);
5690   Float_t* areaJetLarge = new Float_t[nCases];
5691   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5692   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5693   Float_t areaOut = areaFull;
5694
5695   //estimate jets and background areas
5696   Int_t nOut = 0;
5697   Int_t ijet = 0;
5698   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5699
5700   for(Int_t ij=0; ij<nCases; ++ij) 
5701     {
5702       // Get jet information
5703       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5704       if(!jet)continue;
5705       TVector3 jet3mom;
5706       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5707       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5708       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5709
5710       // Jet area
5711       areaJet[ij] = CalcJetArea(etaJet,rc);
5712
5713       // Area jet larger angle
5714       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5715
5716       // Outside jets area
5717       areaOut = areaOut - areaJetLarge[ij];
5718       ijet++;
5719     }
5720
5721   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5722     
5723     // embedded tracks
5724     if( fUseExtraTracksBgr != 1){
5725       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5726         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5727         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5728       }
5729     }
5730
5731     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5732     if(!track)continue;
5733     Double_t trackMom[3];
5734     track->PxPyPz(trackMom);
5735     TVector3 track3mom(trackMom);
5736     
5737     Double_t *dR = new Double_t[nCases];
5738     for(Int_t ij=0; ij<nCases; ij++)
5739         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5740
5741     if((nCases==0) ||
5742        (nCases==1 && (dR[0]>rcl)) ||
5743        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5744        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5745       {
5746         outputlist->Add(track);
5747         sumPt += track->Pt();
5748         nOut++;
5749       }
5750     delete [] dR;
5751   }
5752
5753   if(nCases==0) areaJet[0] = TMath::Pi()*rc*rc;
5754   normFactor = (Float_t) 1./(areaJet[0] / areaOut); 
5755
5756   outputlist->Sort();
5757
5758   delete vect3Jet;
5759   delete [] areaJetLarge;
5760   delete [] areaJet;
5761
5762 }
5763
5764 // ______________________________________________________________________________________________________________________________________________________
5765 Float_t AliAnalysisTaskFragmentationFunction::CalcJetArea(const Float_t etaJet, const Float_t rc) const
5766 {
5767   // calculate area of jet with eta etaJet and radius rc
5768
5769   Float_t detamax = etaJet + rc;
5770   Float_t detamin = etaJet - rc;
5771   Float_t accmax = 0.0; Float_t accmin = 0.0;
5772   if(detamax > fTrackEtaMax){ // sector outside etamax
5773     Float_t h = fTrackEtaMax - etaJet;
5774     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5775   }
5776   if(detamin < fTrackEtaMin){ // sector outside etamin
5777     Float_t h = fTrackEtaMax + etaJet;
5778     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5779   }
5780   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
5781   
5782   return areaJet;
5783
5784 }
5785
5786 // ___________________________________________________________________________________________________________________________
5787 void AliAnalysisTaskFragmentationFunction::GetClusterTracksOutOf1Jet(AliAODJet* jet, TList* outputlist, Double_t &normFactor)
5788 {
5789   // fill tracks from bckgCluster branch in list, 
5790   // for all clusters outside jet cone 
5791   // sum up total area of clusters
5792
5793   Double_t rc  = GetFFRadius();
5794   Double_t rcl = GetFFBckgRadius();
5795     
5796   Double_t areaTotal   = 0;
5797   Double_t sumPtTotal  = 0;
5798
5799   for(Int_t ij=0; ij<fBckgJetsRec->GetEntries(); ++ij){
5800       
5801     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij)); // not 'recCuts': use all clusters in full eta range
5802     
5803     Double_t dR = jet->DeltaR(bgrCluster);  
5804          
5805     if(dR<rcl) continue;
5806          
5807     Double_t clusterPt = bgrCluster->Pt();
5808     Double_t area      = bgrCluster->EffectiveAreaCharged();
5809     areaTotal  += area;
5810     sumPtTotal += clusterPt;
5811     
5812     Int_t nTracksJet = bgrCluster->GetRefTracks()->GetEntries();
5813
5814     for(Int_t it = 0; it<nTracksJet; it++){
5815         
5816       // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5817       if( fUseExtraTracksBgr != 1){
5818         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (bgrCluster->GetTrack(it))){
5819           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5820           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5821         }
5822       }
5823
5824       AliVParticle*   track = dynamic_cast<AliVParticle*>(bgrCluster->GetTrack(it));
5825       if(!track) continue;
5826         
5827       Float_t trackPt  = track->Pt();
5828       Float_t trackEta = track->Eta();
5829       Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5830         
5831       if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5832       if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5833       if(trackPt  < fTrackPtCut) continue;
5834         
5835       outputlist->Add(track);
5836     }
5837   }
5838     
5839   Double_t areaJet = TMath::Pi()*rc*rc;
5840   if(areaTotal) normFactor = (Float_t) 1./(areaJet / areaTotal); 
5841
5842   outputlist->Sort();
5843 }    
5844
5845 // _______________________________________________________________________________________________________________________
5846 void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputlist, Double_t &normFactor)
5847 {
5848   // fill tracks from bckgCluster branch, 
5849   // using cluster with median density (odd number of clusters) 
5850   // or picking randomly one of the two closest to median (even number)
5851   
5852   normFactor = 0;
5853
5854   Int_t nBckgClusters = fBckgJetsRec->GetEntries(); // not 'recCuts': use all clusters in full eta range
5855
5856   if(nBckgClusters<3) return; // need at least 3 clusters (skipping 2 highest)
5857
5858   Double_t* bgrDensity = new Double_t[nBckgClusters];
5859   Int_t*    indices    = new Int_t[nBckgClusters];
5860     
5861   for(Int_t ij=0; ij<nBckgClusters; ++ij){
5862       
5863     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij));
5864     Double_t clusterPt    = bgrCluster->Pt();
5865     Double_t area         = bgrCluster->EffectiveAreaCharged();
5866       
5867     Double_t density = 0;
5868     if(area>0) density = clusterPt/area;
5869
5870     bgrDensity[ij] = density;
5871     indices[ij]    = ij;
5872   }
5873    
5874   TMath::Sort(nBckgClusters, bgrDensity, indices); 
5875   
5876   // get median cluster
5877
5878   AliAODJet* medianCluster = 0;
5879   Double_t   medianDensity = 0;
5880
5881   if(TMath::Odd(nBckgClusters)){
5882     
5883     Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters-1))];
5884     medianCluster = (AliAODJet*)(fBckgJetsRec->At(medianIndex));
5885     
5886     Double_t clusterPt = medianCluster->Pt();
5887     Double_t area      = medianCluster->EffectiveAreaCharged();
5888     
5889     if(area>0) medianDensity = clusterPt/area;
5890   }
5891   else{
5892
5893     Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters-1)];
5894     Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters)];
5895
5896     AliAODJet* medianCluster1 = (AliAODJet*)(fBckgJetsRec->At(medianIndex1));
5897     AliAODJet* medianCluster2 = (AliAODJet*)(fBckgJetsRec->At(medianIndex2));
5898     
5899     Double_t density1 = 0;
5900     Double_t clusterPt1 = medianCluster1->Pt();
5901     Double_t area1      = medianCluster1->EffectiveAreaCharged();
5902     if(area1>0) density1 = clusterPt1/area1;
5903     
5904     Double_t density2 = 0;
5905     Double_t clusterPt2 = medianCluster2->Pt();
5906     Double_t area2      = medianCluster2->EffectiveAreaCharged();
5907     if(area2>0) density2 = clusterPt2/area2;
5908     
5909     medianDensity = 0.5*(density1+density2);
5910     
5911     medianCluster = ( (fRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 );  // select one randomly to avoid adding areas
5912   }
5913     
5914   Int_t nTracksJet = medianCluster->GetRefTracks()->GetEntries();
5915
5916   for(Int_t it = 0; it<nTracksJet; it++){
5917         
5918     // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5919     if( fUseExtraTracksBgr != 1){
5920       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (medianCluster->GetTrack(it))){
5921         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5922         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5923       }
5924     }
5925
5926     AliVParticle* track = dynamic_cast<AliVParticle*>(medianCluster->GetTrack(it));
5927     if(!track) continue;
5928         
5929     Float_t trackPt  = track->Pt();
5930     Float_t trackEta = track->Eta();
5931     Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5932     
5933     if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5934     if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5935     if(trackPt  < fTrackPtCut) continue;
5936         
5937     outputlist->Add(track);
5938   }     
5939     
5940   Double_t areaMedian = medianCluster->EffectiveAreaCharged();
5941   Double_t areaJet = TMath::Pi()*GetFFRadius()*GetFFRadius();
5942   
5943   if(areaMedian) normFactor = (Float_t) 1./(areaJet / areaMedian); 
5944   
5945   outputlist->Sort();
5946
5947   delete[] bgrDensity;
5948   delete[] indices; 
5949 }    
5950
5951 // ______________________________________________________________________________________________________________________________________________________
5952 void AliAnalysisTaskFragmentationFunction::FillBckgHistos(Int_t type, TList* inputtracklist, TList* inputjetlist, AliAODJet* jet, Float_t leadTrackPt, TLorentzVector* leadTrackV,
5953                                                           AliFragFuncHistos* ffbckghistocuts, AliFragFuncHistos* ffbckghistoleading, 
5954                                                           AliFragFuncIntraJetHistos* ijbckghistocuts, AliFragFuncIntraJetHistos* ijbckghistoleading,   
5955                                                           AliFragFuncQATrackHistos* qabckghistocuts){
5956
5957   // List of tracks outside jets for background study
5958   TList* tracklistout2jets     = new TList();
5959   TList* tracklistout3jets     = new TList();
5960   TList* tracklistout2jetsStat = new TList();
5961   TList* tracklistout3jetsStat = new TList();
5962   Double_t sumPtOut2Jets       = 0.;
5963   Double_t sumPtOut3Jets       = 0.;
5964   Double_t sumPtOut2JetsStat   = 0.;
5965   Double_t sumPtOut3JetsStat   = 0.;
5966   Double_t normFactor2Jets     = 0.;
5967   Double_t normFactor3Jets     = 0.;
5968
5969   Int_t nRecJetsCuts = fJetsRecCuts->GetEntries();
5970
5971   if(nRecJetsCuts>1) {
5972     GetTracksOutOfNJets(2,inputtracklist, tracklistout2jets, inputjetlist, sumPtOut2Jets);
5973     GetTracksOutOfNJetsStat(2,inputtracklist, tracklistout2jetsStat, inputjetlist,sumPtOut2JetsStat, normFactor2Jets);
5974
5975   }
5976   if(nRecJetsCuts>2) {
5977     GetTracksOutOfNJets(3,inputtracklist, tracklistout3jets, inputjetlist, sumPtOut3Jets);
5978     GetTracksOutOfNJetsStat(3,inputtracklist, tracklistout3jetsStat, inputjetlist, sumPtOut3JetsStat, normFactor3Jets);
5979   }
5980
5981   if(type==kBckgOutLJ || type==kBckgOutAJ)
5982     {
5983       TList* tracklistoutleading   = new TList();
5984       Double_t sumPtOutLeading     = 0.; 
5985       GetTracksOutOfNJets(1,inputtracklist, tracklistoutleading, inputjetlist, sumPtOutLeading);
5986       if(type==kBckgOutLJ) fh1OutLeadingMult->Fill(tracklistoutleading->GetSize());
5987       
5988       for(Int_t it=0; it<tracklistoutleading->GetSize(); ++it){
5989
5990         AliVParticle* trackVP   = (AliVParticle*)(tracklistoutleading->At(it));
5991         if(!trackVP) continue;
5992         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
5993         
5994         Float_t jetPt   = jet->Pt();
5995         Float_t trackPt = trackV->Pt();
5996         
5997         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
5998
5999         if(type==kBckgOutLJ)
6000           {
6001             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt);
6002             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6003             
6004             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt);
6005             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6006             
6007             // Fill track QA for background
6008             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6009           }
6010
6011         // All cases included
6012         if(nRecJetsCuts==1 && type==kBckgOutAJ)
6013           {
6014             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6015             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6016             
6017             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6018             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6019           }
6020         delete trackV;
6021       }
6022       // Increment jet pt with one entry in case #tracks outside jets = 0
6023       if(tracklistoutleading->GetSize()==0) {
6024          Float_t jetPt = jet->Pt();
6025          Bool_t incrementJetPt = kTRUE;
6026          if(type==kBckgOutLJ)
6027           {
6028             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6029             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6030           }
6031         // All cases included
6032         if(nRecJetsCuts==1 && type==kBckgOutAJ)
6033           {
6034             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6035             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6036           }
6037       }
6038       delete tracklistoutleading;
6039     }
6040   if(type==kBckgOutLJStat || type==kBckgOutAJStat)
6041     { 
6042       TList* tracklistoutleadingStat   = new TList();
6043       Double_t sumPtOutLeadingStat = 0.; 
6044       Double_t normFactorLeading   = 0.;
6045
6046       GetTracksOutOfNJetsStat(1,inputtracklist, tracklistoutleadingStat, inputjetlist, sumPtOutLeadingStat, normFactorLeading);
6047       if(type==kBckgOutLJStat) fh1OutLeadingStatMult->Fill(tracklistoutleadingStat->GetSize());
6048
6049       for(Int_t it=0; it<tracklistoutleadingStat->GetSize(); ++it){
6050
6051         AliVParticle* trackVP   = dynamic_cast<AliVParticle*>(tracklistoutleadingStat->At(it));
6052         if(!trackVP) continue;
6053         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6054         
6055         Float_t jetPt   = jet->Pt();
6056         Float_t trackPt = trackV->Pt();
6057         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6058         
6059         // Stat plots
6060         if(type==kBckgOutLJStat)
6061           {
6062             if(fFFMode)ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6063             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading);
6064             
6065             if(fFFMode)ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6066             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading);
6067             
6068             // Fill track QA for background
6069             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt); // OB added bgr QA
6070           }
6071
6072         // All cases included
6073         if(nRecJetsCuts==1 && type==kBckgOutAJStat)
6074           {
6075             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6076             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading );
6077             
6078             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6079             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading );
6080
6081             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6082
6083           }
6084         delete trackV;
6085       }
6086       // Increment jet pt with one entry in case #tracks outside jets = 0
6087       if(tracklistoutleadingStat->GetSize()==0) {
6088          Float_t jetPt = jet->Pt();
6089          Bool_t incrementJetPt = kTRUE;
6090          if(type==kBckgOutLJStat)
6091           {
6092             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6093             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading);
6094           }
6095         // All cases included
6096         if(nRecJetsCuts==1 && type==kBckgOutLJStat)
6097           {
6098             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6099             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading );
6100           }
6101       }
6102
6103       delete tracklistoutleadingStat;
6104     }
6105
6106   if(type==kBckgPerp)
6107     {
6108       Double_t sumPtPerp = 0.;
6109       TList* tracklistperp = new TList();
6110       GetTracksTiltedwrpJetAxis(TMath::Pi()/2., inputtracklist,tracklistperp,jet,GetFFRadius(),sumPtPerp);
6111       fh1PerpMult->Fill(tracklistperp->GetSize());
6112       
6113       for(Int_t it=0; it<tracklistperp->GetSize(); ++it){
6114         
6115         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperp->At(it));
6116         if(!trackVP)continue;
6117         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6118         
6119         Float_t jetPt   = jet->Pt();
6120         Float_t trackPt = trackV->Pt();
6121         
6122         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6123
6124         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6125         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6126         
6127         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6128         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6129         
6130         // Fill track QA for background
6131         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6132         
6133         delete trackV;
6134       }
6135       // Increment jet pt with one entry in case #tracks outside jets = 0
6136       if(tracklistperp->GetSize()==0) {
6137          Float_t jetPt = jet->Pt();
6138          Bool_t incrementJetPt = kTRUE;
6139          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6140          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6141       }
6142
6143       delete tracklistperp;
6144     }
6145
6146  if(type==kBckgASide)
6147     {
6148       Double_t sumPtASide = 0.;
6149       TList* tracklistaside = new TList();
6150       GetTracksTiltedwrpJetAxis(TMath::Pi(),inputtracklist,tracklistaside,jet,GetFFRadius(),sumPtASide);
6151       fh1ASideMult->Fill(tracklistaside->GetSize());
6152
6153       for(Int_t it=0; it<tracklistaside->GetSize(); ++it){
6154         
6155         AliVParticle*   trackVP = (AliVParticle*)(tracklistaside->At(it));
6156         if(!trackVP) continue;
6157         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6158
6159         Float_t jetPt   = jet->Pt();
6160         Float_t trackPt = trackV->Pt();
6161
6162         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6163
6164         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6165         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6166
6167         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6168         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6169
6170         // Fill track QA for background
6171         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6172
6173         delete trackV;
6174       }
6175       if(tracklistaside->GetSize()==0) {
6176          Float_t jetPt = jet->Pt();
6177          Bool_t incrementJetPt = kTRUE;
6178          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6179          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6180       }
6181
6182       delete tracklistaside;
6183     }
6184
6185   if(type==kBckgASideWindow)
6186     {
6187       Double_t normFactorASide = 0.;
6188       Double_t sumPtASideW = 0.;
6189       TList* tracklistasidew = new TList();
6190       GetTracksTiltedwrpJetAxisWindow(TMath::Pi(),inputtracklist,tracklistasidew,jet,GetFFRadius(),sumPtASideW,normFactorASide);
6191       fh1ASideWindowMult->Fill(tracklistasidew->GetSize());
6192
6193       for(Int_t it=0; it<tracklistasidew->GetSize(); ++it){
6194
6195         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistasidew->At(it));
6196         if(!trackVP) continue;
6197         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6198
6199         Float_t jetPt   = jet->Pt();
6200         Float_t trackPt = trackV->Pt();
6201         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6202
6203         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorASide);
6204         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorASide);
6205
6206         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorASide );
6207         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorASide );
6208
6209         // Fill track QA for background
6210         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorASide);
6211
6212         delete trackV;
6213       }
6214       if(tracklistasidew->GetSize()==0) {
6215          Float_t jetPt = jet->Pt();
6216          Bool_t incrementJetPt = kTRUE;
6217          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorASide);
6218          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorASide);
6219       }
6220
6221       delete tracklistasidew;
6222     }
6223
6224   if(type==kBckgPerpWindow)
6225     {
6226       Double_t normFactorPerp = 0.;
6227       Double_t sumPtPerpW = 0.;
6228       TList* tracklistperpw = new TList();
6229       GetTracksTiltedwrpJetAxisWindow(TMath::Pi()/2.,inputtracklist,tracklistperpw,jet,GetFFRadius(),sumPtPerpW,normFactorPerp);
6230       fh1PerpWindowMult->Fill(tracklistperpw->GetSize());
6231
6232       for(Int_t it=0; it<tracklistperpw->GetSize(); ++it){
6233         
6234         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperpw->At(it));
6235         if(!trackVP) continue;
6236         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6237
6238         Float_t jetPt   = jet->Pt();
6239         Float_t trackPt = trackV->Pt();
6240         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6241
6242         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorPerp);
6243         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorPerp);
6244
6245         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorPerp );
6246         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorPerp );
6247
6248         // Fill track QA for background
6249         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorPerp);
6250
6251         delete trackV;
6252       }
6253       if(tracklistperpw->GetSize()==0) {
6254          Float_t jetPt = jet->Pt();
6255          Bool_t incrementJetPt = kTRUE;
6256          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorPerp);
6257          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorPerp);
6258       }
6259
6260       delete tracklistperpw;
6261     }
6262
6263
6264   if(type==kBckgOut2J || type==kBckgOutAJ)
6265     {
6266       if(type==kBckgOut2J) fh1Out2JetsMult->Fill(tracklistout2jets->GetSize());
6267       for(Int_t it=0; it<tracklistout2jets->GetSize(); ++it){
6268
6269         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jets->At(it));
6270         if(!trackVP) continue;
6271         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6272         
6273         Float_t jetPt   = jet->Pt();
6274         Float_t trackPt = trackV->Pt();
6275         
6276         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6277
6278         if(type==kBckgOut2J)
6279           {
6280             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6281             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6282             
6283             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6284             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6285             
6286             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6287           }
6288
6289         // All cases included
6290         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6291           {
6292             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6293             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6294             
6295             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6296             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6297           }
6298         delete trackV;
6299       }
6300       // Increment jet pt with one entry in case #tracks outside jets = 0
6301       if(tracklistout2jets->GetSize()==0) {
6302          Float_t jetPt = jet->Pt();
6303          Bool_t incrementJetPt = kTRUE;
6304          if(type==kBckgOut2J)
6305           {
6306             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6307             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6308           }
6309         // All cases included
6310         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6311           {
6312             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6313             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6314           }
6315       }
6316
6317     }
6318
6319   if(type==kBckgOut2JStat || type==kBckgOutAJStat)
6320     {
6321       for(Int_t it=0; it<tracklistout2jetsStat->GetSize(); ++it){
6322         
6323         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jetsStat->At(it));
6324         if(!trackVP) continue;
6325         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6326         
6327         Float_t jetPt   = jet->Pt();
6328         Float_t trackPt = trackV->Pt();
6329         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6330         
6331         if(type==kBckgOut2JStat)
6332           {
6333             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6334             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6335             
6336             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6337             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6338             
6339             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6340           }
6341
6342         // All cases included
6343         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6344           {
6345             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6346             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6347             
6348             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6349             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6350
6351             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6352           }
6353         delete trackV;
6354       }
6355       // Increment jet pt with one entry in case #tracks outside jets = 0
6356       if(tracklistout2jetsStat->GetSize()==0) {
6357          Float_t jetPt = jet->Pt();
6358          Bool_t incrementJetPt = kTRUE;
6359          if(type==kBckgOut2JStat)
6360            {
6361             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6362             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets);
6363           }
6364         // All cases included
6365         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6366           {
6367             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6368             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets );
6369           }
6370       }
6371       
6372     }
6373
6374   if(type==kBckgOut3J || type==kBckgOutAJ)
6375     {
6376       if(type==kBckgOut3J) fh1Out3JetsMult->Fill(tracklistout3jets->GetSize());
6377       
6378       for(Int_t it=0; it<tracklistout3jets->GetSize(); ++it){
6379         
6380         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jets->At(it));
6381         if(!trackVP) continue;
6382         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6383         
6384         Float_t jetPt   = jet->Pt();
6385         Float_t trackPt = trackV->Pt();
6386         
6387         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6388         
6389         if(type==kBckgOut3J)
6390           {
6391             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6392             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6393             
6394             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6395             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6396             
6397             qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6398           }
6399
6400         // All cases included
6401         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6402           {
6403             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6404             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6405             
6406             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6407             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6408           }
6409         delete trackV;
6410       }
6411       // Increment jet pt with one entry in case #tracks outside jets = 0
6412       if(tracklistout3jets->GetSize()==0) {
6413          Float_t jetPt = jet->Pt();
6414          Bool_t incrementJetPt = kTRUE;
6415          if(type==kBckgOut3J)
6416           {
6417             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6418             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6419           }
6420         // All cases included
6421         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6422           {
6423             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6424             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6425           }
6426       }
6427     }
6428
6429   if(type==kBckgOut3JStat || type==kBckgOutAJStat)
6430     {
6431       for(Int_t it=0; it<tracklistout3jetsStat->GetSize(); ++it){
6432         
6433         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jetsStat->At(it));
6434         if(!trackVP) continue;
6435         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6436         
6437         Float_t jetPt   = jet->Pt();
6438         Float_t trackPt = trackV->Pt();
6439         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6440
6441         if(type==kBckgOut3JStat)
6442           {
6443             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets);
6444             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6445             
6446             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets);
6447             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets);
6448             
6449             //if(fQAMode&1)     qabckghistocuts->FillTrackQA( trackEta, TVector2::Phi_0_2pi(trackPhi), trackPt);
6450           }
6451
6452         // All cases included
6453         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6454           {
6455             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets );
6456             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6457             
6458             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets );
6459             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets );
6460
6461             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6462
6463           }
6464         delete trackV;
6465       }
6466       // Increment jet pt with one entry in case #tracks outside jets = 0
6467       if(tracklistout3jetsStat->GetSize()==0) {
6468          Float_t jetPt = jet->Pt();
6469          Bool_t incrementJetPt = kTRUE;
6470          if(type==kBckgOut3JStat)
6471           {
6472             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6473             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets);
6474           }
6475         // All cases included
6476         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6477           {
6478             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6479             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets );
6480           }
6481       }
6482
6483     }
6484
6485   if(type==kBckgClustersOutLeading){ // clusters bgr: all tracks in clusters out of leading jet
6486     
6487     TList* tracklistClustersOutLeading = new TList();
6488     Double_t normFactorClusters = 0;
6489     Float_t jetPt   = jet->Pt();
6490     
6491     GetClusterTracksOutOf1Jet(jet, tracklistClustersOutLeading, normFactorClusters);
6492     fh1OutClustersMult->Fill(tracklistClustersOutLeading->GetSize());
6493     
6494     for(Int_t it=0; it<tracklistClustersOutLeading->GetSize(); ++it){
6495       
6496       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersOutLeading->At(it));
6497       if(!trackVP) continue;
6498       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6499       
6500       Float_t trackPt = trackVP->Pt();
6501       
6502       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6503       
6504       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6505       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); 
6506
6507       delete trackV;
6508     }
6509     
6510     delete tracklistClustersOutLeading;
6511     
6512   }
6513   
6514   if(type == kBckgClusters){ // clusters bgr: all tracks in 'median cluster' 
6515     
6516     TList* tracklistClustersMedian = new TList();
6517     Double_t normFactorClusters = 0;
6518     Float_t jetPt = jet->Pt();
6519     
6520     GetClusterTracksMedian(tracklistClustersMedian, normFactorClusters); 
6521     fh1MedianClustersMult->Fill(tracklistClustersMedian->GetSize());
6522
6523     for(Int_t it=0; it<tracklistClustersMedian->GetSize(); ++it){
6524       
6525       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersMedian->At(it));
6526       if(!trackVP) continue;
6527       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6528       
6529       Float_t trackPt = trackVP->Pt();
6530       
6531       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6532       
6533       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6534       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt );
6535       
6536       delete trackV;
6537     }
6538     
6539     delete tracklistClustersMedian;
6540   }
6541   
6542   delete tracklistout2jets;
6543   delete tracklistout3jets;
6544   delete tracklistout2jetsStat;
6545   delete tracklistout3jetsStat;
6546   
6547 }
6548
6549 // ______________________________________________________________________________________________________________________________________________________
6550 AliAODJet* AliAnalysisTaskFragmentationFunction::GetAODBckgSubJet(AliAODJet* jet, Int_t method)
6551 {
6552   // correct jet pt for (mean bgr energy density) x (jet area) 
6553
6554   if(!fBranchRecBackJets.Length()){
6555     if(fDebug>0)Printf("%s:%d background branch name not set",(char*)__FILE__,__LINE__);
6556     return 0;
6557   }
6558
6559   static AliAODJetEventBackground*   externalBackground =  (AliAODJetEventBackground*)(fAOD->FindListObject(fBranchRecBackJets.Data()));
6560
6561   if(!externalBackground){
6562     if(fDebug>0)Printf("%s:%d no external background object found in %s",(char*)__FILE__,__LINE__,fBranchRecBackJets.Data());
6563     return 0;
6564   }
6565
6566   Float_t rho = externalBackground->GetBackground(method);
6567
6568   // Calculate background and subtract it from jet pt
6569   Float_t ptBack = rho*jet->EffectiveAreaCharged();
6570   Float_t ptSub = jet->Pt()-ptBack;
6571
6572   // Get px, py, pz from eta, phi, pt
6573   TLorentzVector vecSub;
6574   AliAODJet *tmpJet = 0;
6575   if(ptSub>=0){
6576     vecSub.SetPtEtaPhiM(ptSub,jet->Eta(),jet->Phi(),0.);
6577     tmpJet = new AliAODJet(vecSub.Px(),vecSub.Py(),vecSub.Pz(),vecSub.P());
6578   }
6579
6580   return tmpJet;
6581 }