#ifndef __CINT__ #include "RooGlobalFunc.h" #endif #include "RooFit.h" #include "RooRealVar.h" #include "RooCategory.h" #include "RooFormulaVar.h" #include "RooGaussModel.h" #include "RooBDecay.h" #include "RooWorkspace.h" #include "RooSimWSTool.h" #include "RooSimultaneous.h" #include "RooDataSet.h" #include "RooNLLVar.h" #include "RooMinuit.h" #include "RooFitResult.h" #include "RooRealConstant.h" #include "TFile.h" using namespace RooFit; int test( ) { RooRealVar*t = new RooRealVar("t","t",-0.1,15,"ps"); RooCategory*tag = new RooCategory("tag","tag"); tag->defineType("mixed",-1); tag->defineType("unmixed",1); RooCategory*tagCat = new RooCategory("tagCat","tagCat"); tagCat->defineType("cat1",1); tagCat->defineType("cat2",2); tagCat->defineType("cat3",3); tagCat->defineType("cat4",4); tagCat->defineType("cat5",5); RooRealVar*tau = new RooRealVar("tau","tau",1.53,0.4,1.6,"ps"); RooRealVar*dm = new RooRealVar("dm","dm",0.502,0.4,0.6,"ps^{-1}"); RooRealVar*dg = new RooRealVar("dg","dg",0); RooRealVar*omega = new RooRealVar("omega","omega",0.39,0.1,0.45); RooFormulaVar *fcos_S = new RooFormulaVar("f cos S","@0*(1-2*@1)", RooArgList(*tag,*omega)); RooRealVar*mures = new RooRealVar("mu_res","mu_res",0,-0.1,0.1,"ps"); RooRealVar*sires = new RooRealVar("si_res","si_res",0.03,0,0.1,"ps"); RooGaussModel*res = new RooGaussModel("gres","gres",*t,*mures,*sires); RooBDecay*dec = new RooBDecay("dec","dec",*t,*tau,*dg, RooRealConstant::value(1), RooRealConstant::value(0), *fcos_S, RooRealConstant::value(0), *dm, *res, RooBDecay::SingleSided); RooWorkspace*m_workspace = new RooWorkspace("ws","ws"); m_workspace->import(RooArgSet(*dec,*tagCat)); RooSimWSTool*m_simTool = new RooSimWSTool(*m_workspace); RooSimultaneous*m_simPdf = m_simTool->build("model_sim","dec", SplitParam("omega,mu_res","tagCat")); RooDataSet*data = new RooDataSet("data","data", RooArgSet(*tag,*t,*tagCat)); double*eff = new double[5]; eff[0] = 0.35; eff[1] = 0.25; eff[2] = 0.20; eff[3] = 0.15; eff[4] = 0.05; RooDataSet**d1 = new RooDataSet*[5]; for(int i =0;i<5;++i) { std::cout<<"gen "<setVal(0.39-i*0.02); mures->setVal(0.+i*0.005); d1[i] = (RooDataSet*)dec->generate(RooArgSet(*t,*tag), (int)(eff[i]*100000)); tagCat->setIndex(i+1); d1[i]->addColumn(*tagCat); data->append(*d1[i]); } data->Print(); RooNLLVar*m_sig_fit = new RooNLLVar("Sig fit","Sig fit" ,*m_simPdf ,*data, NumCPU(2)); RooMinuit minuit_Sig(*m_sig_fit); minuit_Sig.setStrategy(1); minuit_Sig.optimizeConst(kTRUE); minuit_Sig.setProfile(kTRUE); minuit_Sig.setVerbose(kFALSE); minuit_Sig.setEps(1e-20); minuit_Sig.migrad(); minuit_Sig.hesse(); RooFitResult*m_fullPdfResults = minuit_Sig.save(); m_fullPdfResults->Print("v"); TFile*f= new TFile("out.root","RECREATE"); m_workspace->Write(); m_simPdf->Write(); m_fullPdfResults->Write(); f->Close(); return 0; } //=============================================================================