]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/AliAnalysisTaskFragmentationFunction.cxx
- FF task: switch for analysis of jets with max track
[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         std::cout<<" here, isBadJet "<<isBadJet<<std::endl;
3843         
3844         if(isBadJet) continue; 
3845
3846
3847         if(ptFractionEmbedded>=fCutFractionPtEmbedded){ // if no embedding: ptFraction = cutFraction = 0
3848           
3849           for(Int_t it=0; it<jettracklist->GetSize(); ++it){
3850
3851             AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
3852             if(!trackVP)continue;
3853             TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3854             
3855             Float_t jetPt   = jet->Pt();
3856             if(fUseEmbeddedJetPt){
3857               if(embeddedJet) jetPt = embeddedJet->Pt();
3858               else jetPt = 0;
3859             }
3860             Float_t trackPt = trackV->Pt();
3861
3862
3863             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3864             
3865             if(fFFMode) fFFHistosRecCuts->FillFF( trackPt, jetPt, incrementJetPt);
3866             if(fIJMode) fIJHistosRecCuts->FillIntraJet( trackV, jet->MomentumVector() );
3867             
3868             if(it==0){ // leading track 
3869               leadTrackPt = trackPt;
3870               leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3871               
3872               if(fFFMode) fFFHistosRecLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE);
3873               if(fIJMode) fIJHistosRecLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
3874             }
3875             if(fFFMode) fFFHistosRecLeading->FillFF( trackPt, leadTrackPt , incrementJetPt);
3876             if(fIJMode) fIJHistosRecLeading->FillIntraJet( trackV, leadTrackV );
3877             
3878             delete trackV;
3879           }
3880           
3881           // ff and ij for background study
3882           if(fBckgMode){
3883             if(fBckgType[0]!=-1)
3884               FillBckgHistos(fBckgType[0], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV, 
3885                              fFFBckgHisto0RecCuts, fFFBckgHisto0RecLeading,
3886                              fIJBckgHisto0RecCuts, fIJBckgHisto0RecLeading,
3887                              fQABckgHisto0RecCuts);
3888             if(fBckgType[1]!=-1)
3889               FillBckgHistos(fBckgType[1], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3890                              fFFBckgHisto1RecCuts, fFFBckgHisto1RecLeading,
3891                              fIJBckgHisto1RecCuts, fIJBckgHisto1RecLeading,
3892                              fQABckgHisto1RecCuts);
3893             if(fBckgType[2]!=-1)
3894               FillBckgHistos(fBckgType[2], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3895                              fFFBckgHisto2RecCuts, fFFBckgHisto2RecLeading,
3896                              fIJBckgHisto2RecCuts, fIJBckgHisto2RecLeading,
3897                              fQABckgHisto2RecCuts);
3898             if(fBckgType[3]!=-1)
3899               FillBckgHistos(fBckgType[3], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3900                              fFFBckgHisto3RecCuts, fFFBckgHisto3RecLeading,
3901                              fIJBckgHisto3RecCuts, fIJBckgHisto3RecLeading,
3902                              fQABckgHisto3RecCuts);
3903             if(fBckgType[4]!=-1)
3904               FillBckgHistos(fBckgType[4], fTracksRecCuts, fJetsRecCuts, jet, leadTrackPt, leadTrackV,
3905                              fFFBckgHisto4RecCuts, fFFBckgHisto4RecLeading,
3906                            fIJBckgHisto4RecCuts, fIJBckgHisto4RecLeading,
3907                              fQABckgHisto4RecCuts);
3908           } // end if(fBckgMode)
3909
3910
3911           // phi correlation
3912           if(fPhiCorrMode){
3913             for(Int_t it=0; it<nRecPartCuts; ++it){
3914               AliVParticle *part = (AliVParticle*)(fTracksRecCuts->At(it));
3915               
3916               Float_t partEta = part->Eta();
3917               Float_t partPhi = part->Phi();
3918               Float_t partPt  = part->Pt();
3919               
3920               fPhiCorrHistosJetArea->FillTrackQA( partEta, 
3921                                                   TVector2::Phi_mpi_pi( jet->Phi() - partPhi ),
3922                                                   partPt,
3923                                                   kTRUE);
3924               
3925               fPhiCorrHistosTransverseArea->FillTrackQA( partEta, 
3926                                                          TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()/2),
3927                                                          partPt,
3928                                                          kTRUE);
3929               
3930               fPhiCorrHistosAwayArea->FillTrackQA( partEta, 
3931                                                    TVector2::Phi_mpi_pi( jet->Phi() - partPhi + TMath::Pi()),
3932                                                    partPt,
3933                                                    kTRUE);
3934             }
3935           } // end: phi-correlation
3936           
3937           delete leadTrackV;
3938           delete jettracklist;  
3939
3940         } // end: cut embedded ratio
3941       } // end: leading jet
3942     } // end: rec. jets after cuts
3943     
3944     // generated jets
3945     for(Int_t ij=0; ij<nGenJets; ++ij){
3946       
3947       AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
3948       if(!jet)continue;
3949       if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3950       
3951       if(ij==0){ // leading jet
3952         
3953         if(fQAMode&2) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
3954         
3955         TList* jettracklist = new TList();
3956         Double_t sumPt      = 0.;
3957         Bool_t isBadJet     = kFALSE;
3958         Float_t leadTrackPt = 0.;
3959         TLorentzVector* leadTrackV = new TLorentzVector();
3960         
3961         if(GetFFRadius()<=0){
3962           GetJetTracksTrackrefs(jettracklist, jet, GetFFMaxTrackPt(), isBadJet);
3963         } else {
3964           GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMaxTrackPt(), isBadJet);
3965         }
3966         
3967         if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
3968         if(isBadJet) continue; 
3969
3970         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
3971           
3972           AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
3973           TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3974           
3975           Float_t jetPt   = jet->Pt();
3976           Float_t trackPt = trackV->Pt();
3977           
3978           Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3979           
3980           if(fFFMode) fFFHistosGen->FillFF( trackPt, jetPt, incrementJetPt );
3981           if(fIJMode) fIJHistosGen->FillIntraJet( trackV, jet->MomentumVector() );
3982           
3983           if(it==0){ // leading track
3984             leadTrackPt = trackPt;
3985             leadTrackV->SetPxPyPzE(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
3986             
3987             if(fFFMode) fFFHistosGenLeadingTrack->FillFF( leadTrackPt, jetPt, kTRUE );    
3988             if(fIJMode) fIJHistosGenLeadingTrack->FillIntraJet( leadTrackV, jet->MomentumVector() );
3989           }
3990           if(fFFMode) fFFHistosGenLeading->FillFF( trackPt, leadTrackPt, incrementJetPt );
3991           if(fIJMode) fIJHistosGenLeading->FillIntraJet( trackV, leadTrackV );
3992           
3993           delete trackV;
3994         }
3995         
3996         delete leadTrackV;
3997         delete jettracklist;
3998       }
3999     }
4000   } // end: QA, FF and intra-jet
4001
4002   //_______ DiJet part _____________________________________________________
4003   if(fDJMode){
4004     if (nRecJetsCuts > 1) 
4005       {
4006         AliAODJet* jet1 = (AliAODJet*)(fJetsRecCuts->At(0));
4007         AliAODJet* jet2 = (AliAODJet*)(fJetsRecCuts->At(1));
4008         
4009         // DiJet deltaphi calculation
4010         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4011         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4012         Double_t deltaPhi = TMath::Abs(phi1-phi2); 
4013         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4014         
4015         // DiJet CDF cut calculation
4016         Double_t et1     = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4017         Double_t et2     = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4018         Double_t sumEt   = et1 + et2;
4019         Double_t normEt1PlusEt2   = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4020         Double_t ratio = (Double_t)(normEt1PlusEt2/sumEt);
4021         
4022         // DiJet events selection
4023         Bool_t positionCut       = 0;
4024         Bool_t positionEnergyCut = 0;
4025         Bool_t cdfCut            = 0; 
4026         
4027         // Position cut :
4028         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4029         // Position-Energy cut :
4030         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4031         // CDF cut :
4032         if (ratio < fDiJetCDFCut) cdfCut = 1;
4033         
4034         Int_t go = 0;
4035         
4036         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4037         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4038         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4039         
4040         if (go)
4041           {
4042             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4043             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4044             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4045             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4046             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4047             
4048             Double_t  jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4049             
4050             if (jetBin > 0)
4051               {
4052                 if(fDJMode&2) fQADiJetHistosRecCuts->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4053                 
4054                 if(fDJMode&1){
4055                   TList* jettracklist1 = new TList();
4056                   Double_t sumPt1      = 0.;
4057                   Bool_t isBadJet1     = kFALSE;
4058                   Float_t leadTrackPt1 = 0;
4059                   
4060
4061                   TList* jettracklist2 = new TList();
4062                   Double_t sumPt2      = 0.;
4063                   Bool_t isBadJet2     = kFALSE;
4064                   Float_t leadTrackPt2 = 0;
4065                   
4066                   if(GetFFRadius()<=0)
4067                     {
4068                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4069                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4070                     }
4071                   else
4072                     {
4073                       GetJetTracksPointing(fTracksRecCuts, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4074                       GetJetTracksPointing(fTracksRecCuts, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4075                     }
4076                   
4077
4078                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4079                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4080
4081                   if(!(isBadJet1 || isBadJet2)){ // good jets
4082
4083                     Int_t nTracks = jettracklist1->GetSize(); 
4084                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4085                   
4086                     for(Int_t it=0; it<nTracks; ++it)
4087                       {
4088                         if (it < jettracklist1->GetSize())
4089                           { 
4090                             AliVParticle *vp = (dynamic_cast<AliVParticle*> (jettracklist1->At(it)));
4091                             Float_t trackPt1 = (vp?vp->Pt():0);
4092                             Float_t jetPt1   = jet1->Pt();
4093                             
4094                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4095                           
4096                             fFFDiJetHistosRecCuts->FillDiJetFF(1, trackPt1, jetPt1, jetBin, incrementJetPt);
4097                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt1, jetPt1, jetBin, incrementJetPt);
4098                             
4099                             if (it == 0)
4100                               {
4101                                 leadTrackPt1 = trackPt1;
4102                                 
4103                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(1, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4104                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt1, jetPt1, jetBin, kTRUE); 
4105                               }
4106                             
4107                             fFFDiJetHistosRecLeading->FillDiJetFF(1, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4108                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt1, leadTrackPt1, jetBin, incrementJetPt); 
4109                           }
4110                         
4111                         if (it < jettracklist2->GetSize())
4112                           { 
4113                             Float_t trackPt2   = ((AliVParticle*)(jettracklist2->At(it)))->Pt();
4114                             Float_t jetPt2     = jet2->Pt();
4115                             
4116                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4117                             
4118                             fFFDiJetHistosRecCuts->FillDiJetFF(2, trackPt2, jetPt2, jetBin, incrementJetPt);
4119                             fFFDiJetHistosRecCuts->FillDiJetFF(0, trackPt2, jetPt2, jetBin, incrementJetPt);
4120                             
4121                             if (it == 0)
4122                               {
4123                                 leadTrackPt2 = trackPt2;
4124                                 
4125                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4126                                 fFFDiJetHistosRecLeadingTrack->FillDiJetFF(0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4127                               }
4128                             
4129                             fFFDiJetHistosRecLeading->FillDiJetFF(2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4130                             fFFDiJetHistosRecLeading->FillDiJetFF(0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4131                           }
4132                       } // End loop on tracks
4133                   }
4134                   
4135                   delete jettracklist1;
4136                   delete jettracklist2;
4137                 }
4138               } // End if(jetBin > 0)
4139             else { Printf("Jet bins for di-jet studies not set !");}
4140           } // End if(go)
4141       } // End if(nRecJets > 1)
4142     
4143     if (nGenJets > 1)
4144       {
4145         AliAODJet* jet1 = dynamic_cast<AliAODJet*>(fJetsGen->At(0));
4146         AliAODJet* jet2 = dynamic_cast<AliAODJet*>(fJetsGen->At(1));
4147         if(jet1&&jet2){
4148         
4149         Double_t deltaPhi = 0;
4150         Double_t phi1 = TVector2::Phi_0_2pi(jet1->Phi());
4151         Double_t phi2 = TVector2::Phi_0_2pi(jet2->Phi());
4152         deltaPhi      = TMath::Abs(phi1-phi2); 
4153         if (deltaPhi > TMath::Pi() && deltaPhi < 2*TMath::Pi()) deltaPhi = 2*TMath::Pi() - deltaPhi;
4154         
4155         Double_t et1            = TMath::Abs(jet1->E()*TMath::Sin(jet1->Theta()));
4156         Double_t et2            = TMath::Abs(jet2->E()*TMath::Sin(jet2->Theta()));
4157         Double_t sumEt          = et1 + et2;
4158         Double_t normEt1PlusEt2 = TMath::Sqrt(et1*et1+et2*et2+2*et1*et2*TMath::Cos(deltaPhi));
4159         Double_t ratio          = (Double_t)(normEt1PlusEt2/sumEt);
4160         
4161         // DiJet events selection
4162         Bool_t positionCut       = 0;
4163         Bool_t positionEnergyCut = 0;
4164         Bool_t cdfCut            = 0; 
4165         
4166         // Position cut :
4167         if (deltaPhi > fDiJetDeltaPhiCut) positionCut = 1;
4168         // Position-Energy cut :
4169         if ((deltaPhi > fDiJetDeltaPhiCut) && ((jet2->Pt()) >= fDiJetPtFractionCut*(jet1->Pt()))) positionEnergyCut = 1;
4170         // CDF cut :
4171         if (ratio < fDiJetCDFCut) cdfCut = 1;    
4172         
4173         Int_t go = 0;
4174         
4175         if (fDiJetCut == 1 && positionCut == 1) go = 1;
4176         if (fDiJetCut == 2 && positionEnergyCut == 1) go = 1;
4177         if (fDiJetCut == 3 && cdfCut == 1) go = 1;
4178         
4179         if (go)
4180           {
4181             Double_t deltaEta      = TMath::Abs(jet1->Eta()-jet2->Eta());
4182             Double_t deltaPt       = TMath::Abs(jet1->Pt()-jet2->Pt());
4183             Double_t inbal         = (jet1->Pt()-jet2->Pt())/(jet1->Pt()+jet2->Pt());
4184             Double_t meanEt        = (Double_t)((et1+et2)/2.);
4185             Double_t invariantMass = (Double_t)InvMass(jet1,jet2);
4186             
4187             Double_t jetBin = GetDiJetBin(invariantMass, jet1->Pt(), meanEt, fDiJetKindBins);
4188             
4189             if(jetBin > 0)
4190               {
4191                 if(fDJMode&2) fQADiJetHistosGen->FillDiJetQA(invariantMass, deltaPhi, deltaEta, deltaPt, inbal, jetBin);
4192                 
4193                 if(fDJMode&1){
4194                   TList* jettracklist1 = new TList();
4195                   Double_t sumPt1 = 0.;
4196                   Bool_t isBadJet1     = kFALSE;
4197                   Float_t leadTrackPt1 = 0.;
4198
4199                   TList* jettracklist2 = new TList();
4200                   Double_t sumPt2 = 0.;
4201                   Bool_t isBadJet2     = kFALSE;
4202                   Float_t leadTrackPt2 = 0.;
4203                   
4204                   if(GetFFRadius()<=0)
4205                     {
4206                       GetJetTracksTrackrefs(jettracklist1, jet1, GetFFMaxTrackPt(), isBadJet1);
4207                       GetJetTracksTrackrefs(jettracklist2, jet2, GetFFMaxTrackPt(), isBadJet2);
4208                     }
4209                   else
4210                     {
4211                       GetJetTracksPointing(fTracksGen, jettracklist1, jet1, GetFFRadius(), sumPt1, GetFFMaxTrackPt(), isBadJet1);
4212                       GetJetTracksPointing(fTracksGen, jettracklist2, jet2, GetFFRadius(), sumPt2, GetFFMaxTrackPt(), isBadJet2);
4213                     }
4214                   
4215                   
4216                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet1 = kTRUE;
4217                   if(GetFFMinNTracks()>0 && jettracklist1->GetSize()<=GetFFMinNTracks()) isBadJet2 = kTRUE;
4218                   
4219                   if(!(isBadJet1 || isBadJet2)){ // good jets
4220
4221                     Int_t nTracks = jettracklist1->GetSize(); 
4222                     if (jettracklist1->GetSize() < jettracklist2->GetSize()) nTracks = jettracklist2->GetSize();
4223                   
4224                     for(Int_t it=0; it<nTracks; ++it)
4225                       {
4226                         if (it < jettracklist1->GetSize())
4227                           { 
4228                             Float_t trackPt1 = ((AliVParticle*)jettracklist1->At(it))->Pt();
4229                             Float_t jetPt1 = jet1->Pt();
4230                             
4231                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4232                             
4233                             fFFDiJetHistosGen->FillDiJetFF( 1, trackPt1, jetPt1, jetBin, incrementJetPt);
4234                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt1, jetPt1, jetBin, incrementJetPt);
4235                             
4236                             if(it==0)
4237                               { 
4238                                 leadTrackPt1 = trackPt1;
4239                                 
4240                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 1, leadTrackPt1, jetPt1, jetBin, kTRUE);
4241                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt1, jetPt1, jetBin, kTRUE);
4242                               }
4243                             
4244                             fFFDiJetHistosGenLeading->FillDiJetFF( 1, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4245                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt1, leadTrackPt1, jetBin, incrementJetPt);
4246                           }
4247                         
4248                         if (it < jettracklist2->GetSize())
4249                           { 
4250                             Float_t trackPt2 = ((AliVParticle*)jettracklist2->At(it))->Pt();
4251                             Float_t jetPt2 = jet2->Pt();
4252                             
4253                             Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
4254                             
4255                             fFFDiJetHistosGen->FillDiJetFF( 2, trackPt2, jetPt2, jetBin, incrementJetPt);
4256                             fFFDiJetHistosGen->FillDiJetFF( 0, trackPt2, jetPt2, jetBin, incrementJetPt);
4257                           
4258                             if (it==0)
4259                               { 
4260                                 leadTrackPt2 = trackPt2;
4261                                 
4262                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 2, leadTrackPt2, jetPt2, jetBin, kTRUE);
4263                                 fFFDiJetHistosGenLeadingTrack->FillDiJetFF( 0, leadTrackPt2, jetPt2, jetBin, kTRUE);
4264                               }
4265                           
4266                             fFFDiJetHistosGenLeading->FillDiJetFF( 2, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4267                             fFFDiJetHistosGenLeading->FillDiJetFF( 0, trackPt2, leadTrackPt2, jetBin, incrementJetPt);
4268                           }
4269                       } // End loop on tracks
4270                   }               
4271
4272                   delete jettracklist1;
4273                   delete jettracklist2;
4274                 }
4275               } // End if(jetBin > 0)
4276             else { Printf("Jet bins for di-jet studies not set !");}
4277           } // End if (go)
4278         }// end if jet1 and jet2
4279       } // End if(nGenJets > 1)
4280   } // end: di-jet
4281   
4282   // ____ efficiency _______________________________
4283
4284   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
4285
4286     // arrays holding for each generated particle the reconstructed AOD track index & isPrimary flag, are initialized in AssociateGenRec(...) function
4287     TArrayI indexAODTr; 
4288     TArrayS isGenPrim; 
4289
4290     // array holding for each reconstructed AOD track generated particle index, initialized in AssociateGenRec(...) function
4291     TArrayI indexMCTr; 
4292
4293     // ... and another set for secondaries (secondary MC tracks are stored in a different list)
4294     TArrayI indexAODTrSec; 
4295     TArrayS isGenSec; 
4296     TArrayI indexMCTrSec; 
4297    
4298     Int_t  nTracksAODMCCharged = GetListOfTracks(fTracksAODMCCharged, kTrackAODMCCharged);
4299     if(fDebug>2)Printf("%s:%d selected AODMC tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCCharged);
4300   
4301     Int_t  nTracksAODMCChargedSec = GetListOfTracks(fTracksAODMCChargedSec, kTrackAODMCChargedSec);
4302     if(fDebug>2)Printf("%s:%d selected AODMC secondary tracks: %d ",(char*)__FILE__,__LINE__,nTracksAODMCChargedSec);
4303   
4304     Int_t  nTracksRecQualityCuts = GetListOfTracks(fTracksRecQualityCuts, kTrackAODQualityCuts);
4305     if(fDebug>2)Printf("%s:%d selected rec tracks quality after cuts, full acceptance/pt : %d ",(char*)__FILE__,__LINE__,nTracksRecQualityCuts);
4306   
4307     // associate gen and rec tracks, store indices in TArrays 
4308     AssociateGenRec(fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,indexMCTr,isGenPrim,fh2PtRecVsGenPrim); 
4309     AssociateGenRec(fTracksAODMCChargedSec,fTracksRecQualityCuts,indexAODTrSec,indexMCTrSec,isGenSec,fh2PtRecVsGenSec);
4310   
4311     // single track eff
4312     if(fQAMode&1) FillSingleTrackHistosRecGen(fQATrackHistosRecEffGen,fQATrackHistosRecEffRec,fTracksAODMCCharged,indexAODTr,isGenPrim);
4313     if(fQAMode&1) FillSingleTrackResponse(fhnResponseSinglePt,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim);
4314
4315     // secondaries
4316     if(fQAMode&1) FillSingleTrackHistosRecGen(0x0,fQATrackHistosSecRec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec);
4317
4318     // high-pt occupancy effect 
4319     FillTwoTrackHistosRecGen(fTracksAODMCCharged, /*fTracksRecQualityCuts,indexAODTr,*/ isGenPrim);
4320
4321     // jet track eff
4322     
4323     Double_t sumPtGenLeadingJetRecEff = 0;
4324     Double_t sumPtGenLeadingJetSec    = 0;
4325     Double_t sumPtRecLeadingJetRecEff = 0;
4326     
4327     for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4328     
4329       AliAODJet* jet = (AliAODJet*)(fJetsRecEff->At(ij));
4330       Bool_t isBadJetGenPrim = kFALSE;
4331       Bool_t isBadJetGenSec  = kFALSE;
4332       Bool_t isBadJetRec     = kFALSE;
4333     
4334
4335       if(ij==0){ // leading jet
4336         
4337         // for efficiency: gen tracks from pointing with gen/rec jet
4338         TList* jettracklistGenPrim = new TList();
4339         GetJetTracksPointing(fTracksAODMCCharged, jettracklistGenPrim, jet, GetFFRadius(), sumPtGenLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetGenPrim); 
4340
4341         TList* jettracklistGenSec = new TList();
4342         GetJetTracksPointing(fTracksAODMCChargedSec, jettracklistGenSec, jet, GetFFRadius(), sumPtGenLeadingJetSec, GetFFMaxTrackPt(), isBadJetGenSec); 
4343
4344         // bin efficiency in jet pt bins using rec tracks  
4345         TList* jettracklistRec = new TList();
4346         GetJetTracksPointing(fTracksRecCuts,jettracklistRec, jet, GetFFRadius(), sumPtRecLeadingJetRecEff, GetFFMaxTrackPt(), isBadJetRec); 
4347         
4348         Double_t jetEta   = jet->Eta();
4349         Double_t jetPhi   = TVector2::Phi_0_2pi(jet->Phi());
4350         
4351         if(GetFFMinNTracks()>0 && jettracklistGenPrim->GetSize()<=GetFFMinNTracks()) isBadJetGenPrim = kTRUE;
4352         if(GetFFMinNTracks()>0 && jettracklistGenSec->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
4353         if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())     isBadJetRec     = kTRUE;
4354
4355         if(isBadJetRec) continue;
4356
4357         if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
4358         
4359         if(fFFMode) FillJetTrackHistosRecGen(fFFHistosRecEffGen,fFFHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4360                                              jettracklistGenPrim,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins); 
4361
4362         if(fFFMode) FillJetTrackResponse(fhnResponseJetTrackPt,fhnResponseJetZ,fhnResponseJetXi,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4363                                          jettracklistGenPrim,fTracksAODMCCharged,fTracksRecQualityCuts,indexAODTr,isGenPrim,fUseResponseRecJetPtBins);
4364
4365         // secondaries: use jet pt from primaries 
4366         if(fFFMode) FillJetTrackHistosRecGen(0x0,fFFHistosSecRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4367                                              jettracklistGenSec,fTracksAODMCChargedSec,indexAODTrSec,isGenSec,fUseRecEffRecJetPtBins); 
4368
4369         delete jettracklistGenPrim;
4370         delete jettracklistGenSec;
4371         delete jettracklistRec;
4372       }
4373     }
4374     
4375
4376     // bckgr eff: complementary cones 
4377
4378     if(0){
4379       
4380       for(Int_t ij=0; ij<nRecEffJets; ++ij){ 
4381         
4382         AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsRecEff->At(ij));
4383         
4384         if(ij==0){ // leading jet
4385           
4386           TList* perpjettracklistGen = new TList();
4387           Double_t sumPtGen = 0.; 
4388           
4389           GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksGen, perpjettracklistGen, jet, GetFFRadius() , sumPtGen); // for efficiency: gen tracks perp to gen/rec jet
4390           
4391           // here could be your histos !!! 
4392           // FillJetTrackRecEffHisto(fFFBckgrPerpHistosRecEffGen,fFFBckgrPerpHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,perpjettracklistGen,
4393           //                     fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4394           
4395           delete perpjettracklistGen;
4396         }
4397       }
4398     }
4399
4400     // bgr eff: outside N leading jets
4401
4402     if(0){
4403       
4404       Int_t nCases = 1;
4405       
4406       TList* outjettracklistGen = new TList();
4407       Double_t sumPtGen = 0.;
4408       
4409       GetTracksOutOfNJets(nCases, fTracksGen, outjettracklistGen, fJetsRecEff, sumPtGen); // for efficiency: gen tracks outide n gen/rec jets 
4410       
4411       // here could be your histos !!! 
4412       // FillJetTrackRecEffHisto(fFFBckgrOutHistosRecEffGen,fFFBckgrOutHistosRecEffRec,sumPtGenLeadingJetRecEff,sumPtRecLeadingJetRecEff,
4413       //                         outjettracklistGen,fTracksAODMCCharged,indexAODTr,isGenPrim,fUseRecEffRecJetPtBins);
4414       
4415       delete outjettracklistGen;
4416     }
4417   }     
4418
4419   //___________________
4420   
4421   fTracksRec->Clear();
4422   fTracksRecCuts->Clear();
4423   fTracksGen->Clear();
4424   fTracksAODMCCharged->Clear();
4425   fTracksAODMCChargedSec->Clear();
4426   fTracksRecQualityCuts->Clear();
4427
4428   fJetsRec->Clear();
4429   fJetsRecCuts->Clear();
4430   fJetsGen->Clear();
4431   fJetsRecEff->Clear();
4432   fJetsEmbedded->Clear();
4433
4434
4435   if(fBckgMode && 
4436      (fBckgType[0]==kBckgClusters || fBckgType[1]==kBckgClusters || fBckgType[2]==kBckgClusters || fBckgType[3]==kBckgClusters || fBckgType[4]==kBckgClusters ||
4437       fBckgType[0]==kBckgClustersOutLeading || fBckgType[1]==kBckgClustersOutLeading || fBckgType[2]==kBckgClustersOutLeading || 
4438       fBckgType[3]==kBckgClustersOutLeading || fBckgType[4]==kBckgClustersOutLeading)){
4439
4440     fBckgJetsRec->Clear();
4441     fBckgJetsRecCuts->Clear();
4442     fBckgJetsGen->Clear();
4443   }
4444
4445
4446   //Post output data.
4447   PostData(1, fCommonHistList);
4448 }
4449
4450 //________________________________________________________________________________________
4451 Double_t AliAnalysisTaskFragmentationFunction::InvMass(const AliAODJet* jet1, const AliAODJet* jet2)
4452 {
4453   // cald DiJet inv mass
4454
4455   Double_t invMass = 0.;
4456   invMass = TMath::Sqrt(pow(jet1->E()+jet2->E(),2) - pow(jet1->Px()+jet2->Px(),2) - 
4457                         pow(jet1->Py()+jet2->Py(),2) - pow(jet1->Pz()+jet2->Pz(),2));
4458
4459   return invMass;
4460
4461 }
4462
4463 //________________________________________________________________________________________
4464 Double_t AliAnalysisTaskFragmentationFunction::GetDiJetBin(Double_t invMass, Double_t leadingJetPt, Double_t EtMean, Int_t kindBins)
4465 {
4466   // calc DiJet bin according to kindBins parameter
4467
4468   Double_t jetBinOk = 0.;
4469   Double_t jetBin = 0.;
4470
4471   Float_t stepInvMass = (fDiJetJetInvMassMax - fDiJetJetInvMassMin)/fDiJetNBinsJetInvMass;
4472   Float_t stepPt = (fDiJetJetPtMax - fDiJetJetPtMin)/fDiJetNBinsJetPt;
4473
4474   if (kindBins == 1)
4475     {
4476       for(Int_t i=0; i<fDiJetNBinsJetInvMass; ++i)
4477         {
4478           jetBin = fDiJetJetInvMassMin + i*stepInvMass + stepInvMass/2.;
4479           if(((fDiJetJetInvMassMin+i*stepInvMass) <= invMass) &&
4480              (fDiJetJetInvMassMin + (i+1)*stepInvMass) > invMass) {jetBinOk = jetBin; break;}
4481           else jetBinOk = -1.;
4482         }
4483     }
4484   else if (kindBins == 3)
4485     {
4486       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4487         {
4488           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4489           if(((fDiJetJetPtMin+i*stepPt) <= EtMean) &&
4490              (fDiJetJetPtMin + (i+1)*stepPt) > EtMean) {jetBinOk = jetBin; break;}
4491           else jetBinOk = -1.;
4492         }
4493     }
4494   else if (kindBins == 2)
4495     {
4496       for(Int_t i=0; i<fDiJetNBinsJetPt; ++i)
4497         {
4498           jetBin = fDiJetJetPtMin + i*stepPt + stepPt/2.;
4499           if(((fDiJetJetPtMin+i*stepPt) <= leadingJetPt) &&
4500              (fDiJetJetPtMin + (i+1)*stepPt) > leadingJetPt) {jetBinOk = jetBin; break;}
4501           else jetBinOk = -1.;
4502         }
4503     }
4504   else {Printf("WARNING: kindBins wrongly set ! Please make sure to call SetKindSlices() and set the kind parameter to 1, 2 or 3.\n");}
4505
4506   return jetBinOk;
4507
4508 }
4509
4510
4511 //______________________________________________________________
4512 void AliAnalysisTaskFragmentationFunction::Terminate(Option_t *) 
4513 {
4514   // terminated
4515
4516   if(fDebug > 1) printf("AliAnalysisTaskFragmentationFunction::Terminate() \n");
4517 }  
4518
4519 //_________________________________________________________________________________
4520 Int_t AliAnalysisTaskFragmentationFunction::GetListOfTracks(TList *list, Int_t type)
4521 {
4522   // fill list of tracks selected according to type
4523
4524   if(fDebug > 2) Printf("%s:%d Selecting tracks with %d", (char*)__FILE__,__LINE__,type);
4525   
4526   if(!list){
4527     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4528     return -1;
4529   }
4530
4531   if(!fAOD) return -1;
4532
4533   if(!fAOD->GetTracks()) return 0;
4534
4535   if(type==kTrackUndef) return 0;
4536   
4537   Int_t iCount = 0;
4538
4539   if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts || type==kTrackAODExtra || type==kTrackAODExtraonly){
4540     
4541     TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(fAOD->FindListObject("aodExtraTracks"));
4542     if(!aodExtraTracks)return iCount;
4543     for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
4544       AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
4545       if (!track) continue;
4546       
4547       AliAODTrack *tr = dynamic_cast<AliAODTrack*> (track);
4548       if(!tr)continue;
4549
4550       if(type==kTrackAODExtraCuts || type==kTrackAODExtraonlyCuts){
4551
4552         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4553         
4554         if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4555         if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4556         if(tr->Pt()  < fTrackPtCut) continue;
4557       }    
4558
4559       list->Add(tr);
4560       iCount++;
4561     }
4562   }
4563
4564   if(type==kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAOD || type==kTrackAODExtraCuts || type==kTrackAODExtra){
4565
4566     // all rec. tracks, esd filter mask, eta range
4567     
4568     for(Int_t it=0; it<fAOD->GetNumberOfTracks(); ++it){
4569       AliAODTrack *tr = fAOD->GetTrack(it);
4570       
4571       if(type == kTrackAODCuts || type==kTrackAODQualityCuts || type==kTrackAODExtraCuts){
4572
4573         if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))   continue;
4574         if(type == kTrackAODCuts){
4575           if(tr->Eta() < fTrackEtaMin || tr->Eta() > fTrackEtaMax) continue;
4576           if(tr->Phi() < fTrackPhiMin || tr->Phi() > fTrackPhiMax) continue;
4577           if(tr->Pt()  < fTrackPtCut) continue;
4578         }
4579       }
4580       list->Add(tr);
4581       iCount++;
4582     }
4583   }
4584   else if (type==kTrackKineAll || type==kTrackKineCharged || type==kTrackKineChargedAcceptance){
4585     // kine particles, all or rather charged
4586     if(!fMCEvent) return iCount;
4587     
4588     for(Int_t it=0; it<fMCEvent->GetNumberOfTracks(); ++it){
4589       AliMCParticle* part = (AliMCParticle*) fMCEvent->GetTrack(it);
4590       
4591       if(type == kTrackKineCharged || type == kTrackKineChargedAcceptance){
4592         if(part->Charge()==0) continue;
4593         
4594         if(type == kTrackKineChargedAcceptance && 
4595            (       part->Eta() < fTrackEtaMin
4596                 || part->Eta() > fTrackEtaMax
4597                 || part->Phi() < fTrackPhiMin
4598                 || part->Phi() > fTrackPhiMax 
4599                 || part->Pt()  < fTrackPtCut)) continue;
4600       }
4601       
4602       list->Add(part);
4603       iCount++;
4604     }
4605   }
4606   else if (type==kTrackAODMCCharged || type==kTrackAODMCAll || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec) {
4607     // MC particles (from AOD), physical primaries, all or rather charged or rather charged within acceptance
4608     if(!fAOD) return -1;
4609     
4610     TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
4611     if(!tca)return iCount;
4612     
4613     for(int it=0; it<tca->GetEntriesFast(); ++it){
4614       AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
4615       if(!part)continue;
4616       if(type != kTrackAODMCChargedSec && !part->IsPhysicalPrimary())continue;
4617       if(type == kTrackAODMCChargedSec && part->IsPhysicalPrimary())continue;
4618       
4619       if (type==kTrackAODMCCharged || type==kTrackAODMCChargedAcceptance || type==kTrackAODMCChargedSec){
4620         if(part->Charge()==0) continue;
4621         if(type==kTrackAODMCChargedAcceptance && 
4622            (     part->Eta() > fTrackEtaMax
4623               || part->Eta() < fTrackEtaMin
4624               || part->Phi() > fTrackPhiMax
4625               || part->Phi() < fTrackPhiMin
4626               || part->Pt()  < fTrackPtCut)) continue;
4627       }
4628       
4629       list->Add(part);
4630       iCount++;
4631     }
4632   }
4633   
4634   list->Sort();
4635   return iCount;
4636   
4637 }
4638 // _______________________________________________________________________________
4639 Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t type)
4640 {
4641   // fill list of jets selected according to type
4642
4643   if(!list){
4644     if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4645     return -1;
4646   }
4647
4648   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4649
4650     if(fBranchRecJets.Length()==0){
4651       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4652       if(fDebug>1)fAOD->Print();
4653       return 0;
4654     }
4655
4656     TClonesArray *aodRecJets = 0; 
4657     if(fBranchRecJets.Length())      aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecJets.Data()));
4658     if(!aodRecJets)                  aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecJets.Data()));
4659     if(fAODExtension&&!aodRecJets)   aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecJets.Data()));
4660
4661     if(!aodRecJets){
4662       if(fBranchRecJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecJets.Data());
4663       if(fDebug>1)fAOD->Print();
4664       return 0;
4665     }
4666
4667     // Reorder jet pt and fill new temporary AliAODJet objects
4668     Int_t nRecJets = 0;
4669     
4670     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4671
4672       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4673       if(!tmp) continue;
4674
4675       if( tmp->Pt() < fJetPtCut ) continue;
4676       if( type == kJetsRecAcceptance &&
4677           (    tmp->Eta() < fJetEtaMin
4678             || tmp->Eta() > fJetEtaMax
4679             || tmp->Phi() < fJetPhiMin
4680             || tmp->Phi() > fJetPhiMax )) continue;
4681
4682       if(fBckgSubMethod && fBranchRecJets.Contains("B0") &&
4683          fBranchRecJets.Contains("KT")) {
4684
4685         AliAODJet *tmpJet = GetAODBckgSubJet(tmp, fBckgSubMethod);
4686         
4687         if(!tmpJet) continue;
4688
4689         list->Add(tmpJet);
4690
4691         nRecJets++;
4692       }
4693       else {
4694         list->Add(tmp);
4695         
4696         nRecJets++;
4697       }
4698     }
4699     
4700     list->Sort();
4701     
4702     return nRecJets;
4703   }
4704   else if(type == kJetsKine || type == kJetsKineAcceptance){
4705     
4706     // generated jets
4707     Int_t nGenJets = 0;
4708     
4709     if(!fMCEvent){
4710       if(fDebug>1) Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
4711       return 0;
4712     }
4713    
4714     AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
4715     AliGenPythiaEventHeader*  pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
4716     AliGenHijingEventHeader*  hijingGenHeader = 0x0;
4717
4718     if(!pythiaGenHeader){
4719       hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
4720       
4721       if(!hijingGenHeader){
4722          Printf("%s:%d no pythiaGenHeader or hijingGenHeader found", (char*)__FILE__,__LINE__);
4723          return 0;
4724       }else{
4725          TLorentzVector mom[4];
4726          AliAODJet* jet[4];
4727          hijingGenHeader->GetJets(mom[0], mom[1], mom[2], mom[3]);
4728
4729          for(Int_t i=0; i<2; ++i){
4730             if(!mom[i].Pt()) continue;
4731             jet[i] = new AliAODJet(mom[i]);
4732
4733             if( type == kJetsKineAcceptance &&
4734                 (    jet[i]->Eta() < fJetEtaMin
4735                   || jet[i]->Eta() > fJetEtaMax
4736                   || jet[i]->Phi() < fJetPhiMin
4737                   || jet[i]->Phi() > fJetPhiMax )) continue;
4738
4739             list->Add(jet[i]);
4740             nGenJets++;
4741          }
4742          list->Sort();
4743          return nGenJets;
4744       }
4745     }
4746     
4747     // fetch the pythia generated jets
4748     for(int ip=0; ip<pythiaGenHeader->NTriggerJets(); ++ip){
4749       
4750       Float_t p[4];
4751       AliAODJet *jet = new AliAODJet();
4752       pythiaGenHeader->TriggerJet(ip, p);
4753       jet->SetPxPyPzE(p[0], p[1], p[2], p[3]);
4754
4755       if( type == kJetsKineAcceptance &&
4756           (    jet->Eta() < fJetEtaMin
4757             || jet->Eta() > fJetEtaMax
4758             || jet->Phi() < fJetPhiMin
4759             || jet->Phi() > fJetPhiMax )) continue;
4760       
4761         list->Add(jet);
4762         nGenJets++;
4763     }
4764     list->Sort();
4765     return nGenJets;
4766   }
4767   else if(type == kJetsGen || type == kJetsGenAcceptance ){
4768
4769     if(fBranchGenJets.Length()==0){
4770       if(fDebug>1) Printf("%s:%d no gen jet branch specified", (char*)__FILE__,__LINE__);
4771       return 0;
4772     }
4773     
4774     TClonesArray *aodGenJets = 0;
4775     if(fBranchGenJets.Length()) aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchGenJets.Data()));
4776     if(!aodGenJets)             aodGenJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchGenJets.Data()));
4777     if(fAODExtension&&!aodGenJets)   aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGenJets.Data()));
4778
4779     if(!aodGenJets){
4780       if(fDebug>0){
4781         if(fBranchGenJets.Length()) Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGenJets.Data());
4782       }
4783       if(fDebug>1)fAOD->Print();
4784       return 0;
4785     }
4786
4787     Int_t nGenJets = 0;
4788     
4789     for(Int_t ig=0; ig<aodGenJets->GetEntries(); ++ig){
4790           
4791       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
4792       if(!tmp) continue;
4793           
4794       if( tmp->Pt() < fJetPtCut ) continue;
4795       if( type == kJetsGenAcceptance &&
4796           (    tmp->Eta() < fJetEtaMin
4797             || tmp->Eta() > fJetEtaMax
4798             || tmp->Phi() < fJetPhiMin
4799             || tmp->Phi() > fJetPhiMax )) continue;
4800       
4801         list->Add(tmp);
4802         nGenJets++;
4803     }
4804     list->Sort();
4805     return nGenJets;
4806   } 
4807   else if(type == kJetsEmbedded){ // embedded jets
4808
4809     if(fBranchEmbeddedJets.Length()==0){
4810       Printf("%s:%d no embedded jet branch specified", (char*)__FILE__,__LINE__);
4811       if(fDebug>1)fAOD->Print();
4812       return 0;
4813     }
4814
4815     TClonesArray *aodEmbeddedJets = 0; 
4816     if(fBranchEmbeddedJets.Length())      aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchEmbeddedJets.Data()));
4817     if(!aodEmbeddedJets)                  aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchEmbeddedJets.Data()));
4818     if(fAODExtension&&!aodEmbeddedJets)   aodEmbeddedJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchEmbeddedJets.Data()));
4819
4820     if(!aodEmbeddedJets){
4821       if(fBranchEmbeddedJets.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchEmbeddedJets.Data());
4822       if(fDebug>1)fAOD->Print();
4823       return 0;
4824     }
4825
4826     // Reorder jet pt and fill new temporary AliAODJet objects
4827     Int_t nEmbeddedJets = 0;
4828     
4829     for(Int_t ij=0; ij<aodEmbeddedJets->GetEntries(); ++ij){
4830
4831       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodEmbeddedJets->At(ij));
4832       if(!tmp) continue;
4833
4834       if( tmp->Pt() < fJetPtCut ) continue;
4835       if(    tmp->Eta() < fJetEtaMin
4836           || tmp->Eta() > fJetEtaMax
4837           || tmp->Phi() < fJetPhiMin
4838           || tmp->Phi() > fJetPhiMax ) continue;
4839       
4840       list->Add(tmp);
4841       nEmbeddedJets++;
4842     }
4843     
4844     list->Sort();
4845     
4846     return nEmbeddedJets;
4847   }
4848   else{
4849     if(fDebug>0)Printf("%s:%d no such type %d",(char*)__FILE__,__LINE__,type);
4850     return 0;
4851   }
4852 }
4853
4854 // ___________________________________________________________________________________
4855 Int_t AliAnalysisTaskFragmentationFunction::GetListOfBckgJets(TList *list, Int_t type)  
4856 {
4857   // fill list of bgr clusters selected according to type
4858
4859   if(type == kJetsRec || type == kJetsRecAcceptance){ // reconstructed jets
4860
4861     if(fBranchRecBckgClusters.Length()==0){ 
4862       Printf("%s:%d no rec jet branch specified", (char*)__FILE__,__LINE__);
4863       if(fDebug>1)fAOD->Print();
4864       return 0;
4865     }
4866     
4867     TClonesArray *aodRecJets = 0; 
4868     if(fBranchRecBckgClusters.Length()) aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fBranchRecBckgClusters.Data()));
4869     if(!aodRecJets)                     aodRecJets = dynamic_cast<TClonesArray*>(fAODJets->GetList()->FindObject(fBranchRecBckgClusters.Data()));
4870     if(fAODExtension&&!aodRecJets)      aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRecBckgClusters.Data()));    
4871
4872     if(!aodRecJets){
4873       if(fBranchRecBckgClusters.Length()) Printf("%s:%d no reconstructed jet array with name %s in AOD", (char*)__FILE__,__LINE__,fBranchRecBckgClusters.Data());
4874       if(fDebug>1)fAOD->Print();
4875       return 0;
4876     }
4877     
4878     // Reorder jet pt and fill new temporary AliAODJet objects
4879     Int_t nRecJets = 0;
4880     
4881     for(Int_t ij=0; ij<aodRecJets->GetEntries(); ++ij){
4882       
4883       AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ij));
4884       if(!tmp) continue;
4885
4886       // if( tmp->Pt() < fJetPtCut ) continue; // no pt cut on bckg clusters !
4887       if( type == kJetsRecAcceptance &&
4888           (    tmp->Eta() < fJetEtaMin
4889                || tmp->Eta() > fJetEtaMax
4890                || tmp->Phi() < fJetPhiMin
4891                || tmp->Phi() > fJetPhiMax )) continue;
4892             
4893       list->Add(tmp);
4894         
4895       nRecJets++;
4896       
4897     }
4898     
4899     list->Sort();
4900     
4901     return nRecJets;
4902   }
4903
4904   //  /*
4905   // MC clusters still Under construction
4906   //  */
4907
4908   return 0;
4909
4910
4911 // _________________________________________________________________________________________________________
4912 void AliAnalysisTaskFragmentationFunction::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
4913 {
4914   // Set properties of THnSparse 
4915
4916   for(Int_t i=0; i<dim; i++){
4917     h->GetAxis(i)->SetTitle(labels[i]);
4918     h->GetAxis(i)->SetTitleColor(1);
4919   }
4920 }
4921
4922 // __________________________________________________________________________________________
4923 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y)
4924 {
4925   //Set properties of histos (x and y title)
4926
4927   h->SetXTitle(x);
4928   h->SetYTitle(y);
4929   h->GetXaxis()->SetTitleColor(1);
4930   h->GetYaxis()->SetTitleColor(1);
4931 }
4932
4933 // _________________________________________________________________________________________________________
4934 void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, const char* y, const char* z)
4935 {
4936   //Set properties of histos (x,y and z title)
4937
4938   h->SetXTitle(x);
4939   h->SetYTitle(y);
4940   h->SetZTitle(z);
4941   h->GetXaxis()->SetTitleColor(1);
4942   h->GetYaxis()->SetTitleColor(1);
4943   h->GetZaxis()->SetTitleColor(1);
4944 }
4945
4946 // ________________________________________________________________________________________________________________________________________________________
4947 void AliAnalysisTaskFragmentationFunction::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
4948                                                                 const Double_t radius, Double_t& sumPt, const Double_t maxPt, Bool_t& isBadMaxPt)
4949 {
4950   // fill list of tracks in cone around jet axis  
4951
4952   sumPt = 0;
4953   isBadMaxPt = kFALSE;
4954
4955   std::cout<<" enter GetJetTracksPointing, maxPt "<<maxPt<<std::endl;
4956
4957   Double_t jetMom[3];
4958   jet->PxPyPz(jetMom);
4959   TVector3 jet3mom(jetMom);
4960
4961   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
4962
4963     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
4964     if(!track)continue;
4965     Double_t trackMom[3];
4966     track->PxPyPz(trackMom);
4967     TVector3 track3mom(trackMom);
4968
4969     Double_t dR = jet3mom.DeltaR(track3mom);
4970
4971     if(dR<radius){
4972
4973       outputlist->Add(track);
4974       
4975       sumPt += track->Pt();
4976
4977       if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
4978       if(maxPt>0 && track->Pt()>maxPt) std::cout<<" found bad jet, track pt "<<track->Pt()<<" max Pt "<<maxPt<<std::endl;
4979     }
4980   }
4981
4982   std::cout<<" leave GetJetTracksPointing, maxPt "<<maxPt<<" isBadMaxPt "<<isBadMaxPt<<std::endl;
4983
4984
4985   outputlist->Sort();
4986 }
4987
4988 // ___________________________________________________________________________________________
4989 void AliAnalysisTaskFragmentationFunction::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t maxPt, Bool_t& isBadMaxPt)
4990 {
4991   // list of jet tracks from trackrefs
4992   
4993   Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
4994
4995   for (Int_t itrack=0; itrack<nTracks; itrack++) {
4996     
4997     AliVParticle* track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(itrack));
4998     if(!track){
4999       AliError("expected ref track not found ");
5000       continue;
5001     }
5002         
5003     if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE;
5004     list->Add(track);
5005   }
5006   
5007   list->Sort();
5008 }
5009
5010 // _ ________________________________________________________________________________________________________________________________
5011 void  AliAnalysisTaskFragmentationFunction::AssociateGenRec(TList* tracksAODMCCharged,TList* tracksRec, TArrayI& indexAODTr,TArrayI& indexMCTr,
5012                                                             TArrayS& isRefGen,TH2F* fh2PtRecVsGen)
5013 {
5014   // associate generated and reconstructed tracks, fill TArrays of list indices
5015
5016   Int_t nTracksRec  = tracksRec->GetSize();
5017   Int_t nTracksGen  = tracksAODMCCharged->GetSize();
5018   TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
5019
5020
5021   if(!nTracksGen) return;
5022   if(!tca)        return;
5023   
5024   // set size
5025   indexAODTr.Set(nTracksGen);
5026   indexMCTr.Set(nTracksRec);
5027   isRefGen.Set(nTracksGen);
5028
5029   indexAODTr.Reset(-1);
5030   indexMCTr.Reset(-1);
5031   isRefGen.Reset(0);
5032
5033   // loop over reconstructed tracks, get generated track 
5034
5035   for(Int_t iRec=0; iRec<nTracksRec; iRec++){ 
5036       
5037     AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5038     if(!rectrack)continue;
5039     Int_t label = TMath::Abs(rectrack->GetLabel());
5040
5041     // find MC track in our list
5042     AliAODMCParticle* gentrack = dynamic_cast<AliAODMCParticle*> (tca->At(label));
5043    
5044     Int_t listIndex = -1;
5045     if(gentrack) listIndex = tracksAODMCCharged->IndexOf(gentrack);
5046
5047     if(listIndex>=0){
5048
5049       indexAODTr[listIndex] = iRec;
5050       indexMCTr[iRec]       = listIndex;
5051     }
5052   }
5053
5054
5055   // define reference sample of primaries/secondaries (for reconstruction efficiency / contamination)
5056
5057   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5058
5059     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksAODMCCharged->At(iGen));
5060     if(!gentrack)continue;
5061     Int_t pdg = gentrack->GetPdgCode();    
5062
5063     // 211 - pi, 2212 - proton, 321 - Kaon, 11 - electron, 13 - muon
5064     if(TMath::Abs(pdg) == 211 || TMath::Abs(pdg) == 2212 || TMath::Abs(pdg) == 321 || 
5065        TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13){
5066       
5067       isRefGen[iGen] = kTRUE;
5068
5069       Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5070
5071       if(iRec>=0){
5072         Float_t genPt = gentrack->Pt();
5073         AliAODTrack* vt = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5074         if(vt){
5075           Float_t recPt = vt->Pt();
5076           fh2PtRecVsGen->Fill(genPt,recPt);
5077         }
5078       }
5079     }
5080   }
5081 }
5082
5083 // _____________________________________________________________________________________________________________________________________________
5084 void AliAnalysisTaskFragmentationFunction::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
5085                                                                        const TArrayI& indexAODTr, const TArrayS& isRefGen){
5086
5087   // fill QA for single track reconstruction efficiency
5088   
5089   Int_t nTracksGen  = tracksGen->GetSize();
5090
5091   if(!nTracksGen) return;
5092
5093   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5094
5095     if(isRefGen[iGen] != 1) continue; // select primaries
5096
5097     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5098     if(!gentrack) continue;
5099     Double_t ptGen  = gentrack->Pt();
5100     Double_t etaGen = gentrack->Eta();
5101     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5102
5103     // apply same acc & pt cuts as for FF 
5104
5105     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5106     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5107     if(ptGen  < fTrackPtCut) continue;
5108
5109     if(trackQAGen) trackQAGen->FillTrackQA(etaGen, phiGen, ptGen);
5110    
5111
5112     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5113     if(iRec>=0 && trackQARec) trackQARec->FillTrackQA(etaGen, phiGen, ptGen);
5114   }
5115 }
5116
5117 // ______________________________________________________________________________________________________________________________________________________
5118
5119 void  AliAnalysisTaskFragmentationFunction::FillJetTrackHistosRecGen(TObject* histGen,TObject* histRec,Double_t jetPtGen,Double_t jetPtRec, TList* jetTrackList, const TList* tracksGen,
5120                                                                      const TArrayI& indexAODTr,const TArrayS& isRefGen, const Bool_t useRecJetPt)
5121 {
5122   // fill objects for jet track reconstruction efficiency or secondaries contamination 
5123   // arguments histGen/histRec can be of different type: AliFragFuncHistos*, AliFragFuncIntraJetHistos*, ...
5124
5125   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5126
5127   if(!nTracksJet) return; 
5128
5129   Bool_t incrementJetPtGenFF = kTRUE; // needed in case we fill FFHistos
5130   Bool_t incrementJetPtRecFF = kTRUE; // needed in case we fill FFHistos
5131
5132   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5133
5134     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5135     if(!gentrack)continue;
5136     // find jet track in gen tracks list
5137     Int_t iGen = tracksGen->IndexOf(gentrack); 
5138
5139     if(iGen<0){
5140       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5141       continue;
5142     }
5143
5144
5145     if(isRefGen[iGen] != 1) continue; // select primaries
5146
5147     Double_t ptGen  = gentrack->Pt();
5148     Double_t etaGen = gentrack->Eta();
5149     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5150
5151     // apply same acc & pt cuts as for FF 
5152
5153     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5154     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5155     if(ptGen  < fTrackPtCut) continue;
5156
5157     Double_t z = ptGen / jetPtGen;
5158     Double_t xi = 0;
5159     if(z>0) xi = TMath::Log(1/z);
5160
5161     Int_t iRec   = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5162     Bool_t isRec = (iRec>=0) ? kTRUE : kFALSE; 
5163
5164     if(dynamic_cast<AliFragFuncHistos*>(histGen) || dynamic_cast<AliFragFuncHistos*>(histRec)){ // histGen can be NULL for secondaries -> ||
5165       
5166       // after checking can afford normal cast
5167       AliFragFuncHistos* ffhistGen =  (AliFragFuncHistos*) (histGen); 
5168       AliFragFuncHistos* ffhistRec =  (AliFragFuncHistos*) (histRec); 
5169
5170       if(ffhistGen){
5171         if(useRecJetPt) ffhistGen->FillFF( ptGen, jetPtRec, incrementJetPtGenFF );
5172         else            ffhistGen->FillFF( ptGen, jetPtGen, incrementJetPtGenFF );
5173         
5174         incrementJetPtGenFF = kFALSE;
5175       }
5176
5177       
5178       if(ffhistRec && isRec){
5179         
5180         if(useRecJetPt) ffhistRec->FillFF( ptGen, jetPtRec, incrementJetPtRecFF );
5181         else            ffhistRec->FillFF( ptGen, jetPtGen, incrementJetPtRecFF );
5182         
5183         incrementJetPtRecFF = kFALSE;
5184       }
5185     }
5186     else if(dynamic_cast<AliFragFuncIntraJetHistos*>(histGen) && dynamic_cast<AliFragFuncIntraJetHistos*>(histRec)){
5187       
5188       // eff for IJ histos ...
5189       
5190     }
5191   }
5192 }
5193
5194 // _____________________________________________________________________________________________________________________________________________
5195 void AliAnalysisTaskFragmentationFunction::FillTwoTrackHistosRecGen(TList* tracksGen, /*TList* tracksRec, const TArrayI& indexAODTr, */ const TArrayS& isRefGen){
5196
5197   Int_t nTracksGen  = tracksGen->GetSize();
5198   
5199   if(!nTracksGen) return;
5200   
5201   Int_t highPtIndices[nTracksGen];
5202   Int_t nHighPt = 0;
5203   
5204   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5205     
5206     if(isRefGen[iGen] != 1) continue; // select primaries
5207     
5208     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5209     if(!gentrack) continue;
5210     Double_t ptGen  = gentrack->Pt();
5211     Double_t etaGen = gentrack->Eta();
5212     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5213     
5214     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5215     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5216      
5217     if(ptGen>10 ){ 
5218       highPtIndices[nHighPt++] = iGen;
5219     }
5220   }
5221   
5222
5223   for(Int_t nHPT = 0; nHPT<nHighPt; nHPT++){ // high pt tracks loop
5224     
5225     Int_t indexHPT = highPtIndices[nHPT];
5226     
5227     AliAODMCParticle* genHPTtrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(indexHPT));
5228     if(!genHPTtrack) continue;
5229     
5230     Double_t trackMomHPT[3];
5231     genHPTtrack->PxPyPz(trackMomHPT);
5232     TVector3 track3MomHPT(trackMomHPT);
5233
5234     
5235     Double_t distNN   = 10;
5236     Double_t ptNN     = 0;
5237     Int_t    indexNN  = -1;
5238
5239     for(Int_t iGen=0; iGen<nTracksGen; iGen++){ // all gen tracks loop
5240       
5241       if(isRefGen[iGen] != 1) continue; // select primaries
5242       
5243       AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5244       if(!gentrack) continue;
5245       
5246       Double_t ptGen  = gentrack->Pt();
5247       Double_t etaGen = gentrack->Eta();
5248       Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5249       
5250       if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5251       if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5252       if(ptGen  < fTrackPtCut) continue;
5253       
5254       
5255       Double_t gentrackMom[3];
5256       gentrack->PxPyPz(gentrackMom);
5257       TVector3 gentrack3Mom(gentrackMom);
5258       
5259       Double_t dR = gentrack3Mom.DeltaR(track3MomHPT);
5260       
5261       if(iGen != indexHPT && dR<distNN){
5262         distNN   = dR;
5263         ptNN     = ptGen;
5264         indexNN  = iGen;
5265       }
5266     }
5267   }
5268 }
5269
5270 // _____________________________________________________________________________________________________________________________________________
5271 void AliAnalysisTaskFragmentationFunction::FillSingleTrackResponse(THnSparse* hnResponse, TList* tracksGen,  TList* tracksRec,
5272                                                                    const TArrayI& indexAODTr, const TArrayS& isGenPrim)
5273 {
5274   // fill response matrix for single tracks 
5275   
5276
5277   Int_t nTracksGen  = tracksGen->GetSize();
5278
5279   if(!nTracksGen) return;
5280
5281   for(Int_t iGen=0; iGen<nTracksGen; iGen++){
5282
5283     if(isGenPrim[iGen] != 1) continue; // select primaries
5284
5285     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (tracksGen->At(iGen));
5286     if(!gentrack)continue;
5287     Double_t ptGen  = gentrack->Pt();
5288     Double_t etaGen = gentrack->Eta();
5289     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5290
5291     // apply same acc & pt cuts as for FF 
5292     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5293     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5294     if(ptGen  < fTrackPtCut) continue;
5295
5296     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5297     if(iRec>=0){ 
5298       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5299       if(!rectrack)continue;
5300       Double_t ptRec = rectrack->Pt();
5301       
5302       Double_t entries[2] = {ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5303       hnResponse->Fill(entries);
5304
5305       Double_t invPtGen = 0;
5306       if(ptGen) invPtGen = 1/ptGen;
5307
5308       Double_t invPtRec = 0;
5309       if(ptRec) invPtRec = 1/ptRec;
5310
5311       fh2SingleInvPtRecMnGenVsPtGen->Fill(ptGen,invPtRec - invPtGen);
5312     }
5313   }
5314 }
5315
5316
5317 // ______________________________________________________________________________________________________________________________________________________
5318 void AliAnalysisTaskFragmentationFunction::FillJetTrackResponse(THnSparse* hnResponsePt, THnSparse* hnResponseZ, THnSparse* hnResponseXi, 
5319                                                                 Double_t jetPtGen, Double_t jetPtRec, TList* jetTrackList, 
5320                                                                 const TList* tracksGen, TList* tracksRec, const TArrayI& indexAODTr, const TArrayS& isGenPrim,const Bool_t useRecJetPt)
5321 {
5322   // fill response matrix for tracks in jets
5323   
5324   Int_t nTracksJet = jetTrackList->GetSize(); // list with AODMC tracks
5325
5326   if(!nTracksJet) return; 
5327
5328   for(Int_t iTr=0; iTr<nTracksJet; iTr++){
5329
5330     AliAODMCParticle* gentrack =  dynamic_cast<AliAODMCParticle*> (jetTrackList->At(iTr));
5331     if(!gentrack)continue;
5332     // find jet track in gen tracks list
5333     Int_t iGen = tracksGen->IndexOf(gentrack); 
5334
5335     if(iGen<0){
5336       if(fDebug>0) Printf("%s:%d gen jet track not found ",(char*)__FILE__,__LINE__);
5337       continue;
5338     }
5339
5340     if(isGenPrim[iGen] != 1) continue; // select primaries
5341     
5342     Double_t ptGen  = gentrack->Pt();
5343     Double_t etaGen = gentrack->Eta();
5344     Double_t phiGen = TVector2::Phi_0_2pi(gentrack->Phi());
5345
5346     // apply same acc & pt cuts as for FF 
5347
5348     if(etaGen < fTrackEtaMin || etaGen > fTrackEtaMax) continue;
5349     if(phiGen < fTrackPhiMin || phiGen > fTrackPhiMax) continue;
5350     if(ptGen  < fTrackPtCut) continue;
5351
5352     Double_t zGen = ptGen / jetPtRec;
5353     Double_t xiGen = 0;
5354     if(zGen>0) xiGen = TMath::Log(1/zGen);
5355
5356     Int_t iRec = indexAODTr[iGen]; // can be -1 if no good reconstructed track 
5357
5358     if(iRec>=0){
5359
5360       AliAODTrack* rectrack = dynamic_cast<AliAODTrack*>(tracksRec->At(iRec)); 
5361       if(rectrack){
5362         Double_t ptRec = rectrack->Pt();
5363         
5364         Double_t zRec    = ptRec / jetPtRec;
5365         Double_t xiRec   = 0;
5366         if(zRec>0) xiRec = TMath::Log(1/zRec);
5367       
5368         Double_t jetPt = useRecJetPt ? jetPtRec : jetPtGen;
5369         
5370         Double_t entriesPt[3] = {jetPt,ptRec,ptGen}; // AliCorrFW convention: gen vs rec
5371         Double_t entriesZ[3]  = {jetPt,zRec,zGen}; 
5372         Double_t entriesXi[3] = {jetPt,xiRec,xiGen}; 
5373         
5374         hnResponsePt->Fill(entriesPt);
5375         hnResponseZ->Fill(entriesZ);
5376         hnResponseXi->Fill(entriesXi);
5377       }
5378     } 
5379   }
5380 }
5381
5382 // _____________________________________________________________________________________________________________________________________________________________________
5383 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxis(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt)
5384 {
5385   // List of tracks in cone perpendicular to the jet azimuthal direction
5386
5387   Double_t jetMom[3];
5388   jet->PxPyPz(jetMom);
5389
5390   TVector3 jet3mom(jetMom);
5391   // Rotate phi and keep eta unchanged
5392   Double_t etaTilted = jet3mom.Eta();
5393   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5394   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5395
5396   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5397
5398     // embedded tracks
5399     if( fUseExtraTracksBgr != 1){
5400       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5401         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5402         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5403       }
5404     }
5405     
5406     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5407     if(!track)continue;
5408     Double_t trackMom[3];
5409     track->PxPyPz(trackMom);
5410     TVector3 track3mom(trackMom);
5411
5412     Double_t deta = track3mom.Eta() - etaTilted;
5413     Double_t dphi = TMath::Abs(track3mom.Phi() - phiTilted);
5414     if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
5415     Double_t dR = TMath::Sqrt(deta * deta + dphi * dphi);
5416
5417     if(dR<=radius){
5418       outputlist->Add(track);
5419       sumPt += track->Pt();
5420     }
5421   }
5422
5423 }
5424
5425 // ________________________________________________________________________________________________________________________________________________________
5426 void AliAnalysisTaskFragmentationFunction::GetTracksTiltedwrpJetAxisWindow(Float_t alpha, TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius,Double_t& sumPt,Double_t &normFactor)
5427 {
5428   // List of tracks in cone perpendicular to the jet azimuthal direction
5429
5430   Double_t jetMom[3];
5431   jet->PxPyPz(jetMom);
5432
5433   TVector3 jet3mom(jetMom);
5434   // Rotate phi and keep eta unchanged
5435   Double_t etaTilted = jet3mom.Eta();
5436   Double_t phiTilted = TVector2::Phi_0_2pi(jet3mom.Phi()) + alpha;
5437   if(phiTilted > 2*TMath::Pi()) phiTilted = phiTilted - 2*TMath::Pi();
5438
5439   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++)
5440     {
5441
5442       // embedded tracks
5443       if( fUseExtraTracksBgr != 1){
5444         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5445           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5446           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5447         }
5448       }
5449       
5450       AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5451       if(!track)continue;
5452       Float_t trackEta = track->Eta();
5453       Float_t trackPhi = track->Phi();
5454
5455       if( ( phiTilted-radius >= 0 ) && ( phiTilted+radius <= 2*TMath::Pi()))
5456         {
5457           if((trackPhi<=phiTilted+radius) && 
5458              (trackPhi>=phiTilted-radius) &&
5459              (trackEta<=fTrackEtaMax)&&(trackEta>=fTrackEtaMin)) // 0.9 and - 0.9
5460             {
5461               outputlist->Add(track);
5462               sumPt += track->Pt();
5463             }
5464         }
5465       else if( phiTilted-radius < 0 ) 
5466         {
5467           if((( trackPhi < phiTilted+radius ) ||
5468               ( trackPhi > 2*TMath::Pi()-(radius-phiTilted) )) &&
5469              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5470             {
5471               outputlist->Add(track);
5472               sumPt += track->Pt();
5473             }
5474         }
5475       else if( phiTilted+radius > 2*TMath::Pi() )
5476         {
5477           if((( trackPhi > phiTilted-radius ) ||
5478               ( trackPhi < phiTilted+radius-2*TMath::Pi() )) &&
5479              (( trackEta <= fTrackEtaMax ) && ( trackEta >= fTrackEtaMin ))) 
5480             {
5481               outputlist->Add(track);
5482               sumPt += track->Pt();
5483             }
5484         }
5485     }
5486
5487   // Jet area - Temporarily added should be modified with the proper jet area value
5488   Float_t areaJet = CalcJetArea(etaTilted,radius);
5489   Float_t areaTilted = 2*radius*(fTrackEtaMax-fTrackEtaMin);
5490
5491   normFactor = (Float_t) 1. / (areaJet / areaTilted);
5492
5493 }
5494
5495
5496 // ________________________________________________________________________________________________________________________________________________________
5497 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJets(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt)
5498 {
5499   // List of tracks outside cone around N jet axis  
5500   // Particles taken randomly
5501
5502   sumPt = 0;
5503   //  Int_t   nj  = jetlist->GetSize();
5504   Float_t rc  = GetFFRadius();
5505   Float_t rcl = GetFFBckgRadius();
5506
5507   // Estimate jet and background areas
5508   Float_t* areaJet = new Float_t[nCases];
5509   memset(areaJet, 0, sizeof(Float_t) * nCases);
5510   Float_t* areaJetLarge = new Float_t[nCases];
5511   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5512   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5513   Float_t areaOut = areaFull;
5514
5515   //estimate jets and background areas
5516   Int_t nOut = 0;
5517   Int_t ijet = 0;
5518   TList* templist = new TList();
5519   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5520
5521   for(Int_t ij=0; ij<nCases; ++ij) 
5522     {
5523       // Get jet information
5524       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5525       if(!jet)continue;
5526       TVector3 jet3mom;
5527       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5528       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5529       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5530
5531       // Jet area
5532       areaJet[ij] = CalcJetArea(etaJet,rc);
5533
5534       // Area jet larger angle
5535       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5536
5537       // Outside jet area
5538       areaOut = areaOut - areaJetLarge[ij];
5539       ijet++;
5540     }
5541
5542   // List of all tracks outside jet areas
5543   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5544     
5545     // embedded tracks
5546     if( fUseExtraTracksBgr != 1){
5547       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5548         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5549         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5550       }
5551     }
5552
5553     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5554     if(!track)continue;
5555     Double_t trackMom[3];
5556     track->PxPyPz(trackMom);
5557     TVector3 track3mom(trackMom);
5558     
5559     Double_t *dR = new Double_t[nCases];
5560     for(Int_t ij=0; ij<nCases; ij++)
5561         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5562
5563     if((nCases==1 && (dR[0]>rcl)) ||
5564        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5565        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5566       {
5567         templist->Add(track);
5568         nOut++;
5569       }
5570     delete [] dR;
5571   }
5572
5573   // Take tracks randomly
5574   Int_t nScaled = (Int_t) (nOut * areaJet[0] / areaOut + 0.5);
5575   TArrayI* ar = new TArrayI(nOut);
5576
5577   for(Int_t init=0; init<nOut; init++)
5578     (*ar)[init] = init;
5579
5580   Int_t *randIndex = new Int_t[nScaled];
5581   for(Int_t init2=0; init2<nScaled; init2++)
5582     randIndex[init2] = -1;
5583
5584   // Select nScaled different random numbers in nOut
5585   for(Int_t i=0; i<nScaled; i++)
5586     {
5587       Int_t* tmpArr = new Int_t[nOut-i];
5588       Int_t temp = fRandom->Integer(nOut-i);
5589       for(Int_t ind = 0; ind< ar->GetSize()-1; ind++)
5590         {
5591           if(ind<temp) tmpArr[ind] = (*ar)[ind];
5592           else tmpArr[ind] = (*ar)[ind+1];
5593         }
5594       randIndex[i] = (*ar)[temp];
5595
5596       ar->Set(nOut-i-1,tmpArr);
5597
5598       delete [] tmpArr;
5599
5600     }
5601
5602   for(Int_t ipart=0; ipart<nScaled; ipart++)
5603     {
5604       AliVParticle* track = (AliVParticle*)(templist->At(randIndex[ipart]));
5605       outputlist->Add(track);
5606       sumPt += track->Pt();
5607     }
5608
5609   outputlist->Sort();
5610
5611   delete vect3Jet;
5612   delete templist;
5613   delete [] areaJetLarge;
5614   delete [] areaJet;
5615   delete ar;
5616   delete [] randIndex;
5617
5618 }
5619
5620 // ________________________________________________________________________________________________________________________________________________________
5621 void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJetsStat(Int_t nCases, TList* inputlist, TList* outputlist, TList* jetlist, Double_t& sumPt, Double_t &normFactor)
5622 {
5623   // List of tracks outside cone around N jet axis  
5624   // All particles taken + final scaling factor 
5625
5626   sumPt = 0;
5627   Float_t rc  = GetFFRadius();
5628   Float_t rcl = GetFFBckgRadius();
5629
5630   // Estimate jet and background areas
5631   Float_t* areaJet = new Float_t[nCases];
5632   memset(areaJet, 0, sizeof(Float_t) * nCases);
5633   Float_t* areaJetLarge = new Float_t[nCases];
5634   memset(areaJetLarge, 0, sizeof(Float_t) * nCases);
5635   Float_t areaFull = (fTrackEtaMax-fTrackEtaMin)*(fTrackPhiMax-fTrackPhiMin);
5636   Float_t areaOut = areaFull;
5637
5638   //estimate jets and background areas
5639   Int_t nOut = 0;
5640   Int_t ijet = 0;
5641   TClonesArray *vect3Jet = new TClonesArray("TVector3",nCases);
5642
5643   for(Int_t ij=0; ij<nCases; ++ij) 
5644     {
5645       // Get jet information
5646       AliAODJet* jet = dynamic_cast<AliAODJet*>(jetlist->At(ij));
5647       if(!jet)continue;
5648       TVector3 jet3mom;
5649       jet3mom.SetPtEtaPhi(jet->Pt(),jet->Eta(),jet->Phi());
5650       new((*vect3Jet)[ijet]) TVector3((TVector3)jet3mom);
5651       Float_t etaJet = (Float_t)((TVector3*) vect3Jet->At(ij))->Eta();
5652
5653       // Jet area
5654       areaJet[ij] = CalcJetArea(etaJet,rc);
5655
5656       // Area jet larger angle
5657       areaJetLarge[ij] = CalcJetArea(etaJet,rcl);
5658
5659       // Outside jets area
5660       areaOut = areaOut - areaJetLarge[ij];
5661       ijet++;
5662     }
5663
5664   for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
5665     
5666     // embedded tracks
5667     if( fUseExtraTracksBgr != 1){
5668       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (inputlist->At(itrack))){
5669         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5670         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5671       }
5672     }
5673
5674     AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
5675     if(!track)continue;
5676     Double_t trackMom[3];
5677     track->PxPyPz(trackMom);
5678     TVector3 track3mom(trackMom);
5679     
5680     Double_t *dR = new Double_t[nCases];
5681     for(Int_t ij=0; ij<nCases; ij++)
5682         dR[ij] = (Double_t)((TVector3*) vect3Jet->At(ij))->DeltaR(track3mom);
5683
5684     if((nCases==0) ||
5685        (nCases==1 && (dR[0]>rcl)) ||
5686        (nCases==2 && (dR[0]>rcl && dR[1]>rcl)) ||
5687        (nCases==3 && (dR[0]>rcl && dR[1]>rcl && dR[2]>rcl)))
5688       {
5689         outputlist->Add(track);
5690         sumPt += track->Pt();
5691         nOut++;
5692       }
5693     delete [] dR;
5694   }
5695
5696   if(nCases==0) areaJet[0] = TMath::Pi()*rc*rc;
5697   normFactor = (Float_t) 1./(areaJet[0] / areaOut); 
5698
5699   outputlist->Sort();
5700
5701   delete vect3Jet;
5702   delete [] areaJetLarge;
5703   delete [] areaJet;
5704
5705 }
5706
5707 // ______________________________________________________________________________________________________________________________________________________
5708 Float_t AliAnalysisTaskFragmentationFunction::CalcJetArea(const Float_t etaJet, const Float_t rc) const
5709 {
5710   // calculate area of jet with eta etaJet and radius rc
5711
5712   Float_t detamax = etaJet + rc;
5713   Float_t detamin = etaJet - rc;
5714   Float_t accmax = 0.0; Float_t accmin = 0.0;
5715   if(detamax > fTrackEtaMax){ // sector outside etamax
5716     Float_t h = fTrackEtaMax - etaJet;
5717     accmax = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5718   }
5719   if(detamin < fTrackEtaMin){ // sector outside etamin
5720     Float_t h = fTrackEtaMax + etaJet;
5721     accmin = rc*rc*TMath::ACos(h/rc) - h*TMath::Sqrt(rc*rc - h*h);
5722   }
5723   Float_t areaJet = rc*rc*TMath::Pi() - accmax - accmin;
5724   
5725   return areaJet;
5726
5727 }
5728
5729 // ___________________________________________________________________________________________________________________________
5730 void AliAnalysisTaskFragmentationFunction::GetClusterTracksOutOf1Jet(AliAODJet* jet, TList* outputlist, Double_t &normFactor)
5731 {
5732   // fill tracks from bckgCluster branch in list, 
5733   // for all clusters outside jet cone 
5734   // sum up total area of clusters
5735
5736   Double_t rc  = GetFFRadius();
5737   Double_t rcl = GetFFBckgRadius();
5738     
5739   Double_t areaTotal   = 0;
5740   Double_t sumPtTotal  = 0;
5741
5742   for(Int_t ij=0; ij<fBckgJetsRec->GetEntries(); ++ij){
5743       
5744     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij)); // not 'recCuts': use all clusters in full eta range
5745     
5746     Double_t dR = jet->DeltaR(bgrCluster);  
5747          
5748     if(dR<rcl) continue;
5749          
5750     Double_t clusterPt = bgrCluster->Pt();
5751     Double_t area      = bgrCluster->EffectiveAreaCharged();
5752     areaTotal  += area;
5753     sumPtTotal += clusterPt;
5754     
5755     Int_t nTracksJet = bgrCluster->GetRefTracks()->GetEntries();
5756
5757     for(Int_t it = 0; it<nTracksJet; it++){
5758         
5759       // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5760       if( fUseExtraTracksBgr != 1){
5761         if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (bgrCluster->GetTrack(it))){
5762           if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5763           if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5764         }
5765       }
5766
5767       AliVParticle*   track = dynamic_cast<AliVParticle*>(bgrCluster->GetTrack(it));
5768       if(!track) continue;
5769         
5770       Float_t trackPt  = track->Pt();
5771       Float_t trackEta = track->Eta();
5772       Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5773         
5774       if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5775       if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5776       if(trackPt  < fTrackPtCut) continue;
5777         
5778       outputlist->Add(track);
5779     }
5780   }
5781     
5782   Double_t areaJet = TMath::Pi()*rc*rc;
5783   if(areaTotal) normFactor = (Float_t) 1./(areaJet / areaTotal); 
5784
5785   outputlist->Sort();
5786 }    
5787
5788 // _______________________________________________________________________________________________________________________
5789 void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputlist, Double_t &normFactor)
5790 {
5791   // fill tracks from bckgCluster branch, 
5792   // using cluster with median density (odd number of clusters) 
5793   // or picking randomly one of the two closest to median (even number)
5794   
5795   normFactor = 0;
5796
5797   Int_t nBckgClusters = fBckgJetsRec->GetEntries(); // not 'recCuts': use all clusters in full eta range
5798
5799   if(nBckgClusters<3) return; // need at least 3 clusters (skipping 2 highest)
5800
5801   Double_t* bgrDensity = new Double_t[nBckgClusters];
5802   Int_t*    indices    = new Int_t[nBckgClusters];
5803     
5804   for(Int_t ij=0; ij<nBckgClusters; ++ij){
5805       
5806     AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij));
5807     Double_t clusterPt    = bgrCluster->Pt();
5808     Double_t area         = bgrCluster->EffectiveAreaCharged();
5809       
5810     Double_t density = 0;
5811     if(area>0) density = clusterPt/area;
5812
5813     bgrDensity[ij] = density;
5814     indices[ij]    = ij;
5815   }
5816    
5817   TMath::Sort(nBckgClusters, bgrDensity, indices); 
5818   
5819   // get median cluster
5820
5821   AliAODJet* medianCluster = 0;
5822   Double_t   medianDensity = 0;
5823
5824   if(TMath::Odd(nBckgClusters)){
5825     
5826     Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters-1))];
5827     medianCluster = (AliAODJet*)(fBckgJetsRec->At(medianIndex));
5828     
5829     Double_t clusterPt = medianCluster->Pt();
5830     Double_t area      = medianCluster->EffectiveAreaCharged();
5831     
5832     if(area>0) medianDensity = clusterPt/area;
5833   }
5834   else{
5835
5836     Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters-1)];
5837     Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters)];
5838
5839     AliAODJet* medianCluster1 = (AliAODJet*)(fBckgJetsRec->At(medianIndex1));
5840     AliAODJet* medianCluster2 = (AliAODJet*)(fBckgJetsRec->At(medianIndex2));
5841     
5842     Double_t density1 = 0;
5843     Double_t clusterPt1 = medianCluster1->Pt();
5844     Double_t area1      = medianCluster1->EffectiveAreaCharged();
5845     if(area1>0) density1 = clusterPt1/area1;
5846     
5847     Double_t density2 = 0;
5848     Double_t clusterPt2 = medianCluster2->Pt();
5849     Double_t area2      = medianCluster2->EffectiveAreaCharged();
5850     if(area2>0) density2 = clusterPt2/area2;
5851     
5852     medianDensity = 0.5*(density1+density2);
5853     
5854     medianCluster = ( (fRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 );  // select one randomly to avoid adding areas
5855   }
5856     
5857   Int_t nTracksJet = medianCluster->GetRefTracks()->GetEntries();
5858
5859   for(Int_t it = 0; it<nTracksJet; it++){
5860         
5861     // embedded tracks - note: using ref tracks here, fBranchRecBckgClusters has to be consistent
5862     if( fUseExtraTracksBgr != 1){
5863       if(AliAODTrack* trackAOD = dynamic_cast<AliAODTrack*> (medianCluster->GetTrack(it))){
5864         if(fUseExtraTracksBgr == 0  &&  ((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5865         if(fUseExtraTracksBgr == -1 && !((trackAOD->GetFlags() & AliESDtrack::kEmbedded)>0)) continue; 
5866       }
5867     }
5868
5869     AliVParticle* track = dynamic_cast<AliVParticle*>(medianCluster->GetTrack(it));
5870     if(!track) continue;
5871         
5872     Float_t trackPt  = track->Pt();
5873     Float_t trackEta = track->Eta();
5874     Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
5875     
5876     if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
5877     if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
5878     if(trackPt  < fTrackPtCut) continue;
5879         
5880     outputlist->Add(track);
5881   }     
5882     
5883   Double_t areaMedian = medianCluster->EffectiveAreaCharged();
5884   Double_t areaJet = TMath::Pi()*GetFFRadius()*GetFFRadius();
5885   
5886   if(areaMedian) normFactor = (Float_t) 1./(areaJet / areaMedian); 
5887   
5888   outputlist->Sort();
5889
5890   delete[] bgrDensity;
5891   delete[] indices; 
5892 }    
5893
5894 // ______________________________________________________________________________________________________________________________________________________
5895 void AliAnalysisTaskFragmentationFunction::FillBckgHistos(Int_t type, TList* inputtracklist, TList* inputjetlist, AliAODJet* jet, Float_t leadTrackPt, TLorentzVector* leadTrackV,
5896                                                           AliFragFuncHistos* ffbckghistocuts, AliFragFuncHistos* ffbckghistoleading, 
5897                                                           AliFragFuncIntraJetHistos* ijbckghistocuts, AliFragFuncIntraJetHistos* ijbckghistoleading,   
5898                                                           AliFragFuncQATrackHistos* qabckghistocuts){
5899
5900   // List of tracks outside jets for background study
5901   TList* tracklistout2jets     = new TList();
5902   TList* tracklistout3jets     = new TList();
5903   TList* tracklistout2jetsStat = new TList();
5904   TList* tracklistout3jetsStat = new TList();
5905   Double_t sumPtOut2Jets       = 0.;
5906   Double_t sumPtOut3Jets       = 0.;
5907   Double_t sumPtOut2JetsStat   = 0.;
5908   Double_t sumPtOut3JetsStat   = 0.;
5909   Double_t normFactor2Jets     = 0.;
5910   Double_t normFactor3Jets     = 0.;
5911
5912   Int_t nRecJetsCuts = fJetsRecCuts->GetEntries();
5913
5914   if(nRecJetsCuts>1) {
5915     GetTracksOutOfNJets(2,inputtracklist, tracklistout2jets, inputjetlist, sumPtOut2Jets);
5916     GetTracksOutOfNJetsStat(2,inputtracklist, tracklistout2jetsStat, inputjetlist,sumPtOut2JetsStat, normFactor2Jets);
5917
5918   }
5919   if(nRecJetsCuts>2) {
5920     GetTracksOutOfNJets(3,inputtracklist, tracklistout3jets, inputjetlist, sumPtOut3Jets);
5921     GetTracksOutOfNJetsStat(3,inputtracklist, tracklistout3jetsStat, inputjetlist, sumPtOut3JetsStat, normFactor3Jets);
5922   }
5923
5924   if(type==kBckgOutLJ || type==kBckgOutAJ)
5925     {
5926       TList* tracklistoutleading   = new TList();
5927       Double_t sumPtOutLeading     = 0.; 
5928       GetTracksOutOfNJets(1,inputtracklist, tracklistoutleading, inputjetlist, sumPtOutLeading);
5929       if(type==kBckgOutLJ) fh1OutLeadingMult->Fill(tracklistoutleading->GetSize());
5930       
5931       for(Int_t it=0; it<tracklistoutleading->GetSize(); ++it){
5932
5933         AliVParticle* trackVP   = (AliVParticle*)(tracklistoutleading->At(it));
5934         if(!trackVP) continue;
5935         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
5936         
5937         Float_t jetPt   = jet->Pt();
5938         Float_t trackPt = trackV->Pt();
5939         
5940         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
5941
5942         if(type==kBckgOutLJ)
5943           {
5944             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt);
5945             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
5946             
5947             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt);
5948             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
5949             
5950             // Fill track QA for background
5951             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
5952           }
5953
5954         // All cases included
5955         if(nRecJetsCuts==1 && type==kBckgOutAJ)
5956           {
5957             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
5958             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
5959             
5960             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
5961             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
5962           }
5963         delete trackV;
5964       }
5965       // Increment jet pt with one entry in case #tracks outside jets = 0
5966       if(tracklistoutleading->GetSize()==0) {
5967          Float_t jetPt = jet->Pt();
5968          Bool_t incrementJetPt = kTRUE;
5969          if(type==kBckgOutLJ)
5970           {
5971             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
5972             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
5973           }
5974         // All cases included
5975         if(nRecJetsCuts==1 && type==kBckgOutAJ)
5976           {
5977             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
5978             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
5979           }
5980       }
5981       delete tracklistoutleading;
5982     }
5983   if(type==kBckgOutLJStat || type==kBckgOutAJStat)
5984     { 
5985       TList* tracklistoutleadingStat   = new TList();
5986       Double_t sumPtOutLeadingStat = 0.; 
5987       Double_t normFactorLeading   = 0.;
5988
5989       GetTracksOutOfNJetsStat(1,inputtracklist, tracklistoutleadingStat, inputjetlist, sumPtOutLeadingStat, normFactorLeading);
5990       if(type==kBckgOutLJStat) fh1OutLeadingStatMult->Fill(tracklistoutleadingStat->GetSize());
5991
5992       for(Int_t it=0; it<tracklistoutleadingStat->GetSize(); ++it){
5993
5994         AliVParticle* trackVP   = dynamic_cast<AliVParticle*>(tracklistoutleadingStat->At(it));
5995         if(!trackVP) continue;
5996         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
5997         
5998         Float_t jetPt   = jet->Pt();
5999         Float_t trackPt = trackV->Pt();
6000         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6001         
6002         // Stat plots
6003         if(type==kBckgOutLJStat)
6004           {
6005             if(fFFMode)ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6006             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading);
6007             
6008             if(fFFMode)ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6009             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading);
6010             
6011             // Fill track QA for background
6012             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt); // OB added bgr QA
6013           }
6014
6015         // All cases included
6016         if(nRecJetsCuts==1 && type==kBckgOutAJStat)
6017           {
6018             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorLeading);
6019             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorLeading );
6020             
6021             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorLeading);
6022             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorLeading );
6023
6024             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6025
6026           }
6027         delete trackV;
6028       }
6029       // Increment jet pt with one entry in case #tracks outside jets = 0
6030       if(tracklistoutleadingStat->GetSize()==0) {
6031          Float_t jetPt = jet->Pt();
6032          Bool_t incrementJetPt = kTRUE;
6033          if(type==kBckgOutLJStat)
6034           {
6035             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6036             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading);
6037           }
6038         // All cases included
6039         if(nRecJetsCuts==1 && type==kBckgOutLJStat)
6040           {
6041             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorLeading);
6042             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorLeading );
6043           }
6044       }
6045
6046       delete tracklistoutleadingStat;
6047     }
6048
6049   if(type==kBckgPerp)
6050     {
6051       Double_t sumPtPerp = 0.;
6052       TList* tracklistperp = new TList();
6053       GetTracksTiltedwrpJetAxis(TMath::Pi()/2., inputtracklist,tracklistperp,jet,GetFFRadius(),sumPtPerp);
6054       fh1PerpMult->Fill(tracklistperp->GetSize());
6055       
6056       for(Int_t it=0; it<tracklistperp->GetSize(); ++it){
6057         
6058         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperp->At(it));
6059         if(!trackVP)continue;
6060         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6061         
6062         Float_t jetPt   = jet->Pt();
6063         Float_t trackPt = trackV->Pt();
6064         
6065         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6066
6067         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6068         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6069         
6070         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6071         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6072         
6073         // Fill track QA for background
6074         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6075         
6076         delete trackV;
6077       }
6078       // Increment jet pt with one entry in case #tracks outside jets = 0
6079       if(tracklistperp->GetSize()==0) {
6080          Float_t jetPt = jet->Pt();
6081          Bool_t incrementJetPt = kTRUE;
6082          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6083          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6084       }
6085
6086       delete tracklistperp;
6087     }
6088
6089  if(type==kBckgASide)
6090     {
6091       Double_t sumPtASide = 0.;
6092       TList* tracklistaside = new TList();
6093       GetTracksTiltedwrpJetAxis(TMath::Pi(),inputtracklist,tracklistaside,jet,GetFFRadius(),sumPtASide);
6094       fh1ASideMult->Fill(tracklistaside->GetSize());
6095
6096       for(Int_t it=0; it<tracklistaside->GetSize(); ++it){
6097         
6098         AliVParticle*   trackVP = (AliVParticle*)(tracklistaside->At(it));
6099         if(!trackVP) continue;
6100         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6101
6102         Float_t jetPt   = jet->Pt();
6103         Float_t trackPt = trackV->Pt();
6104
6105         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6106
6107         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6108         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6109
6110         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6111         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6112
6113         // Fill track QA for background
6114         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6115
6116         delete trackV;
6117       }
6118       if(tracklistaside->GetSize()==0) {
6119          Float_t jetPt = jet->Pt();
6120          Bool_t incrementJetPt = kTRUE;
6121          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6122          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6123       }
6124
6125       delete tracklistaside;
6126     }
6127
6128   if(type==kBckgASideWindow)
6129     {
6130       Double_t normFactorASide = 0.;
6131       Double_t sumPtASideW = 0.;
6132       TList* tracklistasidew = new TList();
6133       GetTracksTiltedwrpJetAxisWindow(TMath::Pi(),inputtracklist,tracklistasidew,jet,GetFFRadius(),sumPtASideW,normFactorASide);
6134       fh1ASideWindowMult->Fill(tracklistasidew->GetSize());
6135
6136       for(Int_t it=0; it<tracklistasidew->GetSize(); ++it){
6137
6138         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistasidew->At(it));
6139         if(!trackVP) continue;
6140         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6141
6142         Float_t jetPt   = jet->Pt();
6143         Float_t trackPt = trackV->Pt();
6144         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6145
6146         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorASide);
6147         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorASide);
6148
6149         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorASide );
6150         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorASide );
6151
6152         // Fill track QA for background
6153         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorASide);
6154
6155         delete trackV;
6156       }
6157       if(tracklistasidew->GetSize()==0) {
6158          Float_t jetPt = jet->Pt();
6159          Bool_t incrementJetPt = kTRUE;
6160          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorASide);
6161          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorASide);
6162       }
6163
6164       delete tracklistasidew;
6165     }
6166
6167   if(type==kBckgPerpWindow)
6168     {
6169       Double_t normFactorPerp = 0.;
6170       Double_t sumPtPerpW = 0.;
6171       TList* tracklistperpw = new TList();
6172       GetTracksTiltedwrpJetAxisWindow(TMath::Pi()/2.,inputtracklist,tracklistperpw,jet,GetFFRadius(),sumPtPerpW,normFactorPerp);
6173       fh1PerpWindowMult->Fill(tracklistperpw->GetSize());
6174
6175       for(Int_t it=0; it<tracklistperpw->GetSize(); ++it){
6176         
6177         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistperpw->At(it));
6178         if(!trackVP) continue;
6179         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6180
6181         Float_t jetPt   = jet->Pt();
6182         Float_t trackPt = trackV->Pt();
6183         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6184
6185         if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorPerp);
6186         if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactorPerp);
6187
6188         if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactorPerp );
6189         if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactorPerp );
6190
6191         // Fill track QA for background
6192         if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt, kFALSE, normFactorPerp);
6193
6194         delete trackV;
6195       }
6196       if(tracklistperpw->GetSize()==0) {
6197          Float_t jetPt = jet->Pt();
6198          Bool_t incrementJetPt = kTRUE;
6199          if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactorPerp);
6200          if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactorPerp);
6201       }
6202
6203       delete tracklistperpw;
6204     }
6205
6206
6207   if(type==kBckgOut2J || type==kBckgOutAJ)
6208     {
6209       if(type==kBckgOut2J) fh1Out2JetsMult->Fill(tracklistout2jets->GetSize());
6210       for(Int_t it=0; it<tracklistout2jets->GetSize(); ++it){
6211
6212         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jets->At(it));
6213         if(!trackVP) continue;
6214         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6215         
6216         Float_t jetPt   = jet->Pt();
6217         Float_t trackPt = trackV->Pt();
6218         
6219         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6220
6221         if(type==kBckgOut2J)
6222           {
6223             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6224             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6225             
6226             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6227             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6228             
6229             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6230           }
6231
6232         // All cases included
6233         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6234           {
6235             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6236             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6237             
6238             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6239             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6240           }
6241         delete trackV;
6242       }
6243       // Increment jet pt with one entry in case #tracks outside jets = 0
6244       if(tracklistout2jets->GetSize()==0) {
6245          Float_t jetPt = jet->Pt();
6246          Bool_t incrementJetPt = kTRUE;
6247          if(type==kBckgOut2J)
6248           {
6249             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6250             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6251           }
6252         // All cases included
6253         if(nRecJetsCuts==2 && type==kBckgOutAJ)
6254           {
6255             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6256             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6257           }
6258       }
6259
6260     }
6261
6262   if(type==kBckgOut2JStat || type==kBckgOutAJStat)
6263     {
6264       for(Int_t it=0; it<tracklistout2jetsStat->GetSize(); ++it){
6265         
6266         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout2jetsStat->At(it));
6267         if(!trackVP) continue;
6268         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6269         
6270         Float_t jetPt   = jet->Pt();
6271         Float_t trackPt = trackV->Pt();
6272         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6273         
6274         if(type==kBckgOut2JStat)
6275           {
6276             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6277             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6278             
6279             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6280             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6281             
6282             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6283           }
6284
6285         // All cases included
6286         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6287           {
6288             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor2Jets);
6289             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor2Jets );
6290             
6291             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor2Jets);
6292             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor2Jets );
6293
6294             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA 
6295           }
6296         delete trackV;
6297       }
6298       // Increment jet pt with one entry in case #tracks outside jets = 0
6299       if(tracklistout2jetsStat->GetSize()==0) {
6300          Float_t jetPt = jet->Pt();
6301          Bool_t incrementJetPt = kTRUE;
6302          if(type==kBckgOut2JStat)
6303            {
6304             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6305             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets);
6306           }
6307         // All cases included
6308         if(nRecJetsCuts==2 && type==kBckgOutAJStat)
6309           {
6310             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor2Jets);
6311             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor2Jets );
6312           }
6313       }
6314       
6315     }
6316
6317   if(type==kBckgOut3J || type==kBckgOutAJ)
6318     {
6319       if(type==kBckgOut3J) fh1Out3JetsMult->Fill(tracklistout3jets->GetSize());
6320       
6321       for(Int_t it=0; it<tracklistout3jets->GetSize(); ++it){
6322         
6323         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jets->At(it));
6324         if(!trackVP) continue;
6325         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6326         
6327         Float_t jetPt   = jet->Pt();
6328         Float_t trackPt = trackV->Pt();
6329         
6330         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6331         
6332         if(type==kBckgOut3J)
6333           {
6334             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6335             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6336             
6337             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6338             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6339             
6340             qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt);
6341           }
6342
6343         // All cases included
6344         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6345           {
6346             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt );
6347             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector() );
6348             
6349             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt );
6350             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV );
6351           }
6352         delete trackV;
6353       }
6354       // Increment jet pt with one entry in case #tracks outside jets = 0
6355       if(tracklistout3jets->GetSize()==0) {
6356          Float_t jetPt = jet->Pt();
6357          Bool_t incrementJetPt = kTRUE;
6358          if(type==kBckgOut3J)
6359           {
6360             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6361             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6362           }
6363         // All cases included
6364         if(nRecJetsCuts==3 && type==kBckgOutAJ)
6365           {
6366             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt );
6367             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt );
6368           }
6369       }
6370     }
6371
6372   if(type==kBckgOut3JStat || type==kBckgOutAJStat)
6373     {
6374       for(Int_t it=0; it<tracklistout3jetsStat->GetSize(); ++it){
6375         
6376         AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistout3jetsStat->At(it));
6377         if(!trackVP) continue;
6378         TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6379         
6380         Float_t jetPt   = jet->Pt();
6381         Float_t trackPt = trackV->Pt();
6382         Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6383
6384         if(type==kBckgOut3JStat)
6385           {
6386             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets);
6387             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6388             
6389             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets);
6390             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets);
6391             
6392             //if(fQAMode&1)     qabckghistocuts->FillTrackQA( trackEta, TVector2::Phi_0_2pi(trackPhi), trackPt);
6393           }
6394
6395         // All cases included
6396         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6397           {
6398             if(fFFMode) ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactor3Jets );
6399             if(fIJMode) ijbckghistocuts->FillIntraJet( trackV, jet->MomentumVector(), normFactor3Jets);
6400             
6401             if(fFFMode) ffbckghistoleading->FillFF( trackPt, leadTrackPt , incrementJetPt, normFactor3Jets );
6402             if(fIJMode) ijbckghistoleading->FillIntraJet( trackV, leadTrackV, normFactor3Jets );
6403
6404             if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); // OB added bgr QA
6405
6406           }
6407         delete trackV;
6408       }
6409       // Increment jet pt with one entry in case #tracks outside jets = 0
6410       if(tracklistout3jetsStat->GetSize()==0) {
6411          Float_t jetPt = jet->Pt();
6412          Bool_t incrementJetPt = kTRUE;
6413          if(type==kBckgOut3JStat)
6414           {
6415             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6416             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets);
6417           }
6418         // All cases included
6419         if(nRecJetsCuts==3 && type==kBckgOutAJStat)
6420           {
6421             if(fFFMode) ffbckghistocuts->FillFF( -1., jetPt, incrementJetPt, normFactor3Jets);
6422             if(fFFMode) ffbckghistoleading->FillFF( -1., leadTrackPt , incrementJetPt, normFactor3Jets );
6423           }
6424       }
6425
6426     }
6427
6428   if(type==kBckgClustersOutLeading){ // clusters bgr: all tracks in clusters out of leading jet
6429     
6430     TList* tracklistClustersOutLeading = new TList();
6431     Double_t normFactorClusters = 0;
6432     Float_t jetPt   = jet->Pt();
6433     
6434     GetClusterTracksOutOf1Jet(jet, tracklistClustersOutLeading, normFactorClusters);
6435     fh1OutClustersMult->Fill(tracklistClustersOutLeading->GetSize());
6436     
6437     for(Int_t it=0; it<tracklistClustersOutLeading->GetSize(); ++it){
6438       
6439       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersOutLeading->At(it));
6440       if(!trackVP) continue;
6441       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6442       
6443       Float_t trackPt = trackVP->Pt();
6444       
6445       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6446       
6447       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6448       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt ); 
6449
6450       delete trackV;
6451     }
6452     
6453     delete tracklistClustersOutLeading;
6454     
6455   }
6456   
6457   if(type == kBckgClusters){ // clusters bgr: all tracks in 'median cluster' 
6458     
6459     TList* tracklistClustersMedian = new TList();
6460     Double_t normFactorClusters = 0;
6461     Float_t jetPt = jet->Pt();
6462     
6463     GetClusterTracksMedian(tracklistClustersMedian, normFactorClusters); 
6464     fh1MedianClustersMult->Fill(tracklistClustersMedian->GetSize());
6465
6466     for(Int_t it=0; it<tracklistClustersMedian->GetSize(); ++it){
6467       
6468       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(tracklistClustersMedian->At(it));
6469       if(!trackVP) continue;
6470       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
6471       
6472       Float_t trackPt = trackVP->Pt();
6473       
6474       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
6475       
6476       if(fFFMode)   ffbckghistocuts->FillFF( trackPt, jetPt, incrementJetPt, normFactorClusters );
6477       if(fQAMode&1) qabckghistocuts->FillTrackQA( trackV->Eta(), TVector2::Phi_0_2pi(trackV->Phi()), trackPt );
6478       
6479       delete trackV;
6480     }
6481     
6482     delete tracklistClustersMedian;
6483   }
6484   
6485   delete tracklistout2jets;
6486   delete tracklistout3jets;
6487   delete tracklistout2jetsStat;
6488   delete tracklistout3jetsStat;
6489   
6490 }
6491
6492 // ______________________________________________________________________________________________________________________________________________________
6493 AliAODJet* AliAnalysisTaskFragmentationFunction::GetAODBckgSubJet(AliAODJet* jet, Int_t method)
6494 {
6495   // correct jet pt for (mean bgr energy density) x (jet area) 
6496
6497   if(!fBranchRecBackJets.Length()){
6498     if(fDebug>0)Printf("%s:%d background branch name not set",(char*)__FILE__,__LINE__);
6499     return 0;
6500   }
6501
6502   static AliAODJetEventBackground*   externalBackground =  (AliAODJetEventBackground*)(fAOD->FindListObject(fBranchRecBackJets.Data()));
6503
6504   if(!externalBackground){
6505     if(fDebug>0)Printf("%s:%d no external background object found in %s",(char*)__FILE__,__LINE__,fBranchRecBackJets.Data());
6506     return 0;
6507   }
6508
6509   Float_t rho = externalBackground->GetBackground(method);
6510
6511   // Calculate background and subtract it from jet pt
6512   Float_t ptBack = rho*jet->EffectiveAreaCharged();
6513   Float_t ptSub = jet->Pt()-ptBack;
6514
6515   // Get px, py, pz from eta, phi, pt
6516   TLorentzVector vecSub;
6517   AliAODJet *tmpJet = 0;
6518   if(ptSub>=0){
6519     vecSub.SetPtEtaPhiM(ptSub,jet->Eta(),jet->Phi(),0.);
6520     tmpJet = new AliAODJet(vecSub.Px(),vecSub.Py(),vecSub.Pz(),vecSub.P());
6521   }
6522
6523   return tmpJet;
6524 }