1 const Int_t numberOfCentralityBins = 12;
2 TString centralityArray[numberOfCentralityBins] = {"0-10","10-20","20-30","30-40","40-50","50-60","60-70","70-80","0-100","0-1","1-2","2-3"};
5 const Int_t gRebin = 1;
6 void drawBalanceFunction2DPsi(const char* filename = "AnalysisResultsPsi.root",
9 const char* gCentralityEstimator = 0x0,
10 Bool_t kShowShuffled = kFALSE,
11 Bool_t kShowMixed = kTRUE,
12 Double_t psiMin = -0.5, Double_t psiMax = 0.5,
13 Double_t ptTriggerMin = -1.,
14 Double_t ptTriggerMax = -1.,
15 Double_t ptAssociatedMin = -1.,
16 Double_t ptAssociatedMax = -1.,
17 Bool_t k2pMethod = kFALSE,
18 TString eventClass = "EventPlane") //Can be "EventPlane", "Centrality", "Multiplicity"
20 //Macro that draws the BF distributions for each centrality bin
21 //for reaction plane dependent analysis
22 //Author: Panos.Christakoglou@nikhef.nl
23 //Load the PWG2ebye library
24 gSystem->Load("libANALYSIS.so");
25 gSystem->Load("libANALYSISalice.so");
26 gSystem->Load("libEventMixing.so");
27 gSystem->Load("libCORRFW.so");
28 gSystem->Load("libPWGTools.so");
29 gSystem->Load("libPWGCFebye.so");
31 gROOT->LoadMacro("~/SetPlotStyle.C");
33 gStyle->SetPalette(1,0);
35 //Prepare the objects and return them
36 TList *listBF = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,0);
37 TList *listBFShuffled = NULL;
38 if(kShowShuffled) listBFShuffled = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,1);
39 TList *listBFMixed = NULL;
40 if(kShowMixed) listBFMixed = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,2);
42 Printf("The TList object was not created");
46 draw(listBF,listBFShuffled,listBFMixed,gCentrality,gCentralityEstimator,
48 ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,
49 k2pMethod,eventClass);
52 //______________________________________________________//
53 TList *GetListOfObjects(const char* filename,
56 const char *gCentralityEstimator,
58 //Get the TList objects (QA, bf, bf shuffled)
62 TFile *f = TFile::Open(filename,"UPDATE");
63 if((!f)||(!f->IsOpen())) {
64 Printf("The file %s is not found. Aborting...",filename);
69 TDirectoryFile *dir = dynamic_cast<TDirectoryFile *>(f->Get("PWGCFEbyE.outputBalanceFunctionPsiAnalysis"));
71 Printf("The TDirectoryFile is not found. Aborting...",filename);
78 //cout<<"no shuffling - no mixing"<<endl;
79 listBFName = "listBFPsi_";
82 //cout<<"shuffling - no mixing"<<endl;
83 listBFName = "listBFPsiShuffled_";
86 //cout<<"no shuffling - mixing"<<endl;
87 listBFName = "listBFPsiMixed_";
89 listBFName += centralityArray[gCentrality-1];
91 listBFName += "_Bit"; listBFName += gBit; }
92 if(gCentralityEstimator) {
93 listBFName += "_"; listBFName += gCentralityEstimator;}
95 // histograms were already retrieved (in first iteration)
96 if(dir->Get(Form("%s_histograms",listBFName.Data()))){
97 //cout<<"second iteration"<<endl;
98 listBF = dynamic_cast<TList *>(dir->Get(Form("%s_histograms",listBFName.Data())));
101 // histograms were not yet retrieved (this is the first iteration)
104 listBF = dynamic_cast<TList *>(dir->Get(listBFName.Data()));
105 cout<<"======================================================="<<endl;
106 cout<<"List name: "<<listBF->GetName()<<endl;
112 histoName = "fHistP";
114 histoName = "fHistP_shuffle";
116 histoName = "fHistP";
117 if(gCentralityEstimator) histoName += gCentralityEstimator;
118 AliTHn *fHistP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
120 Printf("fHistP %s not found!!!",histoName.Data());
123 fHistP->FillParent(); fHistP->DeleteContainers();
126 histoName = "fHistN";
128 histoName = "fHistN_shuffle";
130 histoName = "fHistN";
131 if(gCentralityEstimator) histoName += gCentralityEstimator;
132 AliTHn *fHistN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
134 Printf("fHistN %s not found!!!",histoName.Data());
137 fHistN->FillParent(); fHistN->DeleteContainers();
140 histoName = "fHistPN";
142 histoName = "fHistPN_shuffle";
144 histoName = "fHistPN";
145 if(gCentralityEstimator) histoName += gCentralityEstimator;
146 AliTHn *fHistPN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
148 Printf("fHistPN %s not found!!!",histoName.Data());
151 fHistPN->FillParent(); fHistPN->DeleteContainers();
154 histoName = "fHistNP";
156 histoName = "fHistNP_shuffle";
158 histoName = "fHistNP";
159 if(gCentralityEstimator) histoName += gCentralityEstimator;
160 AliTHn *fHistNP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
162 Printf("fHistNP %s not found!!!",histoName.Data());
165 fHistNP->FillParent(); fHistNP->DeleteContainers();
168 histoName = "fHistPP";
170 histoName = "fHistPP_shuffle";
172 histoName = "fHistPP";
173 if(gCentralityEstimator) histoName += gCentralityEstimator;
174 AliTHn *fHistPP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
176 Printf("fHistPP %s not found!!!",histoName.Data());
179 fHistPP->FillParent(); fHistPP->DeleteContainers();
182 histoName = "fHistNN";
184 histoName = "fHistNN_shuffle";
186 histoName = "fHistNN";
187 if(gCentralityEstimator) histoName += gCentralityEstimator;
188 AliTHn *fHistNN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
190 Printf("fHistNN %s not found!!!",histoName.Data());
193 fHistNN->FillParent(); fHistNN->DeleteContainers();
196 listBF->Write(Form("%s_histograms",listBFName.Data()), TObject::kSingleKey);
205 //______________________________________________________//
206 void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
207 Int_t gCentrality, const char* gCentralityEstimator,
208 Double_t psiMin, Double_t psiMax,
209 Double_t ptTriggerMin, Double_t ptTriggerMax,
210 Double_t ptAssociatedMin, Double_t ptAssociatedMax,
211 Bool_t k2pMethod = kFALSE, TString eventClass) {
220 //Printf("=================");
221 TString histoName = "fHistP";
222 if(gCentralityEstimator) histoName += gCentralityEstimator;
223 hP = (AliTHn*) listBF->FindObject(histoName.Data());
224 hP->SetName("gHistP");
225 histoName = "fHistN";
226 if(gCentralityEstimator) histoName += gCentralityEstimator;
227 hN = (AliTHn*) listBF->FindObject(histoName.Data());
228 hN->SetName("gHistN");
229 histoName = "fHistPN";
230 if(gCentralityEstimator) histoName += gCentralityEstimator;
231 hPN = (AliTHn*) listBF->FindObject(histoName.Data());
232 hPN->SetName("gHistPN");
233 histoName = "fHistNP";
234 if(gCentralityEstimator) histoName += gCentralityEstimator;
235 hNP = (AliTHn*) listBF->FindObject(histoName.Data());
236 hNP->SetName("gHistNP");
237 histoName = "fHistPP";
238 if(gCentralityEstimator) histoName += gCentralityEstimator;
239 hPP = (AliTHn*) listBF->FindObject(histoName.Data());
240 hPP->SetName("gHistPP");
241 histoName = "fHistNN";
242 if(gCentralityEstimator) histoName += gCentralityEstimator;
243 hNN = (AliTHn*) listBF->FindObject(histoName.Data());
244 hNN->SetName("gHistNN");
246 AliBalancePsi *b = new AliBalancePsi();
247 b->SetEventClass(eventClass);
255 //balance function shuffling
256 AliTHn *hPShuffled = NULL;
257 AliTHn *hNShuffled = NULL;
258 AliTHn *hPNShuffled = NULL;
259 AliTHn *hNPShuffled = NULL;
260 AliTHn *hPPShuffled = NULL;
261 AliTHn *hNNShuffled = NULL;
263 //listBFShuffled->ls();
264 histoName = "fHistP_shuffle";
265 if(gCentralityEstimator) histoName += gCentralityEstimator;
266 hPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
267 hPShuffled->SetName("gHistPShuffled");
268 histoName = "fHistN_shuffle";
269 if(gCentralityEstimator) histoName += gCentralityEstimator;
270 hNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
271 hNShuffled->SetName("gHistNShuffled");
272 histoName = "fHistPN_shuffle";
273 if(gCentralityEstimator) histoName += gCentralityEstimator;
274 hPNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
275 hPNShuffled->SetName("gHistPNShuffled");
276 histoName = "fHistNP_shuffle";
277 if(gCentralityEstimator) histoName += gCentralityEstimator;
278 hNPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
279 hNPShuffled->SetName("gHistNPShuffled");
280 histoName = "fHistPP_shuffle";
281 if(gCentralityEstimator) histoName += gCentralityEstimator;
282 hPPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
283 hPPShuffled->SetName("gHistPPShuffled");
284 histoName = "fHistNN_shuffle";
285 if(gCentralityEstimator) histoName += gCentralityEstimator;
286 hNNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
287 hNNShuffled->SetName("gHistNNShuffled");
289 AliBalancePsi *bShuffled = new AliBalancePsi();
290 bShuffled->SetEventClass(eventClass);
291 bShuffled->SetHistNp(hPShuffled);
292 bShuffled->SetHistNn(hNShuffled);
293 bShuffled->SetHistNpn(hPNShuffled);
294 bShuffled->SetHistNnp(hNPShuffled);
295 bShuffled->SetHistNpp(hPPShuffled);
296 bShuffled->SetHistNnn(hNNShuffled);
299 //balance function mixing
300 AliTHn *hPMixed = NULL;
301 AliTHn *hNMixed = NULL;
302 AliTHn *hPNMixed = NULL;
303 AliTHn *hNPMixed = NULL;
304 AliTHn *hPPMixed = NULL;
305 AliTHn *hNNMixed = NULL;
309 histoName = "fHistP";
310 if(gCentralityEstimator) histoName += gCentralityEstimator;
311 hPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
312 hPMixed->SetName("gHistPMixed");
313 histoName = "fHistN";
314 if(gCentralityEstimator) histoName += gCentralityEstimator;
315 hNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
316 hNMixed->SetName("gHistNMixed");
317 histoName = "fHistPN";
318 if(gCentralityEstimator) histoName += gCentralityEstimator;
319 hPNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
320 hPNMixed->SetName("gHistPNMixed");
321 histoName = "fHistNP";
322 if(gCentralityEstimator) histoName += gCentralityEstimator;
323 hNPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
324 histoName = "fHistNP";
325 if(gCentralityEstimator) histoName += gCentralityEstimator;
326 hNPMixed->SetName("gHistNPMixed");
327 histoName = "fHistPP";
328 if(gCentralityEstimator) histoName += gCentralityEstimator;
329 hPPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
330 hPPMixed->SetName("gHistPPMixed");
331 histoName = "fHistNN";
332 if(gCentralityEstimator) histoName += gCentralityEstimator;
333 hNNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
334 hNNMixed->SetName("gHistNNMixed");
336 AliBalancePsi *bMixed = new AliBalancePsi();
337 bMixed->SetEventClass(eventClass);
338 bMixed->SetHistNp(hPMixed);
339 bMixed->SetHistNn(hNMixed);
340 bMixed->SetHistNpn(hPNMixed);
341 bMixed->SetHistNnp(hNPMixed);
342 bMixed->SetHistNpp(hPPMixed);
343 bMixed->SetHistNnn(hNNMixed);
346 TH2D *gHistBalanceFunction;
347 TH2D *gHistBalanceFunctionSubtracted;
348 TH2D *gHistBalanceFunctionShuffled;
349 TH2D *gHistBalanceFunctionMixed;
350 TString histoTitle, pngName;
352 if(eventClass == "Centrality"){
353 histoTitle = "Centrality: ";
354 histoTitle += psiMin;
356 histoTitle += psiMax;
358 histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})";
360 else if(eventClass == "Multiplicity"){
361 histoTitle = "Multiplicity: ";
362 histoTitle += psiMin;
364 histoTitle += psiMax;
365 histoTitle += " tracks";
366 histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})";
368 else{ // "EventPlane" (default)
369 histoTitle = "Centrality: ";
370 histoTitle += centralityArray[gCentrality-1];
372 if((psiMin == -0.5)&&(psiMax == 0.5))
373 histoTitle += " (-7.5^{o} < #varphi - #Psi_{2} < 7.5^{o})";
374 else if((psiMin == 0.5)&&(psiMax == 1.5))
375 histoTitle += " (37.5^{o} < #varphi - #Psi_{2} < 52.5^{o})";
376 else if((psiMin == 1.5)&&(psiMax == 2.5))
377 histoTitle += " (82.5^{o} < #varphi - #Psi_{2} < 97.5^{o})";
379 histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})";
384 gHistBalanceFunction = b->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
386 cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
390 gHistBalanceFunction = b->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
391 gHistBalanceFunction->SetTitle(histoTitle.Data());
392 gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.3);
393 gHistBalanceFunction->SetName("gHistBalanceFunction");
399 gHistBalanceFunctionShuffled = bShuffled->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
401 cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
405 gHistBalanceFunctionShuffled = bShuffled->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
406 gHistBalanceFunctionShuffled->SetTitle(histoTitle.Data());
407 gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
408 gHistBalanceFunctionShuffled->SetName("gHistBalanceFunctionShuffled");
414 gHistBalanceFunctionMixed = bMixed->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
416 cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
420 gHistBalanceFunctionMixed = bMixed->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
421 gHistBalanceFunctionMixed->SetTitle(histoTitle.Data());
422 gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
423 gHistBalanceFunctionMixed->SetName("gHistBalanceFunctionMixed");
425 gHistBalanceFunctionSubtracted = dynamic_cast<TH2D *>(gHistBalanceFunction->Clone());
426 gHistBalanceFunctionSubtracted->Add(gHistBalanceFunctionMixed,-1);
427 gHistBalanceFunctionSubtracted->SetTitle(histoTitle.Data());
428 gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
429 gHistBalanceFunctionSubtracted->SetName("gHistBalanceFunctionSubtracted");
433 TCanvas *c1 = new TCanvas("c1","",0,0,600,500);
434 c1->SetFillColor(10);
435 c1->SetHighLightColor(10);
436 c1->SetLeftMargin(0.15);
437 gHistBalanceFunction->DrawCopy("lego2");
438 gPad->SetTheta(30); // default is 30
439 gPad->SetPhi(-60); // default is 30
441 TCanvas *c1a = new TCanvas("c1a","",600,0,600,500);
442 c1a->SetFillColor(10);
443 c1a->SetHighLightColor(10);
444 c1a->SetLeftMargin(0.15);
445 gHistBalanceFunction->DrawCopy("colz");
448 TCanvas *c2 = new TCanvas("c2","",100,100,600,500);
449 c2->SetFillColor(10);
450 c2->SetHighLightColor(10);
451 c2->SetLeftMargin(0.15);
452 gHistBalanceFunctionShuffled->DrawCopy("lego2");
453 gPad->SetTheta(30); // default is 30
454 gPad->SetPhi(-60); // default is 30
456 TCanvas *c2a = new TCanvas("c2a","",700,100,600,500);
457 c2a->SetFillColor(10);
458 c2a->SetHighLightColor(10);
459 c2a->SetLeftMargin(0.15);
460 gHistBalanceFunctionShuffled->DrawCopy("colz");
464 TCanvas *c3 = new TCanvas("c3","",200,200,600,500);
465 c3->SetFillColor(10);
466 c3->SetHighLightColor(10);
467 c3->SetLeftMargin(0.15);
468 gHistBalanceFunctionMixed->DrawCopy("lego2");
469 gPad->SetTheta(30); // default is 30
470 gPad->SetPhi(-60); // default is 30
472 TCanvas *c3a = new TCanvas("c3a","",800,200,600,500);
473 c3a->SetFillColor(10);
474 c3a->SetHighLightColor(10);
475 c3a->SetLeftMargin(0.15);
476 gHistBalanceFunctionMixed->DrawCopy("colz");
478 TCanvas *c4 = new TCanvas("c4","",300,300,600,500);
479 c4->SetFillColor(10);
480 c4->SetHighLightColor(10);
481 c4->SetLeftMargin(0.15);
482 gHistBalanceFunctionSubtracted->DrawCopy("lego2");
483 gPad->SetTheta(30); // default is 30
484 gPad->SetPhi(-60); // default is 30
486 TCanvas *c4a = new TCanvas("c4a","",900,300,600,500);
487 c4a->SetFillColor(10);
488 c4a->SetHighLightColor(10);
489 c4a->SetLeftMargin(0.15);
490 gHistBalanceFunctionSubtracted->DrawCopy("colz");
492 fitbalanceFunction(gCentrality, psiMin , psiMax,
493 ptTriggerMin, ptTriggerMax,
494 ptAssociatedMin, ptAssociatedMax,
495 gHistBalanceFunctionSubtracted,k2pMethod, eventClass);
498 TString newFileName = "balanceFunction2D.";
499 if(eventClass == "Centrality"){
500 newFileName += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
501 newFileName += ".PsiAll.PttFrom";
503 else if(eventClass == "Multiplicity"){
504 newFileName += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
505 newFileName += ".PsiAll.PttFrom";
507 else{ // "EventPlane" (default)
508 newFileName += "Centrality";
509 newFileName += gCentrality; newFileName += ".Psi";
510 if((psiMin == -0.5)&&(psiMax == 0.5)) newFileName += "InPlane.Ptt";
511 else if((psiMin == 0.5)&&(psiMax == 1.5)) newFileName += "Intermediate.Ptt";
512 else if((psiMin == 1.5)&&(psiMax == 2.5)) newFileName += "OutOfPlane.Ptt";
513 else if((psiMin == 2.5)&&(psiMax == 3.5)) newFileName += "Rest.PttFrom";
514 else newFileName += "All.PttFrom";
516 newFileName += Form("%.1f",ptTriggerMin); newFileName += "To";
517 newFileName += Form("%.1f",ptTriggerMax); newFileName += "PtaFrom";
518 newFileName += Form("%.1f",ptAssociatedMin); newFileName += "To";
519 newFileName += Form("%.1f",ptAssociatedMax);
520 if(k2pMethod) newFileName += "_2pMethod";
521 newFileName += ".root";
523 TFile *fOutput = new TFile(newFileName.Data(),"recreate");
525 /*hP->Write(); hN->Write();
526 hPN->Write(); hNP->Write();
527 hPP->Write(); hNN->Write();
528 hPShuffled->Write(); hNShuffled->Write();
529 hPNShuffled->Write(); hNPShuffled->Write();
530 hPPShuffled->Write(); hNNShuffled->Write();
531 hPMixed->Write(); hNMixed->Write();
532 hPNMixed->Write(); hNPMixed->Write();
533 hPPMixed->Write(); hNNMixed->Write();*/
534 gHistBalanceFunction->Write();
535 if(listBFShuffled) gHistBalanceFunctionShuffled->Write();
537 gHistBalanceFunctionMixed->Write();
538 gHistBalanceFunctionSubtracted->Write();
543 //____________________________________________________________//
544 void fitbalanceFunction(Int_t gCentrality = 1,
545 Double_t psiMin = -0.5, Double_t psiMax = 3.5,
546 Double_t ptTriggerMin = -1.,
547 Double_t ptTriggerMax = -1.,
548 Double_t ptAssociatedMin = -1.,
549 Double_t ptAssociatedMax = -1.,
551 Bool_t k2pMethod = kFALSE,
552 TString eventClass="EventPlane") {
554 cout<<"FITTING FUNCTION"<<endl;
556 //near side peak: [1]*TMath::Exp(-TMath::Power((0.5*TMath::Power((x/[2]),2)+0.5*TMath::Power((y/[3]),2)),[4]))
557 //away side ridge: [5]*TMath::Exp(-TMath::Power((0.5*TMath::Power(((y-TMath::Pi())/[6]),2)),[7]))
558 //longitudinal ridge: [8]*TMath::Exp(-TMath::Power((0.5*TMath::Power((x/[9]),2)),[10]))
559 //wing structures: [11]*TMath::Power(x,2)
560 //flow contribution (v1 up to v4): 2.*([12]*TMath::Cos(y) + [13]*TMath::Cos(2.*y) + [14]*TMath::Cos(3.*y) + [15]*TMath::Cos(4.*y))
561 TF2 *gFitFunction = new TF2("gFitFunction","[0]+[1]*TMath::Exp(-TMath::Power((0.5*TMath::Power((x/[2]),2)+0.5*TMath::Power((y/[3]),2)),[4]))+[5]*TMath::Exp(-TMath::Power((0.5*TMath::Power(((y-TMath::Pi())/[6]),2)),[7]))+[8]*TMath::Exp(-TMath::Power((0.5*TMath::Power(((x+[17])/[9]),2)),[10]))+[8]*TMath::Exp(-TMath::Power((0.5*TMath::Power(((x-[17])/[9]),2)),[10]))+[11]*TMath::Power(x,2)+2.*[12]*([13]*TMath::Cos(y) + [14]*TMath::Cos(2.*y) + [15]*TMath::Cos(3.*y) + [16]*TMath::Cos(4.*y))",-2.0,2.0,-TMath::Pi()/2.,3.*TMath::Pi()/2.);
562 gFitFunction->SetName("gFitFunction");
566 gFitFunction->SetParName(0,"N1");
568 gFitFunction->SetParName(1,"N_{near side}");gFitFunction->FixParameter(1,0.0);
569 gFitFunction->SetParName(2,"Sigma_{near side}(delta eta)"); gFitFunction->FixParameter(2,0.0);
570 gFitFunction->SetParName(3,"Sigma_{near side}(delta phi)"); gFitFunction->FixParameter(3,0.0);
571 gFitFunction->SetParName(4,"Exponent_{near side}"); gFitFunction->FixParameter(4,1.0);
573 gFitFunction->SetParName(5,"N_{away side}"); gFitFunction->FixParameter(5,0.0);
574 gFitFunction->SetParName(6,"Sigma_{away side}(delta phi)"); gFitFunction->FixParameter(6,0.0);
575 gFitFunction->SetParName(7,"Exponent_{away side}"); gFitFunction->FixParameter(7,1.0);
577 gFitFunction->SetParName(8,"N_{long. ridge}"); gFitFunction->SetParameter(8,0.05);//
578 gFitFunction->FixParameter(8,0.0);
579 gFitFunction->SetParName(9,"Sigma_{long. ridge}(delta eta)"); gFitFunction->FixParameter(9,0.0);
580 gFitFunction->SetParName(10,"Exponent_{long. ridge}"); gFitFunction->FixParameter(10,1.0);
582 gFitFunction->SetParName(11,"N_{wing}"); gFitFunction->FixParameter(11,0.0);
584 gFitFunction->SetParName(12,"N_{flow}"); gFitFunction->FixParameter(12,0.0);
585 gFitFunction->SetParName(13,"V1"); gFitFunction->FixParameter(13,0.0);
586 gFitFunction->SetParName(14,"V2"); gFitFunction->FixParameter(14,0.0);
587 gFitFunction->SetParName(15,"V3"); gFitFunction->FixParameter(15,0.0);
588 gFitFunction->SetParName(16,"V4"); gFitFunction->FixParameter(16,0.0);
589 gFitFunction->SetParName(17,"Offset"); gFitFunction->FixParameter(17,0.0);
591 // just release the near side peak
592 gFitFunction->ReleaseParameter(0);gFitFunction->SetParameter(0,1.0);
593 gFitFunction->ReleaseParameter(1);gFitFunction->SetParameter(1,0.3);gFitFunction->SetParLimits(1,0.0,100000);
594 gFitFunction->ReleaseParameter(2);gFitFunction->SetParameter(2,0.3);gFitFunction->SetParLimits(2,0.05,0.7);
595 gFitFunction->ReleaseParameter(3);gFitFunction->SetParameter(3,0.3);gFitFunction->SetParLimits(3,0.05,1.7);
597 gHist->Fit("gFitFunction","nm");
600 //Cloning the histogram
601 TString histoName = gHist->GetName(); histoName += "Fit";
602 TH2D *gHistFit = new TH2D(histoName.Data(),";#Delta#eta;#Delta#varphi (rad);C(#Delta#eta,#Delta#varphi)",gHist->GetNbinsX(),gHist->GetXaxis()->GetXmin(),gHist->GetXaxis()->GetXmax(),gHist->GetNbinsY(),gHist->GetYaxis()->GetXmin(),gHist->GetYaxis()->GetXmax());
603 TH2D *gHistResidual = dynamic_cast<TH2D *>(gHist->Clone());
604 gHistResidual->SetName("gHistResidual");
605 gHistResidual->Sumw2();
607 for(Int_t iBinDeltaEta = 1; iBinDeltaEta <= gHist->GetNbinsX(); iBinDeltaEta++) {
608 for(Int_t iBinDeltaPhi = 1; iBinDeltaPhi <= gHist->GetNbinsY(); iBinDeltaPhi++) {
609 gHistFit->SetBinContent(iBinDeltaEta,iBinDeltaPhi,gFitFunction->Eval(gHist->GetXaxis()->GetBinCenter(iBinDeltaEta),gHist->GetYaxis()->GetBinCenter(iBinDeltaPhi)));
612 gHistResidual->Add(gHistFit,-1);
614 //Write to output file
615 TString newFileName = "balanceFunctionFit2D.";
616 if(eventClass == "Centrality"){
617 newFileName += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
618 newFileName += ".PsiAll.PttFrom";
620 else if(eventClass == "Multiplicity"){
621 newFileName += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
622 newFileName += ".PsiAll.PttFrom";
624 else{ // "EventPlane" (default)
625 newFileName += "Centrality";
626 newFileName += gCentrality; newFileName += ".Psi";
627 if((psiMin == -0.5)&&(psiMax == 0.5)) newFileName += "InPlane.Ptt";
628 else if((psiMin == 0.5)&&(psiMax == 1.5)) newFileName += "Intermediate.Ptt";
629 else if((psiMin == 1.5)&&(psiMax == 2.5)) newFileName += "OutOfPlane.Ptt";
630 else if((psiMin == 2.5)&&(psiMax == 3.5)) newFileName += "Rest.PttFrom";
631 else newFileName += "All.PttFrom";
633 newFileName += Form("%.1f",ptTriggerMin); newFileName += "To";
634 newFileName += Form("%.1f",ptTriggerMax); newFileName += "PtaFrom";
635 newFileName += Form("%.1f",ptAssociatedMin); newFileName += "To";
636 newFileName += Form("%.1f",ptAssociatedMax);
637 if(k2pMethod) newFileName += "_2pMethod";
638 newFileName += ".root";
639 TFile *newFile = TFile::Open(newFileName.Data(),"recreate");
642 gHistResidual->Write();
643 gFitFunction->Write();
647 //____________________________________________________________//
648 void drawBFPsi2D(const char* lhcPeriod = "LHC11h",
649 const char* gCentralityEstimator = "V0M",
651 const char* gEventPlaneEstimator = "VZERO",
652 Int_t gCentrality = 1,
653 Bool_t kShowShuffled = kFALSE,
654 Bool_t kShowMixed = kFALSE,
655 Double_t psiMin = -0.5, Double_t psiMax = 0.5,
656 Double_t ptTriggerMin = -1.,
657 Double_t ptTriggerMax = -1.,
658 Double_t ptAssociatedMin = -1.,
659 Double_t ptAssociatedMax = -1.,
660 Bool_t k2pMethod = kTRUE) {
661 //Macro that draws the BF distributions for each centrality bin
662 //for reaction plane dependent analysis
663 //Author: Panos.Christakoglou@nikhef.nl
664 TGaxis::SetMaxDigits(3);
667 TString filename = lhcPeriod;
668 filename += "/Centrality"; filename += gCentralityEstimator;
669 filename += "_Bit"; filename += gBit;
670 filename += "_"; filename += gEventPlaneEstimator;
671 filename +="/PttFrom";
672 filename += Form("%.1f",ptTriggerMin); filename += "To";
673 filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
674 filename += Form("%.1f",ptAssociatedMin); filename += "To";
675 filename += Form("%.1f",ptAssociatedMax);
676 filename += "/balanceFunction2D.Centrality";
677 filename += gCentrality; filename += ".Psi";
678 if((psiMin == -0.5)&&(psiMax == 0.5)) filename += "InPlane.Ptt";
679 else if((psiMin == 0.5)&&(psiMax == 1.5)) filename += "Intermediate.Ptt";
680 else if((psiMin == 1.5)&&(psiMax == 2.5)) filename += "OutOfPlane.Ptt";
681 else if((psiMin == 2.5)&&(psiMax == 3.5)) filename += "Rest.Ptt";
682 else filename += "All.PttFrom";
683 filename += Form("%.1f",ptTriggerMin); filename += "To";
684 filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
685 filename += Form("%.1f",ptAssociatedMin); filename += "To";
686 filename += Form("%.1f",ptAssociatedMax);
687 if(k2pMethod) filename += "_2pMethod";
691 TFile *f = TFile::Open(filename.Data());
692 if((!f)||(!f->IsOpen())) {
693 Printf("The file %s is not found. Aborting...",filename);
698 //Raw balance function
699 TH1D *gHistBalanceFunction = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunction"));
700 gHistBalanceFunction->SetStats(kFALSE);
701 gHistBalanceFunction->GetXaxis()->SetNdivisions(10);
702 gHistBalanceFunction->GetYaxis()->SetNdivisions(10);
703 gHistBalanceFunction->GetZaxis()->SetNdivisions(10);
704 gHistBalanceFunction->GetXaxis()->SetTitleOffset(1.3);
705 gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.3);
706 gHistBalanceFunction->GetZaxis()->SetTitleOffset(1.3);
707 gHistBalanceFunction->GetXaxis()->SetTitle("#Delta #eta");
708 gHistBalanceFunction->GetYaxis()->SetTitle("#Delta #varphi (rad)");
709 gHistBalanceFunction->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
711 //Shuffled balance function
713 TH1D *gHistBalanceFunctionShuffled = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionShuffled"));
714 gHistBalanceFunctionShuffled->SetStats(kFALSE);
715 gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
716 gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
717 gHistBalanceFunctionShuffled->GetZaxis()->SetNdivisions(10);
718 gHistBalanceFunctionShuffled->GetXaxis()->SetTitleOffset(1.3);
719 gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
720 gHistBalanceFunctionShuffled->GetZaxis()->SetTitleOffset(1.3);
721 gHistBalanceFunctionShuffled->GetXaxis()->SetTitle("#Delta #eta");
722 gHistBalanceFunctionShuffled->GetYaxis()->SetTitle("#Delta #varphi (rad)");
723 gHistBalanceFunctionShuffled->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
726 //Mixed balance function
728 TH1D *gHistBalanceFunctionMixed = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionMixed"));
729 gHistBalanceFunctionMixed->SetStats(kFALSE);
730 gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
731 gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
732 gHistBalanceFunctionMixed->GetZaxis()->SetNdivisions(10);
733 gHistBalanceFunctionMixed->GetXaxis()->SetTitleOffset(1.3);
734 gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
735 gHistBalanceFunctionMixed->GetZaxis()->SetTitleOffset(1.3);
736 gHistBalanceFunctionMixed->GetXaxis()->SetTitle("#Delta #eta");
737 gHistBalanceFunctionMixed->GetYaxis()->SetTitle("#Delta #varphi (rad)");
738 gHistBalanceFunctionMixed->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
741 //Subtracted balance function
743 TH1D *gHistBalanceFunctionSubtracted = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionSubtracted"));
744 gHistBalanceFunctionSubtracted->SetStats(kFALSE);
745 gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
746 gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
747 gHistBalanceFunctionSubtracted->GetZaxis()->SetNdivisions(10);
748 gHistBalanceFunctionSubtracted->GetXaxis()->SetTitleOffset(1.3);
749 gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
750 gHistBalanceFunctionSubtracted->GetZaxis()->SetTitleOffset(1.3);
751 gHistBalanceFunctionSubtracted->GetXaxis()->SetTitle("#Delta #eta");
752 gHistBalanceFunctionSubtracted->GetYaxis()->SetTitle("#Delta #varphi (rad)");
753 gHistBalanceFunctionSubtracted->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
758 TString centralityLatex = "Centrality: ";
759 centralityLatex += centralityArray[gCentrality-1];
760 centralityLatex += "%";
763 if((psiMin == -0.5)&&(psiMax == 0.5))
764 psiLatex = " -7.5^{o} < #varphi - #Psi_{2} < 7.5^{o}";
765 else if((psiMin == 0.5)&&(psiMax == 1.5))
766 psiLatex = " 37.5^{o} < #varphi - #Psi_{2} < 52.5^{o}";
767 else if((psiMin == 1.5)&&(psiMax == 2.5))
768 psiLatex = " 82.5^{o} < #varphi - #Psi_{2} < 97.5^{o}";
770 psiLatex = " 0^{o} < #varphi - #Psi_{2} < 180^{o}";
772 TString pttLatex = Form("%.1f",ptTriggerMin);
773 pttLatex += " < p_{T}^{t} < "; pttLatex += Form("%.1f",ptTriggerMax);
774 pttLatex += " GeV/c";
776 TString ptaLatex = Form("%.1f",ptAssociatedMin);
777 ptaLatex += " < p_{T}^{a} < "; ptaLatex += Form("%.1f",ptAssociatedMax);
778 ptaLatex += " GeV/c";
780 TLatex *latexInfo1 = new TLatex();
781 latexInfo1->SetNDC();
782 latexInfo1->SetTextSize(0.045);
783 latexInfo1->SetTextColor(1);
786 TCanvas *c1 = new TCanvas("c1","Raw balance function 2D",0,0,600,500);
787 c1->SetFillColor(10); c1->SetHighLightColor(10);
788 c1->SetLeftMargin(0.17); c1->SetTopMargin(0.05);
789 gHistBalanceFunction->SetTitle("");
790 gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.4);
791 gHistBalanceFunction->GetYaxis()->SetNdivisions(10);
792 gHistBalanceFunction->GetXaxis()->SetRangeUser(-1.4,1.4);
793 gHistBalanceFunction->GetXaxis()->SetNdivisions(10);
794 gHistBalanceFunction->GetYaxis()->SetTitle("#Delta #varphi (rad)");
795 gHistBalanceFunction->DrawCopy("lego2");
796 gPad->SetTheta(30); // default is 30
797 gPad->SetPhi(-60); // default is 30
800 latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
801 latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
802 latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
803 latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
805 TString pngName = "BalanceFunction2D.";
806 pngName += "Centrality";
807 pngName += gCentrality;
808 if((psiMin == -0.5)&&(psiMax == 0.5)) pngName += "InPlane.Ptt";
809 else if((psiMin == 0.5)&&(psiMax == 1.5)) pngName += "Intermediate.Ptt";
810 else if((psiMin == 1.5)&&(psiMax == 2.5)) pngName += "OutOfPlane.Ptt";
811 else if((psiMin == 2.5)&&(psiMax == 3.5)) pngName += "Rest.PttFrom";
812 else pngName += "All.PttFrom";
813 pngName += Form("%.1f",ptTriggerMin); pngName += "To";
814 pngName += Form("%.1f",ptTriggerMax); pngName += "PtaFrom";
815 pngName += Form("%.1f",ptAssociatedMin); pngName += "To";
816 pngName += Form("%.1f",ptAssociatedMax);
817 if(k2pMethod) pngName += "_2pMethod";
820 c1->SaveAs(pngName.Data());
823 TCanvas *c2 = new TCanvas("c2","Shuffled balance function 2D",100,100,600,500);
824 c2->SetFillColor(10); c2->SetHighLightColor(10);
825 c2->SetLeftMargin(0.17); c2->SetTopMargin(0.05);
826 gHistBalanceFunctionShuffled->SetTitle("Shuffled events");
827 gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.4);
828 gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
829 gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
830 gHistBalanceFunctionShuffled->DrawCopy("lego2");
831 gPad->SetTheta(30); // default is 30
832 gPad->SetPhi(-60); // default is 30
835 latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
836 latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
837 latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
838 latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
842 TCanvas *c3 = new TCanvas("c3","Mixed balance function 2D",200,200,600,500);
843 c3->SetFillColor(10); c3->SetHighLightColor(10);
844 c3->SetLeftMargin(0.17); c3->SetTopMargin(0.05);
845 gHistBalanceFunctionMixed->SetTitle("Mixed events");
846 gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.4);
847 gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
848 gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
849 gHistBalanceFunctionMixed->DrawCopy("lego2");
850 gPad->SetTheta(30); // default is 30
851 gPad->SetPhi(-60); // default is 30
854 latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
855 latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
856 latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
857 latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
861 TCanvas *c4 = new TCanvas("c4","Subtracted balance function 2D",300,300,600,500);
862 c4->SetFillColor(10); c4->SetHighLightColor(10);
863 c4->SetLeftMargin(0.17); c4->SetTopMargin(0.05);
864 gHistBalanceFunctionSubtracted->SetTitle("Subtracted balance function");
865 gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.4);
866 gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
867 gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
868 gHistBalanceFunctionSubtracted->DrawCopy("lego2");
869 gPad->SetTheta(30); // default is 30
870 gPad->SetPhi(-60); // default is 30
873 latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
874 latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
875 latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
876 latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());