#if !defined(__CINT__) || defined(__MAKECINT__) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif TObjArray *gList = 0; TTree *gGTree = 0; // from PPR const Int_t nclasses = 6; Double_t bmin[nclasses] = {0,3,6,9,12,15}; Double_t bmax[nclasses] = {3,6,9,12,15,18}; Double_t fxs[nclasses]; // analysis cuts const int nclassesan = 11; Double_t bminan[nclassesan]; Double_t bmaxan[nclassesan]; Double_t fxsan[nclassesan]; Double_t fxsan1[nclassesan] = {5,5,10,10,10,10,10,10,10,10,10}; Double_t npminan[nclassesan]; Double_t npmaxan[nclassesan]; Double_t npfxsan[nclassesan]; const char *lan[nclassesan] = {"0-5","5-10","10-20","20-30","30-40","40-50","50-60","60-70","70-80","80-90","90-100"}; Int_t colorcl[nclassesan] = {kYellow-9,kYellow,kOrange-4,kOrange+6,kOrange+8,kRed,kRed+1,kRed+2,kMagenta+3,kBlue+3,kBlue+4}; Double_t npmean[nclassesan]; Double_t nprms[nclassesan]; TCanvas *Canvas(const char *name, const char *title=0, Int_t ww=600, Int_t wh=400); TH1 *Hist(const char *hname, const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats=0, Int_t lc=0, Int_t ls=0); TH1 *Hist(TH1 *h, const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats=0, Int_t lc=0, Int_t ls=0); TH1 *Hist(const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats=0, Int_t lc=1, Int_t ls=1); TObjArray *Draw(const char *expr, const char *sel=0, const char *opt=0, Int_t type=1, const char *scl=0, Double_t *smin=0, Double_t *smax=0, TTree *t=0); void Classes(TH1 *h, Double_t *resmin, Double_t *resmax, Double_t *fxs, Int_t pos=1, Int_t verbose=0); TCanvas *FitNpartDists(const char *name, TObjArray *arr, Int_t verbose=0); void Store(TObject *o, const char *name=0, const char *fname="gres"); // macro starts here void glauber() { Bool_t pImDist = 0; Bool_t pNpDist = 0; Bool_t pNpDistSelWithImp = 1; Bool_t pNpDistSelWithImpFits = 0; Bool_t pMidRecResStudy = 1; Double_t fwdres=0.50; Double_t midres=0.25; gStyle->SetOptFit(1); gROOT->ForceStyle(); TH1::SetDefaultSumw2(1); if (gList) delete gList; gList = new TObjArray; gList->SetOwner(1); TFile *f = TFile::Open("hj-unquenched.root"); TTree *t = (TTree*)f->Get("glaubertree"); if (!t) { cerr << " not find glaubertree" <SetDirectory(0); Int_t nents = t->GetEntries(); for (Int_t i=0;iFill(gRandom->Gaus(),gRandom->Gaus(),gRandom->Gaus()); } t->AddFriend(nt,"nt"); } t->SetAlias("Etmidn","response.fEtch0n"); t->SetAlias("Etmidp","response.fEtch0p"); t->SetAlias("Etfwdn","response.fEtch3n+response.fEtch4n"); t->SetAlias("Etfwdp","response.fEtch3p+response.fEtch4p"); t->SetAlias("Nmidn","response.fNch0n"); t->SetAlias("Nmidp","response.fNch0p"); t->SetAlias("Nfwdn","response.fNch3n+response.fNch4n"); t->SetAlias("Nfwdp","response.fNch3p+response.fNch4p"); t->SetAlias("Nmid","(Nmidn+Nmidp)/2."); t->SetAlias("Etfwdnres",Form("Etfwdn*(1+%f*nt.g1)",fwdres)); t->SetAlias("Etfwdpres",Form("Etfwdp*(1+%f*nt.g2)",fwdres)); t->SetAlias("Nmidrec",Form("Nmid*(1+%f*nt.g3)",midres)); t->SetAlias("npart","header.fNT+header.fNP"); t->SetAlias("ncoll","header.fN00+header.fN01+header.fN10+header.fN11"); t->SetAlias("bb","header.fBB"); t->SetAlias("tresp","1+npart*0."); //t->SetAlias("tresp","1-exp(-npart/2.)"); t->SetAlias("trig","1+Nmid*0."); //t->SetAlias("trig","rndm2.5&&Etfwdpres>2.5"); TString name; if (1) { name="ImpactDistFine"; t->Draw("bb>>htemp(3000,0,30)","1","goff"); TH1F *hbb=(TH1F*)Hist(name,"","impact parameter [fm]","counts per bin"); Double_t totxs = 0; for (Int_t i=0;iIntegral(hbb->FindBin(bmin[i]), hbb->FindBin(bmax[i])) / hbb->Integral(); totxs += fxs[i]; printf("Class PPR %d: %.1f - %.1f -> %.1f\n",i+1,bmin[i],bmax[i],fxs[i]); } cout << "Total from PPR: " << totxs << endl; Classes(hbb, bminan, bmaxan, fxsan, 1, 0); totxs = 0; for (Int_t i=0;i %.2f (%s)\n",i+1,bminan[i],bmaxan[i],fxsan[i],lan[i]); totxs+=fxsan[i]; } cout << "Total: " << totxs << endl; if (pImDist) { name="ImpactDist"; TCanvas *c = Canvas(name); t->Draw("bb>>htemp(440,0,22)"); Hist(name,"","impact parameter [fm]","counts per bin"); TObjArray *arr=Draw("bb>>htemp(440,0,22)",0,"hist"); TLegend *l = dynamic_cast(arr->At(0)); if (l) { l->SetX1(0.15); l->SetX2(0.35); l->Draw(); } Store(c); } } if (1) { name="NpartDistFine"; t->Draw("npart>>htemp(440,0,440)","1","goff"); TH1F *hnp=(TH1F*)Hist(name,"","number participants","counts per bin"); Classes(hnp, npminan, npmaxan, npfxsan, -1, 0); Double_t totxs = 0; for (Int_t i=0;i %.1f (%s)\n",i+1,npminan[i],npmaxan[i],npfxsan[i],lan[i]); totxs+=npfxsan[i]; } cout << "Total: " << totxs << endl; if (pNpDist) { name="NpartDist"; TCanvas *c1=Canvas(name); c1->SetLogy(1); t->Draw("npart>>htemp(440,0,440)","1","goff"); TH1 *h=Hist(name,"","number participants","counts per bin"); h->SetMinimum(1); h->Draw(); /*TObjArray *arr=*/Draw("npart>>htemp(440,0,440)",0,"hist",-2); Store(c1); } if (pNpDistSelWithImp) { name="NpartDistsWithImpact"; TCanvas *c1=Canvas(name); c1->SetLogy(1); t->Draw("npart>>htemp(440,0,440)","1","goff"); TH1 *h=Hist(name,"","number participants","counts per bin"); h->SetMinimum(1); h->Draw(); TObjArray *arr=Draw("npart>>htemp(440,0,440)",0,"hist",-1); TGraph *ge1 = new TGraph(nclassesan); TGraph *ge2 = new TGraph(nclassesan); ge1->SetMarkerSize(1.2); ge1->SetMarkerStyle(20); ge2->SetMarkerSize(1.2); ge2->SetMarkerStyle(20); for (Int_t i=1;iGetEntries();++i) { TH1F *h = (TH1F*)arr->At(i); Int_t N=nclassesan-i; Double_t mean = h->GetMean(); Double_t width = h->GetRMS(); npmean[N] = mean; nprms[N] = width; ge1->SetPoint(N,N,mean); ge2->SetPoint(N,N,width); } Store(c1); Store(ge1,"gNpartMean"); Store(ge2,"gNpartRms"); if (pNpDistSelWithImpFits) { TCanvas *c2 = FitNpartDists("NpartDistsWithImpactFits",arr,1); Store(c2); } } } if (pMidRecResStudy) { Int_t resint = 100*midres; name=Form("MidRecDistribution_res%d",resint); t->Draw("Nmidrec>>htemp(3000,0,3000)","1","goff"); TH1 *hNm = Hist(name,"","Nch in -0.5<#eta<0.5","counts per bin"); Double_t resmin[nclassesan]; Double_t resmax[nclassesan]; Double_t fxs[nclassesan]; Classes(hNm,resmin,resmax,fxs,-1,1); if (1) { TCanvas *c = Canvas(name); hNm->SetMinimum(1); hNm->Draw(); Draw("Nmidrec>>htemp(3000,0,3000)",0,"hist",-3,"Nmidrec",resmin,resmax); Store(c); } else { delete hNm; } name=Form("NpartDistsWithTracks_res%d",resint); TCanvas *c1 = Canvas(name); t->Draw("npart>>htemp(440,0,440)","1","goff"); TH1 *hNpart = Hist(name,"","number participants","counts per bin"); hNpart->SetMinimum(1); hNpart->Draw(); TObjArray *arr=Draw("npart>>htemp(440,0,440)",0,"hist",-3,"Nmidrec",resmin,resmax); Store(c1); if (1) { TCanvas *c2 = FitNpartDists(Form("NpartDistsWithTracksFits_res%d",resint),arr,1); Store(c2); } TGraph *ge1 = new TGraph(nclassesan); TGraph *ge2 = new TGraph(nclassesan); ge1->SetMarkerSize(1.2); ge1->SetMarkerStyle(20); ge2->SetMarkerSize(1.2); ge2->SetMarkerStyle(20); for (Int_t i=1;iGetEntries();++i) { Int_t N=nclassesan-i; TH1F *h = (TH1F*)arr->At(i); Double_t mean = h->GetMean(); Double_t rms = h->GetRMS(); ge1->SetPoint(N,N,mean/npmean[N]-1); ge2->SetPoint(N,N,rms/mean*npmean[N]/nprms[N]-1); cout << i << " " << mean << " " << rms << " " << npmean[N] << " " << nprms[N] << endl; } Store(ge1,Form("gMidrecMean_res%d",resint)); Store(ge2,Form("gMidrecRms_res%d",resint)); } if (0) { name="FwdSumCorr"; Canvas(name); t->Draw("Etfwdn:Etfwdp"); Hist(name,"","sum p_{t} [GeV] in 3<#eta<5","sum p_{t} [GeV] in -3<#eta<-5"); } if (0) { name="FwdNvsNpart"; Canvas(name); t->Draw("Etfwdn:npart","1","prof"); Hist(name,"","Npart","sum p_{t} [GeV] in -3<#eta<-5"); } if (0) { name="FwdPvsNpart"; Canvas(name); t->Draw("Etfwdp:npart","1","prof"); Hist(name,"","Npart","sum p_{t} [GeV] in 3<#eta<5"); } if (0) { name="FwdSumvsNpart"; Canvas(name); t->Draw("Etfwdn+Etfwdp:npart","1","prof"); Hist(name,"","Npart","sum p_{t} [GeV] in 3<|#eta|<5"); } if (0) { name="FwdSumDistribution"; Canvas(name); t->Draw("Etfwdn+Etfwdp","1",""); TH1 *h1=Hist(name,"","sum p_{t} [GeV] in 3<|#eta|<5","counts per bin"); name="FwdSumTriggered"; t->Draw("Etfwdn+Etfwdp","trig>0","same"); TH1 *h2=Hist(name,"","sum p_{t} [GeV] in 3<|#eta|<5","counts per bin",0,2,1); Double_t percent = h2->Integral()/h1->Integral()*100.; cout << "Recorded " << percent << "% of tot. cross section" << endl; } if (0) { name="Mid2Distribution"; Canvas(name); t->Draw("Nmidn+Nmidp","1",""); Hist(name,"","Nch in -1<#eta<1","counts per bin"); name="Mid2Triggered"; t->Draw("Nmidn+Nmidp","trig>0","same"); Hist(name,"","Nch in -1<#eta<1","counts per bin",0,2,1); } if (0) { name="MidDistribution"; Canvas(name); t->Draw("Nmid","1",""); Hist(name,"","Nch in -0.5<#eta<0.5","counts per bin"); name="MidTriggered"; t->Draw("Nmid","trig>0","same"); Hist(name,"","Nch in -0.5<#eta<0.5","counts per bin",0,2,1); } } //-------------------------------------------------------------------------------------------------- TCanvas *Canvas(const char *name, const char *title, Int_t ww, Int_t wh) { if (!name) return 0; TString hname(Form("c%s",name)); if (!title) title = name; TCanvas *c = new TCanvas(hname,title,ww,wh); return c; } //-------------------------------------------------------------------------------------------------- TH1 *Hist(const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats, Int_t lc, Int_t ls) { TH1 *h=dynamic_cast(gROOT->FindObject("htemp")); return Hist(h,name,title,xtitle,ytitle,stats,lc,ls); } //-------------------------------------------------------------------------------------------------- TH1 *Hist(const char *hname, const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats, Int_t lc, Int_t ls) { TH1 *h=dynamic_cast(gROOT->FindObject(hname)); return Hist(h,name,title,xtitle,ytitle,stats,lc,ls); } //-------------------------------------------------------------------------------------------------- TH1 *Hist(TH1 *h, const char *name, const char *title, const char *xtitle, const char *ytitle, Bool_t stats, Int_t lc, Int_t ls) { if (!h && !name) return 0; TString hname(Form("h%s",name)); h->SetName(hname); if (!title) title = name; h->SetTitle(title); if (xtitle) h->SetXTitle(xtitle); if (ytitle) h->SetYTitle(ytitle); h->GetXaxis()->SetTitleOffset(1.1); h->GetYaxis()->SetTitleOffset(1.2); h->SetStats(stats); h->SetLineColor(lc); h->SetLineStyle(ls); gList->Add(h); return h; } //-------------------------------------------------------------------------------------------------- TObjArray *Draw(const char *expr, const char *sel, const char *opt, Int_t type, const char *scl, Double_t *smin, Double_t *smax, TTree *t) { if (!t) t = gGTree; TObjArray *oarr = new TObjArray; oarr->SetOwner(); TLegend *l = new TLegend(0.2,0.4,0.4,0.9); l->SetBorderSize(0); l->SetFillStyle(0); oarr->Add(l); TString tsel("1"); if (sel) tsel=sel; TString doopt("same"); if (opt) doopt=Form("%s,same",opt); Int_t beg=0; Int_t end=nclassesan; if (type<0) { beg=nclassesan-1; end=-1; } Double_t *cmin = bminan; Double_t *cmax = bmaxan; const char *varname="bb"; if (TMath::Abs(type)==2) { cmin = npminan; cmax = npmaxan; varname="npart"; } else if (TMath::Abs(type)>2) { cmin = smin; cmax = smax; varname = scl; } while(beg!=end) { Int_t i=beg; TString dosel(Form("(%s>%.2f&&%s<%.2f)&&(%s)",varname,cmin[i],varname,cmax[i],tsel.Data())); t->Draw(expr,dosel,doopt); TH1 *h=dynamic_cast(gROOT->FindObject("htemp")); if (h) { h->SetName(Form("cl_%s_%s",expr,dosel.Data())); h->SetLineColor(colorcl[i]); h->SetMarkerColor(colorcl[i]); h->SetFillColor(colorcl[i]); h->SetFillStyle(1000); l->AddEntry(h,Form("%s%%",lan[i]),"f"); oarr->Add(h); } else { cerr << "Could not obtain htemp for: " << expr << " " << dosel << " " << doopt << endl; } if(type<0) --beg; else ++beg; } return oarr; } //-------------------------------------------------------------------------------------------------- void Classes(TH1 *h, Double_t *resmin, Double_t *resmax, Double_t *fxs, Int_t pos, Int_t verbose) { Int_t bfrom = 0; Int_t cbin = h->GetNbinsX(); if (pos<0) { pos = -1; bfrom = h->GetNbinsX()+1; cbin = 1; } else { pos = 1; } Double_t totxs=0; for (Int_t i=0,lbin=bfrom,bin=lbin;iIntegral(); while (1) { bin += pos; lxs += h->GetBinContent(bin); Double_t pxs = lxs/norm*100; Double_t tdiff = (lxs+h->GetBinContent(bin+pos))/norm*100; //cout << pos << " " << bin << " " << pxs << " " << tdiff << " " << lbin << endl; if ((pxs>1&&TMath::Abs(pxs-fxsan1[i])<=TMath::Abs(tdiff-fxsan1[i]))||(bin==cbin)) { if (pos>0) { resmin[i] = h->GetBinLowEdge(lbin); resmax[i] = h->GetBinLowEdge(bin+1); } else { resmin[i] = h->GetBinLowEdge(bin); resmax[i] = h->GetBinLowEdge(lbin+1); } fxs[i] = pxs; if (verbose) printf("Class %d: %.1f - %.1f -> %.1f (%s)\n",i+1,resmin[i],resmax[i],pxs,lan[i]); totxs += pxs; break; } } } if (verbose) cout << "Total: " << totxs << endl; } //-------------------------------------------------------------------------------------------------- TCanvas *FitNpartDists(const char *name, TObjArray *arr, Int_t verbose) { TCanvas *c = Canvas(name,0,1200,900); c->Divide(4,3); TGraphErrors *ge = new TGraphErrors(nclassesan); for (Int_t i=1;iGetEntries();++i) { c->cd(i); Int_t N=nclassesan-i; TH1F *h = (TH1F*)arr->At(i); Double_t mean = h->GetMean(); Double_t width = h->GetRMS(); TH1 *h1 = h->DrawCopy("hist"); h1->SetName(lan[N]); h1->SetTitle(Form("%s%% most central",lan[N])); h1->SetStats(1); h1->SetXTitle("Npart"); h1->SetYTitle("counts per bin"); TF1 *fit = new TF1(Form("fit%d",i),"gaus(0)",0,440); fit->SetParameters(1,mean,width); fit->SetLineWidth(3); h1->Fit(fit,"QM0"); fit->Draw("same"); ge->SetPoint(N,mean,width); //ge->SetPointError(N,0,width); if (verbose) cout << i << " hist: " << mean << " " << width << " fit: " << fit->GetParameter(1) << " " << fit->GetParameter(2) << endl; } c->cd(12); TH2F *h2f = new TH2F(Form("%s_summary",name),";#LTNpart#GT;RMS",1,0,440,1,0,49); h2f->SetStats(0); h2f->Draw(); ge->SetMarkerSize(1.2); ge->SetMarkerStyle(20); ge->Draw("P"); return c; } //-------------------------------------------------------------------------------------------------- void Store(TObject *o, const char *name, const char *fname) { if (!o || !fname) return; TTimeStamp t; TString filename(Form("%s_%d.root",fname, t.GetDate())); TFile *f = new TFile(filename,"update"); if (!name) name = o->GetName(); if (o) { f->Delete(Form("%s;1",name)); o->Write(name); } f->Close(); delete f; } void plotRes(const char *fname) { TFile *f = new TFile(fname); TGraph *gm0 = (TGraph*)f->Get("gMidrecMean_res0"); TGraph *gm5 = (TGraph*)f->Get("gMidrecMean_res5"); TGraph *gm10 = (TGraph*)f->Get("gMidrecMean_res10"); TGraph *gm15 = (TGraph*)f->Get("gMidrecMean_res14"); TGraph *gm25 = (TGraph*)f->Get("gMidrecMean_res25"); gm0->SetMarkerColor(1); gm5->SetMarkerColor(2); gm10->SetMarkerColor(3); gm15->SetMarkerColor(4); gm25->SetMarkerColor(5); TH2F *h2f = new TH2F("h2f",";classes (0=most central);#LTNpart#GT/#LTNpart^{true}#GT-1",1,-0.5,10.5,1,-0.25,0.25); h2f->SetStats(0); h2f->GetXaxis()->SetTitleOffset(1.1); h2f->GetYaxis()->SetTitleOffset(1.2); h2f->Draw(); gm0->Draw("P"); gm5->Draw("P"); gm10->Draw("P"); gm15->Draw("P"); gm25->Draw("P"); TLegend *leg = new TLegend(0.5,0.5,0.9,0.9); leg->AddEntry(gm0,"0% smearing","p"); leg->AddEntry(gm5,"5% smearing","p"); leg->AddEntry(gm10,"10% smearing","p"); leg->AddEntry(gm15,"15% smearing","p"); leg->AddEntry(gm25,"25% smearing","p"); leg->Draw(); }