]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/PHOSTasks/PHOS_pp_pi0/macros/MakeFinalSpectrum.C
Corrected end-of-line behavior
[u/mrichter/AliRoot.git] / PWGGA / PHOSTasks / PHOS_pp_pi0 / macros / MakeFinalSpectrum.C
index 6251635b18ad3aef9bc7bb931eb6f67c389d490d..99b810a1887e1166c0899e1163746166226a1f9b 100644 (file)
-void MakeFinalSpectrum()\r
-{\r
-  //-----------------------------------------------------------------------------\r
-  // This macro takes the raw pi0 spectrum from LHC11a_FitResult_20130314.root,\r
-  // correct it for feed down, then for efficiency,\r
-  // adds all systematic errors and produces the production invariant spectrum\r
-  //--\r
-  // Last modification: 06.07.2012 by Yuri Kharlov\r
-  //-----------------------------------------------------------------------------\r
-\r
-  TFile *f  = new TFile("LHC11a_FitResult_20130913.root");\r
-  TH1D * nr1CB    = (TH1D*)f->Get("Mix_CB_yr1")  ;\r
-  TH1D * nr1intCB = (TH1D*)f->Get("Mix_CB_yr1int")  ;\r
-  TH1D * nr2CB    = (TH1D*)f->Get("Mix_CB_yr2")  ;\r
-  TH1D * nr2intCB = (TH1D*)f->Get("Mix_CB_yr2int")  ;\r
-\r
-  TH1D * nr1GS    = (TH1D*)f->Get("Mix_yr1")  ;\r
-  TH1D * nr1intGS = (TH1D*)f->Get("Mix_yr1int")  ;\r
-  TH1D * nr2GS    = (TH1D*)f->Get("Mix_yr2")  ;\r
-  TH1D * nr2intGS = (TH1D*)f->Get("Mix_yr2int")  ;\r
-\r
-  //Divide by bin width\r
-  for(Int_t i=1;i<= nr1CB->GetNbinsX();i++){\r
-    nr1CB   ->SetBinContent(i,nr1CB->GetBinContent(i)/nr1CB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1CB   ->SetBinError  (i,nr1CB->GetBinError(i)/nr1CB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1intCB->SetBinContent(i,nr1intCB->GetBinContent(i)/nr1intCB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1intCB->SetBinError  (i,nr1intCB->GetBinError(i)/nr1intCB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2CB   ->SetBinContent(i,nr2CB->GetBinContent(i)/nr2CB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2CB   ->SetBinError  (i,nr2CB->GetBinError(i)/nr2CB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2intCB->SetBinContent(i,nr2intCB->GetBinContent(i)/nr2intCB->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2intCB->SetBinError  (i,nr2intCB->GetBinError(i)/nr2intCB->GetXaxis()->GetBinWidth(i)) ;\r
-\r
-    nr1GS   ->SetBinContent(i,nr1GS->GetBinContent(i)/nr1GS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1GS   ->SetBinError  (i,nr1GS->GetBinError(i)/nr1GS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1intGS->SetBinContent(i,nr1intGS->GetBinContent(i)/nr1intGS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr1intGS->SetBinError  (i,nr1intGS->GetBinError(i)/nr1intGS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2GS   ->SetBinContent(i,nr2GS->GetBinContent(i)/nr2GS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2GS   ->SetBinError  (i,nr2GS->GetBinError(i)/nr2GS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2intGS->SetBinContent(i,nr2intGS->GetBinContent(i)/nr2intGS->GetXaxis()->GetBinWidth(i)) ;\r
-    nr2intGS->SetBinError  (i,nr2intGS->GetBinError(i)/nr2intGS->GetXaxis()->GetBinWidth(i)) ;\r
-  }\r
-\r
-  // feed down correction\r
-\r
-  TF1 *fKaonContaminationToPi0 = new TF1("kaonCont","1./(1.-1.33*1.2*exp(-2.95-0.16*x))",0.,30.);\r
-  nr1GS   ->Divide(fKaonContaminationToPi0);\r
-  nr1intGS->Divide(fKaonContaminationToPi0);\r
-  nr2GS   ->Divide(fKaonContaminationToPi0);\r
-  nr2intGS->Divide(fKaonContaminationToPi0);\r
-  nr1CB   ->Divide(fKaonContaminationToPi0);\r
-  nr2CB   ->Divide(fKaonContaminationToPi0);\r
-  nr1intCB->Divide(fKaonContaminationToPi0);\r
-  nr2intCB->Divide(fKaonContaminationToPi0);\r
-\r
-  // SPD pileup correction\r
-\r
-  TF1 *fSPDpileup = new TF1("SPDpileup","0.988",0.,30.);\r
-  nr1GS   ->Multiply(fSPDpileup);\r
-  nr1intGS->Multiply(fSPDpileup);\r
-  nr2GS   ->Multiply(fSPDpileup);\r
-  nr2intGS->Multiply(fSPDpileup);\r
-  nr1CB   ->Multiply(fSPDpileup);\r
-  nr2CB   ->Multiply(fSPDpileup);\r
-  nr1intCB->Multiply(fSPDpileup);\r
-  nr2intCB->Multiply(fSPDpileup);\r
-\r
-  //correct for efficiency\r
-  TFile *fEff = new TFile("Pi0_efficiency_LHC11a__20131029_Mall.root") ;\r
-\r
-  TF1 * effGS=fEff->Get("eff_Pi0_Gaus_2760GeV") ;\r
-  TF1 * effCB=fEff->Get("eff_Pi0_CB_2760GeV") ;\r
-  effGS   ->SetRange(0.,25.) ;\r
-  effCB   ->SetRange(0.,25.) ;\r
-\r
-  nr1GS   ->Divide(effGS) ;\r
-  nr1intGS->Divide(effGS) ;\r
-  nr2GS   ->Divide(effGS) ;\r
-  nr2intGS->Divide(effGS) ;\r
-  nr1CB   ->Divide(effCB) ;\r
-  nr2CB   ->Divide(effCB) ;\r
-  nr1intCB->Divide(effCB) ;\r
-  nr2intCB->Divide(effCB) ;\r
-\r
-  //make 1/pt\r
-  for(Int_t i=1;i<=nr1CB->GetNbinsX();i++){\r
-    Double_t pt = TMath::TwoPi()*nr1CB->GetXaxis()->GetBinCenter(i);\r
-    nr1CB   ->SetBinContent(i,nr1CB   ->GetBinContent(i)/pt) ;\r
-    nr1CB   ->SetBinError  (i,nr1CB   ->GetBinError(i)  /pt) ;\r
-    nr1intCB->SetBinContent(i,nr1intCB->GetBinContent(i)/pt) ;\r
-    nr1intCB->SetBinError  (i,nr1intCB->GetBinError(i)  /pt) ;\r
-    nr2CB   ->SetBinContent(i,nr2CB   ->GetBinContent(i)/pt) ;\r
-    nr2CB   ->SetBinError  (i,nr2CB   ->GetBinError(i)  /pt) ;\r
-    nr2intCB->SetBinContent(i,nr2intCB->GetBinContent(i)/pt) ;\r
-    nr2intCB->SetBinError  (i,nr2intCB->GetBinError(i)  /pt) ;\r
-\r
-    nr1GS   ->SetBinContent(i,nr1GS   ->GetBinContent(i)/pt) ;\r
-    nr1GS   ->SetBinError  (i,nr1GS   ->GetBinError(i)  /pt) ;\r
-    nr1intGS->SetBinContent(i,nr1intGS->GetBinContent(i)/pt) ;\r
-    nr1intGS->SetBinError  (i,nr1intGS->GetBinError(i)  /pt) ;\r
-    nr2GS   ->SetBinContent(i,nr2GS   ->GetBinContent(i)/pt) ;\r
-    nr2GS   ->SetBinError  (i,nr2GS   ->GetBinError(i)  /pt) ;\r
-    nr2intGS->SetBinContent(i,nr2intGS->GetBinContent(i)/pt) ;\r
-    nr2intGS->SetBinError  (i,nr2intGS->GetBinError(i)  /pt) ;\r
-  }\r
-\r
-  //For the final spectrum we take average of fits\r
-  //with numerical integration of entries in signal\r
-  \r
-  TH1D * hStat = (TH1D*)nr2intCB->Clone("hPi02760GeVStat") ;\r
-  TH1D * hSys  = (TH1D*)hStat   ->Clone("hPi02760GeVSys") ;\r
-  TH1D * hSys2 = (TH1D*)hStat   ->Clone("hPi02760GeVSysTypeB") ;\r
-  TH1D * hSys3 = (TH1D*)hStat   ->Clone("hPi02760GeVSysTypeC") ;\r
-  hStat->SetAxisRange(0.,14.9,"X");\r
-  hSys ->SetAxisRange(0.,14.9,"X");\r
-\r
-  //For systematic error estimate take largest deviation\r
-  //of integrated yeilds (note, they are efficiency corrected)\r
-  for(Int_t i=1;i<=nr1CB->GetNbinsX();i++){\r
-    Double_t mean= hStat->GetBinContent(i) ;\r
-    Double_t dev = TMath::Max(\r
-                   TMath::Max(TMath::Abs(nr1intCB->GetBinContent(i)-mean),\r
-                              TMath::Abs(nr2intCB->GetBinContent(i)-mean)),\r
-                   TMath::Max(TMath::Abs(nr1intGS->GetBinContent(i)-mean),\r
-                              TMath::Abs(nr2intGS->GetBinContent(i)-mean))\r
-                             );\r
-    hSys ->SetBinError(i,dev) ;\r
-    hSys2->SetBinError(i,dev) ;\r
-  }\r
-\r
-  //Add other sys errors\r
-  TF1 * globalE = new TF1("globalE","1.-((x+1.354)/(x*1.002+1.354))^6.18 ",1.,30.) ; \r
-  TF1 * conv    = new TF1("conversion","0.035",0.,30.) ;\r
-  TF1 * accept  = new TF1("accept"    ,"0.01" ,0.,30.) ;\r
-  TF1 * pileup  = new TF1("pileup"    ,"0.004",0.,30.) ;\r
-  TF1 * calib   = new TF1("calib"     ,"0.005",0.,30.) ;\r
-  TF1 * modDiff = new TF1("modDiff"   ,"0.04",0.,30.) ;\r
-  // TF1 * modDiff = new TF1("modDiff"   ,"16.9*exp(-4.5*x)+0.033",0.,30.) ;\r
-  TF1 * tofCut  = new TF1("tofCut"    ,"0.0105" ,0.,30.) ;\r
-\r
-  //Borya's estimate of non-linearity (found for pp @ 7 TeV)\r
-  TF1 * nonlin= new TF1("nl","0.015+7.38*exp(-x/0.24)",0.,30.) ;\r
-\r
-  //Draw sys errors\r
-  TH1D * hRelSysRaw = (TH1D*)hSys->Clone("RelSysRaw") ;\r
-  hRelSysRaw->SetTitle("Summary of systematic errors");\r
-  for(Int_t i=1;i<=hSys->GetNbinsX();i++){\r
-    Double_t mean= hSys->GetBinContent(i) ;\r
-    Double_t a=hSys->GetBinError(i) ;\r
-    if(mean>0)\r
-      hRelSysRaw->SetBinContent(i,a/mean) ;\r
-    else\r
-      hRelSysRaw->SetBinContent(i,0.) ;\r
-      hRelSysRaw->SetBinError(i,0.) ;\r
-  }\r
-\r
-  //Add errors in sys errors\r
-\r
-  TH1D * hRelSysTot = (TH1D*)hSys->Clone("RelSys") ;\r
-  hRelSysTot->SetTitle("Summary of systematic uncertainties");\r
-\r
-  for(Int_t i=1;i<=hSys->GetNbinsX();i++){\r
-    Double_t pt   = hSys->GetXaxis()->GetBinCenter(i) ;\r
-    Double_t mean = hSys->GetBinContent(i) ;\r
-    Double_t a    = hSys->GetBinError(i) ;\r
-    // Double_t b    = mean * hSysErrModules->GetBinContent(i) ;\r
-    Double_t tot= mean*mean*nonlin ->Eval(pt)*nonlin ->Eval(pt) \r
-                 +mean*mean*conv   ->Eval(pt)*conv   ->Eval(pt)\r
-                 +mean*mean*accept ->Eval(pt)*accept ->Eval(pt)\r
-                 +mean*mean*pileup ->Eval(pt)*pileup ->Eval(pt)\r
-                 +mean*mean*calib  ->Eval(pt)*calib  ->Eval(pt)\r
-                 +mean*mean*modDiff->Eval(pt)*modDiff->Eval(pt)\r
-                 +mean*mean*tofCut ->Eval(pt)*tofCut ->Eval(pt)\r
-                 +mean*mean*globalE->Eval(pt)*globalE->Eval(pt); \r
-    Double_t raa= mean*mean*nonlin->Eval(pt)*nonlin->Eval(pt) \r
-                 +mean*mean*pileup->Eval(pt)*pileup->Eval(pt)\r
-                 +mean*mean*calib ->Eval(pt)*calib ->Eval(pt); \r
-    hSys3->SetBinError(i,TMath::Sqrt(tot)) ;\r
-    // hSys->SetBinError(i,TMath::Sqrt(tot + a*a + b*b)) ;\r
-    hSys2->SetBinError(i,TMath::Sqrt(raa + a*a)) ;\r
-    hSys ->SetBinError(i,TMath::Sqrt(tot + a*a)) ;\r
-    \r
-    a = hSys->GetBinError(i) ;\r
-    printf("i=%d, %g+-%g\n",i,mean,a);\r
-    if(mean>0)\r
-      hRelSysTot->SetBinContent(i,a/mean) ;\r
-    else {\r
-      hRelSysTot->SetBinContent(i,0.) ;\r
-      hRelSysTot->SetBinError(i,0.) ;\r
-    }\r
-  }\r
-\r
-  // TFile *fSysErrModules = TFile::Open("PHOS_sysErr_modules.root");\r
-  // TH1D* hSysErrModules = (TH1D*)fSysErrModules->Get("hSyserr");\r
-\r
-  gStyle->SetOptStat(0);\r
-  TCanvas * c = new TCanvas("c","SysErrors") ;\r
-  c->SetLogy();\r
-  c->cd() ;\r
-  gPad->SetRightMargin(0.02);\r
-  gPad->SetTopMargin(0.07);\r
-  hRelSysTot->SetAxisRange(0.8    ,11.9,"X");\r
-  hRelSysTot->SetAxisRange(0.0031,0.45,"Y");\r
-  hRelSysTot->GetYaxis()->SetMoreLogLabels();\r
-  hRelSysTot->GetYaxis()->SetNoExponent();\r
-  hRelSysTot->SetNdivisions(520,"X");\r
-  hRelSysTot->SetLineColor(1) ;\r
-  hRelSysTot->SetLineWidth(2) ;\r
-  hRelSysRaw->SetLineColor(2) ;\r
-  hRelSysRaw->SetLineWidth(2) ;\r
-  globalE->SetLineColor(kGreen+2) ;\r
-  nonlin ->SetLineColor(4) ;\r
-  conv   ->SetLineColor(6) ;\r
-  accept ->SetLineColor(kOrange) ;\r
-  pileup ->SetLineColor(42);\r
-  calib  ->SetLineColor(44);\r
-  calib  ->SetLineStyle(2);\r
-  modDiff->SetLineColor(52);\r
-  modDiff->SetLineStyle(2);\r
-  tofCut ->SetLineColor(53);\r
-  tofCut ->SetLineStyle(3);\r
-  // hSysErrModules->SetLineColor(kOrange+2);\r
-  // hSysErrModules->SetLineStyle(2);\r
-  hRelSysTot->SetXTitle("p_{T} (GeV/c)") ;\r
-  hRelSysTot->SetYTitle("Rel.syst.error") ;\r
-  hRelSysTot->GetYaxis()->SetTitleOffset(1.2) ;\r
-  hRelSysTot->Draw("hist") ;\r
-  hRelSysRaw->Draw("h same") ;\r
-  globalE->Draw("same") ; \r
-  nonlin ->Draw("same") ;\r
-  conv   ->Draw("same") ;\r
-  accept ->Draw("same") ;\r
-  pileup ->Draw("same");\r
-  calib  ->Draw("same");\r
-  modDiff->Draw("same");\r
-  tofCut ->Draw("same");\r
-  // hSysErrModules->Draw("same ][");\r
-  TLegend * l = new TLegend(0.57,0.62,0.85,0.925) ;\r
-  l->SetFillColor(kWhite);\r
-  l->SetBorderSize(0);\r
-  l->AddEntry(hRelSysTot,"Total uncertainty","l") ;\r
-  l->AddEntry(hRelSysRaw,"Raw extraction","l") ;\r
-  l->AddEntry(conv   ,"Conversion","l") ;\r
-  l->AddEntry(nonlin ,"Non-linearity","l") ;\r
-  l->AddEntry(accept ,"Acceptance","l");\r
-  l->AddEntry(pileup ,"Pileup","l");\r
-  l->AddEntry(calib  ,"Rel.calib.","l");\r
-  l->AddEntry(modDiff,"Per-module yield","l");\r
-  l->AddEntry(tofCut ,"Timing cut","l");\r
-  // l->AddEntry(hSysErrModules,"Intermodule spectra","l");\r
-  l->AddEntry(globalE,"Global E scale","l") ;\r
-  l->Draw() ;\r
-\r
-  c->Print("LHC11a_SysErrors.eps");\r
-\r
-  hStat->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, stat.err.");\r
-  hStat->SetXTitle("p_{T}, GeV/c");\r
-  hStat->SetYTitle("1/N_{ev} 1/(2#pi p_{T}) d^{2}N/dydp_{T} (GeV^{-2}c^{2})");\r
-  hSys ->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, total syst.err.");\r
-  hSys ->SetXTitle("p_{T}, GeV/c");\r
-  hSys ->SetYTitle("1/N_{ev} 1/(2#pi p_{T}) d^{2}N/dydp_{T} (GeV^{-2}c^{2})");\r
-  hSys2->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, syst.err. for R_{AA}");\r
-  hSys3->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, apparatus syst.err.");\r
-  hSys ->SetFillColor(kBlue-10) ;\r
-  hSys ->SetNdivisions(520,"X");\r
-\r
-  hSysFinal = (TH1F*)hSys->Clone("hSysFinal");\r
-  hSysFinal ->SetTitle("Production #pi^{0} yield, pp @ 2.76 TeV, 07.11.2013");\r
-  hSysFinal ->GetYaxis()->SetTitleOffset(1.2);\r
-  hStat->GetYaxis()->SetTitleOffset(1.2);\r
-  hSysFinal ->SetAxisRange(0.8,9.9,"X");\r
-\r
-  TCanvas *c2 = new TCanvas("c2","Production spectrum");\r
-  gPad->SetRightMargin(0.02);\r
-  gPad->SetTopMargin(0.07);\r
-  gPad->SetGridx();\r
-  gPad->SetGridy();\r
-  c2->SetLogy();\r
-  hSysFinal->Draw("E2") ;\r
-  hStat->SetMarkerStyle(20) ;\r
-  hStat->SetMarkerColor(4) ;\r
-  hStat->SetLineColor(4) ;\r
-  hStat->Draw("same") ;\r
-  \r
-  // //Apply bin width correction\r
-  // TH1D * hBWcorr = BinWidthCorrection(hStat) ;\r
-  // hSys->Divide(hBWcorr) ;\r
-  // hSys2->Divide(hBWcorr) ;\r
-  // hSys3->Divide(hBWcorr) ;\r
-  // hStat->Divide(hBWcorr) ;\r
-\r
-  c2->Print("LHC11a_pi0Spectrum.eps");\r
-\r
-  TF1 *tsallis = FitTsallis(hStat,hSys);\r
-  \r
-  TFile fout("PHOS_pi0_2760eV_noBinWidthCorr_20131112.root","recreate") ;\r
-  hSys   ->Write() ;\r
-  hSys2  ->Write() ;\r
-  hSys3  ->Write() ;\r
-  hStat  ->Write() ;\r
-  tsallis->Write() ;\r
-  fout.Close() ;\r
-\r
-\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-TF1 *FitTsallis(TH1D* hStat, TH1D* hSys)\r
-{\r
-  TF1 * fit = new TF1("Tsalis","[0]/2./3.1415*([2]-1.)*([2]-2.)/([2]*[1]*([2]*[1]+0.135*([2]-2.)))*(1.+(sqrt(x*x+0.135*0.135)-0.135)/([2]*[1]))^-[2]",0.5,25.) ;\r
-  fit->SetParameters(10.,0.2,8.) ;\r
-  fit->SetLineColor(kBlack) ;\r
-  fit->SetLineWidth(2) ;\r
-  fit->SetParName(0,"dN/dy") ;\r
-  fit->SetParName(1,"T") ;\r
-  fit->SetParName(2,"n") ;\r
-  \r
-  TH1D * hSysRatio  = (TH1D*)hSys ->Clone("RatioSys") ;\r
-  TH1D * hStatRatio = (TH1D*)hStat->Clone("RatioStat") ;\r
-\r
-  TH1D * hsum = (TH1D*)hStat->Clone("sum") ;\r
-  for(Int_t i=1; i<=hsum->GetNbinsX();i++){\r
-    Double_t a=hSys->GetBinError(i) ;\r
-    Double_t b=hStat->GetBinError(i) ;\r
-    hsum->SetBinError(i,TMath::Sqrt(a*a+b*b)) ;\r
-  }\r
-  hsum->SetStats(1) ;\r
-  hsum->Fit(fit,"Q") ;\r
-  Double_t meanPt=fit->Moment(1,1.,10.) ;\r
-  printf("<pt>=%f \n",meanPt) ;\r
-\r
-  hSysRatio ->Divide(fit) ;\r
-  hStatRatio->Divide(fit) ;\r
-\r
-  return fit;\r
-}\r
-//-----------------------------------------------------------------------------\r
-TH1D * BinWidthCorrection(TH1D * h){\r
-  //We apply bin width a-la PHENIX \r
-  //Use Tsalis fit to calculate shift in y direction\r
\r
-  TF1 * fit = new TF1("hag","[0]*(([2]*[1]+sqrt(x*x+0.135*0.135))/([2]*[1]+0.135))^-[2]",0.5,25.) ;\r
-  fit->SetParameters(10.,0.2,8.) ;\r
-  TCanvas * corr = new TCanvas("BWcorr","Bin width correction") ;\r
-  Int_t col[6]={kRed,kOrange,kMagenta,kGreen,kCyan,kBlue} ;\r
-  TH1D * hcorr[20] ;\r
-  char key[55] ;\r
-  Double_t rMax=10 ;\r
-  Int_t iteration=0 ;\r
-  TH1D * htmp = (TH1D*)h->Clone("tmp") ;\r
-  while(iteration<6){\r
-    printf(" Iteration %d: rMax=%f \n",iteration, rMax) ;\r
-    htmp->Fit(fit,"N") ;\r
-    sprintf(key,"Ineration%d",iteration) ;\r
-    hcorr[iteration]=(TH1D*)h->Clone(key);\r
-    rMax= 0; \r
-    for(Int_t i=1;i<=h->GetNbinsX();i++){\r
-      Double_t a=h->GetXaxis()->GetBinLowEdge(i) ;\r
-      Double_t b=h->GetXaxis()->GetBinUpEdge(i) ;\r
-      Double_t r=fit->Integral(a,b)/(b-a)/fit->Eval(0.5*(a+b)) ;\r
-      hcorr[iteration]->SetBinContent(i,r) ;\r
-      hcorr[iteration]->SetBinError(i,0.) ;\r
-      if(rMax<r)rMax=r ;\r
-    }\r
-    delete htmp ;\r
-    htmp = (TH1D*)h->Clone("tmp") ;\r
-    htmp->Divide(hcorr[iteration]) ;\r
-    corr->cd() ;\r
-    hcorr[iteration]->SetLineColor(col[iteration]);\r
-    if(iteration==0)\r
-      hcorr[iteration]->Draw() ;\r
-    else\r
-      hcorr[iteration]->Draw("same") ;\r
-    corr->Update() ;\r
-    iteration++ ;\r
-  } \r
-\r
-  hcorr[5]->SetTitle("Bin-width correction for #pi^{0} spectrum");\r
-  hcorr[5]->SetYTitle("Bin-width corrected / uncorrected");\r
-  TFile fout("PHOS_pi0_7TeV_BinWidthCorrection.root","recreate") ;\r
-  hcorr[5]->Write();\r
-  fout.Close();\r
-\r
-  return hcorr[5] ;\r
-}\r
+void MakeFinalSpectrum()
+{
+  //-----------------------------------------------------------------------------
+  // This macro takes the raw pi0 spectrum from LHC11a_FitResult_20130314.root,
+  // correct it for feed down, then for efficiency,
+  // adds all systematic errors and produces the production invariant spectrum
+  //--
+  // Last modification: 06.07.2012 by Yuri Kharlov
+  //-----------------------------------------------------------------------------
+
+  TFile *f  = new TFile("LHC11a_FitResult_20130913.root");
+  TH1D * nr1CB    = (TH1D*)f->Get("Mix_CB_yr1")  ;
+  TH1D * nr1intCB = (TH1D*)f->Get("Mix_CB_yr1int")  ;
+  TH1D * nr2CB    = (TH1D*)f->Get("Mix_CB_yr2")  ;
+  TH1D * nr2intCB = (TH1D*)f->Get("Mix_CB_yr2int")  ;
+
+  TH1D * nr1GS    = (TH1D*)f->Get("Mix_yr1")  ;
+  TH1D * nr1intGS = (TH1D*)f->Get("Mix_yr1int")  ;
+  TH1D * nr2GS    = (TH1D*)f->Get("Mix_yr2")  ;
+  TH1D * nr2intGS = (TH1D*)f->Get("Mix_yr2int")  ;
+
+  //Divide by bin width
+  for(Int_t i=1;i<= nr1CB->GetNbinsX();i++){
+    nr1CB   ->SetBinContent(i,nr1CB->GetBinContent(i)/nr1CB->GetXaxis()->GetBinWidth(i)) ;
+    nr1CB   ->SetBinError  (i,nr1CB->GetBinError(i)/nr1CB->GetXaxis()->GetBinWidth(i)) ;
+    nr1intCB->SetBinContent(i,nr1intCB->GetBinContent(i)/nr1intCB->GetXaxis()->GetBinWidth(i)) ;
+    nr1intCB->SetBinError  (i,nr1intCB->GetBinError(i)/nr1intCB->GetXaxis()->GetBinWidth(i)) ;
+    nr2CB   ->SetBinContent(i,nr2CB->GetBinContent(i)/nr2CB->GetXaxis()->GetBinWidth(i)) ;
+    nr2CB   ->SetBinError  (i,nr2CB->GetBinError(i)/nr2CB->GetXaxis()->GetBinWidth(i)) ;
+    nr2intCB->SetBinContent(i,nr2intCB->GetBinContent(i)/nr2intCB->GetXaxis()->GetBinWidth(i)) ;
+    nr2intCB->SetBinError  (i,nr2intCB->GetBinError(i)/nr2intCB->GetXaxis()->GetBinWidth(i)) ;
+
+    nr1GS   ->SetBinContent(i,nr1GS->GetBinContent(i)/nr1GS->GetXaxis()->GetBinWidth(i)) ;
+    nr1GS   ->SetBinError  (i,nr1GS->GetBinError(i)/nr1GS->GetXaxis()->GetBinWidth(i)) ;
+    nr1intGS->SetBinContent(i,nr1intGS->GetBinContent(i)/nr1intGS->GetXaxis()->GetBinWidth(i)) ;
+    nr1intGS->SetBinError  (i,nr1intGS->GetBinError(i)/nr1intGS->GetXaxis()->GetBinWidth(i)) ;
+    nr2GS   ->SetBinContent(i,nr2GS->GetBinContent(i)/nr2GS->GetXaxis()->GetBinWidth(i)) ;
+    nr2GS   ->SetBinError  (i,nr2GS->GetBinError(i)/nr2GS->GetXaxis()->GetBinWidth(i)) ;
+    nr2intGS->SetBinContent(i,nr2intGS->GetBinContent(i)/nr2intGS->GetXaxis()->GetBinWidth(i)) ;
+    nr2intGS->SetBinError  (i,nr2intGS->GetBinError(i)/nr2intGS->GetXaxis()->GetBinWidth(i)) ;
+  }
+
+  // feed down correction
+
+  TF1 *fKaonContaminationToPi0 = new TF1("kaonCont","1./(1.-1.33*1.2*exp(-2.95-0.16*x))",0.,30.);
+  nr1GS   ->Divide(fKaonContaminationToPi0);
+  nr1intGS->Divide(fKaonContaminationToPi0);
+  nr2GS   ->Divide(fKaonContaminationToPi0);
+  nr2intGS->Divide(fKaonContaminationToPi0);
+  nr1CB   ->Divide(fKaonContaminationToPi0);
+  nr2CB   ->Divide(fKaonContaminationToPi0);
+  nr1intCB->Divide(fKaonContaminationToPi0);
+  nr2intCB->Divide(fKaonContaminationToPi0);
+
+  // SPD pileup correction
+
+  TF1 *fSPDpileup = new TF1("SPDpileup","0.988",0.,30.);
+  nr1GS   ->Multiply(fSPDpileup);
+  nr1intGS->Multiply(fSPDpileup);
+  nr2GS   ->Multiply(fSPDpileup);
+  nr2intGS->Multiply(fSPDpileup);
+  nr1CB   ->Multiply(fSPDpileup);
+  nr2CB   ->Multiply(fSPDpileup);
+  nr1intCB->Multiply(fSPDpileup);
+  nr2intCB->Multiply(fSPDpileup);
+
+  //correct for efficiency
+  TFile *fEff = new TFile("Pi0_efficiency_LHC11a__20131029_Mall.root") ;
+
+  TF1 * effGS=fEff->Get("eff_Pi0_Gaus_2760GeV") ;
+  TF1 * effCB=fEff->Get("eff_Pi0_CB_2760GeV") ;
+  effGS   ->SetRange(0.,25.) ;
+  effCB   ->SetRange(0.,25.) ;
+
+  nr1GS   ->Divide(effGS) ;
+  nr1intGS->Divide(effGS) ;
+  nr2GS   ->Divide(effGS) ;
+  nr2intGS->Divide(effGS) ;
+  nr1CB   ->Divide(effCB) ;
+  nr2CB   ->Divide(effCB) ;
+  nr1intCB->Divide(effCB) ;
+  nr2intCB->Divide(effCB) ;
+
+  //make 1/pt
+  for(Int_t i=1;i<=nr1CB->GetNbinsX();i++){
+    Double_t pt = TMath::TwoPi()*nr1CB->GetXaxis()->GetBinCenter(i);
+    nr1CB   ->SetBinContent(i,nr1CB   ->GetBinContent(i)/pt) ;
+    nr1CB   ->SetBinError  (i,nr1CB   ->GetBinError(i)  /pt) ;
+    nr1intCB->SetBinContent(i,nr1intCB->GetBinContent(i)/pt) ;
+    nr1intCB->SetBinError  (i,nr1intCB->GetBinError(i)  /pt) ;
+    nr2CB   ->SetBinContent(i,nr2CB   ->GetBinContent(i)/pt) ;
+    nr2CB   ->SetBinError  (i,nr2CB   ->GetBinError(i)  /pt) ;
+    nr2intCB->SetBinContent(i,nr2intCB->GetBinContent(i)/pt) ;
+    nr2intCB->SetBinError  (i,nr2intCB->GetBinError(i)  /pt) ;
+
+    nr1GS   ->SetBinContent(i,nr1GS   ->GetBinContent(i)/pt) ;
+    nr1GS   ->SetBinError  (i,nr1GS   ->GetBinError(i)  /pt) ;
+    nr1intGS->SetBinContent(i,nr1intGS->GetBinContent(i)/pt) ;
+    nr1intGS->SetBinError  (i,nr1intGS->GetBinError(i)  /pt) ;
+    nr2GS   ->SetBinContent(i,nr2GS   ->GetBinContent(i)/pt) ;
+    nr2GS   ->SetBinError  (i,nr2GS   ->GetBinError(i)  /pt) ;
+    nr2intGS->SetBinContent(i,nr2intGS->GetBinContent(i)/pt) ;
+    nr2intGS->SetBinError  (i,nr2intGS->GetBinError(i)  /pt) ;
+  }
+
+  //For the final spectrum we take average of fits
+  //with numerical integration of entries in signal
+  
+  TH1D * hStat = (TH1D*)nr2intCB->Clone("hPi02760GeVStat") ;
+  TH1D * hSys  = (TH1D*)hStat   ->Clone("hPi02760GeVSys") ;
+  TH1D * hSys2 = (TH1D*)hStat   ->Clone("hPi02760GeVSysTypeB") ;
+  TH1D * hSys3 = (TH1D*)hStat   ->Clone("hPi02760GeVSysTypeC") ;
+  hStat->SetAxisRange(0.,14.9,"X");
+  hSys ->SetAxisRange(0.,14.9,"X");
+
+  //For systematic error estimate take largest deviation
+  //of integrated yeilds (note, they are efficiency corrected)
+  for(Int_t i=1;i<=nr1CB->GetNbinsX();i++){
+    Double_t mean= hStat->GetBinContent(i) ;
+    Double_t dev = TMath::Max(
+                   TMath::Max(TMath::Abs(nr1intCB->GetBinContent(i)-mean),
+                              TMath::Abs(nr2intCB->GetBinContent(i)-mean)),
+                   TMath::Max(TMath::Abs(nr1intGS->GetBinContent(i)-mean),
+                              TMath::Abs(nr2intGS->GetBinContent(i)-mean))
+                             );
+    hSys ->SetBinError(i,dev) ;
+    hSys2->SetBinError(i,dev) ;
+  }
+
+  //Add other sys errors
+  TF1 * globalE = new TF1("globalE","1.-((x+1.354)/(x*1.002+1.354))^6.18 ",1.,30.) ; 
+  TF1 * conv    = new TF1("conversion","0.035",0.,30.) ;
+  TF1 * accept  = new TF1("accept"    ,"0.01" ,0.,30.) ;
+  TF1 * pileup  = new TF1("pileup"    ,"0.004",0.,30.) ;
+  TF1 * calib   = new TF1("calib"     ,"0.005",0.,30.) ;
+  TF1 * modDiff = new TF1("modDiff"   ,"0.04",0.,30.) ;
+  // TF1 * modDiff = new TF1("modDiff"   ,"16.9*exp(-4.5*x)+0.033",0.,30.) ;
+  TF1 * tofCut  = new TF1("tofCut"    ,"0.0105" ,0.,30.) ;
+
+  //Borya's estimate of non-linearity (found for pp @ 7 TeV)
+  TF1 * nonlin= new TF1("nl","0.015+7.38*exp(-x/0.24)",0.,30.) ;
+
+  //Draw sys errors
+  TH1D * hRelSysRaw = (TH1D*)hSys->Clone("RelSysRaw") ;
+  hRelSysRaw->SetTitle("Summary of systematic errors");
+  for(Int_t i=1;i<=hSys->GetNbinsX();i++){
+    Double_t mean= hSys->GetBinContent(i) ;
+    Double_t a=hSys->GetBinError(i) ;
+    if(mean>0)
+      hRelSysRaw->SetBinContent(i,a/mean) ;
+    else
+      hRelSysRaw->SetBinContent(i,0.) ;
+      hRelSysRaw->SetBinError(i,0.) ;
+  }
+
+  //Add errors in sys errors
+
+  TH1D * hRelSysTot = (TH1D*)hSys->Clone("RelSys") ;
+  hRelSysTot->SetTitle("Summary of systematic uncertainties");
+
+  for(Int_t i=1;i<=hSys->GetNbinsX();i++){
+    Double_t pt   = hSys->GetXaxis()->GetBinCenter(i) ;
+    Double_t mean = hSys->GetBinContent(i) ;
+    Double_t a    = hSys->GetBinError(i) ;
+    // Double_t b    = mean * hSysErrModules->GetBinContent(i) ;
+    Double_t tot= mean*mean*nonlin ->Eval(pt)*nonlin ->Eval(pt) 
+                 +mean*mean*conv   ->Eval(pt)*conv   ->Eval(pt)
+                 +mean*mean*accept ->Eval(pt)*accept ->Eval(pt)
+                 +mean*mean*pileup ->Eval(pt)*pileup ->Eval(pt)
+                 +mean*mean*calib  ->Eval(pt)*calib  ->Eval(pt)
+                 +mean*mean*modDiff->Eval(pt)*modDiff->Eval(pt)
+                 +mean*mean*tofCut ->Eval(pt)*tofCut ->Eval(pt)
+                 +mean*mean*globalE->Eval(pt)*globalE->Eval(pt); 
+    Double_t raa= mean*mean*nonlin->Eval(pt)*nonlin->Eval(pt) 
+                 +mean*mean*pileup->Eval(pt)*pileup->Eval(pt)
+                 +mean*mean*calib ->Eval(pt)*calib ->Eval(pt); 
+    hSys3->SetBinError(i,TMath::Sqrt(tot)) ;
+    // hSys->SetBinError(i,TMath::Sqrt(tot + a*a + b*b)) ;
+    hSys2->SetBinError(i,TMath::Sqrt(raa + a*a)) ;
+    hSys ->SetBinError(i,TMath::Sqrt(tot + a*a)) ;
+    
+    a = hSys->GetBinError(i) ;
+    printf("i=%d, %g+-%g\n",i,mean,a);
+    if(mean>0)
+      hRelSysTot->SetBinContent(i,a/mean) ;
+    else {
+      hRelSysTot->SetBinContent(i,0.) ;
+      hRelSysTot->SetBinError(i,0.) ;
+    }
+  }
+
+  // TFile *fSysErrModules = TFile::Open("PHOS_sysErr_modules.root");
+  // TH1D* hSysErrModules = (TH1D*)fSysErrModules->Get("hSyserr");
+
+  gStyle->SetOptStat(0);
+  TCanvas * c = new TCanvas("c","SysErrors") ;
+  c->SetLogy();
+  c->cd() ;
+  gPad->SetRightMargin(0.02);
+  gPad->SetTopMargin(0.07);
+  hRelSysTot->SetAxisRange(0.8    ,11.9,"X");
+  hRelSysTot->SetAxisRange(0.0031,0.45,"Y");
+  hRelSysTot->GetYaxis()->SetMoreLogLabels();
+  hRelSysTot->GetYaxis()->SetNoExponent();
+  hRelSysTot->SetNdivisions(520,"X");
+  hRelSysTot->SetLineColor(1) ;
+  hRelSysTot->SetLineWidth(2) ;
+  hRelSysRaw->SetLineColor(2) ;
+  hRelSysRaw->SetLineWidth(2) ;
+  globalE->SetLineColor(kGreen+2) ;
+  nonlin ->SetLineColor(4) ;
+  conv   ->SetLineColor(6) ;
+  accept ->SetLineColor(kOrange) ;
+  pileup ->SetLineColor(42);
+  calib  ->SetLineColor(44);
+  calib  ->SetLineStyle(2);
+  modDiff->SetLineColor(52);
+  modDiff->SetLineStyle(2);
+  tofCut ->SetLineColor(53);
+  tofCut ->SetLineStyle(3);
+  // hSysErrModules->SetLineColor(kOrange+2);
+  // hSysErrModules->SetLineStyle(2);
+  hRelSysTot->SetXTitle("p_{T} (GeV/c)") ;
+  hRelSysTot->SetYTitle("Rel.syst.error") ;
+  hRelSysTot->GetYaxis()->SetTitleOffset(1.2) ;
+  hRelSysTot->Draw("hist") ;
+  hRelSysRaw->Draw("h same") ;
+  globalE->Draw("same") ; 
+  nonlin ->Draw("same") ;
+  conv   ->Draw("same") ;
+  accept ->Draw("same") ;
+  pileup ->Draw("same");
+  calib  ->Draw("same");
+  modDiff->Draw("same");
+  tofCut ->Draw("same");
+  // hSysErrModules->Draw("same ][");
+  TLegend * l = new TLegend(0.57,0.62,0.85,0.925) ;
+  l->SetFillColor(kWhite);
+  l->SetBorderSize(0);
+  l->AddEntry(hRelSysTot,"Total uncertainty","l") ;
+  l->AddEntry(hRelSysRaw,"Raw extraction","l") ;
+  l->AddEntry(conv   ,"Conversion","l") ;
+  l->AddEntry(nonlin ,"Non-linearity","l") ;
+  l->AddEntry(accept ,"Acceptance","l");
+  l->AddEntry(pileup ,"Pileup","l");
+  l->AddEntry(calib  ,"Rel.calib.","l");
+  l->AddEntry(modDiff,"Per-module yield","l");
+  l->AddEntry(tofCut ,"Timing cut","l");
+  // l->AddEntry(hSysErrModules,"Intermodule spectra","l");
+  l->AddEntry(globalE,"Global E scale","l") ;
+  l->Draw() ;
+
+  c->Print("LHC11a_SysErrors.eps");
+
+  hStat->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, stat.err.");
+  hStat->SetXTitle("p_{T}, GeV/c");
+  hStat->SetYTitle("1/N_{ev} 1/(2#pi p_{T}) d^{2}N/dydp_{T} (GeV^{-2}c^{2})");
+  hSys ->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, total syst.err.");
+  hSys ->SetXTitle("p_{T}, GeV/c");
+  hSys ->SetYTitle("1/N_{ev} 1/(2#pi p_{T}) d^{2}N/dydp_{T} (GeV^{-2}c^{2})");
+  hSys2->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, syst.err. for R_{AA}");
+  hSys3->SetTitle("Normalized production #pi^{0} yield, pp @ 2.76 TeV, apparatus syst.err.");
+  hSys ->SetFillColor(kBlue-10) ;
+  hSys ->SetNdivisions(520,"X");
+
+  hSysFinal = (TH1F*)hSys->Clone("hSysFinal");
+  hSysFinal ->SetTitle("Production #pi^{0} yield, pp @ 2.76 TeV, 07.11.2013");
+  hSysFinal ->GetYaxis()->SetTitleOffset(1.2);
+  hStat->GetYaxis()->SetTitleOffset(1.2);
+  hSysFinal ->SetAxisRange(0.8,9.9,"X");
+
+  TCanvas *c2 = new TCanvas("c2","Production spectrum");
+  gPad->SetRightMargin(0.02);
+  gPad->SetTopMargin(0.07);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  c2->SetLogy();
+  hSysFinal->Draw("E2") ;
+  hStat->SetMarkerStyle(20) ;
+  hStat->SetMarkerColor(4) ;
+  hStat->SetLineColor(4) ;
+  hStat->Draw("same") ;
+  
+  // //Apply bin width correction
+  // TH1D * hBWcorr = BinWidthCorrection(hStat) ;
+  // hSys->Divide(hBWcorr) ;
+  // hSys2->Divide(hBWcorr) ;
+  // hSys3->Divide(hBWcorr) ;
+  // hStat->Divide(hBWcorr) ;
+
+  c2->Print("LHC11a_pi0Spectrum.eps");
+
+  TF1 *tsallis = FitTsallis(hStat,hSys);
+  
+  TFile fout("PHOS_pi0_2760eV_noBinWidthCorr_20131112.root","recreate") ;
+  hSys   ->Write() ;
+  hSys2  ->Write() ;
+  hSys3  ->Write() ;
+  hStat  ->Write() ;
+  tsallis->Write() ;
+  fout.Close() ;
+
+
+}
+
+//-----------------------------------------------------------------------------
+TF1 *FitTsallis(TH1D* hStat, TH1D* hSys)
+{
+  TF1 * fit = new TF1("Tsalis","[0]/2./3.1415*([2]-1.)*([2]-2.)/([2]*[1]*([2]*[1]+0.135*([2]-2.)))*(1.+(sqrt(x*x+0.135*0.135)-0.135)/([2]*[1]))^-[2]",0.5,25.) ;
+  fit->SetParameters(10.,0.2,8.) ;
+  fit->SetLineColor(kBlack) ;
+  fit->SetLineWidth(2) ;
+  fit->SetParName(0,"dN/dy") ;
+  fit->SetParName(1,"T") ;
+  fit->SetParName(2,"n") ;
+  
+  TH1D * hSysRatio  = (TH1D*)hSys ->Clone("RatioSys") ;
+  TH1D * hStatRatio = (TH1D*)hStat->Clone("RatioStat") ;
+
+  TH1D * hsum = (TH1D*)hStat->Clone("sum") ;
+  for(Int_t i=1; i<=hsum->GetNbinsX();i++){
+    Double_t a=hSys->GetBinError(i) ;
+    Double_t b=hStat->GetBinError(i) ;
+    hsum->SetBinError(i,TMath::Sqrt(a*a+b*b)) ;
+  }
+  hsum->SetStats(1) ;
+  hsum->Fit(fit,"Q") ;
+  Double_t meanPt=fit->Moment(1,1.,10.) ;
+  printf("<pt>=%f \n",meanPt) ;
+
+  hSysRatio ->Divide(fit) ;
+  hStatRatio->Divide(fit) ;
+
+  return fit;
+}
+//-----------------------------------------------------------------------------
+TH1D * BinWidthCorrection(TH1D * h){
+  //We apply bin width a-la PHENIX 
+  //Use Tsalis fit to calculate shift in y direction
+  TF1 * fit = new TF1("hag","[0]*(([2]*[1]+sqrt(x*x+0.135*0.135))/([2]*[1]+0.135))^-[2]",0.5,25.) ;
+  fit->SetParameters(10.,0.2,8.) ;
+  TCanvas * corr = new TCanvas("BWcorr","Bin width correction") ;
+  Int_t col[6]={kRed,kOrange,kMagenta,kGreen,kCyan,kBlue} ;
+  TH1D * hcorr[20] ;
+  char key[55] ;
+  Double_t rMax=10 ;
+  Int_t iteration=0 ;
+  TH1D * htmp = (TH1D*)h->Clone("tmp") ;
+  while(iteration<6){
+    printf(" Iteration %d: rMax=%f \n",iteration, rMax) ;
+    htmp->Fit(fit,"N") ;
+    sprintf(key,"Ineration%d",iteration) ;
+    hcorr[iteration]=(TH1D*)h->Clone(key);
+    rMax= 0; 
+    for(Int_t i=1;i<=h->GetNbinsX();i++){
+      Double_t a=h->GetXaxis()->GetBinLowEdge(i) ;
+      Double_t b=h->GetXaxis()->GetBinUpEdge(i) ;
+      Double_t r=fit->Integral(a,b)/(b-a)/fit->Eval(0.5*(a+b)) ;
+      hcorr[iteration]->SetBinContent(i,r) ;
+      hcorr[iteration]->SetBinError(i,0.) ;
+      if(rMax<r)rMax=r ;
+    }
+    delete htmp ;
+    htmp = (TH1D*)h->Clone("tmp") ;
+    htmp->Divide(hcorr[iteration]) ;
+    corr->cd() ;
+    hcorr[iteration]->SetLineColor(col[iteration]);
+    if(iteration==0)
+      hcorr[iteration]->Draw() ;
+    else
+      hcorr[iteration]->Draw("same") ;
+    corr->Update() ;
+    iteration++ ;
+  } 
+
+  hcorr[5]->SetTitle("Bin-width correction for #pi^{0} spectrum");
+  hcorr[5]->SetYTitle("Bin-width corrected / uncorrected");
+  TFile fout("PHOS_pi0_7TeV_BinWidthCorrection.root","recreate") ;
+  hcorr[5]->Write();
+  fout.Close();
+
+  return hcorr[5] ;
+}