#include #include #include #include #include "TRandom3.h" #include "TStyle.h" #include "TH1D.h" #include "TCanvas.h" #include "TPad.h" template std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } std::unique_ptr genHisto(int idx) { static TRandom3 r; char name[8]; sprintf(name,"histo_%d",idx); std::unique_ptr histo = make_unique(name,"",100,-5,5); for (int i = 0; i < 1000; ++i) histo->Fill(r.Gaus()); return histo; } std::pair< std::unique_ptr,std::unique_ptr > makeSubpads(int idx) { const double pad = 0.07; const double frac = 0.2; const double gap = 0.01; char tname[12]; sprintf(tname,"histo_%d_pad",idx); char bname[12]; sprintf(bname,"ratio_%d_pad",idx); std::unique_ptr padT = make_unique(tname, tname, 0.0,pad+frac+gap,1.0,1.0); std::unique_ptr padB = make_unique(bname, bname, 0.0,pad,1.0,frac+pad); return { std::move(padT), std::move(padB) }; } void jwimberl () { // STYLE const double width = 800; const double height = 500; gStyle->SetOptStat(0); const int font = 133; gStyle->SetTextFont(font); gStyle->SetLabelFont(font,"x"); gStyle->SetLabelFont(font,"y"); gStyle->SetTitleFont(font); gStyle->SetTitleFont(font,"x"); gStyle->SetTitleFont(font,"y"); const double size = 20; gStyle->SetTextSize(size); gStyle->SetLabelSize(size,"x"); gStyle->SetLabelSize(size,"y"); gStyle->SetTitleSize(1.2*size,"x"); gStyle->SetTitleSize(1.2*size,"y"); // DATA const int N = 2; std::unique_ptr nomHisto = genHisto(0); std::array,N> histos; std::array,N> ratios; for (int i = 0 ; i < N; ++i) { histos[i] = genHisto(i+1); ratios[i] = std::unique_ptr(static_cast(histos[i]->Clone())); ratios[i]->Divide(nomHisto.get()); ratios[i]->GetYaxis()->SetNdivisions(603); ratios[i]->SetMinimum(0.0); ratios[i]->SetMinimum(3.0); ratios[i]->GetXaxis()->SetTitleOffset(12.0); ratios[i]->GetXaxis()->SetTitle("TEST LABEL"); } // SIMPLE PLOT TCanvas csimple("csimple","csimple",width,height*N); csimple.Divide(1,N); for (int i = 0 ; i < N; ++i) { csimple.cd(i+1); histos[i]->Draw(); } csimple.Print("csimple.png"); csimple.Print("csimple.pdf"); // COMPLEX PLOT TCanvas ccomplex("ccomplex","ccomplex",width,height*N); ccomplex.SetFillStyle(4000); ccomplex.Divide(1,N); std::array,std::unique_ptr>,N> pads; for (int i = 0 ; i < N; ++i) { ccomplex.cd(i+1); pads[i] = makeSubpads(i); pads[i].first->Draw(); pads[i].second->Draw(); pads[i].first->cd(); histos[i]->Draw(); pads[i].second->cd(); ratios[i]->Draw(); } ccomplex.Print("ccomplex.png"); ccomplex.Print("ccomplex.pdf"); }