adding track cut filter. Only add used ME tracks to ME
[u/mrichter/AliRoot.git] / PWGGA / GammaConv / ConvCorrelations / AliAnaConvCorrBase.cxx
1 /**************************************************************************
2  * This file is property of and copyright by the ALICE HLT Project        *
3  * ALICE Experiment at CERN, All rights reserved.                         *
4  *                                                                        *
5  * Primary Author: Svein Lindal <slindal@fys.uio.no>                      *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /// @file   AliAnaConvCorrBase.cxx
17 /// @author Svein Lindal
18 /// @brief  Base class for analysation of conversion particle - track correlations
19
20
21 #include "AliAnaConvCorrBase.h"
22 #include "AliAODTrack.h"
23
24 #include "TClonesArray.h"
25 #include "TH1F.h"
26 #include "TH3.h"
27 #include "TList.h"
28 #include "AliAODConversionParticle.h"
29
30 #include <iostream>
31
32 // Gamma - jet correlation analysis task
33 // Authors: Svein Lindal
34
35
36 using namespace std;
37 ClassImp(AliAnaConvCorrBase)
38
39 //________________________________________________________________________
40 AliAnaConvCorrBase::AliAnaConvCorrBase(TString name, TString title = "title") : TNamed(name, title),
41   fHistograms(NULL),
42   fAxesList(), 
43   fTrigAxisList(), 
44   fTrackAxisList(),
45   fAxistPt(),
46   fAxiscPt(), 
47   fAxisdEta(), 
48   fAxisdPhi(),
49   fAxisIso(), 
50   fAxisMEEta(), 
51   fAxisMEPhi(),
52   fCorrSparse(NULL),
53   fTrigSparse(NULL),
54   fTrackSparse(NULL)
55 {
56   //Constructor
57
58   SetUpDefaultBins();
59   
60   fAxesList.SetOwner(kTRUE);
61   fTrackAxisList.SetOwner(kTRUE);
62   fTrigAxisList.SetOwner(kTRUE);
63
64 }
65
66
67 //________________________________________________________________________________
68 AliAnaConvCorrBase::~AliAnaConvCorrBase() {
69   ///destructor
70 }
71
72 //________________________________________________________________________________
73 void AliAnaConvCorrBase::CreateHistograms() {
74   CreateBaseHistograms();
75 }
76
77 ///________________________________________________________________________________
78 void AliAnaConvCorrBase::SetUpDefaultBins() {
79   //Set up default bins
80   Double_t ptbins[19] = {0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10.0, 12.5, 15, 20, 25, 30, 50, 100};
81   fAxisdEta.Set(160, -1.6, 1.6);
82   fAxisdEta.SetNameTitle("dEta", "delta eta");
83
84   fAxisdPhi.Set(64, -TMath::PiOver2(), 3*TMath::PiOver2());
85   fAxisdPhi.SetNameTitle("dPhi", "delta Phi");
86
87   fAxistPt.Set(18, ptbins);
88   fAxistPt.SetNameTitle("tPt", "trigger Pt");
89
90   fAxiscPt.Set(18, ptbins);
91   fAxiscPt.SetNameTitle("cPt", "track Pt");
92
93   fAxisIso.Set(3, -0.5, 2.5);
94   fAxisIso.SetNameTitle("iso", "isolation");
95
96   fAxesList.AddAt(&fAxisdEta, 0);
97   fAxesList.AddAt(&fAxisdPhi, 1);
98   fAxesList.AddAt(&fAxistPt, 2);
99   fAxesList.AddAt(&fAxiscPt, 3);
100   fAxesList.AddAt(&fAxisIso, 4);
101
102   fAxisMEEta.Set(160, -0.8, 0.8);
103   fAxisMEEta.SetNameTitle("eta", "eta");
104   
105   fAxisMEPhi.Set(64, 0, TMath::TwoPi());
106   fAxisMEPhi.SetNameTitle("phi", "phi");
107
108   fTrackAxisList.AddAt(&fAxisMEEta, 0);
109   fTrackAxisList.AddAt(&fAxisMEPhi, 1);
110   fTrackAxisList.AddAt(&fAxistPt, 2);
111   fTrackAxisList.AddAt(&fAxiscPt, 3);
112   fTrackAxisList.AddAt(&fAxisIso, 4);
113
114   fTrigAxisList.AddAt(&fAxisMEEta, 0);
115   fTrigAxisList.AddAt(&fAxisMEPhi, 1);
116   fTrigAxisList.AddAt(&fAxistPt, 2);
117   fTrigAxisList.AddAt(&fAxisIso, 3);
118
119   for(int iIso = 0; iIso < 2; iIso++) {
120     fHNTriggers[iIso] = NULL;
121   }
122 }
123
124
125 //________________________________________________________________________
126 void AliAnaConvCorrBase::CreateBaseHistograms() {
127   //Create histograms add, to outputlis
128
129   cout << "Creating histograms for "<< GetName() << endl;
130
131   fHistograms = new TList();
132   fHistograms->SetOwner(kTRUE);
133   fHistograms->SetName(fName);
134
135   for(int iIso = 0; iIso < 2; iIso++) {
136
137     fHNTriggers[iIso] = new TH1F(Form("%s_%s_fNTriggers", fName.Data(), (iIso==0)?"nonIso":"isolated"), 
138                                                                  Form("%s_%s_fNTriggers", fName.Data(), (iIso==0)?"nonIso":"isolated"), 
139                                                                  fAxistPt.GetNbins(), fAxistPt.GetXbins()->GetArray());
140     fHNTriggers[iIso]->Sumw2();
141     fHistograms->Add(fHNTriggers[iIso]);
142   
143   }
144
145   fCorrSparse = CreateSparse(GetName(), GetTitle(), &fAxesList);
146   fHistograms->Add(fCorrSparse);
147
148   fTrackSparse = CreateSparse(Form("%s_%s", GetName(), "METrack"), Form("%s %s", GetTitle(), "ME Tracks"), &fTrackAxisList);
149   fHistograms->Add(fTrackSparse);
150
151   fTrigSparse = CreateSparse(Form("%s_%s", GetName(), "METrig"), Form("%s %s", GetTitle(), "ME Triggers"), &fTrigAxisList);
152   fHistograms->Add(fTrigSparse);
153
154 }
155
156 ///________________________________________________________________________
157 THnSparseF * AliAnaConvCorrBase::CreateSparse(TString nameString, TString titleString, TList * axesList) {
158   //Create sparse
159   const Int_t dim = axesList->GetSize();
160   
161   cout << nameString << " " << titleString << " " <<   "    dimesion: " << dim << endl;
162
163   TAxis * axes[dim];
164   Int_t   bins[dim];
165   Double_t min[dim];
166   Double_t max[dim];
167
168   for(Int_t i = 0; i<dim; i++) {
169         TAxis * axis = dynamic_cast<TAxis*>(axesList->At(i));
170         if(axis) axes[i] = axis;
171         else {
172           cout << "AliAnalysisTaskdPhi::CreateSparse: Error error, all the axes are not present in axis list" << endl;
173           return NULL;
174         }
175   }
176
177   for(Int_t i = 0; i<dim; i++) {
178         cout << axes[i]->GetTitle() << endl;
179         bins[i] = axes[i]->GetNbins(); 
180         min[i] = axes[i]->GetBinLowEdge(1);
181         max[i] = axes[i]->GetBinUpEdge(axes[i]->GetNbins());
182   }
183
184   THnSparseF * sparse = new THnSparseF(Form("%s", nameString.Data()), 
185                                                                            Form("%s", titleString.Data()), 
186                                                                            dim, bins, min, max);
187   
188   for(Int_t i = 0; i<dim; i++) {
189         sparse->GetAxis(i)->SetNameTitle(axes[i]->GetName(), axes[i]->GetTitle() );
190         if(axes[i]->GetXbins()->GetSize() > 0) {
191           sparse->SetBinEdges(i, axes[i]->GetXbins()->GetArray() );
192         }
193   }
194   return sparse;
195 }
196
197
198 ///____________________________________________________________________________
199 // void AliAnaConvCorrBase::FillTriggerCounters(Float_t tPt, Bool_t isolated){ 
200 //   //Fill histogram with trigger counters
201
202 //   fHNTriggers[0]->Fill(tPt);
203   
204 //   if(isolated) {
205 //     fHNTriggers[isolated]->Fill(tPt);
206     
207 //   }
208 // }
209
210 // ///_____________________________________________________________________________
211 // void AliAnaConvCorrBase::FillHistograms(Float_t tPt, Float_t cPt, Float_t dPhi, Float_t dEta, Bool_t isolated) {
212 //   //Fill histograms
213
214 //   if(dEta) { ;}
215 //   //fHdPhi[0]->Fill(tPt, cPt, dPhi);
216 //   if(isolated) {
217 //     //fHdPhi[isolated]->Fill(tPt, cPt, dPhi);
218 //   }
219 // }
220
221 //_______________________________________________________________________________
222
223 void AliAnaConvCorrBase::PrintStatistics()  { 
224   //Print some statistics between each file
225   for(Int_t i = 1; i <= fHNTriggers[0]->GetNbinsX(); i++) {
226     Int_t nTrig = (Int_t) fHNTriggers[0]->GetBinContent(i+1);
227     cout << "triggers: " << nTrig << endl;
228
229   }
230 }
231
232
233 //_______________________________________________________________________________
234 void AliAnaConvCorrBase::FillTriggerCounters(const AliAODConversionParticle * particle, Bool_t leading) {
235   fHNTriggers[leading]->Fill(particle->Pt());
236 }
237
238
239 //________________________________________________________________
240 void AliAnaConvCorrBase::CorrelateWithTracks(AliAODConversionParticle * particle, TObjArray * tracks, Int_t const tIDs[4], Int_t isolated = 0) {
241   //Correlate particle with tracks
242
243   FillTriggerCounters(particle, isolated);
244
245   Int_t nDim = fAxesList.GetSize();
246   Double_t dphivalues[nDim];
247   Double_t trackValues[nDim];
248   Double_t trigValues[nDim - 1];
249
250
251   trigValues[0] = particle->Eta();
252   trigValues[1] = particle->Phi();
253   trigValues[2] = particle->Pt();
254   trigValues[3] = isolated;
255   fTrigSparse->Fill(trigValues);
256
257   for(int ij = 0; ij < tracks->GetEntriesFast(); ij++) {
258         AliVTrack * track = static_cast<AliVTrack*>(tracks->UncheckedAt(ij));
259         Int_t tid = track->GetID();
260
261         if((tid > 0) && (tid == tIDs[0] || tid == tIDs[1] || tid == tIDs[2] || tid == tIDs[3]) ) {
262           continue;
263         }
264         
265         dphivalues[0] = particle->Eta() - track->Eta();
266         dphivalues[1] = GetDPhi(particle->Phi() - track->Phi());
267         dphivalues[2] = particle->Pt();
268         dphivalues[3] = track->Pt();
269         dphivalues[4] = isolated;
270
271         trackValues[0] = track->Eta();
272         trackValues[1] = track->Phi();
273         trackValues[2] = particle->Pt();
274         trackValues[3] = track->Pt();
275         trackValues[4] = isolated;
276
277
278         if(nDim > 4) {
279           dphivalues[5] = particle->M();
280           trackValues[5] = particle->M();
281           trigValues[4] = particle->M();
282         }
283         
284         fCorrSparse->Fill(dphivalues);
285         fTrackSparse->Fill(trackValues);
286   }
287 }
288