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