1 /**************************************************************************
2 * Author: Panos Christakoglou. *
3 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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 //-----------------------------------------------------------------
23 #include <Riostream.h>
31 #include <TLorentzVector.h>
32 #include <TObjArray.h>
33 #include <TGraphErrors.h>
36 #include "AliVParticle.h"
37 #include "AliMCParticle.h"
38 #include "AliESDtrack.h"
39 #include "AliAODTrack.h"
41 #include "AliBalanceTriggered.h"
43 ClassImp(AliBalanceTriggered)
45 //____________________________________________________________________//
46 AliBalanceTriggered::AliBalanceTriggered() :
49 fAnalysisLevel("AOD"),
57 // Default constructor
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)
77 //____________________________________________________________________//
78 AliBalanceTriggered::~AliBalanceTriggered() {
91 //____________________________________________________________________//
92 void AliBalanceTriggered::InitHistograms() {
94 //Initialize the histograms
96 TString title = ""; // histogram title
97 Int_t anaSteps = 1; // analysis steps
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
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
110 //-----------------------------------------------------------
111 // histogram settings (hard coded!)
112 //-----------------------------------------------------------
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;
120 iBinSingle[0] = kNEtaBins;
121 dBinsSingle[0] = etaBins;
122 axisTitleSingle[0] = "#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;
130 iBinPair[0] = kNDeltaEtaBins;
131 dBinsPair[0] = deltaEtaBins;
132 axisTitlePair[0] = "#Delta #eta";
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.;
140 iBinSingle[1] = kNPhiBins;
141 dBinsSingle[1] = phiBins;
142 axisTitleSingle[1] = "#phi (#circ)";
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.;
150 iBinPair[1] = kNDeltaPhiBins;
151 dBinsPair[1] = deltaPhiBins;
152 axisTitlePair[1] = "#Delta #phi (#circ)";
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)";
161 iBinPair[2] = kNPtBins;
162 dBinsPair[2] = pTBins;
163 axisTitlePair[2] = "p_{T} (GeV/c)";
165 iBinPair[3] = kNPtBins;
166 dBinsPair[3] = pTBins;
167 axisTitlePair[3] = "p_{T,trig} (GeV/c)";
170 const Int_t kNCentBins = 9;
171 Double_t centBins[kNCentBins+1] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.};
173 iBinSingle[3] = kNCentBins;
174 dBinsSingle[3] = centBins;
175 axisTitleSingle[3] = "centrality";
177 iBinPair[4] = kNCentBins;
178 dBinsPair[4] = centBins;
179 axisTitlePair[4] = "centrality";
181 //-----------------------------------------------------------
185 // User settings (depending on the analysis settings [only one at the moment])
186 if(fAnalysisLevel == "AOD"){
187 title = "hdEtaVsdPhi";
190 //-----------------------------------------------------------
191 //-----------------------------------------------------------
192 // Histogram creation
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++)
198 fHistN->SetBinLimits(j, dBinsSingle[j]);
199 fHistN->SetVarTitle(j, axisTitleSingle[j]);
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++)
206 fHistP->SetBinLimits(j, dBinsSingle[j]);
207 fHistP->SetVarTitle(j, axisTitleSingle[j]);
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++)
214 fHistPN->SetBinLimits(j, dBinsPair[j]);
215 fHistPN->SetVarTitle(j, axisTitlePair[j]);
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++)
222 fHistNP->SetBinLimits(j, dBinsPair[j]);
223 fHistNP->SetVarTitle(j, axisTitlePair[j]);
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++)
230 fHistPP->SetBinLimits(j, dBinsPair[j]);
231 fHistPP->SetVarTitle(j, axisTitlePair[j]);
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++)
238 fHistNN->SetBinLimits(j, dBinsPair[j]);
239 fHistNN->SetVarTitle(j, axisTitlePair[j]);
242 //-----------------------------------------------------------
243 //-----------------------------------------------------------
248 //____________________________________________________________________//
249 void AliBalanceTriggered::FillBalance(Float_t fCentrality,vector<Double_t> **chargeVector) {
250 // Calculates the balance function
253 // Initialize histograms if not done yet
255 AliWarning("Histograms not yet initialized! --> Will be done now");
256 AliWarning("This works only in local mode --> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
260 Int_t gNtrack = chargeVector[0]->size();
261 Double_t trackVarsSingle[nTrackVarsSingle];
262 Double_t trackVarsPair[nTrackVarsPair];
265 for(Int_t i = 0; i < gNtrack;i++){
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????)
273 //fill single particle histograms
274 if(charge > 0) fHistP->Fill(trackVarsSingle,0,1.);
275 else fHistN->Fill(trackVarsSingle,0,1.);
277 // 2nd particle loop (now over all particles except the same!)
278 for(Int_t j = 0; j < gNtrack; j++) {
280 if( j == i ) continue;
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????)
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!");
295 }//end of 2nd particle loop
296 }//end of 1st particle loop
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){
302 // check which variable should be analyzed
306 if( var < 0 || var > 1){
307 AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
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
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);
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);
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);
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);
347 TH1D* gHistBalanceFunctionHistogram = NULL;
350 if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
352 gHistBalanceFunctionHistogram = (TH1D*)hTemp1->Clone();
353 gHistBalanceFunctionHistogram->Reset();
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.);
363 return gHistBalanceFunctionHistogram;
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){
368 // check which variable should be analyzed
372 if( var1 < 0 || var1 > 1 || var2 < 0 || var2 > 1){
373 AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
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
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);
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);
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);
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);
413 TH2D* gHistBalanceFunctionHistogram = NULL;
416 if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
418 gHistBalanceFunctionHistogram = (TH2D*)hTemp1->Clone();
419 gHistBalanceFunctionHistogram->Reset();
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.);
429 return gHistBalanceFunctionHistogram;
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){
435 // check which variable should be analyzed
450 if(histo < 0 || histo > 5){
451 AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
455 if( histo > 1 && (var < 0 || var > 5)){
456 AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
459 if( histo < 2 && (var < 0 || var > 4)){
460 AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
495 AliError(Form("AliTHn number %d = NULL",histo));
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
504 gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger);
507 if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax);
510 if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax);
511 else gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax);
514 // Project into the wanted space (1st: analysis step, 2nd: axis)
515 TH1D* gHisto = (TH1D*)gTHn->Project(0,var);
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){
523 // check which variable should be analyzed
538 if(histo < 0 || histo > 5){
539 AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
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)");
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)");
583 AliError(Form("AliTHn number %d = NULL",histo));
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
592 gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger);
595 if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax);
598 if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax);
599 else gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax);
602 // Project into the wanted space (1st: analysis step, 2nd: axis)
603 TH2D* gHisto = (TH2D*)gTHn->Project(0,var1,var2);