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