TCanvas* pHitSpecPos( ) { TCanvas* c = new TCanvas("cHitSpecPos","cHitSpecPos",1000,1100); c->Divide(2,2); TVirtualPad* p; TH2D *h; TText t; t.SetTextColor(4); p =c->cd(1); p->SetLogy(); p->SetGrid(1,0); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhi_BarMinus"); h->GetYaxis()->SetRange(4,33); h->DrawCopy("box"); t.DrawTextNDC(0.17,0.15, "BARREL MU MINUS"); p =c->cd(2); p->SetLogy(); p->SetGrid(1,0); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhi_BarPlus"); h->GetYaxis()->SetRange(4,32); h->DrawCopy("box"); t.DrawTextNDC(0.17,0.15, "BARREL MU PLUS"); p =c->cd(3); p->SetLogy(); p->SetGrid(1,0); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhi_EndMinus"); h->GetYaxis()->SetRange(4,32); h->DrawCopy("box"); t.DrawTextNDC(0.17,0.15, "ENDCAP MU MINUS"); p =c->cd(4); p->SetLogy(); p->SetGrid(1,0); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhi_EndPlus"); h->GetYaxis()->SetRange(4,32); h->DrawCopy("box"); t.DrawTextNDC(0.17,0.15, "ENDCAP MU PLUS"); return c; }
void plotTrk() { gStyle->SetOptStat(0); gStyle->SetOptTitle(1); char c[50]; c1->Clear(); c1->Divide(2,3); for(int hid=0; hid<6; hid++){ TVirtualPad* pad = c1->cd(hid+1); pad->SetLogy(lTrkHist[hid]); double xmin, xmax, ymin=0.0, ymax=0.0; if(lTrkHist[hid]==1) ymin=0.1; for(int quad=0; quad<kFgtNumQuads; quad++){ sprintf(c,"Quad%1s-%s",cquad[quad],cTrkHist[hid]); //printf("Getting %s\n",c); TH1F *h = histTrk[quad][hid] = (TH1F*)file->Get(c); xmin=h->GetXaxis()->GetXmin(); xmax=h->GetXaxis()->GetXmax(); double m=h->GetMaximum(); if(ymax<m) ymax=m; //printf("quad=%d max=%6.1f ymax=%6.1f xmin=%6.1f xmax=%6.1f\n",quad,m,ymax,xmin,xmax); } ymax*=1.2; if(lTrkHist[hid]==1){ymax*=20.0;} sprintf(c,"%s",cTrkHist[hid]); TH2F *frame = new TH2F(c,c,1,xmin,xmax,1,ymin,ymax); frame->SetStats(0); frame->Draw(); for(int quad=0; quad<kFgtNumQuads; quad++){ TH1F *h=histTrk[quad][hid]; h->SetLineColor(colorQuad[quad]); h->SetLineWidth(3); if(hid<5){ h->Draw("SAME"); float mean=h->GetMean(); if(hid==1 || hid==4) {sprintf(c,"%s mean=%6.4f",cquad[quad],mean);} else {sprintf(c,"%s mean=%6.2f",cquad[quad],mean);} }else{ h->SetMarkerColor(colorQuad[quad]); h->SetMarkerStyle(20); h->SetMarkerSize(1); h->Draw("SAME PL"); sprintf(c,"Quad%s",cquad[quad]); } TText *t1; float x1= 0.2, x2= 0.55; float y1=0.8 - 0.07*quad; float y2=0.8 - 0.07*(quad-2); if(quad<2) { t1 = new TText(x1,y1,c); } else { t1 = new TText(x2,y2,c); } t1->SetNDC(); t1->SetTextSize(0.06); t1->SetTextColor(colorQuad[quad]); t1->Draw(); } } c1->Update(); save("trk"); }
//#endif void DrawInPad(TVirtualPad* p, Int_t sub, TH1* h, Bool_t logy=false) { TVirtualPad* pp = p->cd(sub); pp->SetRightMargin(0.02); if (logy) pp->SetLogy(); TH1* copy = h->DrawCopy("hist"); copy->GetXaxis()->SetLabelSize(0.13); copy->GetYaxis()->SetLabelSize(0.08); copy->SetDirectory(0); }
/* *********** multi-pad canvases ******************** */ void setLogy(TCanvas *c, bool on = true) { c->Modified(); c->Update(); //gSystem->ProcessEvents(); TObject *obj; TIter next(c->GetListOfPrimitives()); while ((obj = next())) { if (obj->InheritsFrom(TVirtualPad::Class())) { TVirtualPad *pad = (TVirtualPad*)obj; pad->Modified(); pad->Update(); pad->SetLogy(on); pad->Modified(); pad->Update(); } } }
void TestSPD(const TString& which, Double_t nVar=2) { TFile* file = TFile::Open("forward.root", "READ"); if (!file) return; Bool_t spd = which.EqualTo("spd", TString::kIgnoreCase); TList* l = 0; if (spd) l = static_cast<TList*>(file->Get("CentralSums")); else l = static_cast<TList*>(file->Get("ForwardSums")); if (!l) { Warning("", "%sSums not found", spd ? "Central" : "Forward"); return; } TList* ei = static_cast<TList*>(l->FindObject("fmdEventInspector")); if (!l) { Warning("", "fmdEventInspector not found"); return; } TObject* run = ei->FindObject("runNo"); if (!run) Warning("", "No run number found"); ULong_t runNo = run ? run->GetUniqueID() : 0; TH2* h = 0; if (spd) h = static_cast<TH2*>(l->FindObject("nClusterVsnTracklet")); else { TList* den = static_cast<TList*>(l->FindObject("fmdDensityCalculator")); if (!den) { Error("", "fmdDensityCalculator not found"); return; } TList* rng = static_cast<TList*>(den->FindObject(which)); if (!rng) { Error("", "%s not found", which.Data()); return; } h = static_cast<TH2*>(rng->FindObject("elossVsPoisson")); } if (!h) { Warning("", "%s not found", spd ? nClusterVsnTracklet : "elossVsPoisson"); return; } gStyle->SetOptFit(1111); gStyle->SetOptStat(0); TCanvas* c = new TCanvas("c", Form("Run %u", runNo)); c->Divide(2,2); TVirtualPad* p = c->cd(1); if (spd) { p->SetLogx(); p->SetLogy(); } p->SetLogz(); h->Draw("colz"); TObjArray* fits = new TObjArray; h->FitSlicesY(0, 1, -1, 0, "QN", fits); TF1* mean = new TF1("mean", "pol1"); TF1* var = new TF1("var", "pol1"); // mean->FixParameter(0, 0); // var->FixParameter(0, 0); for (Int_t i = 0; i < 3; i++) { p = c->cd(2+i); if (spd) { p->SetLogx(); p->SetLogy(); } TH1* hh = static_cast<TH1*>(fits->At(i)); hh->Draw(); if (i == 0) continue; hh->Fit((i == 1? mean : var), "+Q"); } TGraphErrors* g1 = new TGraphErrors(h->GetNbinsX()); g1->SetFillColor(kBlue-10); g1->SetFillStyle(3001); g1->SetLineStyle(1); TGraph* u1 = new TGraph(h->GetNbinsX()); TGraph* l1 = new TGraph(h->GetNbinsX()); u1->SetLineColor(kBlue+1); l1->SetLineColor(kBlue+1); u1->SetName("u1"); l1->SetName("l1"); TGraphErrors* g2 = new TGraphErrors(h->GetNbinsX()); g2->SetFillColor(kRed-10); g2->SetFillStyle(3001); g2->SetLineStyle(2); TGraph* u2 = new TGraph(h->GetNbinsX()); TGraph* l2 = new TGraph(h->GetNbinsX()); u2->SetLineColor(kRed+1); l2->SetLineColor(kRed+1); u2->SetName("u2"); l2->SetName("l2"); for (Int_t i = 1; i <= h->GetNbinsX(); i++) { Double_t x = hh->GetXaxis()->GetBinCenter(i); Double_t y = mean->Eval(x); Double_t e = var->Eval(y); Double_t e1 = nVar * e; if (spd) e1 *= TMath::Log10(e); // Printf("%10e -> %10e +/- %10e", x, y, ee); g1->SetPoint(i-1, x, y); g1->SetPointError(i-1, 0, e1); u1->SetPoint(i-1, x, y+e1); l1->SetPoint(i-1, x, y-e1); // Printf("%3d: %f -> %f +/- %f", i, x, y, ee); Double_t e2 = nVar*0.05*x; g2->SetPoint(i-1, x, x); g2->SetPointError(i-1, 0, e2); u2->SetPoint(i-1, x, x+e2); l2->SetPoint(i-1, x, x-e2); } p = c->cd(1); c->Clear(); c->cd(); c->SetLogz(); h->Draw("colz"); g1->Draw("3 same"); u1->Draw("l same"); l1->Draw("l same"); g2->Draw("3 same"); u2->Draw("l same"); l2->Draw("l same"); Double_t ly = 0.9; Double_t dy = 0.06; TLatex* ltx = new TLatex(0.15, ly, Form("#LTy#GT = %f + %f x", mean->GetParameter(0), mean->GetParameter(1))); ltx->SetNDC(); ltx->SetTextSize(dy); ltx->SetTextAlign(13); ltx->Draw(); ly -= dy + 0.01; ltx->DrawLatex(0.15, ly, Form("#sigma_{y} = %f + %f x", var->GetParameter(0), var->GetParameter(1))); ly -= dy + 0.01; ltx->DrawLatex(0.15, ly, Form("#delta = %f #sigma %s", nVar, (spd ? "log_{10}(#sigma" : ""))); }
/** * * * @param o * @param useWeights * @param correct * * @ingroup pwglf_forward_scripts_tests */ void TestPoisson(Double_t o=.3, bool useWeights=false, bool correct=true) { const char* load = "$ALICE_PHYSICS/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C"; if (!gROOT->GetClass("AliAODForwardMult")) { gROOT->Macro(load); gROOT->GetInterpreter()->UnloadFile(gSystem->ExpandPathName(load)); } // --- Parameters of this script ----------------------------------- Int_t nBin = 5; // Our detector matrix size Int_t nMax = TMath::Max(Int_t(nBin * nBin * o + .5)+nBin/2,nBin); Int_t nEv = 10000; // Number of events Double_t mp = o; // The 'hit' probability TH2D* base = new TH2D("base", "Basic histogram", nBin,-.5, nBin-.5, nBin, -.5, nBin-.5); base->SetXTitle("#eta"); base->SetYTitle("#varphi"); base->SetDirectory(0); base->SetOption("colz"); Int_t tN1=nMax; Double_t tMin1; Double_t tMax1; Int_t tN2=nMax*10; Double_t tMin2; Double_t tMax2=nMax; MakeIntegerAxis(tN1, tMin1, tMax1); MakeIntegerAxis(tN2, tMin2, tMax2); TH2D* corr = new TH2D("comp", "Comparison", tN1, tMin1, tMax1, tN2, tMin2, tMax2); corr->SetXTitle("Input"); corr->SetYTitle("Poisson"); corr->SetDirectory(0); corr->SetOption("colz"); corr->SetStats(0); TLine* lcorr = new TLine(0, 0, tMax2, tMax2); Int_t mm = TMath::Max(Int_t(nBin * o + .5),nBin/2); tN2=mm*10; tMax2 = mm; MakeIntegerAxis(tN2, tMin2, tMax2); Info("", "Making mean w/nbins=%d,range=[%f,%f]", tN2, tMin2, tMax2); TH2D* mean = new TH2D("mean", "Mean comparison", tN2, tMin2, tMax2, tN2, tMin2, tMax2); mean->SetXTitle("Input"); mean->SetYTitle("Poisson"); mean->SetDirectory(0); mean->SetOption("colz"); mean->SetStats(0); TLine* lmean = new TLine(tMin2, tMin2, tMax2, tMax2); TH1D* dist = new TH1D("dist", "Distribution of hits", tN1, tMin1, tMax1); dist->SetXTitle("s"); dist->SetYTitle("P(s)"); dist->SetFillColor(kRed+1); dist->SetFillStyle(3001); dist->SetDirectory(0); TH1D* diff = new TH1D("diff", "P-T", 100, -25, 25); diff->SetXTitle("Difference"); diff->SetFillColor(kRed+1); diff->SetFillStyle(3001); diff->SetYTitle("Prob"); AliPoissonCalculator* c = new AliPoissonCalculator("ignored"); c->Init(nBin ,nBin); for (Int_t i = 0; i < nEv; i++) { c->Reset(base); base->Reset(); for (Int_t iEta = 0; iEta < nBin; iEta++) { for (Int_t iPhi = 0; iPhi < nBin; iPhi++) { // Throw a die Int_t m = gRandom->Poisson(mp); dist->Fill(m); // Fill into our base histogram base->Fill(iEta, iPhi, m); // Fill into poisson calculator c->Fill(iEta, iPhi, m > 0, (useWeights ? m : 1)); } } // Calculate the result TH2D* res = c->Result(correct); // Now loop and compare Double_t mBase = 0; Double_t mPois = 0; for (Int_t iEta = 0; iEta < nBin; iEta++) { for (Int_t iPhi = 0; iPhi < nBin; iPhi++) { Double_t p = res->GetBinContent(iEta, iPhi); Double_t t = base->GetBinContent(iEta, iPhi); mBase += t; mPois += p; corr->Fill(t, p); diff->Fill(p-t); } } Int_t nn = nBin * nBin; mean->Fill(mBase / nn, mPois / nn); } TCanvas* cc = new TCanvas("c", "c", 900, 900); cc->SetFillColor(0); cc->SetFillStyle(0); cc->SetBorderMode(0); cc->SetRightMargin(0.02); cc->SetTopMargin(0.02); cc->Divide(2,2); TVirtualPad* pp = cc->cd(1); pp->SetFillColor(0); pp->SetFillStyle(0); pp->SetBorderMode(0); pp->SetRightMargin(0.15); pp->SetTopMargin(0.02); pp->SetLogz(); pp->SetGridx(); pp->SetGridy(); corr->Draw(); lcorr->Draw(); pp = cc->cd(2); pp->SetFillColor(0); pp->SetFillStyle(0); pp->SetBorderMode(0); pp->SetRightMargin(0.02); pp->SetTopMargin(0.02); #if 0 c->GetMean()->Draw(); #elif 1 pp->SetLogy(); diff->Draw(); #elif 1 c->GetOccupancy()->Draw(); #else pp->SetLogy(); dist->SetStats(0); dist->Scale(1. / dist->Integral()); dist->Draw(); TH1D* m1 = c->GetMean(); m1->Scale(1. / m1->Integral()); m1->Draw("same"); Double_t eI; Double_t ii = 100 * dist->Integral(2, 0); TLatex* ll = new TLatex(.97, .85, Form("Input #bar{m}: %5.3f", mp)); ll->SetNDC(); ll->SetTextFont(132); ll->SetTextAlign(31); ll->Draw(); ll->DrawLatex(.97, .75, Form("Result #bar{m}: %5.3f", dist->GetMean())); ll->DrawLatex(.97, .65, Form("Occupancy: #int_{1}^{#infty}P(s)ds = %6.2f%%", ii)); #endif pp = cc->cd(3); pp->SetFillColor(0); pp->SetFillStyle(0); pp->SetBorderMode(0); pp->SetRightMargin(0.15); pp->SetTopMargin(0.02); pp->SetGridx(); pp->SetGridy(); c->GetCorrection()->Draw(); pp = cc->cd(4); pp->SetFillColor(0); pp->SetFillStyle(0); pp->SetBorderMode(0); pp->SetRightMargin(0.15); pp->SetTopMargin(0.02); pp->SetLogz(); pp->SetGridx(); pp->SetGridy(); mean->Draw(); lmean->Draw(); cc->cd(); }
void makeqaplot(int run=0, int plt=0, int save=0){ runnum=run; yearday=run/1000; if(save==0) {png=0; pdf=0;} if(save==1) {png=1; pdf=0;} if(save==2) {png=0; pdf=1;} if(save==3) {png=1; pdf=1;} c1 = new TCanvas("c1","QA",50,50,800,800); gStyle->SetLabelSize(0.04,"xy"); //colortable(); gStyle->SetPalette(1); gStyle->SetStatW(0.4); char fname[50]; if(run==0) {sprintf(fname,"fgtQA.root");} else {sprintf(fname,"%d/fgtQA_%d.root",yearday,run);} cout << "Opening "<<fname<<endl; file=new TFile(fname,""); char c[50]; if(plt==0 || plt==1) { gStyle->SetOptStat(111110); c1->Divide(1,3); for(int i=0; i<3; i++){ TVirtualPad* pad = c1->cd(i+1); int log=0; if(i>0) {log=1;} pad->SetLogy(log); hist0[i]=(TH1F*) file->Get(cHist[i]); hist0[i]->SetFillColor(kBlue); hist0[i]->Draw(); if(i==2){ float ntot = float(hist0[i]->GetEntries()); if(ntot>0.0){ int nbin = hist0[i]->GetNbinsX(); float nofgt = hist0[i]->Integral(1,1); int bin = hist0[i]->FindBin(float(kFgtNumElecIds)); float nonzs = hist0[i]->Integral(bin-1,nbin+1); float zs = hist0[i]->Integral(2,bin-2); hist0[i]->GetXaxis()->SetRange(2, bin-2); float mean = hist0[i]->GetMean() / float(kFgtNumElecIds); char c[100]; sprintf(c,"Total %d",ntot); TText *t1 = new TText(0.3,0.8,c); t1->SetNDC(); t1->SetTextSize(0.06); t1->Draw(); sprintf(c,"NoFGT %d (%5.2f)",nofgt,nofgt/ntot); TText *t2 = new TText(0.3,0.7,c); t2->SetNDC(); t2->SetTextSize(0.06); t2->Draw(); sprintf(c,"NoneZS %d (%5.2f)",nonzs,nonzs/ntot); TText *t3 = new TText(0.3,0.6,c); t3->SetNDC(); t3->SetTextSize(0.06); t3->Draw(); sprintf(c,"ZS %d (%5.2f)",zs,zs/ntot); TText *t4 = new TText(0.3,0.5,c); t4->SetNDC(); t4->SetTextSize(0.06); t4->Draw(); sprintf(c,"Mean ZS data size/fullsize= %5.3f",mean); TText *t5 = new TText(0.3,0.4,c); t5->SetNDC(); t5->SetTextSize(0.06); t5->Draw(); if(mean>0.08) { t5->SetTextColor(2); } else { t5->SetTextColor(4); } } } } c1->Update(); save("plot"); } if(plt==0 || plt==2) { c1->Clear(); gStyle->SetOptStat(0); gStyle->SetOptTitle(0); c1->Divide(1,3); for(int i=3; i<6; i++){ hist0[i]=(TH1F*) file->Get(cHist[i]); } int nevt=hist0[5]->GetEntries(); printf("Nevent=%d\n",nevt); TVirtualPad* pad; pad=c1->cd(1); pad->SetLogy(); pad->SetTopMargin(0.01); pad->SetRightMargin(0.01); hist0[3]->GetXaxis()->SetLabelSize(0.07); hist0[3]->GetYaxis()->SetLabelSize(0.07); hist0[3]->SetFillColor(kRed); hist0[3]->Scale(1/float(nevt)); hist0[3]->Draw(); TText *tx= new TText(0.87,0.0,"EleID"); tx->SetNDC(); tx->SetTextSize(0.1); tx->Draw(); TText *t3= new TText(0.05,0.1,"F3=frac in 3sig/2tb"); t3->SetNDC(); t3->SetTextSize(0.08); t3->SetTextAngle(90); t3->Draw(); pad=c1->cd(2); pad->SetLogy(); pad->SetTopMargin(0.01); pad->SetRightMargin(0.01); hist0[4]->GetXaxis()->SetLabelSize(0.07); hist0[4]->GetYaxis()->SetLabelSize(0.07); hist0[4]->SetFillColor(kBlue); hist0[4]->Scale(1/float(nevt)); hist0[4]->Draw(); tx->Draw(); TText *t4= new TText(0.05,0.1,"F10=frac in 10sig & >500"); t4->SetNDC(); t4->SetTextSize(0.08); t4->SetTextAngle(90); t4->Draw(); float min=-4; int max=hist0[3]->GetNbinsX(); printf("Max=%d\n",max); TH1F *h1 = new TH1F("ZSdataFrac","ZSdataFrac",50,min,0); TH1F *h2 = new TH1F("10SigmaFrac","10SigmaFrac",50,min,0); float f1[kFgtNumElecIds],f2[kFgtNumElecIds]; for(int i=0; i<max; i++){ f1[i] = log10(hist0[3]->GetBinContent(i+1)); if(f1[i]<min) {f1[i]=min;} h1->Fill(f1[i]); f2[i] = log10(hist0[4]->GetBinContent(i+1)); if(f2[i]<min) {f2[i]=min;} h2->Fill(f2[i]); } pad = c1->cd(3); pad->Divide(2,1); TVirtualPad *pad2; pad2 = pad->cd(1); pad2->SetLogy(); pad2->SetTopMargin(0.01); pad2->SetRightMargin(0.01); h1->GetXaxis()->SetLabelSize(0.1); h1->GetYaxis()->SetLabelSize(0.1); h2->GetXaxis()->SetLabelSize(0.1); h2->GetYaxis()->SetLabelSize(0.1); h1->SetLineColor(kRed); h2->SetLineColor(kBlue); if(h1->GetMaximum()>h2->GetMaximum()){ h1->Draw(); h2->Draw("SAME"); }else{ h2->Draw(); h1->Draw("SAME"); } TText *t5= new TText(0.2,0.88,"Log(F3)"); t5->SetNDC(); t5->SetTextSize(0.1); t5->SetTextColor(2); t5->Draw(); TText *t6= new TText(0.6,0.88,"Log(F10)"); t6->SetNDC(); t6->SetTextSize(0.1); t6->SetTextColor(4); t6->Draw(); //read ped file int eid, t; float ped[kFgtNumElecIds],rms[kFgtNumElecIds],p,r; int status[kFgtNumElecIds]; memset(status,0,sizeof(status)); cout<<"Reading Ped File "<<endl; std::ifstream in("ped.txt"); if (!in.is_open()) { cout << "Can't find file!\n"; exit(0); } while (!in.eof()){ in >> eid >> t >> p >> r; ped[eid]=p; rms[eid]=r; } in.close(); TH1F * hr1= new TH1F("RMS","RMS",60,0,120); TH1F * hr2= new TH1F("RMS2","RMS2",60,0,120); TH1F * hr3= new TH1F("RMS3","RMS3",60,0,120); TH1F * hr4= new TH1F("RMS4","RMS4",60,0,120); TH1F * hr5= new TH1F("RMS5","RMS5",60,0,120); float f1l=-3.5, f1h=-0.5; float f2l=-3.5, f2h=-1.2; for(int i=0; i<kFgtNumElecIds; i++){ if(f1[i]<f1l) status[i]+=1; if(f1[i]>f1h) status[i]+=2; if(f1[i]<f2l) status[i]+=4; if(f1[i]>f2h) status[i]+=8; hr1->Fill(rms[i]); if(f1[i]<f1l) {hr2->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h) {hr3->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h || f2[i]<f2l) {hr4->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h || f2[i]<f2l || f2[i]>f2h) {hr5->Fill(rms[i]);} } char filename[150]; if(nevt>=1000){ sprintf(filename,"%d/status/status.%d.txt",yearday,run); }else{ sprintf(filename,"%d/status/status.%d.lowstat.txt",yearday,run); } FILE* pfile=fopen(filename,"w"); if(!pfile){ printf("Couldn't open file %s\n",filename); }else{ printf("Writing %s\n",filename); for(int i=0; i<kFgtNumElecIds; i++){ fprintf(pfile,"%d 0x%d\n",i,status[i]); } fclose(pfile); } pad2 = pad->cd(2); pad2->SetLogy(0); pad2->SetTopMargin(0.01); pad2->SetRightMargin(0.01); hr1->GetXaxis()->SetLabelSize(0.1); hr1->GetYaxis()->SetLabelSize(0.05); hr1->SetFillColor(3); hr1->Draw(); hr5->SetFillColor(9); hr5->Draw("same"); hr4->SetFillColor(4); hr4->Draw("same"); hr3->SetFillColor(6); hr3->Draw("same"); hr2->SetFillColor(2); hr2->Draw("same"); char cc1[100]; sprintf(cc1,"Log(F3)<%4.1f",f1l); char cc2[100]; sprintf(cc2,"Log(F3)>%4.1f",f1h); char cc3[100]; sprintf(cc3,"Log(F10)<%4.1f",f2l); char cc4[100]; sprintf(cc4,"Log(F10)>%4.1f",f2h); TText *t7 = new TText(0.6,0.88,cc1); t7->SetNDC(); t7->SetTextSize(0.07); t7->SetTextColor(2); t7->Draw(); TText *t8 = new TText(0.6,0.78,cc2); t8->SetNDC(); t8->SetTextSize(0.07); t8->SetTextColor(6); t8->Draw(); TText *t9 = new TText(0.6,0.68,cc3); t9->SetNDC(); t9->SetTextSize(0.07); t9->SetTextColor(4); t9->Draw(); TText *t10= new TText(0.6,0.58,cc4); t10->SetNDC(); t10->SetTextSize(0.07); t10->SetTextColor(9); t10->Draw(); TText *t11= new TText(0.6,0.48,"OK"); t11->SetNDC(); t11->SetTextSize(0.07); t11->SetTextColor(3); t11->Draw(); TText *t12= new TText(0.8,0.15,"PedRMS"); t12->SetNDC(); t12->SetTextSize(0.07); t12->Draw(); c1->Update(); save("frac"); }
void mc2ibd_gtDiff(TChain *tMC, TFile *fBgnd, TCanvas *cv, const char *pdfname) { char str[1024]; TLatex *txt = new TLatex(); TVirtualPad *pd; TH1D *hExp = (TH1D *) fBgnd->Get("hgtDiffA-diff"); if (!hExp) { printf("Histogram hgtDiffA-diff not found in %s\n", fBgnd->GetName()); return; } hExp->SetTitle("Time between prompt and delayed events (IBD);us;Events/us"); hExp->SetLineColor(kBlack); hExp->SetMinimum(0); gROOT->cd(); TH1D *hMC = new TH1D("hgtDiffMC", "Time between prompt and delayed events (MC);us;Events/us", 50, 0, 50); hMC->SetLineColor(kBlack); tMC->Project(hMC->GetName(), "gtDiff", cX && cY && cZ && cR && cGamma && cGammaMax && cPe && cN); hMC->Sumw2(); hMC->Scale(hExp->Integral(2,50) / hMC->Integral(2,50)); // Exp vs MC cv->Clear(); cv->Divide(1, 2); cv->cd(1); hExp->SetLineColor(kBlack); hExp->SetLineWidth(3); hMC->SetLineColor(kBlue); hMC->SetLineWidth(1); hExp->Draw(); hMC->Draw("hist,same"); TLegend *lg = new TLegend(0.15, 0.2, 0.4, 0.35); lg->AddEntry(hExp, "IBD", "LE"); lg->AddEntry(hMC, "MC", "L"); lg->Draw(); pd = cv->cd(2); hExp->SetMinimum(2000); hExp->Draw(); hMC->Draw("hist,same"); lg->Draw(); pd->SetLogy(1); cv->Update(); cv->SaveAs(pdfname); hExp->SetMinimum(0); hExp->SetLineWidth(1); hMC->SetLineColor(kBlack); // Fits TF1 *f2Exp = new TF1("f2Exp", "[0]*(exp(-x/[1]) - exp(-x/[2]))", 0, 100); f2Exp->SetParNames("Const.", "#tau_{capt}", "#tau_{th}"); f2Exp->SetLineColor(kBlue); TF1 *fExp = new TF1("fExp", "expo", 0, 100); fExp->SetLineColor(kRed); cv->Clear(); cv->Divide(1, 2); cv->cd(1); f2Exp->SetParameters(hExp->GetMaximum(), 13, 5); hExp->Fit(f2Exp, "", "", 1, 50); hExp->Fit(fExp, "+", "", 15, 50); lg = new TLegend(0.15, 0.2, 0.4, 0.35); lg->AddEntry(hExp, "Data", "LE"); lg->AddEntry(f2Exp, "Fit with two exponents", "L"); lg->AddEntry(fExp, "Capture exponent fit", "L"); lg->Draw(); sprintf(str, "#tau_{capt}=%5.2f us", -1/fExp->GetParameter(1)); txt->DrawLatex(20, hExp->GetMaximum()/5, str); sprintf(str, "#chi^{2}/NDF=%6.1f/34", fExp->GetChisquare()); txt->DrawLatex(20, hExp->GetMaximum()/10, str); cv->cd(2); f2Exp->SetParameters(hMC->GetMaximum(), 13, 5); hMC->Fit(f2Exp, "", "", 1, 50); hMC->Fit(fExp, "+", "", 15, 50); lg->Draw(); sprintf(str, "#tau_{capt}=%5.2f us", -1/fExp->GetParameter(1)); txt->DrawLatex(20, hMC->GetMaximum()/5, str); sprintf(str, "#chi^{2}/NDF=%6.1f/34", fExp->GetChisquare()); txt->DrawLatex(20, hMC->GetMaximum()/10, str); cv->SaveAs(pdfname); // Tha same in log scale hExp->SetMinimum(2000); cv->Clear(); cv->Divide(1, 2); pd = cv->cd(1); hExp->Draw(); lg->Draw(); pd->SetLogy(1); pd = cv->cd(2); hMC->Draw(); lg->Draw(); pd->SetLogy(1); cv->Update(); }
void compareNtuples(TString file1, TString file2, bool doNotSaveSameHistos="true", bool drawWithErrors="true", double ksMinThreshold = 0.001) { //TDirectory *rootdir = gDirectory->GetDirectory("Rint:"); TFile *f1 = TFile::Open(file1.Data(), "READ"); if(f1 == NULL) { cout << "Exiting" << endl; return; } TTree *tree1 = (TTree*)f1->Get("Events"); if(tree1 == NULL) { cout << "Can't find the tree \"Events\" in " << file1 << " Exiting " << endl; return; } TFile *f2 = TFile::Open(file2.Data(), "READ"); if(f2 == NULL) { cout << "Exiting" << endl; return; } TTree *tree2 = (TTree*)f2->Get("Events"); if(tree2 == NULL) { cout << "Can't find the tree \"Events\" in " << file2 << " Exiting " << endl; return; } TObjArray *objArray= file1.Tokenize("/"); TString fname1 = ""; TString fname2 = ""; for(int i = 0; i < objArray->GetSize(); i++) { if(fname1 != "") continue; cout << TString(objArray->At(i)->GetName()) << endl; if(TString(objArray->At(i)->GetName()).Contains("root")) { fname1 = TString(objArray->At(i)->GetName()); continue; } } objArray = file2.Tokenize("/"); for(int i = 0; i < objArray->GetSize(); i++) { if(fname2 != "") continue; cout << TString(objArray->At(i)->GetName()) << endl; if(TString(objArray->At(i)->GetName()).Contains("root")) { fname2 = TString(objArray->At(i)->GetName()); continue; } } vector<TString> t1_aliasnames = getAliasNames(tree1); vector<TString> t2_aliasnames = getAliasNames(tree2); vector<TString> v_commonBranches; vector<TString> v1_notCommonBranches; vector<TString> v2_notCommonBranches; for(vector<TString>::iterator it = t1_aliasnames.begin(); it != t1_aliasnames.end(); it++) { if(find(t2_aliasnames.begin(), t2_aliasnames.end(), *it) != t2_aliasnames.end()) v_commonBranches.push_back(*it); } //figure out which branches are not common so you can output their names //and draw them last v1_notCommonBranches = getUncommonBranches(t1_aliasnames, v_commonBranches); v2_notCommonBranches = getUncommonBranches(t2_aliasnames, v_commonBranches); TCanvas *c1 = new TCanvas(); for(unsigned int i = 0; i < v1_notCommonBranches.size(); i++) { TString alias = v1_notCommonBranches.at(i); cout << "Branch: " << alias << " was found in " << file1 << " but not in " << file2 << endl; TString histname = "h1_"+(alias); TString command = (alias) + ">>" + histname; TBranch *branch = tree1->GetBranch(tree1->GetAlias(alias)); TString branchname(branch->GetName()); if( branchname.Contains("LorentzVector") ) { histname = "h1_"+ alias + "_pt"; command = alias + ".Pt()>>" + histname; } tree1->Draw(command.Data()); TH1F *h1 = (TH1F*)gDirectory->Get(histname.Data()); if(h1==NULL) { cout << "********** Branch " << v1_notCommonBranches.at(i) << " in file " << file1 << "exists, but is undrawable for some reason. " << "Skipping this branch" << endl; c1->Clear(); continue; } c1->Clear(); if(drawWithErrors) h1->TH1F::Sumw2(); h1->Scale(1./h1->GetEntries()); if(!drawWithErrors) { h1->SetLineColor(0); h1->SetMarkerSize(1.1); h1->SetMarkerStyle(3); } else { h1->SetMarkerSize(1.3); h1->SetMarkerStyle(3); } TString histtitle = alias + ", " + fname1; h1->SetTitle(histtitle.Data()); h1->Draw(); c1->SaveAs("diff.ps("); c1->SetLogy(); //if the canvas has been divided, want to set the logy for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)(c1->GetListOfPrimitives()->At(ii)); if(vPad != NULL) { vPad->SetLogy(); } } c1->SaveAs("diff.ps("); c1->SetLogy(0); } for(unsigned int i = 0; i < v2_notCommonBranches.size(); i++) { TString alias = v2_notCommonBranches.at(i); cout << "Branch: " << alias << " was found in " << file1 << " but not in " << file2 << endl; TString histname = "h2_"+(alias); TString command = (alias) + ">>" + histname; TBranch *branch = tree2->GetBranch(tree2->GetAlias(alias)); TString branchname(branch->GetName()); if( branchname.Contains("LorentzVector") ) { histname = "h2_"+ alias + "_pt"; command = alias + ".Pt()>>" + histname; } tree2->Draw(command.Data()); TH1F *h2 = (TH1F*)gDirectory->Get(histname.Data()); if(h2==NULL) { cout << "********** Branch " << v2_notCommonBranches.at(i) << " in file " << file2 << "exists, but is undrawable for some reason. " << "Skipping this branch" << endl; c1->Clear(); continue; } c1->Clear(); if(drawWithErrors) h2->TH1F::Sumw2(); h2->Scale(1./h2->GetEntries()); if(!drawWithErrors) { h2->SetLineColor(kRed); h2->SetLineStyle(7); } else { h2->SetMarkerSize(1.1); h2->SetMarkerStyle(8); h2->SetMarkerColor(kRed); } TString histtitle = alias + ", " + fname2; h2->SetTitle(histtitle.Data()); h2->Draw(); c1->SaveAs("diff.ps("); c1->SetLogy(); //if the canvas has been divided, want to set the logy for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)c1->GetListOfPrimitives()->At(ii); if(vPad != NULL) vPad->SetLogy(); } c1->SaveAs("diff.ps("); c1->SetLogy(0); } for(unsigned int i = 0; i < v_commonBranches.size(); i++) { TString alias = v_commonBranches.at(i); cout << "Comparing Branch: " << alias << endl; TString hist1name = "h1_"+ alias; TString hist2name = "h2_"+ alias; TString command1 = (alias)+"+9990.*((abs("+alias +"+9999)<1)*1.)>>"+hist1name; TString command2 = (alias)+"+9990.*((abs("+alias +"+9999)<1)*1.)>>"+hist2name; TBranch *branch = tree2->GetBranch(tree2->GetAlias(alias)); TString branchname(branch->GetName()); if(branchname.Contains("p4") ) { hist1name = "h1_"+ alias + "_Pt"; hist2name = "h2_"+ alias + "_Pt"; command1 = alias + ".pt()+14130.*((abs("+alias+".pt()-14140.7)<1)*1.)>>"+hist1name; command2 = alias + ".pt()+14130.*((abs("+alias+".pt()-14140.7)<1)*1.)>>"+hist2name; } tree1->Draw(command1.Data()); //TH1F *h1 = (TH1F*)c1->GetPrimitive(hist1name.Data()); TH1F *h1 = (TH1F*)gDirectory->Get(hist1name.Data()); if(h1==NULL) { cout << "********** Branch " << v_commonBranches.at(i) << " in file " << file1 << " exists, but is undrawable for some reason. " << "Skipping this branch" << endl; c1->Clear(); continue; } //set the Overflow at the last bin tree2->Draw(command2.Data()); //TH1F *h2 = (TH1F*)c1->GetPrimitive(hist2name.Data()); TH1F *h2 = (TH1F*)gDirectory->Get(hist2name.Data()); if(h2==NULL) { cout << "********** Branch " << v_commonBranches.at(i) << " in file " << file2 << "exists, but is undrawable for some reason. " << "Skipping this branch" << endl; c1->Clear(); continue; } c1->Clear(); bool histos_theSame = areHistosTheSame(h1, h2); if(histos_theSame && doNotSaveSameHistos) continue; if (! histos_theSame){ double min1 = h1->GetXaxis()->GetXmin(); double min2 = h2->GetXaxis()->GetXmin(); double max1 = h1->GetXaxis()->GetXmax(); double max2 = h2->GetXaxis()->GetXmax(); double hmin = min1 > min2 ? min2 : min1; double hmax = max1 > max2 ? max1 : max2; command1 += Form("_fix(100,%f,%f)", hmin, hmax); command2 += Form("_fix(100,%f,%f)", hmin, hmax); hist1name += "_fix"; hist2name += "_fix"; tree1->Draw(command1.Data()); tree2->Draw(command2.Data()); h1 = (TH1F*)gDirectory->Get(hist1name.Data()); h2 = (TH1F*)gDirectory->Get(hist2name.Data()); } if(drawWithErrors) { h1->TH1F::Sumw2(); h2->TH1F::Sumw2(); } h1->Scale(1./h1->GetEntries()); h2->Scale(1./h2->GetEntries()); double bDiff = 0; unsigned int nX1 = h1->GetNbinsX(); for(unsigned int iB=0; iB<=nX1+1; ++iB){ if(h1->GetBinError(iB)==0 && h1->GetBinContent(iB)!=0) h1->SetBinError(iB,1e-3*fabs(h1->GetBinContent(iB))); if(h2->GetBinError(iB)==0 && h2->GetBinContent(iB)!=0) h2->SetBinError(iB,1e-3*fabs(h2->GetBinContent(iB))); bDiff +=fabs(h1->GetBinContent(iB) - h2->GetBinContent(iB)); } double ksProb = 0; if (bDiff == 0) ksProb = 1; else ksProb = h1->KolmogorovTest(h2); if (bDiff ==0 || ksProb > ksMinThreshold ) continue; if(h1->GetNbinsX() != h2->GetNbinsX() ) { cout << "Branch " << v_commonBranches.at(i) << " not the same between the 2 files" << ". They will be drawn side by side" << endl; c1->Divide(2,1); h2->SetTitle(fname2); h1->SetTitle(fname1); if(!drawWithErrors) { h1->SetLineColor(0); h1->SetMarkerSize(1.1); h1->SetMarkerStyle(3); h2->SetLineColor(kRed); h2->SetLineStyle(7); c1->cd(1); h1->Draw(); c1->cd(2); h2->Draw(); } else { h1->SetMarkerSize(1.3); h1->SetMarkerStyle(3); h2->SetMarkerSize(1.1); h2->SetMarkerStyle(8); h2->SetMarkerColor(kRed); c1->cd(1); h1->Draw("e"); c1->cd(2); h2->Draw("e"); } TPaveText ksPt(0,0, 0.35, 0.05, "NDC"); ksPt.AddText(Form("P(KS)=%g, diffBins=%g, eblk %g ered %g",ksProb, bDiff, h1->GetEntries(), h2->GetEntries())); ksPt.Draw(); if(i < v_commonBranches.size() - 1) { c1->SaveAs("diff.ps("); c1->SetLogy(); //if the canvas has been divided, want to set the logy for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)c1->GetListOfPrimitives()->At(ii); if(vPad != NULL) vPad->SetLogy(); } c1->SaveAs("diff.ps("); c1->SetLogy(0); } else { cout << "done" << endl; c1->SaveAs("diff.ps("); c1->SetLogy(); for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)c1->GetListOfPrimitives()->At(ii); if(vPad != NULL) vPad->SetLogy(); } c1->SaveAs("diff.ps)"); c1->SetLogy(0); } continue; } if(h1->GetMaximum() >= h2->GetMaximum()) { double max = 1.1*h1->GetMaximum(); h1->SetMaximum(max); h2->SetMaximum(max); if(!drawWithErrors) { h1->SetLineColor(0); h1->SetMarkerSize(1.1); h1->SetMarkerStyle(3); h2->SetLineColor(kRed); h2->SetLineStyle(7); h2->Draw(); h1->Draw("samesh*"); } else { h1->SetMarkerSize(1.3); h1->SetMarkerStyle(3); h2->SetMarkerSize(1.1); h2->SetMarkerStyle(8); h2->SetMarkerColor(kRed); h2->Draw("e"); h1->Draw("samese"); } } else { double max = 1.1*h2->GetMaximum(); h1->SetMaximum(max); h2->SetMaximum(max); if(!drawWithErrors) { h1->SetLineColor(0); h1->SetMarkerSize(1.1); h1->SetMarkerStyle(3); h2->SetLineColor(kRed); h2->SetLineStyle(7); TString histtitle = fname1+" (black) " + fname2 + " (red)"; h2->SetTitle(histtitle.Data()); h1->SetTitle(histtitle.Data()); h1->Draw(); h2->Draw("samesh*"); } else { h1->SetMarkerSize(1.3); h1->SetMarkerStyle(3); h2->SetMarkerSize(1.1); h2->SetMarkerStyle(8); h2->SetMarkerColor(kRed); TString histtitle = fname1+" (black) " + fname2 + " (red)"; h2->SetTitle(histtitle.Data()); h1->SetTitle(histtitle.Data()); h1->Draw("e"); h2->Draw("samese"); } } TPaveText ksPt(0,0, 0.35, 0.05, "NDC"); ksPt.AddText(Form("P(KS)=%g, diffBins=%g, eblk %g ered %g",ksProb, bDiff, h1->GetEntries(), h2->GetEntries())); ksPt.Draw(); if(i < v_commonBranches.size() - 1) { c1->SaveAs("diff.ps("); c1->SetLogy(); //if the canvas has been divided, want to set the logy for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)c1->GetListOfPrimitives()->At(ii); if(vPad != NULL) vPad->SetLogy(); } c1->SaveAs("diff.ps("); c1->SetLogy(0); } else { cout << "done" << endl; c1->SaveAs("diff.ps("); c1->SetLogy(); for(int ii = 0; ii < c1->GetListOfPrimitives()->GetSize(); ii++) { if(string(c1->GetListOfPrimitives()->At(ii)->ClassName()) != "TVirtualPad") continue; TVirtualPad *vPad = (TVirtualPad*)c1->GetListOfPrimitives()->At(ii); if(vPad != NULL) vPad->SetLogy(); } c1->SaveAs("diff.ps)"); c1->SetLogy(0); } }//for loop //c1->SaveAs("diff.ps)"); }
void validation() { msglvl[DBG] = SILENT; msglvl[INF] = VISUAL; msglvl[WRN] = VISUAL; msglvl[ERR] = VISUAL; msglvl[FAT] = VISUAL; TDirectory* oldDir = gDirectory; // remember old directory style(); Int_t g4bin = (ng4bins/g4max+1); //==> g^4=1 ==> SSM ! TString suffix = ""; if(doTruth) suffix = "_truth"; TString mctype = (isMC11c) ? "mc11c" : "mc11a"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_overallEWkF_noInAmpSigEWkF_noHighMbins_wthOfficialZP_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_mc11c_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_wthOfficialZP_fixedBWwidth_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_mc11c_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_fixedBWwidth_treeLevelMass_Xmass2000.root"; TLegend* legR = new TLegend(0.15,0.75,0.35,0.85,NULL,"brNDC"); legR->SetFillStyle(4000); //will be transparent legR->SetFillColor(0); legR->SetTextFont(42); TH1D* hDummy = new TH1D("","",1,0.,1.); hDummy->SetMarkerStyle(20); hDummy->SetMarkerSize(0.8); hDummy->SetMarkerColor(kBlack); if(!doResiduals) legR->AddEntry(hDummy,"#frac{template}{official}","lep"); else legR->AddEntry(hDummy,"#frac{template - official}{#sqrt{#delta^{2}template + #delta^{2}official}}","lep"); TPaveText* ptxt = new TPaveText(0.145,0.35,0.245,0.55,"NDC"); TText* txt; ptxt->SetTextSize(0.03); ptxt->SetBorderSize(0); ptxt->SetFillStyle(4000); //will be transparent ptxt->SetFillColor(0); ptxt->SetTextAlign(12); txt = ptxt->AddText("This range"); txt = ptxt->AddText("is chopped"); txt = ptxt->AddText("before the"); txt = ptxt->AddText("template is"); txt = ptxt->AddText("handed to"); txt = ptxt->AddText("BAT (limit)."); oldDir->cd(); TString fBGname = "plots/validation/ZP_2dtemplates_mc11c_33st_noKKtmplates_wthOfficialZP_treeLevelMass_Xmass2000.root"; TFile* fD = new TFile(fBGname,"READ"); TH1D* hDY = NULL; if(doTruth) hDY = (TH1D*)fD->Get("hMass_DYmumu_truth")->Clone(); else hDY = (TH1D*)fD->Get("hMass_DYmumu")->Clone(); hDY->SetLineColor(kMagenta-5); hDY->SetMarkerColor(kMagenta-5); oldDir->cd(); TFile* fDYrozmin = new TFile("plots/mass_plot_tables_3st.root","READ"); TH1D* hDYrozmin = (TH1D*)fDYrozmin->Get("mass_log_dy")->Clone(); hDYrozmin = (TH1D*)hGeV2TeV(hDYrozmin)->Clone(); hDYrozmin = (TH1D*)hChopper(hDYrozmin,bins2chop)->Clone(); oldDir->cd(); TFile* f1dTemplates = new TFile("plots/ZpSignal_MM_MC11c_5points.root","READ"); TObjArray* toarr1d = new TObjArray(); toarr1d->Read("template"); TMapTSP2TH1D h1dBrandeisTmpltMap; double Nflat = 399948; double sigmaflat = 4.3988E+07*nb2fb; double Lmcflat = Nflat/sigmaflat; double scale = luminosity/Lmcflat; TH1D* h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(0/*22*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1000",(TH1D*)resetErrors(h1dTmp)->Clone("1000")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(1/*28*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1250",(TH1D*)resetErrors(h1dTmp)->Clone("1250")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(2/*34*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1500",(TH1D*)resetErrors(h1dTmp)->Clone("1500")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(3/*40*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1750",(TH1D*)resetErrors(h1dTmp)->Clone("1750")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(4/*47*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("2000",(TH1D*)resetErrors(h1dTmp)->Clone("2000")) ); oldDir->cd(); TMapTSP2TH1D h1Map; h1Map.insert( make_pair("1000o", (TH1D*)fD->Get("hMass_Zprime_SSM1000"+suffix)->Clone()) ); h1Map.insert( make_pair("1000t", (TH1D*)fD->Get("hMass_Zprime_SSM1000_template"+suffix)->Clone()) ); if(isMC11c) { h1Map.insert( make_pair("1250o", (TH1D*)fD->Get("hMass_Zprime_SSM1250"+suffix)->Clone()) ); h1Map.insert( make_pair("1250t", (TH1D*)fD->Get("hMass_Zprime_SSM1250_template"+suffix)->Clone()) ); } h1Map.insert( make_pair("1500o", (TH1D*)fD->Get("hMass_Zprime_SSM1500"+suffix)->Clone()) ); h1Map.insert( make_pair("1500t", (TH1D*)fD->Get("hMass_Zprime_SSM1500_template"+suffix)->Clone()) ); h1Map.insert( make_pair("1750o", (TH1D*)fD->Get("hMass_Zprime_SSM1750"+suffix)->Clone()) ); h1Map.insert( make_pair("1750t", (TH1D*)fD->Get("hMass_Zprime_SSM1750_template"+suffix)->Clone()) ); h1Map.insert( make_pair("2000o", (TH1D*)fD->Get("hMass_Zprime_SSM2000"+suffix)->Clone()) ); h1Map.insert( make_pair("2000t", (TH1D*)fD->Get("hMass_Zprime_SSM2000_template"+suffix)->Clone()) ); TMapTSP2TH1D h1rMap; h1rMap.insert( make_pair("1000", (TH1D*)fD->Get("hMass_Zprime_SSM1000"+suffix)->Clone()) ); if(isMC11c) h1rMap.insert( make_pair("1250", (TH1D*)fD->Get("hMass_Zprime_SSM1250"+suffix)->Clone()) ); h1rMap.insert( make_pair("1500", (TH1D*)fD->Get("hMass_Zprime_SSM1500"+suffix)->Clone()) ); h1rMap.insert( make_pair("1750", (TH1D*)fD->Get("hMass_Zprime_SSM1750"+suffix)->Clone()) ); h1rMap.insert( make_pair("2000", (TH1D*)fD->Get("hMass_Zprime_SSM2000"+suffix)->Clone()) ); for(TMapTSP2TH1D::iterator it=h1rMap.begin() ; it!=h1rMap.end() ; ++it) { it->second->Reset(); if(!doResiduals) it->second->Divide(h1Map[it->first+"o"],h1Map[it->first+"t"],1.,1.,"B"); else residuals(h1Map[it->first+"o"], h1Map[it->first+"t"], it->second); // for(Int_t i=0 ; i<=it->second->GetNbinsX()+1 ; i++) it->second->SetBinError(i,0); it->second->SetMarkerStyle(20); it->second->SetMarkerSize(0.5); it->second->GetXaxis()->SetLabelSize(0.073); it->second->GetYaxis()->SetLabelSize(0.073); it->second->GetXaxis()->SetTitleSize(0.073); it->second->GetYaxis()->SetTitleSize(0.073); it->second->SetTitleSize(0.075); it->second->GetYaxis()->SetTitleOffset(0.5); if(!doResiduals) { it->second->SetMinimum(0.2); it->second->SetMaximum(1.8); } else { it->second->SetMinimum(-5.); it->second->SetMaximum(+5.); } it->second->SetTitle(""); if(!doResiduals) it->second->GetYaxis()->SetTitle("ratio"); else it->second->GetYaxis()->SetTitle("residuals"); } TMapTSP2TGAE poissonGraphMap; TMapTSP2TLeg legMap; _INFO(""); oldDir->cd(); fD->cd(); TH1D* h1Template = (TH1D*)fD->Get("hMass_DYmumu"+suffix)->Clone(); h1Template->Reset(); TObjArray* toarr = new TObjArray(); if(doTruth) toarr->Read("truth_template2d"); else toarr->Read("template2d"); TH2D* h2SSM2000 = (TH2D*)((TObjArray*)toarr->At(0))->Clone("hMass"+suffix+"_Zprime_SSM2000_template2d"); for(Int_t bin=1 ; bin<=h2SSM2000->GetNbinsX() ; bin++) { h1Template->SetBinContent(bin, h2SSM2000->GetBinContent(bin,g4bin)); h1Template->SetBinError(bin, h2SSM2000->GetBinError(bin,g4bin)); } h1Template->SetLineColor(kViolet); h1Template->SetLineWidth(1); h1Template->SetMarkerStyle(20); h1Template->SetMarkerSize(0.3); h1Template->SetMarkerColor(kViolet); // the functions h2Template = (TH2D*)h2SSM2000->Clone(); vector<TF1*> vfunc; unsigned int nmllbins = h2Template->GetNbinsX(); for(unsigned int mll=1 ; mll<=(nmllbins-bins2chop) ; mll++) // 1...(56-9 = 47) { TString mllname = (TString)_s(mll); TString mllval = (TString)_s(h2Template->GetXaxis()->GetBinCenter(mll+bins2chop)); TF1* f = new TF1("fNominal_mll"+mllname,fTH1toTF1,g4min,g4max,1); f->SetParameter(0,mll); f->SetParNames("mll"); // f->SetLineColor(kBlue); // f->SetLineWidth(1); f->SetNpx(400); vfunc.push_back(f); } TGraph* graphDY = new TGraph(); graphDY->SetMarkerStyle(25); graphDY->SetMarkerSize(0.6); graphDY->SetMarkerColor(kGreen+2); TGraph* graphSSM = new TGraph(); graphSSM->SetMarkerStyle(24); graphSSM->SetMarkerSize(0.6); graphSSM->SetMarkerColor(kOrange+8); for(unsigned int i=0 ; i<vfunc.size() ; i++) { double DY = vfunc[i]->Eval(0.0); double SSM = vfunc[i]->Eval(1.0); graphDY->SetPoint(i,h2Template->GetXaxis()->GetBinCenter(bins2chop+i+1),DY); graphSSM->SetPoint(i,h2Template->GetXaxis()->GetBinCenter(bins2chop+i+1),SSM); } oldDir->cd(); TObjArray* toarr1dTLV = new TObjArray(); TMapTSP2TH1D h1dTlvTmpltMap; TFile* fT = NULL; TString fTname = "plots/validation/ZP_2dtemplates_mc11c_33st_noInterference_noKKtmplates_noOverallEWkF_wthOfficialZP_treeLevelMass_Xmass"; fT = new TFile(fTname+"1000.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1000",(TH1D*)resetErrors(h1dTmp)->Clone("1000")) ); fT = new TFile(fTname+"1250.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1250",(TH1D*)resetErrors(h1dTmp)->Clone("1250")) ); fT = new TFile(fTname+"1500.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1500",(TH1D*)resetErrors(h1dTmp)->Clone("1500")) ); fT = new TFile(fTname+"1750.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1750",(TH1D*)resetErrors(h1dTmp)->Clone("1750")) ); fT = new TFile(fTname+"2000.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("2000",(TH1D*)resetErrors(h1dTmp)->Clone("2000")) ); oldDir->cd(); for(TMapTSP2TH1D::iterator it=h1Map.begin() ; it!=h1Map.end() ; ++it) { if(it->first.Contains("o")) { TString name = it->first; name.ReplaceAll("o",""); it->second->SetFillColor(kAzure-9); if(doTruth) it->second->SetTitle("m_{Z'} = "+name+" GeV (truth)"); else it->second->SetTitle("m_{Z'} = "+name+" GeV"); } if(it->first.Contains("t")) { //TGraphAsymmErrors* poisson(TH1D* h) it->second->SetLineColor(kBlue); it->second->SetMarkerStyle(20); it->second->SetMarkerSize(0.4); it->second->SetMarkerColor(kBlue); it->second->SetLineWidth(1); TString name = it->first; name.ReplaceAll("t",""); poissonGraphMap.insert( make_pair(name, (TGraphAsymmErrors*)poisson(it->second)->Clone()) ); poissonGraphMap[name]->SetMarkerStyle(20); poissonGraphMap[name]->SetMarkerSize(0.3); poissonGraphMap[name]->SetMarkerColor(kBlue); poissonGraphMap[name]->SetLineWidth(1); poissonGraphMap[name]->SetLineColor(kBlue); } } Double_t yLine = (!doResiduals) ? 1. : 0.; TLine* line = new TLine(0.07,yLine,3.,yLine); line->SetLineColor(kRed); line->SetLineWidth(2); TMapTSP2TCNV cnvMap; cnvMap.insert( make_pair("1000", new TCanvas("1000","1000",600,550)) ); if(isMC11c) cnvMap.insert( make_pair("1250", new TCanvas("1250","1250",600,550)) ); cnvMap.insert( make_pair("1500", new TCanvas("1500","1500",600,550)) ); cnvMap.insert( make_pair("1750", new TCanvas("1750","1750",600,550)) ); cnvMap.insert( make_pair("2000", new TCanvas("2000","2000",600,550)) ); for(TMapTSP2TCNV::iterator it=cnvMap.begin() ; it!=cnvMap.end() ; ++it) { _INFO("starting "+(string)it->first); if(it->first=="2000") legMap.insert( make_pair(it->first, new TLegend(0.35,0.55,0.83,0.84,NULL,"brNDC")) ); else legMap.insert( make_pair(it->first, new TLegend(0.35,0.60,0.83,0.84,NULL,"brNDC")) ); legMap[it->first]->SetFillStyle(4000); //will be transparent legMap[it->first]->SetFillColor(0); legMap[it->first]->SetTextFont(42); legMap[it->first]->AddEntry(h1Map[it->first+"o"],"Official Z'_{SSM}","F"); legMap[it->first]->AddEntry(hDY,"Official DY#mu#mu","lep"); legMap[it->first]->AddEntry(h1Map[it->first+"t"],"ME^{2} method: Template w/o couplings scale","lep"); if(it->first=="2000") { legMap[it->first]->AddEntry(h1Template,"ME^{2} method: Template histogram at #it{g=1} (SSM)","lep"); legMap[it->first]->AddEntry(graphSSM, "ME^{2} method: Template function at #it{g=1} (SSM)","p"); legMap[it->first]->AddEntry(graphDY, "ME^{2} method: Template function at #it{g=0} (DY)","p"); } if(!doTruth) { h1dTlvTmpltMap[it->first]->SetLineColor(kCyan+2); h1dTlvTmpltMap[it->first]->SetMarkerColor(kCyan+2); h1dTlvTmpltMap[it->first]->SetMarkerStyle(5); h1dTlvTmpltMap[it->first]->SetMarkerSize(0.5); legMap[it->first]->AddEntry(h1dTlvTmpltMap[it->first],"ME^{2} method: DY+Template (no interference)","p"); h1dBrandeisTmpltMap[it->first]->SetLineColor(kRed); h1dBrandeisTmpltMap[it->first]->SetMarkerColor(kRed); h1dBrandeisTmpltMap[it->first]->SetMarkerStyle(27); h1dBrandeisTmpltMap[it->first]->SetMarkerSize(0.5); legMap[it->first]->AddEntry(h1dBrandeisTmpltMap[it->first],"Flat Z' method: DY+Template (no interference)","p"); } it->second->Divide(1,2); TVirtualPad* ph = it->second->cd(1); TVirtualPad* pr = it->second->cd(2); ph->SetPad(0.00, 0.35, 1.00, 1.00); pr->SetPad(0.00, 0.00, 1.00, 0.35); ph->SetBottomMargin(0.012); pr->SetBottomMargin(0.20); pr->SetTopMargin(0.012); ph->cd(); ph->Draw(); ph->SetTicks(1,1); ph->SetLogy(); ph->SetLogx(); // h1Map[it->first+"o"]->SetMaximum( h1Map[it->first+"t"]->GetMaximum()*1.5 ); // h1Map[it->first+"o"]->Draw(); TH1D* hTmpNoErr = (TH1D*)resetErrors(h1Map[it->first+"o"])->Clone(); hTmpNoErr->SetMaximum( h1Map[it->first+"t"]->GetMaximum()*1.5 ); hTmpNoErr->SetLineStyle(1); hTmpNoErr->SetLineColor(kBlack); hTmpNoErr->SetFillColor(kAzure-9); hTmpNoErr->Draw(); TH1D* hTmpErr = (TH1D*)ShiftLog(h1Map[it->first+"o"],0.2)->Clone(); hTmpErr->SetFillStyle(4000); //will be transparent hTmpErr->SetFillColor(0); hTmpErr->DrawCopy("epx0SAMES"); hDY->Draw("SAMES"); h1Map[it->first+"t"]->Draw("epSAMES"); //poissonGraphMap[it->first]->Draw("pSAMES"); if(it->first=="2000") { graphDY->Draw("SAMESp"); graphSSM->Draw("SAMESp"); h1Template->Draw("epSAMES"); } _INFO(""); h1dTlvTmpltMap[it->first]->Draw("SAMESp"); h1dBrandeisTmpltMap[it->first]->Draw("SAMESp"); TLine* chopline = new TLine(0.12805,getYmin(h1Map[it->first+"o"]),0.12805,7.e5); chopline->SetLineStyle(2); chopline->SetLineColor(kBlack); chopline->Draw("SAMES"); ptxt->Draw("SAMES"); legMap[it->first]->Draw("SAMES"); ph->RedrawAxis(); ph->Update(); _INFO(""); pr->cd(); pr->Draw(); pr->SetTicks(1,1); pr->SetGridy(); pr->SetLogx(); h1rMap[it->first]->Draw("ep"); line->Draw("SAMES"); h1rMap[it->first]->Draw("epSAMES"); legR->Draw("SAMES"); pr->RedrawAxis(); pr->Update(); unsigned int savestate = 1; if(it->first=="1000") savestate = 0; else if(it->first=="2000") savestate = 2; else savestate = 1; TString testType = (doResiduals) ? "_residuals" : "_ratio"; mutype = (doTruth) ? "_truth" : "_recon"; savemultipdf(it->second, "plots/validation/validation"+mutype+testType+"_"+mctype+"_all.pdf", savestate); saveas(it->second, "plots/validation/validation"+mutype+testType+"_"+mctype+"_"+it->first); TCanvas* c = new TCanvas(it->first,"",600,400); c->cd(); c->Draw(); c->SetTicks(1,1); c->SetLogy(); c->SetLogx(); hTmpNoErr->Draw(); hTmpErr->DrawCopy("epx0SAMES"); hDY->Draw("SAMES"); h1Map[it->first+"t"]->Draw("epSAMES"); //poissonGraphMap[it->first]->Draw("pSAMES"); if(it->first=="2000") { graphDY->Draw("SAMESp"); graphSSM->Draw("SAMESp"); h1Template->Draw("epSAMES"); } h1dTlvTmpltMap[it->first]->Draw("SAMESp"); h1dBrandeisTmpltMap[it->first]->Draw("SAMESp"); legMap[it->first]->Draw("SAMES"); chopline->Draw("SAMES"); ptxt->Draw("SAMES"); c->RedrawAxis(); c->Update(); saveas(c,"plots/validation/validation_"+it->first+"_"+mutype+testType); _INFO("done "+(string)it->first); } }
//______________________________________________________________________________ void CMSApplicationTBB::FinishRun() { #ifdef USE_ROOT if (fScore == kNoScore) return; TCanvas *c1 = new TCanvas("CMS test flux", "Simple scoring in CMS geometry", 700, 1200); double norm = 1. / fRunMgr->GetNprimaries(); TVirtualPad *pad; TFile *f = TFile::Open("ScoreECAL.root", "RECREATE"); c1->Divide(2, 3); pad = c1->cd(1); pad->SetLogx(); pad->SetLogy(); fFluxElec->Sumw2(); fFluxElec->Scale(norm); fFluxElec->Draw("9"); pad = c1->cd(2); pad->SetLogx(); pad->SetLogy(); fFluxGamma->Sumw2(); fFluxGamma->Scale(norm); fFluxGamma->Draw("9"); pad = c1->cd(3); pad->SetLogx(); pad->SetLogy(); fFluxP->Sumw2(); fFluxP->Scale(norm); fFluxP->Draw("9"); pad = c1->cd(4); pad->SetLogx(); pad->SetLogy(); fFluxPi->Sumw2(); fFluxPi->Scale(norm); fFluxPi->Draw("9"); pad = c1->cd(5); pad->SetLogx(); pad->SetLogy(); fFluxK->Sumw2(); fFluxK->Scale(norm); fFluxK->Draw("9"); fFluxElec->Write(); fFluxGamma->Write(); fFluxP->Write(); fFluxPi->Write(); fFluxK->Write(); TCanvas *c2 = new TCanvas("CMS test edep", "Simple scoring in CMS geometry", 700, 1200); c2->Divide(2, 3); pad = c2->cd(1); pad->SetLogx(); pad->SetLogy(); fEdepElec->Sumw2(); fEdepElec->Scale(norm); fEdepElec->Draw("9"); pad = c2->cd(2); pad->SetLogx(); pad->SetLogy(); fEdepP->Sumw2(); fEdepP->Scale(norm); fEdepP->Draw("9"); pad = c2->cd(3); pad->SetLogx(); pad->SetLogy(); fEdepPi->Sumw2(); fEdepPi->Scale(norm); fEdepPi->Draw("9"); pad = c2->cd(4); pad->SetLogx(); pad->SetLogy(); fEdepK->Sumw2(); fEdepK->Scale(norm); fEdepK->Draw("9"); pad = c2->cd(5); pad->SetLogx(); pad->SetLogy(); fEdepGamma->Sumw2(); fEdepGamma->Scale(norm); fEdepGamma->Draw("9"); fEdepElec->Write(); fEdepGamma->Write(); fEdepP->Write(); fEdepPi->Write(); fEdepK->Write(); // Close file f->Close(); #endif }
TCanvas* pHitSpecPosGen( ) { TCanvas* c = new TCanvas("cHitSpecPosGen","cHitSpecPosGen",1200,600); c->Divide(2,1); TVirtualPad* p; TH2D *h; TH2D *hAtPhi0; TText t; t.SetTextColor(4); p =c->cd(1); p->SetLogy(); p->SetGrid(0,1); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhiGen_Minus"); hAtPhi0 = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhiGenAtPhi0_Minus"); h->GetYaxis()->SetRange(4,33); h->GetXaxis()->SetNdivisions(505); h->GetXaxis()->SetLabelSize(0.04); h->DrawCopy("box"); hAtPhi0->SetLineColor(2); hAtPhi0->DrawCopy("box same"); t.DrawTextNDC(0.17,0.15, "BARREL MU MINUS"); std::cout <<h->GetTitle() << std::endl; for (int iy = 1; iy <=h->GetNbinsY(); iy++) { std::cout <<" pt: " << h->GetYaxis()->GetBinLowEdge(iy); double xmin=100.; double xAtMax = 0.; double valAtMax = 0.; double xmax=-100.; for (int ix = 1; ix <=h->GetNbinsX(); ix++) { double val = h->GetBinContent(ix,iy); double xbmin = h->GetXaxis()->GetBinLowEdge(ix); double xcent = h->GetXaxis()->GetBinCenter(ix); double xbmax = h->GetXaxis()->GetBinUpEdge(ix); if (val > valAtMax) { valAtMax = val; xAtMax = xcent; } if (val > 1 && (xbmin < xmin)) xmin = xbmin; if (val > 1 && (xbmax > xmax)) xmax = xbmax; } std::cout <<" set DPHI0 = "<<1.025-xAtMax <<"; set DPHI_MARGIN = " <<std::max( (xAtMax-xmin), (xmax-xAtMax)) <<";" << std::endl; } p =c->cd(2); p->SetLogy(); p->SetGrid(1,1); h = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhiGen_Plus"); hAtPhi0 = (TH2D*)gROOT->FindObject("hHitSpec_PtVsPhiGenAtPhi0_Plus"); h->GetYaxis()->SetRange(4,32); h->GetXaxis()->SetNdivisions(505); h->GetXaxis()->SetLabelSize(0.04); h->DrawCopy("box"); hAtPhi0->SetLineColor(2); hAtPhi0->DrawCopy("box same"); t.DrawTextNDC(0.17,0.15, "BARREL MU PLUS"); std::cout <<h->GetTitle() << std::endl; for (int iy = 1; iy <=h->GetNbinsY(); iy++) { std::cout <<" pt: " << h->GetYaxis()->GetBinLowEdge(iy); double xmin=100.; double xAtMax = 0.; double valAtMax = 0.; double xmax=-100.; for (int ix = 1; ix <=h->GetNbinsX(); ix++) { double val = h->GetBinContent(ix,iy); double xbmin = h->GetXaxis()->GetBinLowEdge(ix); double xcent = h->GetXaxis()->GetBinCenter(ix); double xbmax = h->GetXaxis()->GetBinUpEdge(ix); if (val > valAtMax) { valAtMax = val; xAtMax = xcent; } if (val > 1 && (xbmin < xmin)) xmin = xbmin; if (val > 1 && (xbmax > xmax)) xmax = xbmax; } std::cout <<" set DPHI0 = "<<1.025-xAtMax <<"; set DPHI_MARGIN = " <<std::max( (xAtMax-xmin), (xmax-xAtMax)) <<";" << std::endl; } return c; }
void EstimateBg_76X(bool save=0, std::string in = "", std::string out = "/afs/cern.ch/user/j/jkarancs/public/NOTES/notes/AN-14-290/trunk/Plots/v1.0/", std::string ext="png") { gStyle->SetOptTitle(0); gStyle->SetOptStat(0); bool latex = save; bool ABCD_prime = 0; bool TT_only = 0; std::stringstream ss, ss2; ss<<DPHI_CUT; ss2<<R_CUT; std::string dphi_cut = ss.str().replace(ss.str().find("."),1,"p"); std::string r_cut = ss2.str().replace(ss2.str().find("."),1,"p"); std::string filename = in.size() ? in : //"results/Plotter_out_2016_05_31_08h48m57_replot.root"; "results/Plotter_out_2016_06_24_14h28m51.root"; std::vector<std::string> samples[4]; //samples[0].push_back("TTJetsMGHT"); //samples[0].push_back("TTJetsMG"); //samples[0].push_back("TTJetsNLOFXFX"); //samples[0].push_back("TTNLO"); //samples[0].push_back("TTNLOHerwig"); //samples[0].push_back("TTPowheg"); //samples[0].push_back("TTPowhegmpiOff"); //samples[0].push_back("TTPowhegnoCR"); //samples[0].push_back("TTPowhegHerwig"); //+data+ samples[1].push_back("SingleElectron"); //+data+ samples[1].push_back("SingleMuon"); if (TT_only) { samples[1].push_back("TTJetsMGHT"); samples[1].push_back("TTJetsMG"); samples[1].push_back("TTJetsNLOFXFX"); samples[1].push_back("TTNLO"); samples[1].push_back("TTNLOHerwig"); samples[1].push_back("TTPowheg"); samples[1].push_back("TTPowhegmpiOFF"); samples[1].push_back("TTPowhegnoCR"); samples[1].push_back("TTPowhegHerwig"); } else { samples[1].push_back("TTJetsMGHT"); //samples[1].push_back("TTJetsMG"); //samples[1].push_back("TTJetsNLOFXFX"); //samples[1].push_back("TTNLO"); //samples[1].push_back("TTNLOHerwig"); //samples[1].push_back("TTPowheg"); //samples[1].push_back("TTPowhegmpiOff"); //samples[1].push_back("TTPowhegnoCR"); //samples[1].push_back("TTPowhegHerwig"); samples[1].push_back("ZJets"); samples[1].push_back("TTX"); samples[1].push_back("WJets"); samples[1].push_back("Diboson"); samples[1].push_back("Top"); samples[1].push_back("QCD"); //ZERO samples[1].push_back("TZQ"); //ZERO samples[1].push_back("ZJetsToQQ"); // Also WJetsToQQ //ZERO samples[1].push_back("GJets"); } //samples[1].push_back("Data"); // NTop Sideband All background summed samples[2].push_back("All Bkg."); // Signal in NTop bins samples[3].push_back("T1tttt"); bool baderror = false; double weight[] = { 0.32686, 0.0505037, 0.00921411, 6.80717, 0.354934, 0.00484915 }; int rebin = /*(R_CUT*10-int(R_CUT*10))==0 ? 10 :*/ (R_CUT*20-int(R_CUT*20))==0 ? 5 : (R_CUT*50-int(R_CUT*50))==0 ? 2 : 1; double sideband_fit_low_range[] = { 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15 }; int i_h_side[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int i_h_signal[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; double scale_factors[] = { 1, 1, 1, 1, 1, 1, 1}; // All normal //double scale_factors[] = { /* TT */ 1, /* W */ 1, /* Z */ 1, /* T */ 1, /* TTV */ 1, /* QCD */ 2, /* VV */ 1 }; // QCD high //double scale_factors[] = { /* TT */ 5, /* W */ 1, /* Z */ 1, /* T */ 1, /* TTV */ 5, /* QCD */ 1, /* VV */ 1 }; // TT/TTV high //double scale_factors[] = { /* TT */ 1, /* W */ 2, /* Z */ 2, /* T */ 2, /* TTV */ 1, /* QCD */ 1, /* VV */ 2 }; // T/V/VV high Double_t Rranges_ABCD[][4] = { { DPHI_CUT, 3.2, 0.0, DPHI_CUT }, { R_CUT_LOW-1e-10, R_CUT, R_CUT-1e-10, 1.20 }, { R_CUT_LOW-1e-10, R_CUT, R_CUT-1e-10, 1.20 }, { R_CUT_LOW-1e-10, R_CUT, R_CUT-1e-10, 1.20 } }; bool doFitting = false; double sum_a = 0, sum_b = 0, sum_c = 0, sum_d = 0, sum_d_abcd = 0, sum_d_nevt = 0; double sum_a_err = 0, sum_b_err = 0, sum_c_err = 0, sum_d_err = 0, sum_d_abcd_err = 0; double sum_b_fit = 0, sum_d_fit = 0, sum_d_fit_comb = 0; double sum_b_fit_err = 0, sum_d_fit_err = 0, sum_d_fit_comb_err = 0; double comb_d = 0, comb_d_err = 0, comb_d_abcd = 0, comb_d_abcd_err = 0; if (latex) { printf("\\begin{table*}[htbH]\n"); printf("\\small\n"); printf("\\begin{center}\n"); printf("\\topcaption{Estimated Standard Model background yields in ABCD regions. A, B is in the sideband, C and D is the signal band, D is the signal region.\\label{tab:SMBkgEstimate}}\n"); printf("\\begin{tabular}{lrrrrrrrr}\n"); } TFile *f = TFile::Open(filename.c_str()); for (size_t iMethod = 0; iMethod<4; ++iMethod) if (!(iMethod==0&&samples[0].size()==0)){ // Print Top row for each method if (latex) { if (iMethod==0) { printf("\\hline\n"); printf("Method 2 & A & B & C & D = B*C/A & D obs. & Ratio pred./obs. & Pull & KS test\\\\\n"); } else if (iMethod==1){ printf("\\hline\n"); printf("Method 1 & A & B & C & D = B*C/A & D obs. & Ratio pred./obs. & Pull & KS test\\\\\n"); } printf("\\hline\n"); } else { std::stringstream r_sb_cut; if (R_CUT_LOW==0) r_sb_cut<<"R<"<<R_CUT; else r_sb_cut<<R_CUT_LOW<<"<R<"<<R_CUT; const char* prime = ABCD_prime ? "'" : ""; //if (iMethod==0) printf("| *Sample* | *A (DPhi>2.8, SB)* | *B (DPhi<2.8, SB)* | *C (DPhi>2.8, Sig.B.)* | - | *D = B*C/A pred.* | *D (DPhi<2.8, Sig.B.) obs.* | *Ratio pred./obs.* |\n"); //else if (iMethod==1) printf("| *Sample* | *A (R<%1.1f, SB)* | *B (R>%1.1f, SB)* | *C (R<%1.1f, Sig.B.)* | *D = B (R fit, SB) * C/A pred.* | *D = B*C/A pred.* | *D (R>%1.1f, Sig.B.) obs.* | *Ratio pred./obs.* | \n", R_CUT, R_CUT, R_CUT, R_CUT); if (iMethod==0) printf("| *Sample* | *A (DPhi>%1.1f, %s)* | *B (DPhi<%1.1f, %s)* | *C (DPhi>%1.1f, R>0.4)* | *D = B*C/A pred.* | *D (DPhi<%1.1f, R>0.4) obs.* | *Ratio pred./obs.* | *Pull (pred-obs)/error* | *KS test* |\n", DPHI_CUT, r_sb_cut.str().c_str(), DPHI_CUT, r_sb_cut.str().c_str(), DPHI_CUT, DPHI_CUT); else if (iMethod==1) printf("| *Sample* | *A%s (%s, <2 tag)* | *B%s (R>%1.1f, <2 tag)* | *C%s (%s, 2 tag)* | *D%s = B%s*C%s/A%s pred.* | *D%s (R>%1.1f, 2 tag) obs.* | *Ratio pred./obs.* | *Pull (pred-obs)/error* | *KS test* |\n", prime, r_sb_cut.str().c_str(), prime, R_CUT, prime, r_sb_cut.str().c_str(), prime, prime, prime, prime, prime, R_CUT); } TH1D *h_side_sum, *h_signal_sum; for (size_t iSample = 0; iSample<samples[iMethod].size(); ++iSample) { std::string canname = iMethod==0 ? std::string("DPhiBins")+(ABCD_prime ? "/RBins_0To1HadTop_" : "/RBins_2HadTop_")+samples[iMethod][iSample] : iMethod==1 ? std::string("RFine/Tau32Cuts_")+(ABCD_prime ? "Fail" : "Pass")+"DPhiCut_"+samples[iMethod][iSample] : iMethod==2 ? std::string("RFine/Tau32Cuts_")+(ABCD_prime ? "Fail" : "Pass")+"DPhiCut_Background" : iMethod==3 ? std::string("RFine/Tau32Cuts_")+(ABCD_prime ? "Fail" : "Pass")+"DPhiCut_"+samples[iMethod][iSample] : ""; TCanvas *can = (TCanvas*)(f->Get(canname.c_str())); can = (TCanvas*)can->Clone(); can->Draw(); TH1D *h_side = (TH1D*)can->GetListOfPrimitives()->At(i_h_side[iMethod]); TH1D *h_signal = (TH1D*)can->GetListOfPrimitives()->At(i_h_signal[iMethod]); // Simulate different cross section by scaling a certain background if (iMethod==1) { TH1D *h_side_temp_scaled = (TH1D*)h_side->Clone(); h_side_temp_scaled->Scale(scale_factors[iSample]); TH1D *h_signal_temp_scaled = (TH1D*)h_signal->Clone(); h_signal_temp_scaled->Scale(scale_factors[iSample]); if (iSample==0) { h_side_sum = h_side_temp_scaled; h_signal_sum = h_signal_temp_scaled; } else { h_side_sum->Add(h_side_temp_scaled); h_signal_sum->Add(h_signal_temp_scaled); } } else if (iMethod==2) { h_side = h_side_sum; h_signal = h_signal_sum; } TH1D *h_pred =(TH1D*)h_side->Clone(); if (iMethod!=0&&rebin>1) { h_side->Rebin(rebin); h_signal->Rebin(rebin); h_pred->Rebin(rebin); } TLegend *leg = (TLegend*)can->GetListOfPrimitives()->At(can->GetListOfPrimitives()->GetEntries()-1); leg->SetX1(0.35); leg->SetX2(0.65); leg->SetY1(0.6); // Add ratio plot int y1 = 350; int y2 = 150; int mid2 = 10; can->Divide(1,2); // Pad 1 (80+500+20 x 40+500) TVirtualPad* p = can->cd(1); p->SetPad(0,(y2+60+mid2)/(y1+y2+100.0+mid2),1,1); p->SetTopMargin(40.0/(y1+40)); p->SetBottomMargin(0); p->SetRightMargin(0.05); p->SetLogy(1); h_side->GetYaxis()->SetRangeUser(1.00001e-4,1e4); h_side->Draw("HIST"); h_signal->Draw("SAMEHISTE1"); leg->Draw(); // Pad 2 (80+500+20 x 200+60) p = can->cd(2); p->SetGrid(0,1); p->SetPad(0,0,1,(y2+60+mid2)/(y1+y2+100.0+mid2)); p->SetTopMargin(((float)mid2)/(y2+60+mid2)); p->SetBottomMargin(60.0/(y2+60+mid2)); p->SetRightMargin(0.05); TH1D* ratio = (TH1D*)h_signal->Clone(); TH1D* div = (TH1D*)h_side->Clone(); //ratio->Scale(1/ratio->GetSumOfWeights()); double sum_bins_ratio = iMethod==0 ? ratio->Integral(): ratio->Integral(ratio->FindBin(R_CUT_LOW),ratio->FindBin(Rranges_ABCD[iMethod][3])); ratio->Scale(1/sum_bins_ratio); ratio->SetTitleSize(32.0/(y2+60+mid2),"xyz"); ratio->SetLabelSize(20.0/(y2+60+mid2),"xyz"); //ratio->Scale(1/div->GetSumOfWeights()); double sum_bins_div = iMethod==0 ? div->Integral(): div->Integral(div->FindBin(R_CUT_LOW),div->FindBin(Rranges_ABCD[iMethod][3])); div->Scale(1/sum_bins_div); ratio->Divide(div); //ratio->GetYaxis()->SetRangeUser(0,2); ratio->GetXaxis()->SetTitleOffset(0.7); ratio->GetYaxis()->SetNdivisions(305); ratio->GetYaxis()->SetTitle("Ratio (Norm.)"); ratio->GetYaxis()->SetTitleOffset(0.4); ratio->SetTitleSize(24.0/(y2+60+mid2),"y"); ratio->SetTitle(""); ratio->SetMarkerStyle(20); ratio->SetMarkerColor(1); ratio->SetLineColor(1); ratio->GetYaxis()->SetRangeUser(0,4); ratio->Draw("PE1"); TLine* l = new TLine(ratio->GetXaxis()->GetXmin(), 1, ratio->GetXaxis()->GetXmax(), 1); l->SetLineWidth(2); //l->SetLineColor(2); l->SetLineStyle(2); l->Draw(); gPad->Update(); // Fit ratio //TF1 *fit_ratio; //if (iMethod==1) { // fit_ratio = new TF1("fit_ratio","pol0", Rranges_ABCD[iMethod][0], Rranges_ABCD[iMethod][1]); // fit_ratio->SetLineColor(1); // ratio->Fit("fit_ratio","RE"); // fit_ratio->SetRange(Rranges_ABCD[iMethod][0], Rranges_ABCD[iMethod][2]); // fit_ratio->Draw("SAME"); //} p = can->cd(1); // calculate integrals double integral[2][2] = { { 0, 0 }, { 0, 0 } }; double integral_error[2][2] = { { 0, 0 }, { 0, 0 } }; double nevt[2][2] = { { 0, 0 }, { 0, 0 } }; //std::cout<<samples[iMethod][iSample]<<":"<<std::endl; for (int i=0; i<2; ++i) { for (int bin=1; bin<=h_side->GetNbinsX(); ++bin) { if (h_signal->GetXaxis()->GetBinLowEdge(bin)>=Rranges_ABCD[iMethod][i*2] && h_signal->GetXaxis()->GetBinUpEdge(bin)<=Rranges_ABCD[iMethod][i*2+1]) { //std::cout<<bin<<"="<<h_side->GetBinCenter(bin); //if (i==0) std::cout<<" in, "; //else std::cout<<" out, "; double c0 = h_side->GetBinContent(bin), c1 = h_signal->GetBinContent(bin); double e0 = h_side->GetBinError(bin), e1 = h_signal->GetBinError(bin); //std::cout<<h_signal->GetBinError(bin)<<" "<<sqrt(c1*weight[iSample])<<std::endl; if (baderror&&iMethod==1) { e0 = sqrt(c0*weight[iSample]); e1 = sqrt(c1*weight[iSample]); } nevt[0][i] += (int)(c0*c0/(e0*e0) + 0.5); nevt[1][i] += (int)(c1*c1/(e1*e1) + 0.5); integral[0][i] += c0; integral[1][i] += c1; //if (iMethod==1) { // weight bin by projected ratio (correction) // double bincent = h_signal->GetXaxis()->GetBinLowEdge(bin); // integral[0][1] *= fit_ratio->Eval(bincent); //} integral_error[0][i] += e0*e0; integral_error[1][i] += e1*e1; //if (iSample==0&&e1>0) std::cout<<bin<<" "<<c1<<" +- "<<e1*e1<<" nevt = "<<((int)(c1*c1/(e1*e1) + 0.5))<<std::endl; } } //if (iSample==1&&i==1) std::cout<<integral[1][i]<<" +- "<<integral_error[1][i]<<std::endl; integral_error[0][i] = sqrt(integral_error[0][i]); integral_error[1][i] = sqrt(integral_error[1][i]); } //std::cout<<nevt[1][1]<<std::endl; // predict yields using 2 methods (ABCD and constrained R-shape fit method combined) // ABCD method double a = integral[0][0], b = integral[0][1], c = integral[1][0], d = integral[1][1]; double a_err = integral_error[0][0], b_err = integral_error[0][1], c_err = integral_error[1][0], d_err = integral_error[1][1]; // Calculate error // z = x / y -> z_err = sqrt( (x*x*y_err*y_err + y*y*x_err*x_err)/(y*y*y*y) ) // z = x * y -> z_err = sqrt ( x*x*y_err*y_err + y*y*x_err*x_err ) double c_per_a_err = sqrt((c*c*a_err*a_err + a*a*c_err*c_err)/(a*a*a*a)); double d_abcd = b * (c/a), d_abcd_err = sqrt(b*b*c_per_a_err*c_per_a_err + (c/a)*(c/a)*b_err*b_err); double d_nevt = nevt[1][1]; double d_ratio = d_abcd / d; double d_ratio_err = sqrt((d_err/d)*(d_err/d) + (d_abcd_err/d_abcd)*(d_abcd_err/d_abcd))*d_ratio; double d_pull = (d_abcd-d)/sqrt(d_abcd_err*d_abcd_err + d_err*d_err); // Scaled plot h_pred->Scale(c/a); h_pred->SetLineColor(1); h_pred->SetLineStyle(2); h_pred->Draw("SAMEHIST"); leg->AddEntry(h_pred, "Prediction (ABCD)", "l"); double fit_integral[2][2], fit_integral_error[2][2], d_fit_comb = 0, d_fit_comb_err = 0; if (iMethod==1) { // Fit in the full range of NTop Sideband // Do fitting and calculate integrals TF1 *fit_side = new TF1("NTopSide_fit","exp([0]+[1]*x)", iMethod==2 ? 0.2 : sideband_fit_low_range[iSample], Rranges_ABCD[iMethod][3]); fit_side->SetLineColor(h_side->GetLineColor()); h_side->Fit("NTopSide_fit","QRE"); //fit_side->Draw("SAME"); double Rranges_ACfit[3] = { sideband_fit_low_range[iSample], Rranges_ABCD[iMethod][2], Rranges_ABCD[iMethod][3] }; for (int i=0; i<2; ++i) { fit_integral[0][i] = fit_side->Integral(Rranges_ACfit[i], Rranges_ACfit[i+1])/h_signal->GetXaxis()->GetBinWidth(1); fit_integral_error[0][i] = fit_side->IntegralError(Rranges_ACfit[i], Rranges_ACfit[i+1])/h_signal->GetXaxis()->GetBinWidth(1); } double par0 = fit_side->GetParameter(0), par0_error = fit_side->GetParError(0); double par1 = fit_side->GetParameter(1), par1_error = fit_side->GetParError(1); double par1min, par1max; fit_side->GetParLimits(1, par1min, par1max); // Fit in the Signal region // Fitting in sideband, get B area under curve and scale by C/A TF1 *fit_signal = new TF1("NTopSignal_RSide_fit","exp([0]+[1]*x)", Rranges_ACfit[0], Rranges_ABCD[iMethod][3]); fit_signal->SetLineColor(h_signal->GetLineColor()); //fit_signal->SetParameter(1, par1); //fit_signal->SetParLimits(1, par1min, par1max); h_signal->Fit("NTopSignal_RSide_fit","QREB"); //fit_signal->Draw("SAME"); for (int i=0; i<2; ++i) { fit_integral[1][i] = fit_signal->Integral(Rranges_ACfit[i], Rranges_ACfit[i+1])/h_signal->GetXaxis()->GetBinWidth(1); fit_integral_error[1][i] = fit_signal->IntegralError(Rranges_ACfit[i], Rranges_ACfit[i+1])/h_signal->GetXaxis()->GetBinWidth(1); } d_fit_comb = fit_integral[0][1] * (c/a); d_fit_comb_err = sqrt(fit_integral[0][1]*fit_integral[0][1]*c_per_a_err*c_per_a_err + (c/a)*(c/a)*fit_integral_error[0][1]*fit_integral_error[0][1]); TF1 *fit_pred = new TF1("Predicted_fit","exp([0]+[1]*x)", Rranges_ACfit[0], Rranges_ACfit[2]); fit_pred->SetLineColor(1); fit_pred->SetLineStyle(2); fit_pred->FixParameter(0, par0+std::log(c/a)); fit_pred->FixParameter(1, par1); h_signal->Fit("Predicted_fit","QREB+"); //fit_pred->Draw("SAME"); } // Save plot if (iMethod==3) samples[iMethod][iSample] = "T1tttt"; std::string name = samples[iMethod][iSample]; if (iMethod==2) name = "AllBkg"; if (save) can->SaveAs((out+"BkgEst/ABCD_closure_"+name+"."+ext).c_str()); // Check compatibility of prediction to observed distribution double ks_test = h_pred->KolmogorovTest(h_signal); if (iMethod==1) { sum_a += a; sum_b += b; sum_c += c; sum_d += d; sum_a_err += a_err*a_err; sum_b_err += b_err*b_err; sum_c_err += c_err*c_err; sum_d_err += d_err*d_err; sum_d_abcd += d_abcd; sum_d_abcd_err += d_abcd_err*d_abcd_err; sum_b_fit += fit_integral[0][1]; sum_b_fit_err += fit_integral_error[0][1]*fit_integral_error[0][1]; sum_d_fit += fit_integral[1][1]; sum_d_fit_err += fit_integral_error[1][1]*fit_integral_error[1][1]; sum_d_fit_comb += d_fit_comb; sum_d_fit_comb_err += d_fit_comb_err*d_fit_comb_err; sum_d_nevt += d_nevt; //printf(" %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f |\n", d_fit_comb, d_fit_comb_err, d_abcd, d_abcd_err, d, d_err, d_ratio, d_ratio_err); } if (latex) { printf("%s & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ &", samples[iMethod][iSample].c_str(), a, a_err, b, b_err, c, c_err); printf(" $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & %.2f & %.2f \\\\\n", d_abcd, d_abcd_err, d, d_err, d_ratio, d_ratio_err, d_pull, ks_test); } else { printf("| %s | %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f |", samples[iMethod][iSample].c_str(), a, a_err, b, b_err, c, c_err); printf(" %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f | %.2f |\n", d_abcd, d_abcd_err, d, d_err, d_ratio, d_ratio_err, d_pull, ks_test); } // Combining best methods if ((iMethod==0&&iSample==0)||(iMethod==1&&iSample!=0)) { comb_d_abcd += d_abcd; comb_d += d; comb_d_abcd_err += d_abcd_err*d_abcd_err; comb_d_err += d_err*d_err; } } if (iMethod==1) { sum_a_err = sqrt(sum_a_err); sum_b_err = sqrt(sum_b_err); sum_c_err = sqrt(sum_c_err); sum_d_err = sqrt(sum_d_err); sum_b_fit_err = sqrt(sum_b_fit_err); sum_d_fit_err = sqrt(sum_d_fit_err); sum_d_fit_comb_err = sqrt(sum_d_fit_comb_err); double sum_d_ratio = sum_d_abcd / sum_d; double sum_d_ratio_err = sqrt((sum_d_err/sum_d)*(sum_d_err/sum_d) + (sum_d_abcd_err/sum_d_abcd)*(sum_d_abcd_err/sum_d_abcd))*sum_d_ratio; double sum_d_pull = (sum_d_abcd-sum_d)/sqrt(sum_d_abcd_err*sum_d_abcd_err + sum_d_err*sum_d_err); if (latex) { printf("\\hline\n"); printf("Sum Bkg. & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ &", sum_a, sum_a_err, sum_b, sum_b_err, sum_c, sum_c_err); printf(" $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & %.2f & \\\\\n", sum_d_abcd, sum_d_abcd_err, sum_d, sum_d_err, sum_d_ratio, sum_d_ratio_err, sum_d_pull); } else { //printf("| Sum Bkg.| %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f |", sum_a, sum_a_err, sum_b_fit, sum_b_fit_err, sum_b, sum_b_err, sum_c, sum_c_err); printf("| Sum Bkg.| %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f |", sum_a, sum_a_err, sum_b, sum_b_err, sum_c, sum_c_err); //printf(" %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f |\n", sum_d_fit_comb, sum_d_fit_comb_err, sum_d_abcd, sum_d_abcd_err, sum_d, sum_d_err, sum_d_ratio, sum_d_ratio_err); printf(" %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f | - |\n", sum_d_abcd, sum_d_abcd_err, sum_d, sum_d_err, sum_d_ratio, sum_d_ratio_err, sum_d_pull); } } else if (iMethod==2&&samples[0].size()) { double comb_d_ratio = comb_d_abcd / comb_d; double comb_d_ratio_err = sqrt((comb_d_err/comb_d)*(comb_d_err/comb_d) + (comb_d_abcd_err/comb_d_abcd)*(comb_d_abcd_err/comb_d_abcd))*comb_d_ratio; double comb_d_pull = (comb_d_abcd-comb_d)/sqrt(comb_d_abcd_err*comb_d_abcd_err + comb_d_err*comb_d_err); if (latex) { printf("\\hline\n"); printf("\\hline\n"); printf("Combined Bkg. & & & & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & $%.2f \\pm %.2f$ & %.2f & \\\\\n", comb_d_abcd, comb_d_abcd_err, comb_d, comb_d_err, comb_d_ratio, comb_d_ratio_err, comb_d_pull); printf("\\hline\n"); } else { printf("| Combined Bkg.| | | | %.2f +- %.2f | %.2f +- %.2f | %.2f +- %.2f | %.2f | - |\n", comb_d_abcd, comb_d_abcd_err, comb_d, comb_d_err, comb_d_ratio, comb_d_ratio_err, comb_d_pull); } } } if (latex) { printf("\\hline\n"); printf("\\end{tabular}\n"); printf("\\end{center}\n"); printf("\\end{table*}\n"); } if (save) gApplication->Terminate(); }
void DrawTwoInPad(TVirtualPad* p, Int_t sub, TH1* h1, TH1* h2, Bool_t ratio, Bool_t logy=false, Bool_t legend=false) { TVirtualPad* pp = p->cd(sub); pp->SetRightMargin(0.02); pp->SetLeftMargin(0.10); TVirtualPad* ppp = pp; if (ratio) { pp->Divide(1,2,0,0); ppp = pp->cd(1); ppp->SetRightMargin(0.02); } if (logy) ppp->SetLogy(); TH1* hs[] = { h1, h2, 0 }; if (h1->GetMaximum() < h2->GetMaximum()) { hs[0] = h2; hs[1] = h1; } TH1** ph = hs; Double_t size = (ratio ? 0.1 : 0.05); Double_t off = (ratio ? 0.6 : 0.5); h1->SetFillStyle(3004); h2->SetFillStyle(3005); while (*ph) { TString opt("hist"); if (ph != hs) opt.Append(" same"); TH1* copy = (*ph)->DrawCopy(opt); copy->GetXaxis()->SetLabelSize(2*size); copy->GetYaxis()->SetLabelSize(size); copy->GetYaxis()->SetTitleSize(size); copy->GetYaxis()->SetTitleOffset(off); copy->SetYTitle(copy->GetTitle()); copy->SetTitle(""); copy->SetDirectory(0); ph++; } TString s1 = h1->GetYaxis()->GetTitle(); TString s2 = h2->GetYaxis()->GetTitle(); if (legend) { TLegend* l = new TLegend(0.6, 0.1, 0.9, 0.9); l->SetBorderSize(0); TLegendEntry* e = l->AddEntry("dummy", s1, "lf"); l->SetFillColor(kWhite); e->SetFillColor(kBlack); e->SetFillStyle(h1->GetFillStyle()); e = l->AddEntry("dummy", s2, "lf"); e->SetFillColor(kBlack); e->SetFillStyle(h2->GetFillStyle()); l->Draw(); } if (!ratio) return; ppp = pp->cd(2); ppp->SetRightMargin(0.02); TH1* r = static_cast<TH1*>(h1->Clone(Form("ratio%s", h1->GetName()))); r->SetDirectory(0); r->SetTitle(""); r->GetXaxis()->SetLabelSize(size); r->GetYaxis()->SetLabelSize(size); r->GetYaxis()->SetTitleSize(0.9*size); r->GetYaxis()->SetTitleOffset(0.9*off); r->SetMarkerStyle(20); r->SetMarkerColor(h1->GetFillColor()+1); r->SetFillStyle(3007); r->SetYTitle(Form("#frac{%s}{%s}", s1.Data(), s2.Data())); // r->Add(h2, -1); // r->Divide(h1); if (!r->IsA()->InheritsFrom(TProfile::Class())) { r->GetSumw2()->Set(0); // r->Sumw2(false); h2->GetSumw2()->Set(0); // h2->Sumw2(false); } r->Divide(h2); Printf("%s", r->GetName()); for (UShort_t bin = 1; bin <= r->GetNbinsX(); bin++) { Printf(" bin # %2d: Diff=%g+/-%g", bin, r->GetBinContent(bin), r->GetBinError(bin)); r->SetBinError(bin, 0); } r->GetSumw2()->Set(0); //r->Sumw2(false); r->SetMarkerSize(4); r->SetMaximum(r->GetMaximum()*1.2); r->SetMinimum(r->GetMinimum()*0.8); r->Draw("hist text30"); p->Modified(); p->Update(); p->cd(); }