// part1 : model building RooRealVar ST("ST", "ST", 500, 400, 1000); // observable RooRealVar nSignal("nSignal", "signal events", 50, 0, 100); nSignal.setConstant(true); RooRealVar nTTbar("nTTbar", "ttbar events", 85, 40, 160); // nuisance parameter RooRealVar nOtherBack("nOtherBack", "other back events", 5, 0, 10); nOtherBack.setConstant(true); RooRealVar mu("mu", "signal strength", 1, 0, 1); // parameter of interest RooProduct muTimesSignal("muTimesSignal", "mu x signal", RooArgSet(mu, nSignal)); // pdfSignalST, pdfTTbarST etc. are fixed shapes from histograms RooExtendPdf * epdfSignalST = new RooExtendPdf("epdfSignalST", "signal x PDF(ST)", *pdfSignalST, muTimesSignal); RooExtendPdf * epdfTTbarST = new RooExtendPdf("epdfTTbarST", "ttbar x PDF(ST)", *pdfTTbarST, nTTbar); RooExtendPdf * epdfOtherBackST = new RooExtendPdf("epdfOtherBackST", "other back x PDF(ST)", *pdfOtherBackST, nOtherBack); RooRealVar nTTbarMean("nTTbarMean", "mean nTTbar", 85, 70, 110); nTTbarMean.setConstant(true); RooRealVar nTTbarSigma("nTTbarSigma", "sigma nTTbar", 5, 1, 10); nTTbarSigma.setConstant(true); RooGaussian * prior_nTTbar = new RooGaussian("prior_nTTbar", "prior_nTTbar", nTTbar, nTTbarMean, nTTbarSigma); RooProdPdf * epdfTTbarSTFinal = new RooProdPdf("epdfTTbarSTFinal", "conditional ttbar PDF", *prior_nTTbar, Conditional(*epdfTTbarST, ST)); RooAddPdf * model = new RooAddPdf("model", "model", RooArgList(*epdfTTbarSTFinal, *epdfOtherBackST, *epdfSignalST)); // part2, fitting and plotting RooFitResult * result = model->fitTo(*data, Save()); nll->SetName("nll"); RooMinuit minuit(*nll); minuit.migrad(); result = minuit.save(); const double nllMin = nll->getVal(); canvas1->cd(1); RooPlot * plot1 = mu->frame(Title("-ln(L) vs mu")); nll->plotOn(plot1, ShiftToZero()); plot1->Draw(); canvas1->cd(2); RooPlot * plot2 = nTTbar->frame(Title("-ln(L) vs nTTbar")); nll->plotOn(plot2, ShiftToZero()); plot2->Draw(); canvas1->cd(3); TH1 * h_nll = nll->createHistogram("h_nll", *mu, Binning(50, 0, 0.2), YVar(*nTTbar, Binning(20, 40, 120))); h_nll->SetTitle("-ln(L) vs (mu, nTTbar)"); h_nll->Draw("surf"); canvas1->cd(4); TString tmp; tmp += nllMin; tmp += " )"; RooFormulaVar * likl = new RooFormulaVar("likl", "L", "exp(-nll + "+tmp, RooArgList(*nll)); TH1 * hPDF = model->createHistogram("hPDF", *mu, Binning(50, 0, 1), YVar(*nTTbar, Binning(20, 70, 100)) , ConditionalObservables(*nTTbar)); hPDF->SetTitle("L vs (mu, nTTbar)"); hPDF->Draw("SURF1"); canvas1->cd(5); TH2D * manL = new TH2D("manL", "manual calc. of L", 50, 0, 1, 20, 70, 100); manL->SetXTitle(mu->GetTitle()); manL->SetYTitle(nTTbar->GetTitle()); for(int i = 1; i <= manL->GetNbinsX(); i++) { double x = manL->GetXaxis()->GetBinCenter(i); mu->setVal(x); for(int j = 1; j <= manL->GetNbinsY(); j++) { double y = manL->GetYaxis()->GetBinCenter(j); nTTbar->setVal(y); manL->SetBinContent(i, j, likl->getVal()); } } manL->Draw("SURF1"); canvas1->cd(6); TH1 * h_likl = likl->createHistogram("h_likl", *mu, Binning(50, 0, 1), YVar(*nTTbar, Binning(20, 70, 100))); h_likl->SetTitle("L vs (mu, nTTbar)"); h_likl->Draw(); canvas1->cd(7); mu->setVal(muBest); nTTbar->setVal(nTTbarBest); RooPlot * plot3 = minuit.contour(*mu, *nTTbar, 1, 2, 3) ; plot3->SetTitle("RooMinuit contour plot"); plot3->Draw();