1 const Double_t kMean=0.135 ; //Approximate peak position to facilitate error estimate
3 //-----------------------------------------------------------------------------
4 void MakeMmixPi0(const Int_t centrality=0,
5 const char* cModule="")
7 //---------------------------------------------------------------------------
8 // This macro processes PWGPP QA output of the analysis task PHOSPbPbQA
9 // (see analysis code in the class AliAnalysisTaskPHOSPbPbQA).
10 // It fits Real/Mixed ratio, normalize Mixed and subtract it from Real
12 // centrality: 0 or 1 for centralities 0-20% or 20-100%
13 // cModule: string with the PHOS module to analyze: "", "SM1", "SM2" or "SM3"
15 // Yuri Kharlov. 19.11.2011
16 //---------------------------------------------------------------------------
19 TFile * f = new TFile("PHOSPbPb_all.root") ;
20 TList *histESD = (TList*) f->Get("PHOSPbPbQAResults");
23 const char* pid="All";
24 const char* txtCent[] = {"0-20%","20-100%"};
25 TH2F * hCentrality = (TH2F*)f->Get("hCenPHOS") ;
26 TH1D * hCentrality1 = hCentrality->ProjectionX();
28 TString outputKey = Form("%s10_cent%d",pid,centrality);
32 if (centrality == 0 || centrality == 1) {// centrality 0-20%, 20-100%
33 inputKey = Form("hPi0%s%s_cen%d" ,pid,cModule,centrality);
34 TH2F *h = (TH2F*)f->Get(inputKey) ;
35 inputKey = Form("hMiPi0%s%s_cen%d",pid,cModule,centrality);
36 TH2F *hm= (TH2F*)f->Get(inputKey) ;
38 printf("Missing histogram %s\n",inputKey);
43 printf("Wrong centrality %d. Allowed values are 0,1,2,3,10.\n",centrality);
47 // Int_t nPadX=2,nPadY=2;
49 // Double_t xa[]={0.8, 2.0, 3.5, 6.0, 20.} ;
51 Int_t nPadX=1,nPadY=1;
53 Double_t xa[]={2.0, 20.} ;
56 gStyle->SetOptFit(111);
57 gStyle->SetPadLeftMargin(0.14);
58 gStyle->SetPadRightMargin(0.01);
59 gStyle->SetPadTopMargin(0.05);
60 gStyle->SetPadBottomMargin(0.08);
63 if (strcmp(cModule,"") ==0) txtModule="All PHOS modules";
64 else if (strcmp(cModule,"SM1")==0) txtModule="PHOS module 4";
65 else if (strcmp(cModule,"SM2")==0) txtModule="PHOS module 3";
66 else if (strcmp(cModule,"SM3")==0) txtModule="PHOS module 2";
68 TPaveText *label = new TPaveText(0.15,0.80,0.40,0.90,"NDC");
69 label->SetFillColor(kWhite);
70 label->SetBorderSize(1);
71 label->AddText(Form("Centrality %s" ,txtCent[centrality]));
72 label->AddText(Form("%s",txtModule.Data()));
77 sprintf(kkey,outputKey.Data()) ;
79 sprintf(key,"Mix%s",kkey) ;
80 sprintf(key2,"%s_mr1",key) ;
81 TH1D * mr1 = new TH1D(key2,"Mass",nbin,xa) ;
82 sprintf(key2,"%s_sr1",key) ;
83 TH1D * sr1 = new TH1D(key2,"Width",nbin,xa) ;
84 sprintf(key2,"%s_ar1",key) ;
85 TH1D * ar1 = new TH1D(key2,"a",nbin,xa) ;
86 sprintf(key2,"%s_br1",key) ;
87 TH1D * br1 = new TH1D(key2,"a",nbin,xa) ;
88 sprintf(key2,"%s_yr1",key) ;
89 TH1D * nr1 = new TH1D(key2,"Raw yield",nbin,xa) ;
90 sprintf(key2,"%s_yr1int",key) ;
91 TH1D * nr1int = new TH1D(key2,"Raw yield, integrated",nbin,xa) ;
94 sprintf(key2,"%s_mr2",key) ;
95 TH1D * mr2 = new TH1D(key2,"Mass",nbin,xa) ;
96 sprintf(key2,"%s_sr2",key) ;
97 TH1D * sr2 = new TH1D(key2,"Width",nbin,xa) ;
98 sprintf(key2,"%s_ar2",key) ;
99 TH1D * ar2 = new TH1D(key2,"a",nbin,xa) ;
100 sprintf(key2,"%s_br2",key) ;
101 TH1D * br2 = new TH1D(key2,"a",nbin,xa) ;
102 sprintf(key2,"%s_cr2",key) ;
103 TH1D * cr2 = new TH1D(key2,"a",nbin,xa) ;
104 sprintf(key2,"%s_yr2",key) ;
105 TH1D * nr2 = new TH1D(key2,"Raw yield",nbin,xa) ;
106 sprintf(key2,"%s_yr2int",key) ;
107 TH1D * nr2int = new TH1D(key2,"Raw yield, integrated",nbin,xa) ;
109 TF1 * fit1 = new TF1("fit",CB,0.,1.,6) ;
110 fit1->SetParName(0,"A") ;
111 fit1->SetParName(1,"m_{0}") ;
112 fit1->SetParName(2,"#sigma") ;
113 fit1->SetParName(3,"a_{0}") ;
114 fit1->SetParName(4,"a_{1}") ;
115 fit1->SetParName(5,"a_{2}") ;
116 fit1->SetLineWidth(2) ;
117 fit1->SetLineColor(2) ;
118 TF1 * fgs = new TF1("gs",CBs,0.,1.,3) ;
119 fgs->SetParName(0,"A") ;
120 fgs->SetParName(1,"m_{0}") ;
121 fgs->SetParName(2,"#sigma") ;
122 fgs->SetLineColor(2) ;
123 fgs->SetLineWidth(2) ;
125 TF1 * fit2 = new TF1("fit2",CB2,0.,1.,7) ;
126 fit2->SetParName(0,"A") ;
127 fit2->SetParName(1,"m_{0}") ;
128 fit2->SetParName(2,"#sigma") ;
129 fit2->SetParName(3,"a_{0}") ;
130 fit2->SetParName(4,"a_{1}") ;
131 fit2->SetParName(5,"a_{2}") ;
132 fit2->SetParName(6,"a_{3}") ;
133 fit2->SetLineWidth(2) ;
134 fit2->SetLineColor(4) ;
135 fit2->SetLineStyle(2) ;
137 TF1 * fbg1 = new TF1("bg1",BG1,0.,1.,3) ;
138 TF1 * fbg2 = new TF1("bg2",BG2,0.,1.,4) ;
140 TCanvas * c3 = new TCanvas("mggFit1_Signal","mggFitCB",10,10,1200,800) ;
141 c3->Divide(nPadX,nPadY) ;
143 TCanvas * c1 = new TCanvas("mggFit1","mggFit1",10,10,1200,800) ;
144 c1->Divide(nPadX,nPadY) ;
148 TAxis * pta=h->GetYaxis() ;
149 TAxis * ma=h->GetXaxis() ;
150 for(Int_t i=1;i<=nbin;i++){
155 c2 = new TCanvas("mggFit2","mggFit2",10,10,1200,800) ;
156 c2->Divide(nPadX,nPadY) ;
160 printf("\t%.1f<pt<%.1f GeV/c\n",xa[i-1],xa[i]);
161 Int_t imin=pta->FindBin(xa[i-1]+0.0001);
162 Int_t imax=pta->FindBin(xa[i]-0.0001) ;
163 Double_t pt=(xa[i]+xa[i-1])/2. ;
164 TH1D * hp = h->ProjectionX("re",imin,imax) ;
166 TH1D * hpm= hm->ProjectionX("mi",imin,imax) ;
177 for(Int_t ib=1; ib<=hp->GetNbinsX();ib++){if(hp ->GetBinContent(ib)==0)hp ->SetBinError(ib,1.);}
178 for(Int_t ib=1; ib<=hp->GetNbinsX();ib++){if(hpm->GetBinContent(ib)==0)hpm->SetBinError(ib,1.);}
179 TH1D * hpm2 = (TH1D*)hpm->Clone("Bg1") ;
180 TH1D * hpcopy = (TH1D*)hp ->Clone("hpcopy") ;
181 TH1D * hp2 = (TH1D*)hp ->Clone("hp2") ;
182 hpcopy->SetXTitle("M_{#gamma#gamma} (GeV/c^{2})");
183 hp2 ->SetXTitle("M_{#gamma#gamma} (GeV/c^{2})");
184 hpcopy->Divide(hpm) ;
185 sprintf(key,"%3.1f<p_{T}<%3.1f GeV/c",xa[i-1],xa[i]) ;
186 hpcopy->SetTitle(key) ;
187 hpcopy->SetMarkerStyle(20) ;
188 hpcopy->SetMarkerSize(0.7) ;
190 fit1->SetParameters(0.001,0.136,0.005,0.0002,-0.002,0.0) ;
191 fit1->SetParLimits(0,0.000,1.000) ;
192 fit1->SetParLimits(1,0.125,0.145) ;
193 fit1->SetParLimits(2,0.002,0.015) ;
195 Double_t rangeMin=0.06;
196 Double_t rangeMax=0.26;
198 hpcopy->Fit(fit1,"Q" ,"",rangeMin,rangeMax) ;
199 hpcopy->Fit(fit1,"MQ","",rangeMin,rangeMax) ;
201 ar1->SetBinContent(i,fit1->GetParameter(3)) ;
202 ar1->SetBinError (i,fit1->GetParError(3)) ;
203 br1->SetBinContent(i,fit1->GetParameter(4)) ;
204 br1->SetBinError (i,fit1->GetParError(4)) ;
206 fit2->SetParameters(fit1->GetParameters()) ;
207 fit2->SetParLimits(0,0.000,1.000) ;
208 fit2->SetParLimits(1,0.125,0.145) ;
209 fit2->SetParLimits(2,0.002,0.015) ;
211 hpcopy->Fit(fit2,"+NQ","",rangeMin,rangeMax) ;
212 hpcopy->Fit(fit2,"+MQ","",rangeMin,rangeMax) ;
214 ar2->SetBinContent(i,fit2->GetParameter(3)) ;
215 ar2->SetBinError (i,fit2->GetParError(3)) ;
216 br2->SetBinContent(i,fit2->GetParameter(4)) ;
217 br2->SetBinError (i,fit2->GetParError(4)) ;
218 cr2->SetBinContent(i,fit2->GetParameter(5)) ;
219 cr2->SetBinError (i,fit2->GetParError(5)) ;
220 hpcopy->SetAxisRange(0.04,0.3,"X") ;
227 // if(getchar()=='q')return ;
229 fbg1->SetParameters(fit1->GetParameter(3),fit1->GetParameter(4),fit1->GetParameter(5));
230 fbg2->SetParameters(fit2->GetParameter(3),fit2->GetParameter(4),fit2->GetParameter(5),
231 fit2->GetParameter(6));
233 Double_t intRangeMin = PeakPosition(pt,centrality)-3.*PeakWidth(pt,centrality) ;
234 Double_t intRangeMax = PeakPosition(pt,centrality)+3.*PeakWidth(pt,centrality) ;
235 // printf("pt=%f, %f < M < %f\n",pt,intRangeMin,intRangeMax);
236 Int_t intBinMin = hp->GetXaxis()->FindBin(intRangeMin) ;
237 Int_t intBinMax = hp->GetXaxis()->FindBin(intRangeMax) ;
238 Double_t errStat = hpm->Integral(intBinMin,intBinMax);
240 hpm ->Multiply(fbg1) ;
241 hpm2->Multiply(fbg2) ;
243 hp2 ->Add(hpm2,-1.) ;
249 c4 = new TCanvas("mggFit2_Signal","mggFit2",10,10,1200,800) ;
250 c4->Divide(nPadX,nPadY) ;
255 Int_t binPi0 = hp->FindBin(kMean);
256 fgs->SetParameters(hp->Integral(binPi0-1,binPi0+1)/3.,fit1->GetParameter(1),fit1->GetParameter(2)) ;
257 fgs->SetParLimits(0,0.000,1.e+5) ;
258 fgs->SetParLimits(1,0.120,0.145) ;
259 fgs->SetParLimits(2,0.002,0.015) ;
260 hp->Fit(fgs,"Q","",rangeMin,rangeMax) ;
261 hp->SetMaximum(hp2->GetMaximum()*1.4) ;
262 hp->SetMinimum(hp2->GetMinimum()*1.1) ;
263 hp->SetMarkerStyle(20) ;
264 hp->SetMarkerSize(0.7) ;
265 mr1->SetBinContent(i,fgs->GetParameter(1)) ;
266 mr1->SetBinError (i,fgs->GetParError(1) ) ;
267 sr1->SetBinContent(i,TMath::Abs(fgs->GetParameter(2))) ;
268 sr1->SetBinError (i,fgs->GetParError(2) ) ;
270 Double_t y=fgs->Integral(intRangeMin,intRangeMax)/hp->GetXaxis()->GetBinWidth(1) ;
271 nr1->SetBinContent(i,y) ;
273 if(fgs->GetParameter(0)!=0. && fgs->GetParameter(2)!=0.){
274 Double_t en=fgs->GetParError(0)/fgs->GetParameter(0) ;
275 Double_t es=fgs->GetParError(2)/fgs->GetParameter(2) ;
276 ey=y*TMath::Sqrt(en*en+es*es) ;
278 nr1->SetBinError(i,ey) ;
280 Double_t npiInt = hp->Integral(intBinMin,intBinMax) ;
281 Double_t norm = fbg1->GetParameter(0) ;
282 Double_t normErr= fbg1->GetParError(0) ;
284 nr1int->SetBinContent(i,npiInt) ;
285 nr1int->SetBinError(i,TMath::Sqrt(npiInt + norm*errStat + normErr*normErr*errStat*errStat + norm*norm*errStat)) ;
287 hp2->SetAxisRange(0.04,0.3,"X") ;
288 hp2->SetMaximum(hp2->GetMaximum()*1.4) ;
289 hp2->SetMinimum(hp2->GetMinimum()*1.1) ;
290 hp2->SetMarkerStyle(20) ;
291 hp2->SetMarkerSize(0.7) ;
292 hp2->Fit(fgs,"Q","",rangeMin,rangeMax) ;
293 mr2->SetBinContent(i,fgs->GetParameter(1)) ;
294 mr2->SetBinError (i,fgs->GetParError(1)) ;
295 sr2->SetBinContent(i,TMath::Abs(fgs->GetParameter(2))) ;
296 sr2->SetBinError (i,fgs->GetParError(2)) ;
297 y=fgs->Integral(intRangeMin,intRangeMax)/hp->GetXaxis()->GetBinWidth(1) ;
298 nr2->SetBinContent(i,y) ;
300 if(fgs->GetParameter(0)!=0. && fgs->GetParameter(2)!=0.){
301 Double_t en=fgs->GetParError(0)/fgs->GetParameter(0) ;
302 Double_t es=fgs->GetParError(2)/fgs->GetParameter(2) ;
303 ey=y*TMath::Sqrt(en*en+es*es) ;
305 nr2->SetBinError(i,ey) ;
306 npiInt=hp2->Integral(intBinMin,intBinMax) ;
307 norm=fbg2->GetParameter(0) ;
308 normErr=fbg2->GetParError(0) ;
310 nr2int->SetBinContent(i,npiInt) ;
311 nr2int->SetBinError(i,TMath::Sqrt(npiInt + norm*errStat + normErr*normErr*errStat*errStat + norm*norm*errStat)) ;
329 sprintf(name,"Pi0_ratio_cent%d%s.eps" ,centrality,cModule) ;
331 sprintf(name,"Pi0_signal_cent%d%s.eps",centrality,cModule) ;
334 //Normalize by the number of events
336 if (centrality == 0) {
340 else if (centrality == 1) {
344 Double_t nevents = hCentrality1->Integral(cMin,cMax);
345 nr1 ->Scale(1./nevents) ;
346 nr1int->Scale(1./nevents) ;
347 nr2 ->Scale(1./nevents) ;
348 nr2int->Scale(1./nevents) ;
350 printf("\t==============================\n");
351 printf("\t| N events = %i8 |\n",nevents);
352 printf("\t==============================\n");
354 TFile fout("LHC10h_Pi0_FitResult.root","update");
355 mr1->Write(0,TObject::kOverwrite) ;
356 sr1->Write(0,TObject::kOverwrite) ;
357 ar1->Write(0,TObject::kOverwrite) ;
358 br1->Write(0,TObject::kOverwrite) ;
359 nr1->Write(0,TObject::kOverwrite) ;
360 nr1int->Write(0,TObject::kOverwrite) ;
361 ar2->Write(0,TObject::kOverwrite) ;
362 br2->Write(0,TObject::kOverwrite) ;
363 cr2->Write(0,TObject::kOverwrite) ;
364 mr2->Write(0,TObject::kOverwrite) ;
365 sr2->Write(0,TObject::kOverwrite) ;
366 nr2->Write(0,TObject::kOverwrite) ;
367 nr2int->Write(0,TObject::kOverwrite) ;
372 //-----------------------------------------------------------------------------
373 Double_t PeakPosition(Double_t pt, Int_t centrality = 0){
374 //Fit to the measured peak position
375 Double_t pi0Peak = 0.135;
376 if (centrality == 0) pi0Peak=0.1413;
377 else if (centrality == 1) pi0Peak=0.1380;
378 else if (centrality == 2) pi0Peak=0.1367;
379 else if (centrality == 3) pi0Peak=0.1359;
381 // return 4.99292e-003*exp(-pt*9.32300e-001)+1.34944e-001 ;
383 //-----------------------------------------------------------------------------
384 Double_t PeakWidth(Double_t pt, Int_t centrality = 0){
385 //fit to the measured peak width
386 Double_t pi0Sigma = 0.07;
387 if (centrality == 0) pi0Sigma=0.0084;
388 else if (centrality == 1) pi0Sigma=0.0071;
389 else if (centrality == 2) pi0Sigma=0.0068;
390 else if (centrality == 3) pi0Sigma=0.0064;
393 // Double_t a=0.0068 ;
394 // Double_t b=0.0025 ;
395 // Double_t c=0.000319 ;
396 // return TMath::Sqrt(a*a+b*b/pt/pt+c*c*pt*pt) ;
399 //-----------------------------------------------------------------------------
400 Double_t CB(Double_t * x, Double_t * par){
401 //Parameterization of Real/Mixed ratio
404 Double_t dx=(x[0]-m)/s ;
405 Double_t dMpi0 = x[0]-kMean;
406 Double_t peak = par[0] * TMath::Exp(-dx*dx/2.);
407 Double_t bg = par[3] + par[4]*dMpi0 + par[5]*dMpi0*dMpi0;
411 //-----------------------------------------------------------------------------
412 Double_t CB2(Double_t * x, Double_t * par){
413 //Another parameterization of Real/Mixed ratio7TeV/README
416 Double_t dx=(x[0]-m)/s ;
417 Double_t dMpi0 = x[0]-kMean;
418 Double_t peak = par[0] * TMath::Exp(-dx*dx/2.);
419 Double_t bg = par[3] + par[4]*dMpi0 + par[5]*dMpi0*dMpi0 + par[6]*dMpi0*dMpi0*dMpi0;
422 //-----------------------------------------------------------------------------
423 Double_t CBs(Double_t * x, Double_t * par){
424 //Parameterizatin of signal
427 Double_t dx=(x[0]-m)/s ;
428 Double_t peak = par[0] * TMath::Exp(-dx*dx/2.);
431 //-----------------------------------------------------------------------------
432 Double_t BG1(Double_t * x, Double_t * par){
433 //Normalizatino of Mixed
434 return par[0]+par[1]*(x[0]-kMean)+par[2]*(x[0]-kMean)*(x[0]-kMean) ;
436 //-----------------------------------------------------------------------------
437 Double_t BG2(Double_t * x, Double_t * par){
438 //Another normalization of Mixed
439 return par[0]+par[1]*(x[0]-kMean)+par[2]*(x[0]-kMean)*(x[0]-kMean)+par[3]*(x[0]-kMean)*(x[0]-kMean)*(x[0]-kMean) ;
443 //-----------------------------------------------------------------------------
447 //////////////////////////////////////////////////////////////////////
449 // ROOT style macro for the TRD TDR
451 //////////////////////////////////////////////////////////////////////
453 gStyle->SetPalette(1);
454 gStyle->SetCanvasBorderMode(-1);
455 gStyle->SetCanvasBorderSize(1);
456 gStyle->SetCanvasColor(10);
458 gStyle->SetFrameFillColor(10);
459 gStyle->SetFrameBorderSize(1);
460 gStyle->SetFrameBorderMode(-1);
461 gStyle->SetFrameLineWidth(1.2);
462 gStyle->SetFrameLineColor(1);
464 gStyle->SetHistFillColor(0);
465 gStyle->SetHistLineWidth(1);
466 gStyle->SetHistLineColor(1);
468 gStyle->SetPadColor(10);
469 gStyle->SetPadBorderSize(1);
470 gStyle->SetPadBorderMode(-1);
472 gStyle->SetStatColor(10);
473 gStyle->SetTitleColor(kBlack,"X");
474 gStyle->SetTitleColor(kBlack,"Y");
476 gStyle->SetLabelSize(0.04,"X");
477 gStyle->SetLabelSize(0.04,"Y");
478 gStyle->SetLabelSize(0.04,"Z");
479 gStyle->SetTitleSize(0.04,"X");
480 gStyle->SetTitleSize(0.04,"Y");
481 gStyle->SetTitleSize(0.04,"Z");
482 gStyle->SetTitleFont(42,"X");
483 gStyle->SetTitleFont(42,"Y");
484 gStyle->SetTitleFont(42,"X");
485 gStyle->SetLabelFont(42,"X");
486 gStyle->SetLabelFont(42,"Y");
487 gStyle->SetLabelFont(42,"Z");
488 gStyle->SetStatFont(42);
490 gStyle->SetTitleOffset(1.0,"X");
491 gStyle->SetTitleOffset(1.4,"Y");
493 gStyle->SetFillColor(kWhite);
494 gStyle->SetTitleFillColor(kWhite);
496 gStyle->SetOptDate(0);
497 gStyle->SetOptTitle(1);
498 gStyle->SetOptStat(0);
499 gStyle->SetOptFit(0);