]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/EBYE/BalanceFunctions/AliBalanceTriggered.cxx
Avoid double counting in Triggered BF analysis (2nd particle loop)
[u/mrichter/AliRoot.git] / PWGCF / EBYE / BalanceFunctions / AliBalanceTriggered.cxx
1 /**************************************************************************
2  * Author: Panos Christakoglou.                                           *
3  * Contributors are mentioned in the code where appropriate.              *
4  *                                                                        *
5  * Permission to use, copy, modify and distribute this software and its   *
6  * documentation strictly for non-commercial purposes is hereby granted   *
7  * without fee, provided that the above copyright notice appears in all   *
8  * copies and that both the copyright notice and this permission notice   *
9  * appear in the supporting documentation. The authors make no claims     *
10  * about the suitability of this software for any purpose. It is          *
11  * provided "as is" without express or implied warranty.                  *
12  **************************************************************************/
13
14 //-----------------------------------------------------------------
15 //           Balance Function class
16 //   This is the class to deal with the Balance Function analysis
17 //   Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
18 //   Modified: Michael Weber, m.weber@cern.ch
19 //-----------------------------------------------------------------
20
21
22 //ROOT
23 #include <Riostream.h>
24 #include <TMath.h>
25 #include <TAxis.h>
26 #include <TH1D.h>
27 #include <TH2D.h>
28
29
30 #include <AliTHn.h>
31 #include <TLorentzVector.h>
32 #include <TObjArray.h>
33 #include <TGraphErrors.h>
34 #include <TString.h>
35
36 #include "AliVParticle.h"
37 #include "AliMCParticle.h"
38 #include "AliESDtrack.h"
39 #include "AliAODTrack.h"
40
41 #include "AliBalanceTriggered.h"
42
43 ClassImp(AliBalanceTriggered)
44
45 //____________________________________________________________________//
46 AliBalanceTriggered::AliBalanceTriggered() :
47   TObject(), 
48   bShuffle(kFALSE),
49   fAnalysisLevel("AOD"),
50   fHistP(0x0),
51   fHistN(0x0),
52   fHistPN(0x0),
53   fHistNP(0x0),
54   fHistPP(0x0),
55   fHistNN(0x0)
56 {
57   // Default constructor
58  
59 }
60
61
62 //____________________________________________________________________//
63 AliBalanceTriggered::AliBalanceTriggered(const AliBalanceTriggered& balance):
64   TObject(balance), bShuffle(balance.bShuffle), 
65   fAnalysisLevel(balance.fAnalysisLevel),
66   fHistP(balance.fHistP),
67   fHistN(balance.fHistN),
68   fHistPN(balance.fHistPN),
69   fHistNP(balance.fHistNP),
70   fHistPP(balance.fHistPP),
71   fHistNN(balance.fHistNN)
72 {
73   //copy constructor
74
75 }
76
77 //____________________________________________________________________//
78 AliBalanceTriggered::~AliBalanceTriggered() {
79   // Destructor
80  
81   delete fHistP;
82   delete fHistN;
83   delete fHistPN;
84   delete fHistNP;
85   delete fHistPP;
86   delete fHistNN;
87   
88
89 }
90
91 //____________________________________________________________________//
92 void AliBalanceTriggered::InitHistograms() {
93
94   //Initialize the histograms
95
96   TString title    = "";      // histogram title
97   Int_t anaSteps   = 1;       // analysis steps
98
99   // single particle histograms
100   Int_t iBinSingle[nTrackVarsSingle];         // binning for track variables
101   Double_t* dBinsSingle[nTrackVarsSingle];    // bins for track variables  
102   TString axisTitleSingle[nTrackVarsSingle];  // axis titles for track variables
103   
104   // two particle histograms
105   Int_t iBinPair[nTrackVarsPair];         // binning for track variables
106   Double_t* dBinsPair[nTrackVarsPair];    // bins for track variables  
107   TString axisTitlePair[nTrackVarsPair];  // axis titles for track variables
108
109    
110   //-----------------------------------------------------------
111   // histogram settings (hard coded!)
112   //-----------------------------------------------------------
113
114   // eta
115   const Int_t kNEtaBins = 40;
116   Double_t etaBins[kNEtaBins+1];
117   for(Int_t i = 0; i < kNEtaBins+1; i++){
118     etaBins[i] = -1.0 + i * 0.05;
119   } 
120   iBinSingle[0]       = kNEtaBins;
121   dBinsSingle[0]      = etaBins;
122   axisTitleSingle[0]  = "#eta"; 
123   
124   // delta eta
125   const Int_t kNDeltaEtaBins = 40;
126   Double_t deltaEtaBins[kNDeltaEtaBins+1];
127   for(Int_t i = 0; i < kNDeltaEtaBins+1; i++){
128     deltaEtaBins[i] = -2.0 + i * 0.1;
129   } 
130   iBinPair[0]       = kNDeltaEtaBins;
131   dBinsPair[0]      = deltaEtaBins;
132   axisTitlePair[0]  = "#Delta #eta"; 
133
134   // phi
135   const Int_t kNPhiBins = 72;
136   Double_t phiBins[kNPhiBins+1];
137   for(Int_t i = 0; i < kNPhiBins+1; i++){
138     phiBins[i] = 0.0 + i * 5.;
139   } 
140   iBinSingle[1]       = kNPhiBins;
141   dBinsSingle[1]      = phiBins;
142   axisTitleSingle[1]  = "#phi (#circ)"; 
143   
144   // delta phi
145   const Int_t kNDeltaPhiBins = 72;
146   Double_t deltaPhiBins[kNDeltaPhiBins+1];
147   for(Int_t i = 0; i < kNDeltaPhiBins+1; i++){
148     deltaPhiBins[i] = -180.0 + i * 5.;
149   } 
150   iBinPair[1]       = kNDeltaPhiBins;
151   dBinsPair[1]      = deltaPhiBins;
152   axisTitlePair[1]  = "#Delta #phi (#circ)"; 
153
154   // pT
155   const Int_t kNPtBins = 22;
156   Double_t pTBins[kNPtBins+1] = {0.15, 0.2, 0.3, 0.4, 0.5, 0.75, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 15.0, 20.0};
157   iBinSingle[2]       = kNPtBins;
158   dBinsSingle[2]      = pTBins;
159   axisTitleSingle[2]  = "p_{T,trig} (GeV/c)";
160  
161   iBinPair[2]       = kNPtBins;
162   dBinsPair[2]      = pTBins;
163   axisTitlePair[2]  = "p_{T} (GeV/c)";
164  
165   iBinPair[3]       = kNPtBins;
166   dBinsPair[3]      = pTBins;
167   axisTitlePair[3]  = "p_{T,trig} (GeV/c)"; 
168
169   // centrality
170   const Int_t kNCentBins = 9;
171   Double_t centBins[kNCentBins+1] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.};
172
173   iBinSingle[3]       = kNCentBins;
174   dBinsSingle[3]      = centBins;
175   axisTitleSingle[3]  = "centrality"; 
176
177   iBinPair[4]       = kNCentBins;
178   dBinsPair[4]      = centBins;
179   axisTitlePair[4]  = "centrality";
180
181   //-----------------------------------------------------------
182   
183
184
185   // User settings (depending on the analysis settings [only one at the moment])
186   if(fAnalysisLevel == "AOD"){
187     title = "hdEtaVsdPhi";
188   }
189
190   //-----------------------------------------------------------
191   //-----------------------------------------------------------
192   // Histogram creation
193
194   // histogram for negative particles
195   fHistN = new AliTHn(Form("fHistN"), Form("%s_N",title.Data()), anaSteps, nTrackVarsSingle, iBinSingle);
196   for (Int_t j=0; j<nTrackVarsSingle; j++)
197     {
198       fHistN->SetBinLimits(j, dBinsSingle[j]);
199       fHistN->SetVarTitle(j, axisTitleSingle[j]);
200     }
201
202   // histogram for positive particles
203   fHistP = new AliTHn(Form("fHistP"), Form("%s_P",title.Data()), anaSteps, nTrackVarsSingle, iBinSingle);
204   for (Int_t j=0; j<nTrackVarsSingle; j++)
205     {
206       fHistP->SetBinLimits(j, dBinsSingle[j]);
207       fHistP->SetVarTitle(j, axisTitleSingle[j]);
208     }
209
210   // histogram for +- pairs
211   fHistPN = new AliTHn(Form("fHistPN"), Form("%s_PN",title.Data()), anaSteps, nTrackVarsPair, iBinPair);
212   for (Int_t j=0; j<nTrackVarsPair; j++)
213     {
214       fHistPN->SetBinLimits(j, dBinsPair[j]);
215       fHistPN->SetVarTitle(j, axisTitlePair[j]);
216     }
217
218   // histogram for -+ pairs
219   fHistNP = new AliTHn(Form("fHistNP"), Form("%s_NP",title.Data()), anaSteps, nTrackVarsPair, iBinPair);
220   for (Int_t j=0; j<nTrackVarsPair; j++)
221     {
222       fHistNP->SetBinLimits(j, dBinsPair[j]);
223       fHistNP->SetVarTitle(j, axisTitlePair[j]);
224     }
225
226   // histogram for ++ pairs
227   fHistPP = new AliTHn(Form("fHistPP"), Form("%s_PP",title.Data()), anaSteps, nTrackVarsPair, iBinPair);
228   for (Int_t j=0; j<nTrackVarsPair; j++)
229     {
230       fHistPP->SetBinLimits(j, dBinsPair[j]);
231       fHistPP->SetVarTitle(j, axisTitlePair[j]);
232     }
233
234   // histogram for -- pairs
235   fHistNN = new AliTHn(Form("fHistNN"), Form("%s_NN",title.Data()), anaSteps, nTrackVarsPair, iBinPair);
236   for (Int_t j=0; j<nTrackVarsPair; j++)
237     {
238       fHistNN->SetBinLimits(j, dBinsPair[j]);
239       fHistNN->SetVarTitle(j, axisTitlePair[j]);
240     }
241
242   //-----------------------------------------------------------
243   //-----------------------------------------------------------
244
245
246 }
247
248 //____________________________________________________________________//
249 void AliBalanceTriggered::FillBalance(Float_t fCentrality,vector<Double_t> **chargeVector) {
250   // Calculates the balance function
251
252  
253   // Initialize histograms if not done yet
254   if(!fHistPN){
255     AliWarning("Histograms not yet initialized! --> Will be done now");
256     AliWarning("This works only in local mode --> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
257     InitHistograms();
258   }
259
260   Int_t gNtrack = chargeVector[0]->size();
261   Double_t trackVarsSingle[nTrackVarsSingle];
262   Double_t trackVarsPair[nTrackVarsPair];
263
264   // 1st particle loop
265   for(Int_t i = 0; i < gNtrack;i++){
266
267     Short_t  charge = (Short_t) chargeVector[0]->at(i);
268     trackVarsSingle[0]    =  chargeVector[2]->at(i);  //eta
269     trackVarsSingle[1]    =  chargeVector[3]->at(i);  //phi
270     trackVarsSingle[2]    =  chargeVector[7]->at(i);  //pt trigger
271     trackVarsSingle[3]    =  fCentrality;             //centrality (really as variable here????)
272
273     //fill single particle histograms
274     if(charge > 0)  fHistP->Fill(trackVarsSingle,0,1.); 
275     else            fHistN->Fill(trackVarsSingle,0,1.); 
276
277     // 2nd particle loop (only for j < i for non double counting in the same pT region)
278     // --> SAME pT region for trigger and assoc: NO double counting with this
279     // --> DIFF pT region for trigger and assoc: Missing assoc. particles with j > i to a trigger i 
280     //                          --> can be handled afterwards by using assoc. as trigger as well ?!
281
282     for(Int_t j = 0; j < i; j++) {
283       
284       Short_t charge2 = (Short_t) chargeVector[0]->at(j);
285       trackVarsPair[0]    =  chargeVector[2]->at(i) - chargeVector[2]->at(j) ;  //delta eta
286       trackVarsPair[1]    =  chargeVector[3]->at(i) - chargeVector[3]->at(j);  //delta phi
287       trackVarsPair[2]    =  chargeVector[7]->at(j);  //pt
288       trackVarsPair[3]    =  chargeVector[7]->at(i);  //pt trigger
289       trackVarsPair[4]    =  fCentrality;             //centrality (really as variable here????)
290       
291       if( charge > 0 && charge2 < 0)  fHistPN->Fill(trackVarsPair,0,1.); 
292       else if( charge < 0 && charge2 > 0)  fHistNP->Fill(trackVarsPair,0,1.); 
293       else if( charge > 0 && charge2 > 0)  fHistPP->Fill(trackVarsPair,0,1.); 
294       else if( charge < 0 && charge2 < 0)  fHistNN->Fill(trackVarsPair,0,1.); 
295       else AliWarning("Wrong charge combination!");
296       
297     }//end of 2nd particle loop
298   }//end of 1st particle loop
299 }  
300
301
302 TH1D* AliBalanceTriggered::GetBalanceFunctionHistogram1D(Int_t var, Double_t pTMinTrigger, Double_t pTMaxTrigger, Double_t pTMin, Double_t pTMax, Double_t centrMin, Double_t centrMax){
303
304   // check which variable should be analyzed
305   // 0 = Delta eta
306   // 1 = Delta phi
307
308   if( var < 0 || var > 1){
309     AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
310     return NULL;
311   }
312
313
314   // Choose region to analyze 
315   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
316   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
317
318   // pT trigger
319   fHistP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
320   fHistN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
321   fHistPN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
322   fHistNP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
323   fHistPP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
324   fHistNN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
325
326   // pT
327   fHistPN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
328   fHistNP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
329   fHistPP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
330   fHistNN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
331
332   // centrality
333   fHistP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
334   fHistN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
335   fHistPN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
336   fHistNP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
337   fHistPP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
338   fHistNN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
339   
340
341   // Project into the wanted space (1st: analysis step, 2nd: axis)
342   TH1D* hTemp1 = (TH1D*)fHistPN->Project(0,var);
343   TH1D* hTemp2 = (TH1D*)fHistNP->Project(0,var);
344   TH1D* hTemp3 = (TH1D*)fHistPP->Project(0,var);
345   TH1D* hTemp4 = (TH1D*)fHistNN->Project(0,var);
346   TH1D* hTemp5 = (TH1D*)fHistP->Project(0,var);
347   TH1D* hTemp6 = (TH1D*)fHistN->Project(0,var);
348
349   TH1D* gHistBalanceFunctionHistogram = NULL;
350
351   // Calculate BF
352   if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
353     
354     gHistBalanceFunctionHistogram = (TH1D*)hTemp1->Clone();
355     gHistBalanceFunctionHistogram->Reset();
356
357     // Calculate BF
358     hTemp1->Add(hTemp3,-1.);
359     hTemp1->Scale(1./hTemp5->GetEntries());
360     hTemp2->Add(hTemp4,-1.);
361     hTemp2->Scale(1./hTemp6->GetEntries());
362     gHistBalanceFunctionHistogram->Add(hTemp1,hTemp2,1.,1.);
363     gHistBalanceFunctionHistogram->Scale(0.5/1.);
364   }
365
366   return gHistBalanceFunctionHistogram;
367 }
368
369 TH2D* AliBalanceTriggered::GetBalanceFunctionHistogram2D(Int_t var1, Int_t var2, Double_t pTMinTrigger, Double_t pTMaxTrigger, Double_t pTMin, Double_t pTMax, Double_t centrMin, Double_t centrMax){
370
371   // check which variable should be analyzed
372   // 0 = Delta eta
373   // 1 = Delta phi
374
375   if( var1 < 0 || var1 > 1 || var2 < 0 || var2 > 1){
376     AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
377     return NULL;
378   }
379
380
381   // Choose region to analyze 
382   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
383   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
384
385   // pT trigger
386   fHistP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
387   fHistN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
388   fHistPN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
389   fHistNP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
390   fHistPP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
391   fHistNN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
392
393   // pT
394   fHistPN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
395   fHistNP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
396   fHistPP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
397   fHistNN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
398
399   // centrality
400   fHistP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
401   fHistN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
402   fHistPN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
403   fHistNP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
404   fHistPP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
405   fHistNN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
406   
407
408   // Project into the wanted space (1st: analysis step, 2nd: axis1, 3rd: axis2)
409   TH2D* hTemp1 = (TH2D*)fHistPN->Project(0,var1,var2);
410   TH2D* hTemp2 = (TH2D*)fHistNP->Project(0,var1,var2);
411   TH2D* hTemp3 = (TH2D*)fHistPP->Project(0,var1,var2);
412   TH2D* hTemp4 = (TH2D*)fHistNN->Project(0,var1,var2);
413   TH2D* hTemp5 = (TH2D*)fHistP->Project(0,var1,var2);
414   TH2D* hTemp6 = (TH2D*)fHistN->Project(0,var1,var2);
415
416   TH2D* gHistBalanceFunctionHistogram = NULL;
417
418   // Calculate BF
419   if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
420     
421     gHistBalanceFunctionHistogram = (TH2D*)hTemp1->Clone();
422     gHistBalanceFunctionHistogram->Reset();
423     
424     // Calculate BF
425     hTemp1->Add(hTemp3,-1.);
426     hTemp1->Scale(1./hTemp5->GetEntries());
427     hTemp2->Add(hTemp4,-1.);
428     hTemp2->Scale(1./hTemp6->GetEntries());
429     gHistBalanceFunctionHistogram->Add(hTemp1,hTemp2,1.,1.);
430   }
431
432   return gHistBalanceFunctionHistogram;
433 }
434
435
436 TH1D* AliBalanceTriggered::GetHistogram1D(Int_t histo, Int_t var, Double_t pTMinTrigger, Double_t pTMaxTrigger, Double_t pTMin, Double_t pTMax, Double_t centrMin, Double_t centrMax){
437
438   // check which variable should be analyzed
439   //
440   // pair histograms:
441   // 0 = Delta eta 
442   // 1 = Delta phi
443   // 2 = pT, trigger
444   // 3 = centrality
445   //
446   // pair histograms:
447   // 0 = Delta eta 
448   // 1 = Delta phi
449   // 2 = pT
450   // 3 = pT, trigger
451   // 4 = centrality
452
453   if(histo < 0 || histo > 5){
454     AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
455     return NULL;
456   }
457
458   if( histo > 1 && (var < 0 || var > 5)){
459     AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
460     return NULL;
461   }
462   if( histo < 2 && (var < 0 || var > 4)){
463     AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
464     return NULL;
465   }
466
467   // get the histogram
468   AliTHn *gTHn = NULL;
469   switch(histo){
470  
471   case 0:
472     gTHn = fHistP;
473     break;
474
475   case 1:
476     gTHn = fHistN;
477     break;
478
479   case 2:
480     gTHn = fHistPN;
481     break;
482
483   case 3:
484     gTHn = fHistNP;
485     break;
486
487   case 4:
488     gTHn = fHistPP;
489     break;
490
491   case 5:
492     gTHn = fHistNN;
493     break;
494     
495   }
496
497   if(!gTHn){
498     AliError(Form("AliTHn number %d = NULL",histo));
499     return NULL;
500   }
501
502   // Choose region to analyze 
503   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
504   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
505
506   // pT trigger
507   gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
508  
509   // pT
510   if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
511  
512   // centrality
513   if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
514   else          gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
515  
516
517   // Project into the wanted space (1st: analysis step, 2nd: axis)
518   TH1D* gHisto = (TH1D*)gTHn->Project(0,var);
519
520   return gHisto;
521 }
522
523
524 TH2D* AliBalanceTriggered::GetHistogram2D(Int_t histo, Int_t var1, Int_t var2, Double_t pTMinTrigger, Double_t pTMaxTrigger, Double_t pTMin, Double_t pTMax, Double_t centrMin, Double_t centrMax){
525
526   // check which variable should be analyzed
527   //
528   // pair histograms:
529   // 0 = Delta eta 
530   // 1 = Delta phi
531   // 2 = pT, trigger
532   // 3 = centrality
533   //
534   // pair histograms:
535   // 0 = Delta eta 
536   // 1 = Delta phi
537   // 2 = pT
538   // 3 = pT, trigger
539   // 4 = centrality
540
541   if(histo < 0 || histo > 5){
542     AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
543     return NULL;
544   }
545
546   if( histo > 1 && (var1 < 0 || var1 > 5 || var2 < 0 || var2 > 5)){
547     AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
548     return NULL;
549   }
550   if( histo < 2 && (var1 < 0 || var1 > 4 || var2 < 0 || var2 > 4)){
551     AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
552     return NULL;
553   }
554
555   // get the histogram
556   AliTHn *gTHn = NULL;
557   switch(histo){
558  
559   case 0:
560     gTHn = fHistP;
561     break;
562
563   case 1:
564     gTHn = fHistN;
565     break;
566
567   case 2:
568     gTHn = fHistPN;
569     break;
570
571   case 3:
572     gTHn = fHistNP;
573     break;
574
575   case 4:
576     gTHn = fHistPP;
577     break;
578
579   case 5:
580     gTHn = fHistNN;
581     break;
582     
583   }
584
585   if(!gTHn){
586     AliError(Form("AliTHn number %d = NULL",histo));
587     return NULL;
588   }
589
590   // Choose region to analyze 
591   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
592   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
593
594   // pT trigger
595   gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
596  
597   // pT
598   if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
599  
600   // centrality
601   if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
602   else          gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
603  
604
605   // Project into the wanted space (1st: analysis step, 2nd: axis)
606   TH2D* gHisto = (TH2D*)gTHn->Project(0,var1,var2);
607
608   return gHisto;
609 }