void test(){ using namespace RooFit; RooRealVar x("x", "y", -10, 10); x.setBins(10); RooRealVar y("y", "y", 0, 100); y.setBins(20); //Signal region and backgound region RooCategory cat("cat", "cat"); cat.defineType("SR", 0); cat.defineType("BR", 1); //2D setup for signal RooRealVar meanS("meanS", "meanS", 0); RooRealVar widthS("widthS", "widthS", 3); RooGaussian gS("gS", "gS", x, meanS, widthS); RooRealVar tauS("tauS", "tauS", -0.10); RooExponential eS("eS", "eS", y, tauS); RooProdPdf modelS("modelS", "modelS", gS, eS); // 2D setup for background RooRealVar meanB("meanB", "meanB", -1); RooRealVar widthB("widthB", "widthB", 5); RooGaussian gB("gB", "gB", x, meanB, widthB); RooRealVar tauB("tauB", "tauV", -0.30); RooExponential eB("eB", "eB", y, tauB); RooProdPdf modelB("modelB", "modelB", gB, eB); //Signal region is mostly Signal and backgeound region is mostly background //models for signal and background RooRealVar s("s", "s", 100000); RooRealVar b("b", "b", 100000); RooRealVar eff_s("eff_s", "eff_s", 0.8); RooRealVar eff_b("eff_b", "eff_b", 0.1); // number of events in the signal region is s*eff_s +b*eff_b RooFormulaVar sSR("sSR", "s*eff_s", RooArgList(s, eff_s)); RooFormulaVar sBR("sBR", "s*(1-eff_s)", RooArgList(s, eff_s)); // number of events in the background region is s*(1-eff_s) +b*(1-eff_b) RooFormulaVar bSR("bSR", "b*eff_b", RooArgList(b, eff_b)); RooFormulaVar bBR("bBR", "b*(1-eff_b)", RooArgList(b, eff_b)); //models for SR and BR RooAddPdf modelSR("modelSR", "modelSR", RooArgList(modelS, modelB), RooArgList(sSR, bSR)); RooAddPdf modelBR("modelBR", "modelBR", RooArgList(modelS, modelB), RooArgList(sBR, bBR)); RooSimultaneous modelTotal("modelTotal", "modelTotal", cat); modelTotal.addPdf(modelSR, "SR"); modelTotal.addPdf(modelBR, "BR"); //generate the individual components to check the normalizations when plotting cat.setLabel("SR"); RooDataSet* dataS_SR = modelS.generate(RooArgSet(cat, x, y), sSR.getValV()); cat.setLabel("BR"); RooDataSet* dataS_BR = modelS.generate(RooArgSet(cat, x, y), sBR.getValV()); cat.setLabel("SR"); RooDataSet* dataB_SR = modelB.generate(RooArgSet(cat, x, y), bSR.getValV()); cat.setLabel("BR"); RooDataSet* dataB_BR = modelB.generate(RooArgSet(cat, x, y), bBR.getValV()); RooDataSet* data = (RooDataSet*) dataS_SR->Clone(); data->append(*dataS_BR); data->append(*dataB_SR); data->append(*dataB_BR); RooPlot* frameX_SR = x.frame(); data->plotOn(frameX_SR, Cut("cat==cat::SR")); dataS_SR->plotOn(frameX_SR, MarkerColor(kRed), LineWidth(0)); modelTotal->plotOn(frameX_SR, Slice(cat, "SR"), ProjWData(*data), Components(modelS), LineColor(kRed)); RooPlot* frameX_BR = x.frame(); data->plotOn(frameX_BR, Cut("cat==cat::BR")); RooPlot* frameY_SR = y.frame(); RooPlot* frameY_BR = y.frame(); data->plotOn(frameY_SR, Cut("cat==cat::SR")); data->plotOn(frameY_BR, Cut("cat==cat::BR")); TCanvas * c = new TCanvas(); c->Divide(2,2); c->cd(1); frameX_SR->Draw(); c->cd(2); frameX_BR->Draw(); c->cd(3); frameY_SR->Draw(); c->cd(4); frameY_BR->Draw(); }