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 (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 ?!
282 for(Int_t j = 0; j < i; j++) {
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????)
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!");
297 }//end of 2nd particle loop
298 }//end of 1st particle loop
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){
304 // check which variable should be analyzed
308 if( var < 0 || var > 1){
309 AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
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
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);
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);
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);
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);
349 TH1D* gHistBalanceFunctionHistogram = NULL;
352 if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
354 gHistBalanceFunctionHistogram = (TH1D*)hTemp1->Clone();
355 gHistBalanceFunctionHistogram->Reset();
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.);
366 return gHistBalanceFunctionHistogram;
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){
371 // check which variable should be analyzed
375 if( var1 < 0 || var1 > 1 || var2 < 0 || var2 > 1){
376 AliError("Only Variable 0 (= Delta eta) or 1 (= Delta phi) allowed");
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
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);
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);
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);
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);
416 TH2D* gHistBalanceFunctionHistogram = NULL;
419 if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)&&(hTemp5)&&(hTemp6)) {
421 gHistBalanceFunctionHistogram = (TH2D*)hTemp1->Clone();
422 gHistBalanceFunctionHistogram->Reset();
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.);
432 return gHistBalanceFunctionHistogram;
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){
438 // check which variable should be analyzed
453 if(histo < 0 || histo > 5){
454 AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
458 if( histo > 1 && (var < 0 || var > 5)){
459 AliError("Only Variable 0 to 4 allowed for pair histograms (histo > 1)");
462 if( histo < 2 && (var < 0 || var > 4)){
463 AliError("Only Variable 0 to 3 allowed for single histograms (histo < 2)");
498 AliError(Form("AliTHn number %d = NULL",histo));
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
507 gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger);
510 if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax);
513 if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax);
514 else gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax);
517 // Project into the wanted space (1st: analysis step, 2nd: axis)
518 TH1D* gHisto = (TH1D*)gTHn->Project(0,var);
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){
526 // check which variable should be analyzed
541 if(histo < 0 || histo > 5){
542 AliError("Only 6 histograms available: 0(P), 1(N), 2(PN), 3(NP), 4(PP), 5(NN)");
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)");
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)");
586 AliError(Form("AliTHn number %d = NULL",histo));
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
595 gTHn->GetGrid(0)->GetGrid()->GetAxis(2)->SetRange(pTMinTrigger,pTMaxTrigger);
598 if(histo > 1) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(pTMin,pTMax);
601 if(histo < 2) gTHn->GetGrid(0)->GetGrid()->GetAxis(3)->SetRange(centrMin,centrMax);
602 else gTHn->GetGrid(0)->GetGrid()->GetAxis(4)->SetRange(centrMin,centrMax);
605 // Project into the wanted space (1st: analysis step, 2nd: axis)
606 TH2D* gHisto = (TH2D*)gTHn->Project(0,var1,var2);