]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/EMCALJetTasks/UserTasks/AliAnalysisTaskChargedJetsPA.cxx
18d2e8cc0d46832e4100db1654cdfa93d0346ddf
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / UserTasks / AliAnalysisTaskChargedJetsPA.cxx
1 #include "AliAnalysisTaskChargedJetsPA.h"
2
3 //TODO: Not accessing the particles when using MC
4 //TODO: FillHistogram can be done better with virtual TH1(?)
5 ClassImp(AliAnalysisTaskChargedJetsPA)
6
7 // ######################################################################################## DEFINE HISTOGRAMS
8 void AliAnalysisTaskChargedJetsPA::Init()
9 {
10   #ifdef DEBUGMODE
11     AliInfo("Creating histograms.");
12   #endif
13   // NOTE: Track & Cluster & QA histograms
14   if (fAnalyzeQA)
15   {
16   
17     AddHistogram1D<TH1D>("hNumberEvents", "Number of events (0 = before, 1 = after vertex cuts)", "", 2, 0, 2, "#Delta z(cm)","N^{Events}/cut");
18       
19     AddHistogram1D<TH1D>("hAppliedEtaCorrectionFactor", "Applied #eta correction factor for the k_{T} background", "", 500, 0.5, 1.5, "Correction factor","dN^{Jets}/df");
20     AddHistogram1D<TH1D>("hAppliedEtaCorrectionFactor2", "Applied #eta correction factor for the k_{T} background 2", "", 500, 0.5, 1.5, "Correction factor","dN^{Jets}/df");
21     AddHistogram1D<TH1D>("hVertexZ", "Z distribution of the vertex", "", 400, -40., 40., "#Delta z(cm)","dN^{Events}/dz");
22
23     AddHistogram1D<TH1D>("hVertexR", "R distribution of the vertex", "", 100, 0., 1., "#Delta r(cm)","dN^{Events}/dr");
24     AddHistogram1D<TH1D>("hCentrality", "Centrality distribution", "", 5, 0., 100., "Centrality (classes)","dN^{Events}");
25
26     AddHistogram2D<TH2D>("hTrackCountAcc", "Number of tracks in acceptance vs. centrality", "LEGO2", 750, 0., 750., 5, 0, 100, "N tracks","Centrality", "dN^{Events}/dN^{Tracks}");
27     AddHistogram2D<TH2D>("hTrackPhiEta", "Track angular distribution", "LEGO2", 100, 0., 2*TMath::Pi(),100, -2.5, 2.5, "#phi","#eta","dN^{Tracks}/(d#phi d#eta)");
28     AddHistogram1D<TH1D>("hTrackPt", "Tracks p_{T} distribution", "", 20000, 0., 200., "p_{T} (GeV/c)","dN^{Tracks}/dp_{T}");
29     AddHistogram1D<TH1D>("hTrackCharge", "Charge", "", 11, -5, 5, "Charge (e)","dN^{Tracks}/dq");
30     AddHistogram1D<TH1D>("hTrackEta", "Track #eta distribution", "", 180, -fTrackEtaWindow, +fTrackEtaWindow, "#eta","dN^{Tracks}/d#eta");
31
32     AddHistogram2D<TH2D>("hClusterCountAcc", "Number of clusters in acceptance vs. centrality", "LEGO2", 750, 0., 750., 5, 0, 100, "N clusters","Centrality", "dN^{Events}/dN^{Clusters}");
33     AddHistogram1D<TH1D>("hClusterE", "Clusters energy distribution", "", 20000, 0., 200., "p_{T} (GeV/c)","dN^{Cluster}/dp_{T}");
34   }
35
36   // NOTE: Pythia histograms
37   if (fAnalyzePythia)
38   {
39     AddHistogram1D<TH1D>("hPythiaPtHard", "Pythia p_{T} hard distribution", "", 2000, 0, 400, "p_{T} hard","dN^{Events}/dp_{T,hard}");
40     AddHistogram1D<TProfile>("hPythiaXSection", "Pythia cross section distribution", "", fNumPtHardBins+2, -1, fNumPtHardBins+1, "p_{T} hard bin","dN^{Events}/dp_{T,hard}");
41     AddHistogram1D<TH1D>("hPythiaNTrials", "Pythia trials (no correction for manual cuts)", "", fNumPtHardBins+2, -1, fNumPtHardBins+1, "p_{T} hard bin", "Trials");
42   }
43
44   // NOTE: Jet histograms
45   if (fAnalyzeJets)
46   {
47     // ######## Jet spectra
48     AddHistogram1D<TH1D>("hJetPt", "Jets p_{T} distribution", "", 1000, 0., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
49     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedRC", "Jets p_{T} distribution, RC background subtracted", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
50     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedKT", "Jets p_{T} distribution, KT background subtracted, corrected for eta dependence)", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
51     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedKTNoEtaCorr", "Jets p_{T} distribution, KT background subtracted", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
52     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedKT2", "Jets p_{T} distribution, KT background 2 subtracted, corrected for eta dependence)", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
53     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedKT2NoEtaCorr", "Jets p_{T} distribution, KT background 2 subtracted", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
54
55     AddHistogram1D<TH1D>("hJetPtBgrdSubtractedTR", "Jets p_{T} distribution, Track background subtracted", "", 500, -50., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
56
57
58     AddHistogram1D<TH1D>("hJetArea", "Jets area distribution", "", 200, 0., 2., "Area","dN^{Jets}/dA");
59     AddHistogram2D<TH2D>("hJetPtArea", "Jets p_{T} distribution", "LEGO2", 1000, 0., 200.,100, 0., 1., "p_{T} (GeV/c)","Area","dN^{Jets}/(dp_{T}dA)");
60     AddHistogram1D<TH1D>("hJetDeltaPhi", "Jets combinatorial #Delta #phi", "", 250, 0., TMath::Pi(), "#Delta #phi","dN^{Jets}/d(#Delta #phi)");
61     AddHistogram2D<TH2D>("hJetDeltaPhiPt", "Jets combinatorial #Delta #phi vs. p_{T}", "LEGO2", 250, 0., TMath::Pi(), 20, 0.,100., "#Delta #phi","max(p_{T,1},p_{T,2}) (GeV/c)","dN^{Jets}/d(#Delta #phi)dp_{T}");
62     AddHistogram1D<TH1D>("hLeadingJetDeltaPhi", "1st and 2nd leading jet #Delta #phi", "", 250, 0., TMath::Pi(), "#Delta #phi","dN^{Jets}/d(#Delta #phi)");
63     AddHistogram2D<TH2D>("hLeadingJetDeltaPhiPt", "1st and 2nd leading jet #Delta #phi vs. p_{T}", "LEGO2", 250, 0., TMath::Pi(),20, 0.,100., "#Delta #phi","1st leading p_{T} (GeV/c)","dN^{Jets}/d(#Delta #phi)dp_{T}");
64     AddHistogram2D<TH2D>("hJetPtEta", "Jets p_{T} distribution", "LEGO2", 1000, 0., 200.,100, -0.6, 0.6, "p_{T} (GeV/c)","#eta","dN^{Jets}/(dp_{T}d#eta)");
65     AddHistogram2D<TH2D>("hJetPtPhi", "Jets p_{T} #phi distribution", "LEGO2", 1000, 0., 200.,100, 0.0, TMath::TwoPi(), "p_{T} (GeV/c)","#phi","dN^{Jets}/(dp_{T}d#phi)");
66     AddHistogram2D<TH2D>("hJetPtCentrality", "Jets p_{T} distribution", "LEGO2", 1000, 0., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
67     AddHistogram2D<TH2D>("hJetPhiEta", "Jets angular distribution", "LEGO2", 100, 0., 2*TMath::Pi(),100, -0.6, 0.6, "#phi","#eta","dN^{Jets}/(d#phi d#eta)");
68     AddHistogram1D<TH1D>("hJetCountAll", "Number of Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
69     AddHistogram1D<TH1D>("hJetCountAccepted", "Number of accepted Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
70
71     AddHistogram1D<TH1D>("hLeadingJetPt", "Leading jet p_{T}", "", 500,  0, 100, "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
72     AddHistogram1D<TH1D>("hSecondLeadingJetPt", "Second Leading jet p_{T}", "", 500,  0, 100, "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
73
74     AddHistogram1D<TH1D>("hDijetConstituentsPt", "Dijet constituents p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
75     AddHistogram1D<TH1D>("hDijetLeadingJetPt", "Dijet leading jet p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
76     AddHistogram2D<TH2D>("hDijetPtCorrelation", "Dijet constituents p_{T} correlation", "COLZ", 500, 5., 100., 500, 5., 100., "1st leading jet p_{T} (GeV/c)","2nd leading jet p_{T} (GeV/c)","dN^{Dijets}/d^{2}p_{T}");
77
78     AddHistogram1D<TH1D>("hDijet2ConstituentsPt", "Dijet2 constituents p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
79     AddHistogram1D<TH1D>("hDijet2LeadingJetPt", "Dijet2 leading jet p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
80     AddHistogram2D<TH2D>("hDijet2PtCorrelation", "Dijet2 constituents p_{T} correlation", "COLZ", 500, 5., 100., 500, 5., 100., "1st leading jet p_{T} (GeV/c)","2nd leading jet p_{T} (GeV/c)","dN^{Dijets}/d^{2}p_{T}");
81
82   }
83   // NOTE: Jet background histograms
84   if (fAnalyzeBackground)
85   {
86     // ########## Delta Pt
87     AddHistogram1D<TH1D>("hDeltaPtKT", "Background fluctuations #delta p_{T} (KT, 0 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
88     AddHistogram1D<TH1D>("hDeltaPtKT1Excl", "Background fluctuations #delta p_{T} (KT, 1 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
89     AddHistogram1D<TH1D>("hDeltaPtKT2Excl", "Background fluctuations #delta p_{T} (KT, 2 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
90
91     Double_t dptEtaMin = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins *  fKTDeltaPtEtaBin;
92     Double_t dptEtaMax = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins * (fKTDeltaPtEtaBin+1);
93
94     AddHistogram1D<TH1D>("hDeltaPtKTEta", Form("Background fluctuations #delta p_{T} (KT, 0 jets excluded, #eta=%1.3f to %1.3f)", dptEtaMin,dptEtaMax), "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
95     AddHistogram1D<TH1D>("hDeltaPtKTEta1Excl", Form("Background fluctuations #delta p_{T} (KT, 1 jets excluded, #eta=%1.3f to %1.3f)", dptEtaMin,dptEtaMax), "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
96     AddHistogram1D<TH1D>("hDeltaPtKTEta2Excl", Form("Background fluctuations #delta p_{T} (KT, 2 jets excluded, #eta=%1.3f to %1.3f)", dptEtaMin,dptEtaMax), "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
97
98     AddHistogram1D<TH1D>("hDeltaPtKT2Eta2Excl", Form("Background fluctuations #delta p_{T} (KT 2, 2 jets excluded, #eta=%1.3f to %1.3f)", dptEtaMin,dptEtaMax), "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
99
100     AddHistogram1D<TH1D>("hDeltaPtRC", "Background fluctuations #delta p_{T} (RC, 0 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
101     AddHistogram1D<TH1D>("hDeltaPtRC1Excl", "Background fluctuations #delta p_{T} (RC, 1 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
102     AddHistogram1D<TH1D>("hDeltaPtRC2Excl", "Background fluctuations #delta p_{T} (RC, 2 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
103
104     AddHistogram1D<TH1D>("hDeltaPtTR", "Background fluctuations #delta p_{T} (TR, 0 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
105     AddHistogram1D<TH1D>("hDeltaPtTR1Excl", "Background fluctuations #delta p_{T} (TR, 1 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
106     AddHistogram1D<TH1D>("hDeltaPtTR2Excl", "Background fluctuations #delta p_{T} (TR, 2 jets excluded)", "", 500, -20., 80., "#delta p_{T} (GeV/c)","dN^{Jets}/d#delta p_{T}");
107
108
109
110     AddHistogram2D<TH2D>("hKTJetPhiEta", "KT Jets angular distribution", "LEGO2", 100, 0., 2*TMath::Pi(),100, -0.6, 0.6, "#phi","#eta","dN^{Jets}/(d#phi d#eta)");
111     AddHistogram2D<TH2D>("hKTLeadingJetPhiEta", "KT Leading jets angular distribution", "LEGO2", 100, 0., 2*TMath::Pi(),100, -0.6, 0.6, "#phi","#eta","dN^{Jets}/(d#phi d#eta)");
112
113     AddHistogram1D<TH1D>("hDijetBackground", "Background density (dijets excluded)", "", 400, 0., 40., "#rho (GeV/c)","dN^{Events}/d#rho");
114     AddHistogram1D<TH1D>("hDijetBackgroundMostCentral", "Background density (0-20 centrality, dijets excluded)", "", 400, 0., 40., "#rho (GeV/c)","dN^{Events}/d#rho");
115     AddHistogram2D<TH2D>("hDijetBackgroundVsCentrality", "Background density vs. centrality (dijets excluded)", "", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
116
117     AddHistogram1D<TH1D>("hDijetBackgroundPerpendicular", "Background density (dijets excluded)", "", 400, 0., 40., "#rho (GeV/c)","dN^{Events}/d#rho");
118     AddHistogram1D<TH1D>("hDijetBackgroundPerpendicularMostCentral", "Background density (0-20 centrality, dijets excluded)", "", 400, 0., 40., "#rho (GeV/c)","dN^{Events}/d#rho");
119     AddHistogram2D<TH2D>("hDijetBackgroundPerpendicularVsCentrality", "Background density vs. centrality (dijets excluded)", "", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
120   
121     AddHistogram2D<TH2D>("hRCBackground", "RC background density (2 leading jets excluded, mean(8 RCs))", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
122
123     AddHistogram1D<TH1D>("hAccConesInRCBackground", Form("Number of cones used for RC background (|#eta| < %1.1f)", fSignalJetEtaWindow), "", 8, 0, 8, "Used cones", "dN^{Events}/dN^{Cones}");
124
125     AddHistogram2D<TH2D>("hRCBackgroundMostCentral", "RC background density (0-20 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta",  "#rho (GeV/c)","dN^{Events}/d#rho");
126     AddHistogram2D<TH2D>("hRCBackgroundMostPeripheral", "RC background density (80-100 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius),  400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
127     AddHistogram2D<TH2D>("hRCBackgroundVsCentrality", "RC background density vs centrality (2 leading jets excluded)", "LEGO2", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
128
129     
130     AddHistogram2D<TH2D>("hKTBackground", "KT background density (2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
131     AddHistogram2D<TH2D>("hKTBackgroundMostCentral", "KT background density (0-20 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta",  "#rho (GeV/c)","dN^{Events}/d#rho");
132     AddHistogram2D<TH2D>("hKTBackgroundMostPeripheral", "KT background density (80-100 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius),  400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
133     AddHistogram2D<TH2D>("hKTBackgroundVsCentrality", "KT background density vs centrality (2 leading jets excluded)", "LEGO2", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
134   
135     AddHistogram2D<TH2D>("hKTBackground2", "KT background 2 density (2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
136     AddHistogram2D<TH2D>("hKTBackground2MostCentral", "KT background 2 density (0-20 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta",  "#rho (GeV/c)","dN^{Events}/d#rho");
137     AddHistogram2D<TH2D>("hKTBackground2MostPeripheral", "KT background 2 density (80-100 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius),  400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
138     AddHistogram2D<TH2D>("hKTBackground2VsCentrality", "KT background 2 density vs centrality (2 leading jets excluded)", "LEGO2", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
139
140
141     AddHistogram2D<TH2D>("hTrackBackground", "Track background density (2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
142     AddHistogram2D<TH2D>("hTrackBackgroundMostCentral", "Track background density (0-20 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins,  -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
143     AddHistogram2D<TH2D>("hTrackBackgroundMostPeripheral", "Track background density (80-100 centrality, 2 leading jets excluded)", "LEGO2", fBackgroundEtaBins, -(fTrackEtaWindow-fRandConeRadius), +(fTrackEtaWindow-fRandConeRadius), 400, 0., 40., "#eta", "#rho (GeV/c)","dN^{Events}/d#rho");
144     AddHistogram2D<TH2D>("hTrackBackgroundVsCentrality", "Track background density vs centrality (2 leading jets excluded)", "LEGO2", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
145
146   }
147
148
149
150   // register Histograms
151   for (Int_t i = 0; i < fHistCount; i++)
152   {
153     fOutputList->Add(fHistList->At(i));
154   }
155   
156   PostData(1,fOutputList); // important for merging
157
158 }
159
160 //________________________________________________________________________
161 AliAnalysisTaskChargedJetsPA::AliAnalysisTaskChargedJetsPA(const char *name, const char* trackArrayName, const char* clusterArrayName, const char* jetArrayName, const char* backgroundJetArrayName) : AliAnalysisTaskSE(name), fOutputList(0), fAnalyzeQA(1), fAnalyzeJets(1), fAnalyzeBackground(1), fAnalyzePythia(0), fHasTracks(0), fHasClusters(0), fHasJets(0), fHasBackgroundJets(0), fIsMC(0), fJetArray(0), fTrackArray(0), fClusterArray(0), fBackgroundJetArray(0), fJetArrayName(0), fTrackArrayName(0), fClusterArrayName(0), fBackgroundJetArrayName(0), fNumPtHardBins(11), fRandConeRadius(0.4), fSignalJetRadius(0.4), fBackgroundJetRadius(0.4),  fKTDeltaPtEtaBin(3), fTrackBackgroundConeRadius(0.4), fNumberRandCones(8), fNumberExcludedJets(2), fDijetMaxAngleDeviation(10.0), fBackgroundEtaBins(5), fJetBgrdCorrectionFactors(0), fSignalJetEtaWindow(0.5), fBackgroundJetEtaWindow(0.5), fTrackEtaWindow(0.9), fClusterEtaWindow(0.7), fVertexWindow(10.0), fVertexMaxR(1.0), fMinTrackPt(0.150), fMinClusterPt(0.300), fMinJetPt(1.0), fMinJetArea(0.4), fMinBackgroundJetPt(0.15), fMinDijetLeadingPt(10.0), fFirstLeadingJet(0), fSecondLeadingJet(0), fNumberSignalJets(0), fCrossSection(0.0), fTrials(0.0),  fRandom(0), fHelperClass(0), fInitialized(0), fTaskInstanceCounter(0), fHistList(0), fHistCount(0)
162 {
163   #ifdef DEBUGMODE
164     AliInfo("Calling constructor.");
165   #endif
166
167   // Constructor
168   // Define input and output slots here (never in the dummy constructor)
169   // Input slot #0 works with a TChain - it is connected to the default input container
170   // Output slot #1 writes into a TH1 container
171   // Constructor
172
173   // Every instance of this task gets his own number
174   static Int_t instance = 0;
175   fTaskInstanceCounter = instance;
176   instance++;
177
178   fTrackArrayName = new TString(trackArrayName);
179   fClusterArrayName = new TString(clusterArrayName);
180   if (strcmp(fTrackArrayName->Data(),"") == 0)
181     fAnalyzeQA = kFALSE;
182   else
183   {
184     fAnalyzeQA = kTRUE;
185     if (fTrackArrayName->Contains("MCParticles")) //TODO: Hardcoded for now
186       fIsMC = kTRUE;
187   }
188
189   fJetArrayName = new TString(jetArrayName);
190   if (strcmp(fJetArrayName->Data(),"") == 0)
191     fAnalyzeJets = kFALSE;
192   else
193     fAnalyzeJets = kTRUE;
194     
195   fBackgroundJetArrayName = new TString(backgroundJetArrayName);
196   if (strcmp(fBackgroundJetArrayName->Data(),"") == 0)
197     fAnalyzeBackground = kFALSE;
198   else
199     fAnalyzeBackground = kTRUE;
200
201   DefineOutput(1, TList::Class());
202  
203   fHistList = new TList();
204
205   #ifdef DEBUGMODE
206     AliInfo("Constructor done.");
207   #endif
208   
209 }
210
211 //________________________________________________________________________
212 inline Double_t AliAnalysisTaskChargedJetsPA::GetConePt(Double_t eta, Double_t phi, Double_t radius)
213 {
214   Double_t tmpConePt = 0.0;
215
216   for (Int_t i = 0; i < fTrackArray->GetEntries(); i++)
217   {
218     AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
219     if (IsTrackInAcceptance(tmpTrack))
220       if(IsTrackInCone(tmpTrack, eta, phi, radius))
221         tmpConePt = tmpConePt + tmpTrack->Pt();
222   }
223   return tmpConePt;
224 }
225
226 //________________________________________________________________________
227 inline Double_t AliAnalysisTaskChargedJetsPA::GetPtHard()
228 {
229   Double_t tmpPtHard = -1.0;
230
231   if (!MCEvent())
232     AliError("MCEvent not accessible although demanded!");
233   else
234   {
235     AliGenPythiaEventHeader* pythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
236     if (!pythiaHeader)
237       AliError("Pythia Header not accessible!");
238     else
239       tmpPtHard = pythiaHeader->GetPtHard();
240   }
241   return tmpPtHard;
242 }
243
244 //________________________________________________________________________
245 inline Int_t AliAnalysisTaskChargedJetsPA::GetPtHardBin()
246 {
247   // ########## PT HARD BIN EDGES
248   const Int_t localkPtHardLowerEdges[] = { 0, 5,11,21,36,57, 84,117,152,191,234};
249   const Int_t localkPtHardHigherEdges[] = { 5,11,21,36,57,84,117,152,191,234,1000000};
250
251   Int_t tmpPtHardBin = 0;
252   Double_t tmpPtHard = GetPtHard();
253  
254   for (tmpPtHardBin = 0; tmpPtHardBin <= fNumPtHardBins; tmpPtHardBin++)
255     if (tmpPtHard >= localkPtHardLowerEdges[tmpPtHardBin] && tmpPtHard < localkPtHardHigherEdges[tmpPtHardBin])
256       break;
257
258   return tmpPtHardBin;
259 }
260
261
262 //________________________________________________________________________
263 inline Bool_t AliAnalysisTaskChargedJetsPA::IsTrackInCone(AliVTrack* track, Double_t eta, Double_t phi, Double_t radius)
264 {
265   // This is to use a full cone in phi even at the edges of phi (2pi -> 0) (0 -> 2pi)
266   Double_t trackPhi = 0.0;
267   if (track->Phi() > (TMath::TwoPi() - (radius-phi)))
268     trackPhi = track->Phi() - TMath::TwoPi();
269   else if (track->Phi() < (phi+radius - TMath::TwoPi()))
270     trackPhi = track->Phi() + TMath::TwoPi();
271   else
272     trackPhi = track->Phi();
273   
274   if ( TMath::Abs(trackPhi-phi)*TMath::Abs(trackPhi-phi) + TMath::Abs(track->Eta()-eta)*TMath::Abs(track->Eta()-eta) <= radius*radius)
275     return kTRUE;
276   
277   return kFALSE;
278 }
279
280 //________________________________________________________________________
281 inline Bool_t AliAnalysisTaskChargedJetsPA::IsTrackInAcceptance(AliVParticle* track)
282 {
283   if (track != 0)
284     if (TMath::Abs(track->Eta()) <= fTrackEtaWindow)
285       if (track->Pt() >= fMinTrackPt)
286         return kTRUE;
287
288   return kFALSE;
289 }
290
291 //________________________________________________________________________
292 inline Bool_t AliAnalysisTaskChargedJetsPA::IsClusterInAcceptance(AliVCluster* cluster)
293 {
294   if (cluster != 0)
295  //   if (TMath::Abs(cluster->Eta()) <= fClusterEtaWindow)
296 //      if (cluster->Phi() <= 187.0/360.0 * TMath::TwoPi());
297 //        if (cluster->Phi() >= 80.0/360.0 * TMath::TwoPi());
298           if (cluster->E() >= fMinClusterPt)
299             return kTRUE;
300
301   return kFALSE;
302 }
303
304
305 //________________________________________________________________________
306 inline Bool_t AliAnalysisTaskChargedJetsPA::IsBackgroundJetInAcceptance(AliEmcalJet *jet)
307 {   
308   if (jet != 0)
309     if (TMath::Abs(jet->Eta()) <= fBackgroundJetEtaWindow)
310       if (jet->Pt() >= fMinBackgroundJetPt)
311         return kTRUE;
312
313   return kFALSE;
314 }
315
316 //________________________________________________________________________
317 inline Bool_t AliAnalysisTaskChargedJetsPA::IsSignalJetInAcceptance(AliEmcalJet *jet)
318 {   
319   if (jet != 0)
320     if (TMath::Abs(jet->Eta()) <= fSignalJetEtaWindow)
321       if (jet->Pt() >= fMinJetPt)
322         if (jet->Area() >= fMinJetArea)
323           return kTRUE;
324
325   return kFALSE;
326 }
327
328 //________________________________________________________________________
329 inline Bool_t AliAnalysisTaskChargedJetsPA::IsDijet(AliEmcalJet *jet1, AliEmcalJet *jet2)
330 {   
331   // Output from GetDeltaPhi is < pi in any case
332   if ((jet1 != 0) && (jet2 != 0))
333     if((TMath::Pi() - GetDeltaPhi(jet1->Phi(),jet2->Phi())) < fDijetMaxAngleDeviation)
334       if ((jet1->Pt() > fMinDijetLeadingPt) && (jet2->Pt() > fMinDijetLeadingPt)) //TODO: Introduce recoil jet?
335         return kTRUE;
336
337   return kFALSE;
338 }
339
340 //________________________________________________________________________
341 void AliAnalysisTaskChargedJetsPA::ExecOnce()
342 {
343   #ifdef DEBUGMODE
344     AliInfo("Starting ExecOnce.");
345   #endif
346   fInitialized = kTRUE;
347
348   // Check for track array
349   if (strcmp(fTrackArrayName->Data(), "") != 0)
350   {
351     fTrackArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrackArrayName->Data()));
352     fHasTracks = kTRUE;
353     if (!fTrackArray) 
354     {
355       AliInfo(Form("%s: Could not retrieve tracks %s! This is OK, if tracks are not demanded.", GetName(), fTrackArrayName->Data())); 
356       fHasTracks = kFALSE;
357     } 
358     else
359     {
360       TClass *cl = fTrackArray->GetClass();
361       if (!cl->GetBaseClass("AliVParticle"))
362       {
363         AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTrackArrayName->Data())); 
364         fTrackArray = 0;
365         fHasTracks = kFALSE;
366       }
367     }
368   }
369   // Check for cluster array
370   if (strcmp(fClusterArrayName->Data(), "") != 0)
371   {
372     fClusterArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fClusterArrayName->Data()));
373     fHasClusters = kTRUE;
374     if (!fClusterArray) 
375     {
376       AliInfo(Form("%s: Could not retrieve clusters %s! This is OK, if clusters are not demanded.", GetName(), fClusterArrayName->Data())); 
377       fHasClusters = kFALSE;
378     } 
379     else
380     {
381       TClass *cl = fClusterArray->GetClass();
382       if (!cl->GetBaseClass("AliVCluster"))
383       {
384         AliError(Form("%s: Collection %s does not contain AliVCluster objects!", GetName(), fClusterArrayName->Data())); 
385         fClusterArray = 0;
386         fHasClusters = kFALSE;
387       }
388     }
389   }
390
391   // Check for jet array
392   if (strcmp(fJetArrayName->Data(), "") != 0)
393   {
394     fJetArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetArrayName->Data()));
395     fHasJets = kTRUE;
396
397     if (!fJetArray) 
398     {
399       AliInfo(Form("%s: Could not retrieve jets %s! This is OK, if jets are not demanded.", GetName(), fJetArrayName->Data())); 
400       fHasJets = kFALSE;
401     } 
402     else
403     {
404       if (!fJetArray->GetClass()->GetBaseClass("AliEmcalJet")) 
405       {
406         AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fJetArrayName->Data())); 
407         fJetArray = 0;
408         fHasJets = kFALSE;
409       }
410     }
411   }
412
413   // Check for background object
414   if (strcmp(fBackgroundJetArrayName->Data(), "") != 0)
415   {
416     fBackgroundJetArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fBackgroundJetArrayName->Data()));
417     fHasBackgroundJets = kTRUE;
418     if (!fBackgroundJetArray)
419     {
420       AliInfo(Form("%s: Could not retrieve background jets %s! This is OK, if background is not demanded.", GetName(), fBackgroundJetArrayName->Data())); 
421       fHasBackgroundJets = kFALSE;
422     }
423   }
424
425   // Look, if initialization is OK
426   if ((!fHasTracks && fAnalyzeQA) || (!fHasTracks && fAnalyzeBackground))
427   {
428     AliError(Form("%s: Tracks NOT successfully casted although demanded! Deactivating QA and background analysis",GetName()));
429     fAnalyzeQA = kFALSE;
430     fAnalyzeBackground = kFALSE;
431   }
432   if ((!fHasJets && fAnalyzeJets) || (!fHasJets && fAnalyzeBackground))
433   {
434     AliError(Form("%s: Jets NOT successfully casted although demanded!  Deactivating jet- and background analysis",GetName()));
435     fAnalyzeJets = kFALSE;
436     fAnalyzeBackground = kFALSE;
437   }
438   if (!fHasBackgroundJets && fAnalyzeBackground)
439   {
440     AliError(Form("%s: Background NOT successfully casted although demanded!  Deactivating background analysis",GetName()));
441     fAnalyzeBackground = kFALSE;
442   }
443
444   // Initialize helper class (for vertex selection)
445   fHelperClass = new AliAnalysisUtils();
446
447   // Histogram init
448   Init();
449
450   #ifdef DEBUGMODE
451     AliInfo("ExecOnce done.");
452   #endif
453
454 }
455
456 //________________________________________________________________________
457 void AliAnalysisTaskChargedJetsPA::GetSignalJets()
458 {
459   // Reset vars
460   fFirstLeadingJet = NULL;
461   fSecondLeadingJet = NULL;
462   fNumberSignalJets = 0;
463
464   Float_t maxJetPts[] = {0, 0};
465   Int_t jetIDArray[]   = {-1, -1};
466   Int_t jetCount = fJetArray->GetEntries();
467
468   // Go through all jets and save signal jets and the two leading ones
469   for (Int_t i = 0; i < jetCount; i++)
470   {
471     AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJetArray->At(i));
472     if (!jet)
473     {
474       AliError(Form("%s: Could not receive jet %d", GetName(), i));
475       continue;
476     }
477
478     if (!IsSignalJetInAcceptance(jet)) continue;
479     
480     if (jet->Pt() > maxJetPts[0]) 
481     {
482       maxJetPts[1] = maxJetPts[0];
483       jetIDArray[1] = jetIDArray[0];
484       maxJetPts[0] = jet->Pt();
485       jetIDArray[0] = i;
486     }
487     else if (jet->Pt() > maxJetPts[1]) 
488     {
489       maxJetPts[1] = jet->Pt();
490       jetIDArray[1] = i;
491     }
492     fSignalJets[fNumberSignalJets] = jet;
493     fNumberSignalJets++;
494   }
495   
496   if (fNumberSignalJets > 0)
497     fFirstLeadingJet  = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[0]));
498   if (fNumberSignalJets > 1)
499     fSecondLeadingJet = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[1]));
500
501 }
502
503 //________________________________________________________________________
504 Int_t AliAnalysisTaskChargedJetsPA::GetLeadingJets(TClonesArray* jetArray, Int_t* jetIDArray, Bool_t isSignalJets)
505 {
506 // Writes first two leading jets into already registered array jetIDArray
507
508   if (!jetArray)
509   {
510     AliError("Could not get the jet array to get leading jets from it!");
511     return 0;
512   }
513
514   Float_t maxJetPts[] = {0, 0};
515   jetIDArray[0] = -1;
516   jetIDArray[1] = -1;
517
518   Int_t jetCount = jetArray->GetEntries();
519   Int_t jetCountAccepted = 0;
520
521   for (Int_t i = 0; i < jetCount; i++)
522   {
523     AliEmcalJet* jet = static_cast<AliEmcalJet*>(jetArray->At(i));
524     if (!jet) 
525     {
526       AliError(Form("%s: Could not receive jet %d", GetName(), i));
527       continue;
528     }
529
530     if(isSignalJets)
531     {
532       if (!IsSignalJetInAcceptance(jet)) continue;
533     }
534     else
535     {
536       if (!IsBackgroundJetInAcceptance(jet)) continue;
537     }    
538
539     if (jet->Pt() > maxJetPts[0]) 
540     {
541       maxJetPts[1] = maxJetPts[0];
542       jetIDArray[1] = jetIDArray[0];
543       maxJetPts[0] = jet->Pt();
544       jetIDArray[0] = i;
545     }
546     else if (jet->Pt() > maxJetPts[1]) 
547     {
548       maxJetPts[1] = jet->Pt();
549       jetIDArray[1] = i;
550     }
551     jetCountAccepted++;
552   }
553   return jetCountAccepted;
554 }
555 //________________________________________________________________________
556 Double_t AliAnalysisTaskChargedJetsPA::GetJetBackgroundCorrFactor(Double_t eta, Double_t background)
557 {
558   Double_t tmpCorrFactor = 1.0;
559
560   if(fJetBgrdCorrectionFactors)
561     tmpCorrFactor = fJetBgrdCorrectionFactors->GetBinContent
562                           (
563                             fJetBgrdCorrectionFactors->GetXaxis()->FindBin(eta),
564                             fJetBgrdCorrectionFactors->GetYaxis()->FindBin(background)
565                           );
566
567   return tmpCorrFactor;
568 }
569 //________________________________________________________________________
570 Double_t AliAnalysisTaskChargedJetsPA::GetCorrectedJetPt(AliEmcalJet* jet, Double_t background, Bool_t useEtaCorrection)
571 {
572   #ifdef DEBUGMODE
573     AliInfo("Getting corrected jet spectra.");
574   #endif
575
576   if(!jet)
577   {
578     AliError("Jet pointer passed to GetCorrectedJet() not valid!");
579     return -1.0;
580   }
581
582   Double_t correctedPt = -1.0;
583
584   // Get correction factor from saved histo or similar in dependence of jet eta and background density
585   Double_t corrfactor = 1.0;
586   if(useEtaCorrection)
587   {
588     corrfactor = GetJetBackgroundCorrFactor(jet->Eta(), background);
589   }
590
591   // Get Eta corrected background
592   Double_t tmpCorrectedBackground = background * corrfactor;
593
594   // Subtract background
595   correctedPt = jet->Pt() - tmpCorrectedBackground * jet->Area();
596
597   #ifdef DEBUGMODE
598     AliInfo("Got corrected jet spectra.");
599   #endif 
600
601   return correctedPt;
602 }
603
604
605 //________________________________________________________________________
606 void AliAnalysisTaskChargedJetsPA::GetDeltaPt(Double_t& deltaPt, Double_t rho, Int_t numberExcludeLeadingJets, Int_t usedEtaBin, Bool_t useEtaCorrection)
607 {
608   #ifdef DEBUGMODE
609     AliInfo("Getting Delta Pt.");
610   #endif
611
612   // Define the tmp delta pt
613   deltaPt = -10000.0;
614
615   // Exclude UP TO numberExcludeLeadingJets
616   if (fNumberSignalJets < 2)
617     numberExcludeLeadingJets = fNumberSignalJets;
618   
619   Double_t etaMin, etaMax;
620   if (usedEtaBin==-1)
621   {
622     etaMin = -(fTrackEtaWindow-fRandConeRadius);
623     etaMax = +(fTrackEtaWindow-fRandConeRadius);
624   }
625   else
626   {
627     etaMin = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins *  usedEtaBin;
628     etaMax = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins * (usedEtaBin+1);
629   }  
630
631
632   Double_t tmpRandConeEta = 0.0;
633   Double_t tmpRandConePhi = 0.0;
634
635   Bool_t coneValid = kTRUE;
636
637
638   tmpRandConeEta = etaMin + fRandom->Rndm()*(etaMax-etaMin);
639   tmpRandConePhi = fRandom->Rndm()*TMath::TwoPi();
640
641   // Apply eta correction on demand
642   if(useEtaCorrection)
643     rho = GetJetBackgroundCorrFactor(tmpRandConeEta, rho)*rho;
644
645   // Go through all excluded leading jets and check if there's an overlap
646   for(Int_t j=0;j<numberExcludeLeadingJets;j++)
647   {
648     AliEmcalJet* tmpJet = NULL;
649
650     if (j==0)
651       tmpJet = fFirstLeadingJet;
652     else if (j==1)
653       tmpJet = fSecondLeadingJet;
654     else
655       AliFatal("Trying to exclude more than 2 jets for delta pt -- not implemented.");
656
657     Double_t excludedJetPhi = tmpJet->Phi();
658     Double_t excludedJetEta = tmpJet->Eta();
659     Double_t tmpDeltaPhi = GetDeltaPhi(tmpRandConePhi, excludedJetPhi);
660
661     // Check, if cone has overlap with jet
662     if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(tmpRandConeEta-excludedJetEta)*TMath::Abs(tmpRandConeEta-excludedJetEta) <= fRandConeRadius*fRandConeRadius)
663     {
664       coneValid = kFALSE;
665       break;
666     }
667   }
668
669   // Get the cones' pt and calculate delta pt
670   if (coneValid)
671     deltaPt = GetConePt(tmpRandConeEta,tmpRandConePhi,fRandConeRadius) - (rho*fRandConeRadius*fRandConeRadius*TMath::Pi());
672   #ifdef DEBUGMODE
673     AliInfo("Got Delta Pt.");
674   #endif
675 }
676
677 //________________________________________________________________________
678 void AliAnalysisTaskChargedJetsPA::GetKTBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMedian, Double_t& areaMean, Double_t etaMin, Double_t etaMax)
679 {
680   #ifdef DEBUGMODE
681     AliInfo("Getting KT background density.");
682   #endif
683
684   // static declaration. Advantage: more speed. Disadvantage: Problematic for events with more than 1024 jets :)
685   static Double_t tmpRhos[1024];
686   static Double_t tmpAreas[1024];
687   Int_t maxJetIds[]   = {-1, -1}; // Indices for excludes jets (up to two)
688
689   // Setting invalid values
690   rhoMedian = -1.0;
691   areaMean= -1.0;
692
693   // Exclude UP TO numberExcludeLeadingJets
694   Int_t numberBgrdJets = GetLeadingJets(fBackgroundJetArray, &maxJetIds[0], kFALSE);
695   if (numberBgrdJets < numberExcludeLeadingJets)
696     numberExcludeLeadingJets = numberBgrdJets;
697   if ((etaMin == 0) && (etaMax == 0))
698   {
699     etaMin = -fBackgroundJetEtaWindow;
700     etaMax = +fBackgroundJetEtaWindow;
701   }
702
703   Int_t jetCountAccepted = 0;
704   Int_t jetCount = fBackgroundJetArray->GetEntries();
705
706   for (Int_t i = 0; i < jetCount; i++)
707   {
708     AliEmcalJet* jet = static_cast<AliEmcalJet*>(fBackgroundJetArray->At(i));
709     if (!jet)
710     {
711       AliError(Form("%s: Could not receive jet %d", GetName(), i));
712       continue;
713     } 
714
715     // exclude leading jets
716     if (numberExcludeLeadingJets > 0)
717       if (i == maxJetIds[0])
718         continue;
719     if (numberExcludeLeadingJets > 1)
720       if (i == maxJetIds[1])
721         continue;
722       
723
724
725     if (!IsBackgroundJetInAcceptance(jet))
726       continue;
727     if (!((jet->Eta() >= etaMin) && (jet->Eta() < etaMax)))
728       continue;
729
730     
731     tmpRhos[jetCountAccepted] = jet->Pt() / jet->Area();
732     tmpAreas[jetCountAccepted] = jet->Area();
733     jetCountAccepted++;
734   }
735
736   if (jetCountAccepted > 0)
737   {
738     rhoMedian = TMath::Median(jetCountAccepted, tmpRhos);
739     areaMean   = TMath::Mean(jetCountAccepted, tmpAreas);
740   }
741   #ifdef DEBUGMODE
742     AliInfo("Got KT background density.");
743   #endif
744 }
745
746 //________________________________________________________________________
747 void AliAnalysisTaskChargedJetsPA::GetKTBackground2Density(Int_t numberExcludeLeadingJets, Double_t& rhoMedian, Double_t& areaMean, Double_t etaMin, Double_t etaMax)
748 {
749   #ifdef DEBUGMODE
750     AliInfo("Getting KT background 2 density.");
751   #endif
752
753   // static declaration. Advantage: more speed. Disadvantage: Problematic for events with more than 1024 jets :)
754   static Double_t tmpRhos[1024];
755   static Double_t tmpAreas[1024];
756
757   // Setting invalid values
758   rhoMedian = -1.0;
759   areaMean= -1.0;
760
761   if ((etaMin == 0) && (etaMax == 0))
762   {
763     etaMin = -fBackgroundJetEtaWindow;
764     etaMax = +fBackgroundJetEtaWindow;
765   }
766
767   Int_t jetCountAccepted = 0;
768   Int_t jetCount = fBackgroundJetArray->GetEntries();
769
770   for (Int_t i = 0; i < jetCount; i++)
771   {
772     Bool_t jetValid = kTRUE;
773     AliEmcalJet* jet = static_cast<AliEmcalJet*>(fBackgroundJetArray->At(i));
774     if (!jet)
775     {
776       AliError(Form("%s: Could not receive jet %d", GetName(), i));
777       continue;
778     } 
779
780     if (!((jet->Eta() >= etaMin) && (jet->Eta() < etaMax)))
781       continue;
782     if (!IsBackgroundJetInAcceptance(jet))
783       continue;
784
785     // Look, if theres an overlap of leading jets/ kT jet. If yes, exclude this jet
786     for(Int_t j=0;j<numberExcludeLeadingJets;j++)
787     {
788       AliEmcalJet* tmpLeadingJet = NULL;
789
790       if (j==0)
791         tmpLeadingJet = fFirstLeadingJet;
792       else if (j==1)
793         tmpLeadingJet = fSecondLeadingJet;
794       else
795         AliFatal("Trying to exclude more than 2 jets in KT background 2 -- not implemented.");
796
797       if (tmpLeadingJet)
798       {
799         Double_t tmpDeltaPhi = GetDeltaPhi(jet->Phi(), tmpLeadingJet->Phi());
800         if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(jet->Eta()-tmpLeadingJet->Eta())*TMath::Abs(jet->Eta()-tmpLeadingJet->Eta()) <= fBackgroundJetRadius*fBackgroundJetRadius)
801         {
802           jetValid = kFALSE;
803           break;
804         }
805       }
806     }
807
808     if(!jetValid)
809       continue;
810    
811     tmpRhos[jetCountAccepted] = jet->Pt() / jet->Area();
812     tmpAreas[jetCountAccepted] = jet->Area();
813     jetCountAccepted++;
814   }
815
816   if (jetCountAccepted > 0)
817   {
818     rhoMedian = TMath::Median(jetCountAccepted, tmpRhos);
819     areaMean   = TMath::Mean(jetCountAccepted, tmpAreas);
820   }
821   #ifdef DEBUGMODE
822     AliInfo("Got KT background 2 density.");
823   #endif
824 }
825
826
827 //________________________________________________________________________
828 Int_t AliAnalysisTaskChargedJetsPA::GetRCBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& rhoMedian, Double_t etaMin, Double_t etaMax, Int_t numberRandCones)
829 {
830   #ifdef DEBUGMODE
831     AliInfo("Getting RC background density.");
832   #endif
833
834   if(numberRandCones == 0)
835     numberRandCones = fNumberRandCones;
836
837   std::vector<AliEmcalJet> tmpCones(numberRandCones);
838
839   // Setting invalid values
840   rhoMean = -1.0;
841   rhoMedian = -1.0;
842
843   // Exclude UP TO numberExcludeLeadingJets
844   if (fNumberSignalJets < 2)
845     numberExcludeLeadingJets = fNumberSignalJets;
846
847   // Search given amount of RCs
848   Int_t numAcceptedRCs = 0;
849   for(Int_t i=0;i<numberRandCones;i++)
850   {
851     Double_t tmpRandConeEta = 0.0;
852     Double_t tmpRandConePhi = 0.0;
853     Double_t excludedJetEta = 0.0;
854     Double_t excludedJetPhi = 0.0;
855
856     // Search random cone in acceptance with no overlap with already excluded jets (leading jets and random cones)
857     Bool_t coneValid = kTRUE;
858
859     // Set the random cone position
860     if ((etaMin == 0) && (etaMax == 0))
861       tmpRandConeEta = (fTrackEtaWindow-fRandConeRadius)*(2.0*fRandom->Rndm()-1.0); // full RC is in acceptance
862     else
863       tmpRandConeEta = etaMin + fRandom->Rndm()*(etaMax-etaMin);
864
865     tmpRandConePhi = fRandom->Rndm()*TMath::TwoPi();
866
867     // Go through all excluded leading jets and check if there's an overlap
868      
869     for(Int_t j=0;j<numberExcludeLeadingJets;j++)
870     {
871       AliEmcalJet* tmpJet = NULL;
872
873       if (j==0)
874         tmpJet = fFirstLeadingJet;
875       else if (j==1)
876         tmpJet = fSecondLeadingJet;
877       else
878         AliFatal("Trying to exclude more than 2 jets in RC background -- not implemented.");
879
880       excludedJetPhi = tmpJet->Phi();
881       excludedJetEta = tmpJet->Eta();
882       Double_t tmpDeltaPhi = GetDeltaPhi(tmpRandConePhi, excludedJetPhi);
883       
884       if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(tmpRandConeEta-excludedJetEta)*TMath::Abs(tmpRandConeEta-excludedJetEta) <= fRandConeRadius*fRandConeRadius)
885       {
886         coneValid = kFALSE;
887         break;
888       }
889     }
890
891     // RC is accepted, so save it
892     if(coneValid)
893     {
894       AliEmcalJet tmpJet(GetConePt(tmpRandConeEta, tmpRandConePhi, fRandConeRadius), tmpRandConeEta, tmpRandConePhi, 0.0);
895       tmpCones[numAcceptedRCs] = tmpJet;
896       numAcceptedRCs++;
897     }
898   }
899
900   // Calculate Rho and the mean from the RCs (no excluded jets are considered!)
901   if(numAcceptedRCs > 0)
902   {
903     std::vector<Double_t> tmpRho(numAcceptedRCs);
904     for (Int_t i=0; i<numAcceptedRCs;i++)
905       tmpRho[i] = tmpCones[i].Pt()/(fRandConeRadius*fRandConeRadius*TMath::Pi());
906
907     rhoMean = TMath::Mean(tmpRho.begin(), tmpRho.end());
908     rhoMedian = 0.0; // NOT IMPLEMENTED because TMath::Median is not working with iterators
909   }
910     
911   #ifdef DEBUGMODE
912     AliInfo("Got RC background density.");
913   #endif
914   return numAcceptedRCs;
915 }
916
917 //________________________________________________________________________
918 void AliAnalysisTaskChargedJetsPA::GetTrackBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& area, Double_t etaMin, Double_t etaMax)
919 {
920   #ifdef DEBUGMODE
921     AliInfo("Getting track background density.");
922   #endif
923
924   Double_t summedTracksPt = 0.0;
925
926   if ((etaMin == 0) && (etaMax == 0))
927   {
928     etaMin = -fTrackEtaWindow;
929     etaMax = +fTrackEtaWindow;
930   }
931
932   // Setting invalid values
933   rhoMean = -1.0;
934   area = -1.0;
935   // Exclude UP TO numberExcludeLeadingJets
936   if (fNumberSignalJets < 2)
937     numberExcludeLeadingJets = fNumberSignalJets;
938
939
940   Int_t   trackCount = fTrackArray->GetEntries();
941   Int_t   trackCountAccepted = 0;
942   for (Int_t i = 0; i < trackCount; i++)
943   {
944     Bool_t  trackValid = kTRUE;
945     AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
946     if (IsTrackInAcceptance(tmpTrack))
947       if ((tmpTrack->Eta() >= etaMin) && (tmpTrack->Eta() < etaMax))
948       {
949         for (Int_t j = 0; j < numberExcludeLeadingJets; j++)
950         {
951           AliEmcalJet* tmpJet = NULL;
952           if (j==0)
953             tmpJet = fFirstLeadingJet;
954           else if (j==1)
955             tmpJet = fSecondLeadingJet;
956           else
957             AliFatal("Trying to exclude more than 2 jets in track background -- not implemented.");
958
959           if (IsTrackInCone(tmpTrack, tmpJet->Eta(), tmpJet->Phi(), fTrackBackgroundConeRadius))
960           {
961             trackValid = kFALSE;
962             break;
963           }
964         }
965         if (trackValid)
966         {
967           // Add track pt to array
968           summedTracksPt = summedTracksPt + tmpTrack->Pt();
969           trackCountAccepted++;
970         }
971       }
972   }
973
974   if (trackCountAccepted > 0)
975   {
976     Double_t tmpArea = 0.0;
977
978     tmpArea = (2.0*fTrackEtaWindow) * TMath::TwoPi() * (etaMax-etaMin)/(2.0*fTrackEtaWindow); // area of the used eta strip
979     
980     // Now: exclude the part of the leading jet that is in the strip
981     if (numberExcludeLeadingJets == 2)
982       tmpArea = tmpArea*(1.0-MCGetOverlapCircleRectancle(fFirstLeadingJet->Eta(), fFirstLeadingJet->Phi(), fTrackBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()) -MCGetOverlapCircleRectancle(fSecondLeadingJet->Eta(), fSecondLeadingJet->Phi(), fTrackBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()));
983     else if (numberExcludeLeadingJets == 1)
984       tmpArea = tmpArea*(1.0-MCGetOverlapCircleRectancle(fFirstLeadingJet->Eta(), fFirstLeadingJet->Phi(), fTrackBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()));
985    
986     rhoMean = summedTracksPt/tmpArea;
987     area  = tmpArea;
988   }
989
990   #ifdef DEBUGMODE
991     AliInfo("Got track background density.");
992   #endif
993 }
994
995 //________________________________________________________________________
996 void AliAnalysisTaskChargedJetsPA::GetTrackBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& area, AliEmcalJet* excludeJet1, AliEmcalJet* excludeJet2, Bool_t doSearchPerpendicular)
997 {
998   #ifdef DEBUGMODE
999     AliInfo("Getting track background density.");
1000   #endif
1001
1002   // Setting invalid values
1003   Double_t summedTracksPt = 0.0;
1004   rhoMean = -1.0;
1005   area = -1.0;
1006
1007   Double_t tmpRadius = 0.0;
1008   if (doSearchPerpendicular)
1009     tmpRadius = 0.5*TMath::Pi(); // exclude 90 degrees around jets
1010   else
1011     tmpRadius = fSignalJetRadius;
1012     
1013   numberExcludeLeadingJets = 2; // dijet is excluded here in any case
1014
1015
1016
1017   if (!fTrackArray || !fJetArray)
1018   {
1019     AliError("Could not get the track/jet array to calculate track rho!");
1020     return;
1021   }
1022
1023   Int_t   trackCount = fTrackArray->GetEntries();
1024   Int_t   trackCountAccepted = 0;
1025   for (Int_t i = 0; i < trackCount; i++)
1026   {
1027     AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
1028     if (IsTrackInAcceptance(tmpTrack))
1029     {
1030       if (IsTrackInCone(tmpTrack, excludeJet1->Eta(), excludeJet1->Phi(), tmpRadius))
1031         continue;
1032
1033       if (numberExcludeLeadingJets > 1)
1034         if (IsTrackInCone(tmpTrack, excludeJet2->Eta(), excludeJet2->Phi(), tmpRadius))
1035           continue;
1036
1037         // Add track pt to array
1038         summedTracksPt = summedTracksPt + tmpTrack->Pt();
1039         trackCountAccepted++;
1040     }
1041   }
1042
1043   if (trackCountAccepted > 0)
1044   {
1045     Double_t tmpArea = 2.0*fTrackEtaWindow*TMath::TwoPi()  - 2*(tmpRadius*tmpRadius * TMath::Pi()); //TPC area - excluding jet area
1046     rhoMean = summedTracksPt/tmpArea;
1047     area = tmpArea;
1048   }
1049
1050   #ifdef DEBUGMODE
1051     AliInfo("Got track background density.");
1052   #endif
1053 }
1054
1055 //________________________________________________________________________
1056 void AliAnalysisTaskChargedJetsPA::Calculate(AliVEvent* event)
1057 {
1058   #ifdef DEBUGMODE
1059     AliInfo("Starting Calculate().");
1060   #endif
1061   ////////////////////// NOTE: initialization & casting
1062
1063   if (!event) {
1064     AliError("??? Event pointer == 0 ???");
1065     return;
1066   }
1067  
1068   if (!fInitialized)
1069     ExecOnce(); // Get tracks, jets, background from arrays if not already given + Init Histos
1070   
1071   // Additional cuts
1072   FillHistogram("hNumberEvents", 0.5); // number of events before manual cuts
1073
1074   if(!fHelperClass->IsVertexSelected2013pA(event))
1075     return;
1076
1077   FillHistogram("hNumberEvents", 1.5); // number of events after manual cuts
1078
1079   #ifdef DEBUGMODE
1080     AliInfo("Calculate()::Init done.");
1081   #endif
1082
1083   ////////////////////// NOTE: Get Centrality, (Leading)Signal jets and Background
1084
1085   // Get centrality (V0A)
1086   AliCentrality* tmpCentrality = NULL;
1087   tmpCentrality = event->GetCentrality();
1088   Double_t centralityPercentile = 0.0;
1089   if (tmpCentrality != NULL)
1090     centralityPercentile = tmpCentrality->GetCentralityPercentile("V0A");
1091
1092   // Get jets
1093   if (fAnalyzeBackground || fAnalyzeJets)
1094     GetSignalJets();
1095
1096   // Get background
1097
1098   // Background with N excluded leading jets
1099   std::vector<Double_t>  ktBackgroundRhoMedian(fBackgroundEtaBins+1);
1100   std::vector<Double_t>  ktBackgroundAreaMean(fBackgroundEtaBins+1);
1101   std::vector<Double_t>  ktBackground2RhoMedian(fBackgroundEtaBins+1);
1102   std::vector<Double_t>  ktBackground2AreaMean(fBackgroundEtaBins+1);
1103   std::vector<Double_t>  rcBackgroundRhoMean(fBackgroundEtaBins+1);
1104   std::vector<Double_t>  rcBackgroundRhoMedian(fBackgroundEtaBins+1);
1105   std::vector<Double_t>  trackBackgroundRhoMean(fBackgroundEtaBins+1);
1106   std::vector<Double_t>  trackBackgroundArea(fBackgroundEtaBins+1);
1107   Double_t  dijetBackground = -1.0; // calculation only done in events with dijets I!
1108   Double_t  dijetBackgroundPerpendicular = -1.0; // calculation only done in events with dijets I!
1109   if (fAnalyzeBackground)
1110   {
1111
1112     // Get backgrounds in bins of eta
1113     for(Int_t i = 0; i<fBackgroundEtaBins; i++)
1114     {
1115       // scheme: etaMin = RangeMin + l*binN; etaMax = RangeMin + l*(binN+1)
1116
1117       Double_t etaMin = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins *  i;
1118       Double_t etaMax = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins * (i+1);
1119       GetRCBackgroundDensity (fNumberExcludedJets, rcBackgroundRhoMean[i],rcBackgroundRhoMedian[i],  etaMin, etaMax);
1120       GetTrackBackgroundDensity (fNumberExcludedJets, trackBackgroundRhoMean[i], trackBackgroundArea[i], etaMin, etaMax);
1121       GetKTBackgroundDensity (fNumberExcludedJets, ktBackgroundRhoMedian[i], ktBackgroundAreaMean[i], etaMin, etaMax);
1122       GetKTBackground2Density (fNumberExcludedJets, ktBackground2RhoMedian[i], ktBackground2AreaMean[i], etaMin, etaMax);
1123
1124     }
1125     Int_t tmpNRCs = 0;
1126
1127     // All eta in one bin
1128     tmpNRCs = GetRCBackgroundDensity (fNumberExcludedJets, rcBackgroundRhoMean[fBackgroundEtaBins], rcBackgroundRhoMedian[fBackgroundEtaBins]);
1129     FillHistogram("hAccConesInRCBackground", tmpNRCs);
1130     GetTrackBackgroundDensity (fNumberExcludedJets, trackBackgroundRhoMean[fBackgroundEtaBins], trackBackgroundArea[fBackgroundEtaBins]);
1131     GetKTBackgroundDensity (fNumberExcludedJets, ktBackgroundRhoMedian[fBackgroundEtaBins], ktBackgroundAreaMean[fBackgroundEtaBins]);
1132     GetKTBackground2Density (fNumberExcludedJets, ktBackground2RhoMedian[fBackgroundEtaBins], ktBackground2AreaMean[fBackgroundEtaBins]);
1133
1134   }
1135
1136   #ifdef DEBUGMODE
1137     AliInfo("Calculate()::Centrality&SignalJets&Background-Calculation done.");
1138   #endif
1139   ////////////////////// NOTE: Pythia histograms
1140   if(fAnalyzePythia)
1141   {
1142     FillHistogram("hPythiaPtHard", GetPtHard());
1143     FillHistogram("hPythiaNTrials", GetPtHardBin()-0.1, fTrials);
1144     FillHistogram("hPythiaXSection", GetPtHardBin()-0.1, fCrossSection);
1145
1146     #ifdef DEBUGMODE
1147       AliInfo("Calculate()::Pythia done.");
1148     #endif
1149   }
1150
1151   ////////////////////// NOTE: Track & QA histograms
1152
1153   if (fAnalyzeQA)
1154   {
1155     FillHistogram("hVertexZ",event->GetPrimaryVertex()->GetZ());
1156     FillHistogram("hVertexR",TMath::Sqrt(event->GetPrimaryVertex()->GetX()*event->GetPrimaryVertex()->GetX() + event->GetPrimaryVertex()->GetY()*event->GetPrimaryVertex()->GetY()));
1157     FillHistogram("hCentrality",centralityPercentile);
1158
1159     Int_t trackCountAcc = 0;
1160     Int_t nTracks = fTrackArray->GetEntries();
1161     for (Int_t i = 0; i < nTracks; i++)
1162     {
1163       AliVTrack* track = static_cast<AliVTrack*>(fTrackArray->At(i));
1164       if (IsTrackInAcceptance(track))
1165       {
1166         FillHistogram("hTrackPhiEta", track->Phi(),track->Eta(), 1);
1167         FillHistogram("hTrackPt", track->Pt());
1168         FillHistogram("hTrackEta", track->Eta());
1169         FillHistogram("hTrackCharge", track->Charge());
1170         trackCountAcc++;
1171       }
1172     }
1173     FillHistogram("hTrackCountAcc", trackCountAcc, centralityPercentile);
1174
1175     if (fHasClusters)
1176     {
1177       Int_t clusterCountAcc = 0;
1178       Int_t nClusters = fClusterArray->GetEntries();
1179       for (Int_t i = 0; i < nClusters; i++)
1180       {
1181         AliVCluster* cluster = static_cast<AliVCluster*>(fClusterArray->At(i));
1182         if (IsClusterInAcceptance(cluster))
1183         {
1184           FillHistogram("hClusterE", cluster->E());
1185           clusterCountAcc++;
1186         }
1187       }
1188       FillHistogram("hClusterCountAcc", clusterCountAcc, centralityPercentile);
1189     }
1190   }
1191   #ifdef DEBUGMODE
1192     AliInfo("Calculate()::QA done.");
1193   #endif
1194
1195   ////////////////////// NOTE: Jet analysis and calculations
1196
1197   if (fAnalyzeJets)
1198   {
1199     FillHistogram("hJetCountAll", fJetArray->GetEntries());
1200     FillHistogram("hJetCountAccepted", fNumberSignalJets);
1201     if (fFirstLeadingJet)
1202       FillHistogram("hLeadingJetPt", fFirstLeadingJet->Pt());
1203     if (fSecondLeadingJet)
1204       FillHistogram("hSecondLeadingJetPt", fSecondLeadingJet->Pt());
1205
1206     // ### Dijets I ###
1207     if(fNumberSignalJets >= 2)
1208     {
1209       FillHistogram("hLeadingJetDeltaPhi", GetDeltaPhi(fFirstLeadingJet->Phi(), fSecondLeadingJet->Phi()));
1210       FillHistogram("hLeadingJetDeltaPhiPt", GetDeltaPhi(fFirstLeadingJet->Phi(), fSecondLeadingJet->Phi()), fFirstLeadingJet->Pt());
1211
1212       if (IsDijet(fFirstLeadingJet, fSecondLeadingJet)) // Gettin' the money
1213       {
1214         FillHistogram("hDijetConstituentsPt", fFirstLeadingJet->Pt()); FillHistogram("hDijetConstituentsPt", fSecondLeadingJet->Pt());
1215         FillHistogram("hDijetLeadingJetPt", fFirstLeadingJet->Pt());
1216         FillHistogram("hDijetPtCorrelation", fFirstLeadingJet->Pt(), fSecondLeadingJet->Pt());
1217         Double_t dummyArea = 0;
1218         GetTrackBackgroundDensity (2, dijetBackground, dummyArea, fFirstLeadingJet, fSecondLeadingJet, kFALSE);
1219         GetTrackBackgroundDensity (2, dijetBackgroundPerpendicular, dummyArea, fFirstLeadingJet, fSecondLeadingJet, kTRUE);
1220       }
1221     }
1222
1223     // SIGNAL JET ANALYSIS
1224     for (Int_t i = 0; i<fNumberSignalJets; i++)
1225     {
1226       AliEmcalJet* tmpJet = fSignalJets[i];
1227
1228       FillHistogram("hJetPtArea", tmpJet->Pt(), tmpJet->Area());
1229       FillHistogram("hJetPtEta", tmpJet->Pt(), tmpJet->Eta());
1230       FillHistogram("hJetPtPhi", tmpJet->Pt(), tmpJet->Phi());
1231       FillHistogram("hJetPtCentrality", tmpJet->Pt(), centralityPercentile);
1232       FillHistogram("hJetArea", tmpJet->Area());
1233       FillHistogram("hJetPt", tmpJet->Pt());
1234       FillHistogram("hJetPhiEta", tmpJet->Phi(),tmpJet->Eta());
1235       
1236       // Background subtracted spectra
1237       
1238       FillHistogram("hJetPtBgrdSubtractedRC", GetCorrectedJetPt(tmpJet, rcBackgroundRhoMean[fBackgroundEtaBins]));
1239       FillHistogram("hJetPtBgrdSubtractedKT", GetCorrectedJetPt(tmpJet, ktBackgroundRhoMedian[fBackgroundEtaBins], kTRUE));
1240       FillHistogram("hJetPtBgrdSubtractedKT2", GetCorrectedJetPt(tmpJet, ktBackground2RhoMedian[fBackgroundEtaBins], kTRUE));
1241       FillHistogram("hJetPtBgrdSubtractedKTNoEtaCorr", GetCorrectedJetPt(tmpJet, ktBackgroundRhoMedian[fBackgroundEtaBins]));
1242       FillHistogram("hJetPtBgrdSubtractedKT2NoEtaCorr", GetCorrectedJetPt(tmpJet, ktBackground2RhoMedian[fBackgroundEtaBins]));
1243       FillHistogram("hJetPtBgrdSubtractedTR", GetCorrectedJetPt(tmpJet, trackBackgroundRhoMean[fBackgroundEtaBins]));
1244
1245
1246       Double_t tmpCorrFactor = GetJetBackgroundCorrFactor(tmpJet->Eta(), ktBackgroundRhoMedian[fBackgroundEtaBins]);
1247       FillHistogram("hAppliedEtaCorrectionFactor", tmpCorrFactor);
1248       tmpCorrFactor = GetJetBackgroundCorrFactor(tmpJet->Eta(), ktBackground2RhoMedian[fBackgroundEtaBins]);
1249       FillHistogram("hAppliedEtaCorrectionFactor2", tmpCorrFactor);
1250
1251       // Signal jet vs. signal jet
1252       for (Int_t j = i+1; j<fNumberSignalJets; j++)
1253       {
1254         AliEmcalJet* tmpJet2 = fSignalJets[j];
1255         FillHistogram("hJetDeltaPhi", GetDeltaPhi(tmpJet->Phi(), tmpJet2->Phi()));
1256         FillHistogram("hJetDeltaPhiPt", GetDeltaPhi(tmpJet->Phi(), tmpJet2->Phi()), max(tmpJet->Pt(), tmpJet2->Pt()));
1257
1258         // ### Dijets II ###
1259         if (IsDijet(tmpJet, tmpJet2)) // Gettin' the money
1260         {
1261           FillHistogram("hDijet2ConstituentsPt", tmpJet->Pt()); FillHistogram("hDijet2ConstituentsPt", tmpJet2->Pt());
1262           FillHistogram("hDijet2LeadingJetPt", fFirstLeadingJet->Pt());
1263           FillHistogram("hDijet2PtCorrelation", tmpJet->Pt(), tmpJet2->Pt());
1264         }
1265       }
1266     }
1267   } //endif AnalyzeJets
1268
1269   #ifdef DEBUGMODE
1270     AliInfo("Calculate()::Jets done.");
1271   #endif
1272   ////////////////////// NOTE: Background analysis
1273
1274   if (fAnalyzeBackground)
1275   {
1276
1277     Int_t leadingJetIds[] = {-1, -1};
1278     GetLeadingJets(fBackgroundJetArray, &leadingJetIds[0], kFALSE);
1279
1280     for (Int_t i = 0; i < fBackgroundJetArray->GetEntries(); i++)
1281     {
1282       AliEmcalJet* jet = static_cast<AliEmcalJet*>(fBackgroundJetArray->At(i));
1283       if (!jet)
1284       {
1285         AliError(Form("%s: Could not receive kt jet %d", GetName(), i));
1286         continue;
1287       }
1288       if (!IsBackgroundJetInAcceptance(jet))
1289         continue;
1290       if (!((jet->Eta() >= -fBackgroundJetEtaWindow) && (jet->Eta() < fBackgroundJetEtaWindow)))
1291         continue;
1292       
1293       FillHistogram("hKTJetPhiEta", jet->Phi(),jet->Eta());
1294       if(i==leadingJetIds[0])
1295         FillHistogram("hKTLeadingJetPhiEta", jet->Phi(),jet->Eta());
1296             
1297     }
1298
1299     // ############# RC, Track, and KT background calculations
1300     Double_t etaMin = 0;
1301     for (Int_t i=0;i<fBackgroundEtaBins;i++)
1302     {
1303       etaMin = -(fTrackEtaWindow-fRandConeRadius) + 2*(fTrackEtaWindow-fRandConeRadius)/fBackgroundEtaBins *  (i+0.5);
1304       FillHistogram("hRCBackground", etaMin, rcBackgroundRhoMean[i]);
1305       FillHistogram("hTrackBackground", etaMin, trackBackgroundRhoMean[i]);
1306       FillHistogram("hKTBackground", etaMin, ktBackgroundRhoMedian[i]);
1307       FillHistogram("hKTBackground2", etaMin, ktBackground2RhoMedian[i]);
1308       if(centralityPercentile <= 20.)
1309       {
1310         FillHistogram("hRCBackgroundMostCentral", etaMin, rcBackgroundRhoMean[i]);
1311         FillHistogram("hTrackBackgroundMostCentral", etaMin, trackBackgroundRhoMean[i]);
1312         FillHistogram("hKTBackgroundMostCentral", etaMin, ktBackgroundRhoMedian[i]);
1313         FillHistogram("hKTBackground2MostCentral", etaMin, ktBackground2RhoMedian[i]);
1314       }
1315       else if(centralityPercentile >= 80.)
1316       {
1317         FillHistogram("hRCBackgroundMostPeripheral", etaMin, rcBackgroundRhoMean[i]);
1318         FillHistogram("hTrackBackgroundMostPeripheral", etaMin, trackBackgroundRhoMean[i]);
1319         FillHistogram("hKTBackgroundMostPeripheral", etaMin, ktBackgroundRhoMedian[i]);
1320         FillHistogram("hKTBackground2MostPeripheral", etaMin, ktBackground2RhoMedian[i]);
1321       }
1322     }
1323
1324     FillHistogram("hRCBackgroundVsCentrality", rcBackgroundRhoMean[fBackgroundEtaBins], centralityPercentile);
1325     FillHistogram("hTrackBackgroundVsCentrality", trackBackgroundRhoMean[fBackgroundEtaBins], centralityPercentile);
1326     FillHistogram("hKTBackgroundVsCentrality", ktBackgroundRhoMedian[fBackgroundEtaBins], centralityPercentile);
1327     FillHistogram("hKTBackground2VsCentrality", ktBackground2RhoMedian[fBackgroundEtaBins], centralityPercentile);
1328
1329     if (dijetBackground >= 0)
1330     {
1331       // Background in Dijet events
1332       FillHistogram("hDijetBackground", dijetBackground); 
1333       if(centralityPercentile <= 20.)
1334         FillHistogram("hDijetBackgroundMostCentral", dijetBackground); 
1335       FillHistogram("hDijetBackgroundVsCentrality", dijetBackground, centralityPercentile);
1336     }
1337     if (dijetBackgroundPerpendicular >= 0)
1338     {
1339       // Background in Dijet events
1340       FillHistogram("hDijetBackgroundPerpendicular", dijetBackgroundPerpendicular); 
1341       if(centralityPercentile <= 20.)
1342         FillHistogram("hDijetBackgroundPerpendicularMostCentral", dijetBackgroundPerpendicular); 
1343       FillHistogram("hDijetBackgroundPerpendicularVsCentrality", dijetBackgroundPerpendicular, centralityPercentile);
1344     }
1345
1346     // ########## Delta pT calculations (most central, kt is eta corrected)
1347     if (centralityPercentile <= 20.)
1348     {
1349       Double_t tmpDeltaPtKT, tmpDeltaPtKT2Excl, tmpDeltaPtKT1Excl;
1350       Double_t tmpDeltaPtKTEta, tmpDeltaPtKTEta2Excl, tmpDeltaPtKTEta1Excl, tmpDeltaPtKT2Eta2Excl;
1351       Double_t tmpDeltaPtRC, tmpDeltaPtRC2Excl, tmpDeltaPtRC1Excl;
1352       Double_t tmpDeltaPtTR, tmpDeltaPtTR2Excl, tmpDeltaPtTR1Excl;
1353
1354       GetDeltaPt(tmpDeltaPtKT, ktBackgroundRhoMedian[fBackgroundEtaBins], 0, -1, kTRUE);
1355       GetDeltaPt(tmpDeltaPtKTEta, ktBackgroundRhoMedian[fKTDeltaPtEtaBin], 0, fKTDeltaPtEtaBin);
1356       GetDeltaPt(tmpDeltaPtRC, rcBackgroundRhoMean[fBackgroundEtaBins], 0);
1357       GetDeltaPt(tmpDeltaPtTR, trackBackgroundRhoMean[fBackgroundEtaBins], 0);
1358
1359       GetDeltaPt(tmpDeltaPtKT1Excl, ktBackgroundRhoMedian[fBackgroundEtaBins], 1, -1, kTRUE);
1360       GetDeltaPt(tmpDeltaPtKTEta1Excl, ktBackgroundRhoMedian[fKTDeltaPtEtaBin], 1, fKTDeltaPtEtaBin);
1361       GetDeltaPt(tmpDeltaPtRC1Excl, rcBackgroundRhoMean[fBackgroundEtaBins], 1);
1362       GetDeltaPt(tmpDeltaPtTR1Excl, trackBackgroundRhoMean[fBackgroundEtaBins], 1);
1363
1364       GetDeltaPt(tmpDeltaPtKT2Excl, ktBackgroundRhoMedian[fBackgroundEtaBins], 2, -1, kTRUE);
1365       GetDeltaPt(tmpDeltaPtKTEta2Excl, ktBackgroundRhoMedian[fKTDeltaPtEtaBin], 2, fKTDeltaPtEtaBin);
1366       GetDeltaPt(tmpDeltaPtRC2Excl, rcBackgroundRhoMean[fBackgroundEtaBins], 2);
1367       GetDeltaPt(tmpDeltaPtTR2Excl, trackBackgroundRhoMean[fBackgroundEtaBins], 2);
1368
1369       GetDeltaPt(tmpDeltaPtKT2Eta2Excl, ktBackground2RhoMedian[fKTDeltaPtEtaBin], 2, fKTDeltaPtEtaBin);
1370
1371       // kT Background
1372       if(tmpDeltaPtKT > -10000.0)
1373         FillHistogram("hDeltaPtKT", tmpDeltaPtKT);
1374       if(tmpDeltaPtKT1Excl > -10000.0)
1375         FillHistogram("hDeltaPtKT1Excl", tmpDeltaPtKT1Excl);
1376       if(tmpDeltaPtKT2Excl > -10000.0)
1377         FillHistogram("hDeltaPtKT2Excl", tmpDeltaPtKT2Excl);
1378
1379       if(tmpDeltaPtKT > -10000.0)
1380         FillHistogram("hDeltaPtKTEta", tmpDeltaPtKTEta);
1381       if(tmpDeltaPtKTEta1Excl > -10000.0)
1382         FillHistogram("hDeltaPtKTEta1Excl", tmpDeltaPtKTEta1Excl);
1383       if(tmpDeltaPtKTEta2Excl > -10000.0)
1384         FillHistogram("hDeltaPtKTEta2Excl", tmpDeltaPtKTEta2Excl);
1385       if(tmpDeltaPtKT2Eta2Excl > -10000.0)
1386         FillHistogram("hDeltaPtKT2Eta2Excl", tmpDeltaPtKT2Eta2Excl);
1387
1388       // RC Background
1389       if(tmpDeltaPtRC > -10000.0)
1390         FillHistogram("hDeltaPtRC", tmpDeltaPtRC);
1391       if(tmpDeltaPtRC1Excl > -10000.0)
1392         FillHistogram("hDeltaPtRC1Excl", tmpDeltaPtRC1Excl);
1393       if(tmpDeltaPtRC2Excl > -10000.0)
1394         FillHistogram("hDeltaPtRC2Excl", tmpDeltaPtRC2Excl);
1395       // TR Background
1396       if(tmpDeltaPtTR > -10000.0)
1397         FillHistogram("hDeltaPtTR", tmpDeltaPtTR);
1398       if(tmpDeltaPtTR1Excl > -10000.0)
1399         FillHistogram("hDeltaPtTR1Excl", tmpDeltaPtTR1Excl);
1400       if(tmpDeltaPtTR2Excl > -10000.0)
1401         FillHistogram("hDeltaPtTR2Excl", tmpDeltaPtTR2Excl);
1402     }
1403   }
1404   
1405   #ifdef DEBUGMODE
1406     AliInfo("Calculate()::Background done.");
1407   #endif
1408
1409
1410 //________________________________________________________________________
1411 Bool_t AliAnalysisTaskChargedJetsPA::Notify()
1412 {
1413   // Implemented Notify() to read the cross sections
1414   // and number of trials from pyxsec.root
1415   // 
1416   #ifdef DEBUGMODE
1417     AliInfo("Notify started.");
1418   #endif
1419
1420   if(fAnalyzePythia)
1421   {
1422     TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
1423     TFile *currFile = tree->GetCurrentFile();
1424
1425     TString file(currFile->GetName());
1426
1427     if(file.Contains("root_archive.zip#")){
1428       Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
1429       Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
1430       file.Replace(pos+1,20,"");
1431     }
1432     else {
1433       // not an archive take the basename....
1434       file.ReplaceAll(gSystem->BaseName(file.Data()),"");
1435     }
1436    
1437     TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
1438     if(!fxsec){
1439       // next trial fetch the histgram file
1440       fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
1441       if(!fxsec){
1442           // not a severe condition but inciate that we have no information
1443         return kFALSE;
1444       }
1445       else{
1446         // find the tlist we want to be independtent of the name so use the Tkey
1447         TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0); 
1448         if(!key){
1449           fxsec->Close();
1450           return kFALSE;
1451         }
1452         TList *list = dynamic_cast<TList*>(key->ReadObj());
1453         if(!list){
1454           fxsec->Close();
1455           return kFALSE;
1456         }
1457         fCrossSection = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
1458         fTrials  = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
1459         fxsec->Close();
1460       }
1461     } // no tree pyxsec.root
1462     else {
1463       TTree *xtree = (TTree*)fxsec->Get("Xsection");
1464       if(!xtree){
1465         fxsec->Close();
1466         return kFALSE;
1467       }
1468       UInt_t   ntrials  = 0;
1469       Double_t  xsection  = 0;
1470       xtree->SetBranchAddress("xsection",&xsection);
1471       xtree->SetBranchAddress("ntrials",&ntrials);
1472       xtree->GetEntry(0);
1473       fTrials = ntrials;
1474       fCrossSection = xsection;
1475       fxsec->Close();
1476     }
1477     #ifdef DEBUGMODE
1478       AliInfo("Notify ended.");
1479     #endif
1480   }
1481   return kTRUE;
1482 }
1483
1484 //________________________________________________________________________
1485 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x)
1486 {
1487   TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(key)));
1488   if(!tmpHist)
1489   {
1490     AliInfo(Form("Cannot find histogram <%s> ",key)) ;
1491     return;
1492   }
1493
1494   tmpHist->Fill(x);
1495 }
1496
1497 //________________________________________________________________________
1498 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x, Double_t y)
1499 {
1500   TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(key)));
1501   if(!tmpHist)
1502   {
1503     AliInfo(Form("Cannot find histogram <%s> ",key));
1504     return;
1505   }
1506
1507   if (tmpHist->IsA()->GetBaseClass("TH1"))
1508     static_cast<TH1*>(tmpHist)->Fill(x,y); // Fill x with y
1509   else if (tmpHist->IsA()->GetBaseClass("TH2"))
1510     static_cast<TH2*>(tmpHist)->Fill(x,y); // Fill x,y with 1
1511 }
1512
1513 //________________________________________________________________________
1514 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x, Double_t y, Double_t add)
1515 {
1516   TH2* tmpHist = static_cast<TH2*>(fOutputList->FindObject(GetHistoName(key)));
1517   if(!tmpHist)
1518   {
1519     AliInfo(Form("Cannot find histogram <%s> ",key));
1520     return;
1521   }
1522   
1523   tmpHist->Fill(x,y,add);
1524 }
1525 //________________________________________________________________________
1526 template <class T> T* AliAnalysisTaskChargedJetsPA::AddHistogram1D(const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, const char* xTitle, const char* yTitle)
1527 {
1528   T* tmpHist = new T(GetHistoName(name), GetHistoName(title), xBins, xMin, xMax);
1529
1530   tmpHist->GetXaxis()->SetTitle(xTitle);
1531   tmpHist->GetYaxis()->SetTitle(yTitle);
1532   tmpHist->SetOption(options);
1533   tmpHist->SetMarkerStyle(kFullCircle);
1534   tmpHist->Sumw2();
1535
1536   fHistList->Add(tmpHist);
1537   fHistCount++;
1538   
1539   return tmpHist;
1540 }
1541
1542 //________________________________________________________________________
1543 template <class T> T* AliAnalysisTaskChargedJetsPA::AddHistogram2D(const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, Int_t yBins, Double_t yMin, Double_t yMax, const char* xTitle, const char* yTitle, const char* zTitle)
1544 {
1545   T* tmpHist = new T(GetHistoName(name), GetHistoName(title), xBins, xMin, xMax, yBins, yMin, yMax);
1546   tmpHist->GetXaxis()->SetTitle(xTitle);
1547   tmpHist->GetYaxis()->SetTitle(yTitle);
1548   tmpHist->GetZaxis()->SetTitle(zTitle);
1549   tmpHist->SetOption(options);
1550   tmpHist->SetMarkerStyle(kFullCircle);
1551   tmpHist->Sumw2();
1552
1553   fHistList->Add(tmpHist);
1554   fHistCount++;
1555
1556   return tmpHist;
1557 }
1558
1559 //________________________________________________________________________
1560 void AliAnalysisTaskChargedJetsPA::Terminate(Option_t *)
1561 {
1562   PostData(1, fOutputList);
1563
1564   // Mandatory
1565   fOutputList = dynamic_cast<TList*> (GetOutputData(1)); // '1' refers to the output slot
1566   if (!fOutputList) {
1567     printf("ERROR: Output list not available\n");
1568     return;
1569   }
1570 }
1571
1572 //________________________________________________________________________
1573 AliAnalysisTaskChargedJetsPA::~AliAnalysisTaskChargedJetsPA()
1574 {
1575   // Destructor. Clean-up the output list, but not the histograms that are put inside
1576   // (the list is owner and will clean-up these histograms). Protect in PROOF case.
1577   if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
1578     delete fOutputList;
1579   }
1580 }
1581
1582 //________________________________________________________________________
1583 void AliAnalysisTaskChargedJetsPA::UserCreateOutputObjects()
1584 {
1585   // called once to create user defined output objects like histograms, plots etc. 
1586   // and to put it on the output list.
1587   // Note: Saving to file with e.g. OpenFile(0) is must be before creating other objects.
1588
1589   fRandom = new TRandom3(0);
1590   
1591   fOutputList = new TList();
1592   fOutputList->SetOwner(); // otherwise it produces leaks in merging
1593
1594   PostData(1, fOutputList);
1595 }
1596
1597 //________________________________________________________________________
1598 void AliAnalysisTaskChargedJetsPA::UserExec(Option_t *) 
1599 {
1600   #ifdef DEBUGMODE
1601     AliInfo("UserExec() started.");
1602   #endif
1603
1604   Calculate(InputEvent());
1605         
1606   PostData(1, fOutputList);
1607 }