]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/EBYE/BalanceFunctions/AliBalanceTriggered.cxx
coverity fixes + changed to full loop over second particle
[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 (now over all particles except the same!)
278     for(Int_t j = 0; j < gNtrack; j++) {
279
280       if( j == i ) continue;  
281       
282       Short_t charge2 = (Short_t) chargeVector[0]->at(j);
283       trackVarsPair[0]    =  chargeVector[2]->at(i) - chargeVector[2]->at(j) ;  //delta eta
284       trackVarsPair[1]    =  chargeVector[3]->at(i) - chargeVector[3]->at(j);  //delta phi
285       trackVarsPair[2]    =  chargeVector[7]->at(j);  //pt
286       trackVarsPair[3]    =  chargeVector[7]->at(i);  //pt trigger
287       trackVarsPair[4]    =  fCentrality;             //centrality (really as variable here????)
288       
289       if( charge > 0 && charge2 < 0)  fHistPN->Fill(trackVarsPair,0,1.); 
290       else if( charge < 0 && charge2 > 0)  fHistNP->Fill(trackVarsPair,0,1.); 
291       else if( charge > 0 && charge2 > 0)  fHistPP->Fill(trackVarsPair,0,1.); 
292       else if( charge < 0 && charge2 < 0)  fHistNN->Fill(trackVarsPair,0,1.); 
293       else AliWarning("Wrong charge combination!");
294       
295     }//end of 2nd particle loop
296   }//end of 1st particle loop
297 }  
298
299
300 TH1D* AliBalanceTriggered::GetBalanceFunctionHistogram1D(Int_t var, Double_t pTMinTrigger, Double_t pTMaxTrigger, Double_t pTMin, Double_t pTMax, Double_t centrMin, Double_t centrMax){
301
302   // check which variable should be analyzed
303   // 0 = Delta eta
304   // 1 = Delta phi
305
306   if( var < 0 || var > 1){
307     AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
308     return NULL;
309   }
310
311
312   // Choose region to analyze 
313   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
314   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
315
316   // pT trigger
317   fHistP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
318   fHistN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
319   fHistPN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
320   fHistNP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
321   fHistPP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
322   fHistNN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
323
324   // pT
325   fHistPN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
326   fHistNP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
327   fHistPP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
328   fHistNN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
329
330   // centrality
331   fHistP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
332   fHistN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
333   fHistPN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
334   fHistNP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
335   fHistPP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
336   fHistNN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
337   
338
339   // Project into the wanted space (1st: analysis step, 2nd: axis)
340   TH1D* hTemp1 = (TH1D*)fHistPN->Project(0,var);
341   TH1D* hTemp2 = (TH1D*)fHistNP->Project(0,var);
342   TH1D* hTemp3 = (TH1D*)fHistPP->Project(0,var);
343   TH1D* hTemp4 = (TH1D*)fHistNN->Project(0,var);
344   TH1D* hTemp5 = (TH1D*)fHistP->Project(0,var);
345   TH1D* hTemp6 = (TH1D*)fHistN->Project(0,var);
346
347   TH1D* gHistBalanceFunctionHistogram = NULL;
348
349   // Calculate BF
350   if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
351     
352     gHistBalanceFunctionHistogram = (TH1D*)hTemp1->Clone();
353     gHistBalanceFunctionHistogram->Reset();
354
355     // Calculate BF
356     hTemp1->Add(hTemp3,-1.);
357     hTemp1->Scale(1./hTemp5->GetEntries());
358     hTemp2->Add(hTemp4,-1.);
359     hTemp2->Scale(1./hTemp6->GetEntries());
360     gHistBalanceFunctionHistogram->Add(hTemp1,hTemp2,1.,1.);
361   }
362
363   return gHistBalanceFunctionHistogram;
364 }
365
366 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){
367
368   // check which variable should be analyzed
369   // 0 = Delta eta
370   // 1 = Delta phi
371
372   if( var1 < 0 || var1 > 1 || var2 < 0 || var2 > 1){
373     AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
374     return NULL;
375   }
376
377
378   // Choose region to analyze 
379   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
380   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
381
382   // pT trigger
383   fHistP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
384   fHistN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
385   fHistPN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
386   fHistNP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
387   fHistPP->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
388   fHistNN->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
389
390   // pT
391   fHistPN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
392   fHistNP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
393   fHistPP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
394   fHistNN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
395
396   // centrality
397   fHistP->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
398   fHistN->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
399   fHistPN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
400   fHistNP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
401   fHistPP->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
402   fHistNN->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
403   
404
405   // Project into the wanted space (1st: analysis step, 2nd: axis1, 3rd: axis2)
406   TH2D* hTemp1 = (TH2D*)fHistPN->Project(0,var1,var2);
407   TH2D* hTemp2 = (TH2D*)fHistNP->Project(0,var1,var2);
408   TH2D* hTemp3 = (TH2D*)fHistPP->Project(0,var1,var2);
409   TH2D* hTemp4 = (TH2D*)fHistNN->Project(0,var1,var2);
410   TH2D* hTemp5 = (TH2D*)fHistP->Project(0,var1,var2);
411   TH2D* hTemp6 = (TH2D*)fHistN->Project(0,var1,var2);
412
413   TH2D* gHistBalanceFunctionHistogram = NULL;
414
415   // Calculate BF
416   if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
417     
418     gHistBalanceFunctionHistogram = (TH2D*)hTemp1->Clone();
419     gHistBalanceFunctionHistogram->Reset();
420     
421     // Calculate BF
422     hTemp1->Add(hTemp3,-1.);
423     hTemp1->Scale(1./hTemp5->GetEntries());
424     hTemp2->Add(hTemp4,-1.);
425     hTemp2->Scale(1./hTemp6->GetEntries());
426     gHistBalanceFunctionHistogram->Add(hTemp1,hTemp2,1.,1.);
427   }
428
429   return gHistBalanceFunctionHistogram;
430 }
431
432
433 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){
434
435   // check which variable should be analyzed
436   //
437   // pair histograms:
438   // 0 = Delta eta 
439   // 1 = Delta phi
440   // 2 = pT, trigger
441   // 3 = centrality
442   //
443   // pair histograms:
444   // 0 = Delta eta 
445   // 1 = Delta phi
446   // 2 = pT
447   // 3 = pT, trigger
448   // 4 = centrality
449
450   if(histo < 0 || histo > 5){
451     AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
452     return NULL;
453   }
454
455   if( histo > 1 && (var < 0 || var > 5)){
456     AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
457     return NULL;
458   }
459   if( histo < 2 && (var < 0 || var > 4)){
460     AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
461     return NULL;
462   }
463
464   // get the histogram
465   AliTHn *gTHn = NULL;
466   switch(histo){
467  
468   case 0:
469     gTHn = fHistP;
470     break;
471
472   case 1:
473     gTHn = fHistN;
474     break;
475
476   case 2:
477     gTHn = fHistPN;
478     break;
479
480   case 3:
481     gTHn = fHistNP;
482     break;
483
484   case 4:
485     gTHn = fHistPP;
486     break;
487
488   case 5:
489     gTHn = fHistNN;
490     break;
491     
492   }
493
494   if(!gTHn){
495     AliError(Form("AliTHn number %d = NULL",histo));
496     return NULL;
497   }
498
499   // Choose region to analyze 
500   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
501   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
502
503   // pT trigger
504   gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
505  
506   // pT
507   if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
508  
509   // centrality
510   if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
511   else          gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
512  
513
514   // Project into the wanted space (1st: analysis step, 2nd: axis)
515   TH1D* gHisto = (TH1D*)gTHn->Project(0,var);
516
517   return gHisto;
518 }
519
520
521 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){
522
523   // check which variable should be analyzed
524   //
525   // pair histograms:
526   // 0 = Delta eta 
527   // 1 = Delta phi
528   // 2 = pT, trigger
529   // 3 = centrality
530   //
531   // pair histograms:
532   // 0 = Delta eta 
533   // 1 = Delta phi
534   // 2 = pT
535   // 3 = pT, trigger
536   // 4 = centrality
537
538   if(histo < 0 || histo > 5){
539     AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
540     return NULL;
541   }
542
543   if( histo > 1 && (var1 < 0 || var1 > 5 || var2 < 0 || var2 > 5)){
544     AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
545     return NULL;
546   }
547   if( histo < 2 && (var1 < 0 || var1 > 4 || var2 < 0 || var2 > 4)){
548     AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
549     return NULL;
550   }
551
552   // get the histogram
553   AliTHn *gTHn = NULL;
554   switch(histo){
555  
556   case 0:
557     gTHn = fHistP;
558     break;
559
560   case 1:
561     gTHn = fHistN;
562     break;
563
564   case 2:
565     gTHn = fHistPN;
566     break;
567
568   case 3:
569     gTHn = fHistNP;
570     break;
571
572   case 4:
573     gTHn = fHistPP;
574     break;
575
576   case 5:
577     gTHn = fHistNN;
578     break;
579     
580   }
581
582   if(!gTHn){
583     AliError(Form("AliTHn number %d = NULL",histo));
584     return NULL;
585   }
586
587   // Choose region to analyze 
588   // for Single Histograms (P,N):       2 = pT,trigger; 3 = centrality
589   // for Pair Histograms (PN,NP,NN,PP): 2 = pT; 3 = pT,trigger; 4 = centrality
590
591   // pT trigger
592   gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger); 
593  
594   // pT
595   if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax); 
596  
597   // centrality
598   if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax); 
599   else          gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax); 
600  
601
602   // Project into the wanted space (1st: analysis step, 2nd: axis)
603   TH2D* gHisto = (TH2D*)gTHn->Project(0,var1,var2);
604
605   return gHisto;
606 }