void rs602_HLFactoryCombinationexample() { using namespace RooStats; using namespace RooFit; // create a card TString card_name("HLFavtoryCombinationexample.rs"); ofstream ofile(card_name); ofile << "// The simplest card for combination\n\n" << "gauss1 = Gaussian(x[0,100],mean1[50,0,100],4);\n" << "flat1 = Polynomial(x,0);\n" << "sb_model1 = SUM(nsig1[120,0,300]*gauss1 , nbkg1[100,0,1000]*flat1);\n" << "gauss2 = Gaussian(x,mean2[80,0,100],5);\n" << "flat2 = Polynomial(x,0);\n" << "sb_model2 = SUM(nsig2[90,0,400]*gauss2 , nbkg2[80,0,1000]*flat2);\n"; ofile.close(); HLFactory hlf("HLFavtoryCombinationexample", card_name, false); hlf.AddChannel("model1","sb_model1","flat1"); hlf.AddChannel("model2","sb_model2","flat2"); RooAbsPdf* pdf=hlf.GetTotSigBkgPdf(); RooCategory* thecat = hlf.GetTotCategory(); RooRealVar* x= static_cast<RooRealVar*>(hlf.GetWs()->arg("x")); RooDataSet* data = pdf->generate(RooArgSet(*x,*thecat),Extended()); // --- Perform extended ML fit of composite PDF to toy data --- pdf->fitTo(*data) ; // --- Plot toy data and composite PDF overlaid --- RooPlot* xframe = x->frame() ; data->plotOn(xframe); thecat->setIndex(0); pdf->plotOn(xframe,Slice(*thecat),ProjWData(*thecat,*data)) ; thecat->setIndex(1); pdf->plotOn(xframe,Slice(*thecat),ProjWData(*thecat,*data)) ; gROOT->SetStyle("Plain"); xframe->Draw(); }
// Combinatorial PDFs void makeCombinatorialPdf( RooWorkspace *w ) { // one in each cat RooCategory *cat = (RooCategory*)w->cat("DataCat"); for ( int i=0; i < cat->numTypes(); i++ ) { cat->setIndex(i); w->factory( Form("Exponential::bkg_pdf_%s( B_s0_DTF_B_s0_M, bkg_exp_p1_%s[-0.002,-0.005,0.] )", cat->getLabel(), cat->getLabel() ) ); defineParamSet( w, Form("bkg_pdf_%s",cat->getLabel()) ); } }
void rs603_HLFactoryElaborateExample() { // --- Prepare the 2 needed datacards for this example --- TString card_name("rs603_card_WsMaker.rs"); ofstream ofile(card_name); ofile << "// The simplest card for combination\n\n"; ofile << "gauss1 = Gaussian(x[0,100],mean1[50,0,100],4);\n"; ofile << "flat1 = Polynomial(x,0);\n"; ofile << "sb_model1 = SUM(nsig1[120,0,300]*gauss1 , nbkg1[100,0,1000]*flat1);\n\n"; ofile << "echo In the middle!;\n\n"; ofile << "gauss2 = Gaussian(x,mean2[80,0,100],5);\n"; ofile << "flat2 = Polynomial(x,0);\n"; ofile << "sb_model2 = SUM(nsig2[90,0,400]*gauss2 , nbkg2[80,0,1000]*flat2);\n\n"; ofile << "echo At the end!;\n"; ofile.close(); TString card_name2("rs603_card.rs"); ofstream ofile2(card_name2); ofile2 << "// The simplest card for combination\n\n"; ofile2 << "gauss1 = Gaussian(x[0,100],mean1[50,0,100],4);\n"; ofile2 << "flat1 = Polynomial(x,0);\n"; ofile2 << "sb_model1 = SUM(nsig1[120,0,300]*gauss1 , nbkg1[100,0,1000]*flat1);\n\n"; ofile2 << "echo In the middle!;\n\n"; ofile2 << "gauss2 = Gaussian(x,mean2[80,0,100],5);\n"; ofile2 << "flat2 = Polynomial(x,0);\n"; ofile2 << "sb_model2 = SUM(nsig2[90,0,400]*gauss2 , nbkg2[80,0,1000]*flat2);\n\n"; ofile2 << "#include rs603_included_card.rs;\n\n"; ofile2 << "echo At the end!;\n"; ofile2.close(); TString card_name3("rs603_included_card.rs"); ofstream ofile3(card_name3); ofile3 << "echo Now reading the included file!;\n\n"; ofile3 << "echo Including datasets in a Workspace in a Root file...;\n"; ofile3 << "data1 = import(rs603_infile.root,\n"; ofile3 << " rs603_ws,\n"; ofile3 << " data1);\n\n"; ofile3 << "data2 = import(rs603_infile.root,\n"; ofile3 << " rs603_ws,\n"; ofile3 << " data2);\n"; ofile3.close(); // --- Produce the two separate datasets into a WorkSpace --- HLFactory hlf("HLFactoryComplexExample", "rs603_card_WsMaker.rs", false); RooRealVar* x = static_cast<RooRealVar*>(hlf.GetWs()->arg("x")); RooAbsPdf* pdf1 = hlf.GetWs()->pdf("sb_model1"); RooAbsPdf* pdf2 = hlf.GetWs()->pdf("sb_model2"); RooWorkspace w("rs603_ws"); RooDataSet* data1 = pdf1->generate(RooArgSet(*x),Extended()); data1->SetName("data1"); w.import(*data1); RooDataSet* data2 = pdf2->generate(RooArgSet(*x),Extended()); data2->SetName("data2"); w.import(*data2); // --- Write the WorkSpace into a rootfile --- TFile outfile("rs603_infile.root","RECREATE"); w.Write(); outfile.Close(); cout << "-------------------------------------------------------------------\n" << " Rootfile and Workspace prepared \n" << "-------------------------------------------------------------------\n"; HLFactory hlf_2("HLFactoryElaborateExample", "rs603_card.rs", false); x = hlf_2.GetWs()->var("x"); pdf1 = hlf_2.GetWs()->pdf("sb_model1"); pdf2 = hlf_2.GetWs()->pdf("sb_model2"); hlf_2.AddChannel("model1","sb_model1","flat1","data1"); hlf_2.AddChannel("model2","sb_model2","flat2","data2"); RooDataSet* data = hlf_2.GetTotDataSet(); RooAbsPdf* pdf = hlf_2.GetTotSigBkgPdf(); RooCategory* thecat = hlf_2.GetTotCategory(); // --- Perform extended ML fit of composite PDF to toy data --- pdf->fitTo(*data) ; // --- Plot toy data and composite PDF overlaid --- RooPlot* xframe = x->frame() ; data->plotOn(xframe); thecat->setIndex(0); pdf->plotOn(xframe,Slice(*thecat),ProjWData(*thecat,*data)) ; thecat->setIndex(1); pdf->plotOn(xframe,Slice(*thecat),ProjWData(*thecat,*data)) ; gROOT->SetStyle("Plain"); xframe->Draw(); }
// total PDF void makeTotalPdf( RooWorkspace *w ) { // constrain the bs->phikst / bd->phikst ratio w->factory( "yield_ratio_bs2phikst_o_bd2phikst[0.,1.]" ); w->factory( "Gaussian::yield_ratio_bs2phikst_o_bd2phikst_constraint( yield_ratio_bs2phikst_o_bd2phikst, 0.113, 0.0287 )" ); // constrain the bd->rhokst / bd->phikst ratio w->factory("yield_ratio_bd2rhokst_o_bd2phikst[0.,1.]" ); w->factory( "Gaussian::yield_ratio_bd2rhokst_o_bd2phikst_constraint( yield_ratio_bd2rhokst_o_bd2phikst, 0.390, 0.130 )" ); // PDG err is 0.130 (relax this for eff) // make a yield for each category RooCategory *cat = (RooCategory*)w->cat("DataCat"); for ( int i=0; i < cat->numTypes(); i++ ) { cat->setIndex(i); w->factory( Form("bkg_y_%s[200,400e3]", cat->getLabel())); w->factory( Form("part_reco_y_%s[100,200e3]", cat->getLabel())); w->factory( Form("bs2kstkst_y_%s[0,20e3]", cat->getLabel())); w->factory( Form("bd2kstkst_y_%s[0,3000]", cat->getLabel())); w->factory( Form("bd2phikst_y_%s[10,5000]", cat->getLabel())); // add bs2phikst yield as constrained ratio w->factory( Form("prod::bs2phikst_y_%s( yield_ratio_bs2phikst_o_bd2phikst, bd2phikst_y_%s )", cat->getLabel(), cat->getLabel()) ); //w->factory( Form("bs2phikst_y_%s[10,5000]", cat->getLabel())); // add bd2rhokst yield as constrained ratio w->factory( Form("prod::bd2rhokst_y_%s( yield_ratio_bd2rhokst_o_bd2phikst, bd2phikst_y_%s )", cat->getLabel(), cat->getLabel()) ); //w->factory( Form("bd2rhokst_y_%s[5,250]", cat->getLabel())); w->factory( Form("lb2pkpipi_y_%s[0,4000]", cat->getLabel())); w->factory( Form("lb2ppipipi_y_%s[0,4000]", cat->getLabel())); } // construct the pdf for each category for ( int i=0; i < cat->numTypes(); i++ ) { cat->setIndex(i); RooArgList *yields = new RooArgList(); yields->add(*w->var( Form("bkg_y_%s" , cat->getLabel()) )); yields->add(*w->var( Form("part_reco_y_%s", cat->getLabel()) )); yields->add(*w->var( Form("bs2kstkst_y_%s", cat->getLabel()) )); yields->add(*w->var( Form("bd2kstkst_y_%s", cat->getLabel()) )); yields->add(*w->var( Form("bd2phikst_y_%s", cat->getLabel()) )); yields->add(*w->function( Form("bs2phikst_y_%s", cat->getLabel()) )); //yields->add(*w->var( Form("bs2phikst_y_%s", cat->getLabel()) )); yields->add(*w->function( Form("bd2rhokst_y_%s", cat->getLabel()) )); //yields->add(*w->var( Form("bd2rhokst_y_%s", cat->getLabel()) )); yields->add(*w->var( Form("lb2pkpipi_y_%s", cat->getLabel()) )); //yields->add(*w->var( Form("lb2ppipipi_y_%s", cat->getLabel()) )); // this guy we scrap RooArgList *pdfs = new RooArgList(); pdfs->add(*w->pdf( Form("bkg_pdf_%s", cat->getLabel()) )); pdfs->add(*w->pdf("part_reco_pdf" )); pdfs->add(*w->pdf("bs2kstkst_mc_pdf" )); pdfs->add(*w->pdf("bd2kstkst_mc_pdf" )); pdfs->add(*w->pdf("bd2phikst_mc_pdf" )); pdfs->add(*w->pdf("bs2phikst_mc_pdf" )); pdfs->add(*w->pdf("bd2rhokst_mc_pdf" )); pdfs->add(*w->pdf("lb2pkpipi_mc_pdf" )); //pdfs->add(*w->pdf("lb2ppipipi_mc_pdf")); // this guy we scrap RooAddPdf *pdf = new RooAddPdf( Form("pdf_%s",cat->getLabel()), "pdf" , *pdfs, *yields); w->import(*pdf); delete pdf; // then make the constrained pdf RooArgSet *prodpdfs = new RooArgSet(); prodpdfs->add( *w->pdf(Form("pdf_%s",cat->getLabel())) ); prodpdfs->add( *w->pdf("yield_ratio_bs2phikst_o_bd2phikst_constraint") ); prodpdfs->add( *w->pdf("yield_ratio_bd2rhokst_o_bd2phikst_constraint") ); RooProdPdf *cpdf = new RooProdPdf( Form("constrained_pdf_%s",cat->getLabel()), "constrained_pdf", *prodpdfs ); w->import(*cpdf); delete cpdf; w->defineSet(Form("pdf_%s_yield_params",cat->getLabel()), *yields); w->defineSet(Form("constrained_pdf_%s_yield_params",cat->getLabel()), *yields); } // now make simultaneous pdf RooSimultaneous *cpdf = new RooSimultaneous( "constrained_pdf", "constrained_pdf", *w->cat("DataCat") ); RooSimultaneous *pdf = new RooSimultaneous( "pdf", "pdf", *w->cat("DataCat") ); for ( int i=0; i < cat->numTypes(); i++ ) { cat->setIndex(i); cpdf->addPdf( *w->pdf( Form("constrained_pdf_%s", cat->getLabel() )), cat->getLabel() ); pdf->addPdf( *w->pdf( Form("pdf_%s", cat->getLabel() )), cat->getLabel() ); } w->import(*cpdf); w->import(*pdf); delete pdf; delete cpdf; }