%%cpp -d #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooPolynomial.h" #include "RooIntegralMorph.h" #include "TCanvas.h" #include "TAxis.h" #include "RooPlot.h" #include "TH1.h" using namespace RooFit; RooRealVar x("x", "x", -20, 20); RooRealVar g1mean("g1mean", "g1mean", -10); RooGaussian g1("g1", "g1", x, g1mean, 2.0); RooPolynomial g2("g2", "g2", x, RooArgSet(-0.03, -0.001)); RooRealVar alpha("alpha", "alpha", 0, 1.0); x.setBins(1000, "cache"); alpha.setBins(50, "cache"); RooIntegralMorph lmorph("lmorph", "lmorph", g1, g2, x, alpha); RooPlot *frame1 = x.frame(); g1.plotOn(frame1); g2.plotOn(frame1); alpha.setVal(0.125); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.25); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.375); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.50); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.625); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.75); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.875); lmorph.plotOn(frame1, LineColor(kRed)); alpha.setVal(0.95); lmorph.plotOn(frame1, LineColor(kRed)); TH1 *hh = lmorph.createHistogram("hh", x, Binning(40), YVar(alpha, Binning(40))); hh->SetLineColor(kBlue); alpha = 0.8; std::unique_ptr data{lmorph.generate(x, 1000)}; lmorph.setCacheAlpha(true); lmorph.fitTo(*data, Verbose(true), PrintLevel(-1)); RooPlot *frame2 = x.frame(Bins(100)); data->plotOn(frame2); lmorph.plotOn(frame2); RooPlot *frame3 = alpha.frame(Bins(100), Range(0.1, 0.9)); std::unique_ptr nll{lmorph.createNLL(*data)}; nll->plotOn(frame3, ShiftToZero()); lmorph.setCacheAlpha(false); TCanvas *c = new TCanvas("rf705_linearmorph", "rf705_linearmorph", 800, 800); c->Divide(2, 2); c->cd(1); gPad->SetLeftMargin(0.15); frame1->GetYaxis()->SetTitleOffset(1.6); frame1->Draw(); c->cd(2); gPad->SetLeftMargin(0.20); hh->GetZaxis()->SetTitleOffset(2.5); hh->Draw("surf"); c->cd(3); gPad->SetLeftMargin(0.15); frame3->GetYaxis()->SetTitleOffset(1.4); frame3->Draw(); c->cd(4); gPad->SetLeftMargin(0.15); frame2->GetYaxis()->SetTitleOffset(1.4); frame2->Draw(); return; gROOT->GetListOfCanvases()->Draw()