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