void Projected2D_Simple() { TStopwatch twatch; twatch.Start(); RooRealVar x("x","x",0.,10.); RooRealVar y("y","y",0.,10.); RooRealVar mu0("mu0","mu0",1.,0.,10.); RooRealVar mu1("mu1","mu1",0.5,0.,10.); RooRealVar sigma0("sigma0","sigma0",1.5,0.,10.); RooRealVar sigma1("sigma1","sigma1",0.,0.,10.); RooPolyVar mean("mean","mean",x,RooArgSet(mu0,mu1));// mean of pdf(y) depends on x RooPolyVar sigma("sigma","sigma",x,RooArgSet(sigma0,sigma1));// sigma of pdf(y) depends on x RooGaussian model_y("model_y","model_y",y,mean,sigma);// pdf(y|x) RooGaussian model_x("model_x","model_x",x,RooFit::RooConst(5),RooFit::RooConst(0.1));// pdf(x) RooProdPdf model_2D("model_2D","model_2D",model_x,RooFit::Conditional(model_y,y));//2D model: pdf(x,y)=pdf(y|x)*pdf(x) RooDataHist* Data=model_2D.generateBinned(RooArgSet(x,y),1000); RooDataHist* y_Data=(RooDataHist*)Data->reduce(y); //---- Project 2D PDF RooAbsPdf* model_2D_ProjX=model_2D.createProjection(y);// pdf(x)=\int pdf(x,y)*dy RooAbsPdf* model_2D_ProjY=model_2D.createProjection(x);// pdf(x)=\int pdf(x,y)*dx //----Creating NLL variable and minimisation y.setRange("R",0.,10.); RooAbsReal* nll =(RooAbsReal*) model_2D_ProjY->createNLL(*y_Data,RooFit::Verbose(),RooFit::Optimize(kTRUE) //,RooFit::Range("R") ); //----With this syntax Range does work but forces num int. even if anal. int. available cout<<"Value of Neg. log-likelihood = "<getVal()<plotOn(yFrame,RooFit::MarkerStyle(2)); //model_2D.plotOn(xFrame,RooFit::LineColor(2)); //model_2D.plotOn(yFrame,RooFit::LineColor(2)); //model_x.plotOn(xFrame,RooFit::LineColor(3)); //model_y.plotOn(yFrame,RooFit::LineColor(3)); model_2D_ProjX->plotOn(xFrame); model_2D_ProjY->plotOn(yFrame); TCanvas *c0 = new TCanvas("c0","c0",350,50,750,550); c0->Divide(2); c0->cd(1); xFrame->Draw(); c0->cd(2); yFrame->Draw(); twatch.Stop(); twatch.Print(); return; }