////////////////////////////////////////////////////////////////////////// // // 'MULTIDIMENSIONAL MODELS' RooFit tutorial macro #310 // // Projecting p.d.f and data ranges in continuous observables // // // // 07/2008 - Wouter Verkerke // ///////////////////////////////////////////////////////////////////////// #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooProdPdf.h" #include "RooAddPdf.h" #include "RooPolynomial.h" #include "TCanvas.h" #include "TFile.h" #include "RooPlot.h" using namespace RooFit ; void TestApp_works(){ // C r e a t e 3 D p d f a n d d a t a // ------------------------------------------- //if the RooRealVars are declared here, it is possible to set ranges later: RooRealVar x("x","x",-5,5) ; RooRealVar y("y","y",-5,5) ; RooRealVar z("z","z",-5,5) ; { // Create observables //RooRealVar x("x","x",-5,5) ; //RooRealVar y("y","y",-5,5) ; //RooRealVar z("z","z",-5,5) ; RooRealVar *Gauss_mean = new RooRealVar("Gauss_mean", "mean" , 0.) ; RooRealVar *Gauss_sigma = new RooRealVar("Gauss_sigma", "sigma" , 1.) ; // Create signal pdf gauss(x)*gauss(y)*gauss(z) RooGaussian gx("gx","gx",x,*Gauss_mean, *Gauss_sigma) ; RooGaussian gy("gy","gy",y,*Gauss_mean, *Gauss_sigma) ; RooGaussian gz("gz","gz",z,*Gauss_mean, *Gauss_sigma) ; RooProdPdf sig("sig","sig",RooArgSet(gx,gy,gz)) ; // Create background pdf poly(x)*poly(y)*poly(z) RooRealVar *p1a = new RooRealVar("p1a", "p1a" , -0.1) ; RooRealVar *p2a = new RooRealVar("p1b", "p1b" , 0.004) ; RooRealVar *p1b = new RooRealVar("p2a", "p2a" , 0.1) ; RooRealVar *p2b = new RooRealVar("p2b", "p2b" , -0.004) ; RooPolynomial px("px","px",x, RooArgSet(*p1a, *p1b) ); RooPolynomial py("py","py",y, RooArgSet(*p2a, *p2b) ); RooPolynomial pz("pz","pz",z) ; RooProdPdf bkg("bkg","bkg",RooArgSet(px,py,pz)) ; // Create composite pdf sig+bkg RooRealVar fsig("fsig","signal fraction",0.1,0.,1.) ; RooAddPdf *model = new RooAddPdf("model","model",RooArgList(sig,bkg),fsig) ; RooDataSet* data = model->generate(RooArgSet(x,y,z),20000) ; data->SetName("data"); TFile * output = new TFile("output.root", "RECREATE"); output->cd(); data->Write(); model->Write(); output->Close(); } // Create observables //RooRealVar x("x","x",-5,5) ; //RooRealVar y("y","y",-5,5) ; //RooRealVar z("z","z",-5,5) ; TFile *output = new TFile("output.root", "READ"); output->cd(); RooDataSet *data2 = (RooDataSet*)output->Get("data"); RooAddPdf* model2 = (RooAddPdf*)output->Get("model"); output->Close(); // P r o j e c t p d f a n d d a t a o n x // ------------------------------------------------- // Make plain projection of data and pdf on x observable RooPlot* frame = x.frame(Title("Projection of 3D data and pdf on X"),Bins(40)) ; data2->plotOn(frame) ; model2->plotOn(frame) ; // P r o j e c t p d f a n d d a t a o n x i n s i g n a l r a n g e // ---------------------------------------------------------------------------------- // Define signal region in y and z observables y.setRange("sigRegion",-1,1) ; z.setRange("sigRegion",-1,1) ; // Make plot frame RooPlot* frame2 = x.frame(Title("Same projection on X in signal range of (Y,Z)"),Bins(40)) ; // Plot subset of data in which all observables are inside "sigRegion" // For observables that do not have an explicit "sigRegion" range defined (e.g. observable) // an implicit definition is used that is identical to the full range (i.e. [-5,5] for x) data2->plotOn(frame2,CutRange("sigRegion")) ; // Project model on x, integrating projected observables (y,z) only in "sigRegion" model2->plotOn(frame2,ProjectionRange("sigRegion")) ; TCanvas *c = new TCanvas("test","test",1200,600); c->Divide(2,1); c->cd(1); frame->Draw(); c->cd(2); frame2->Draw(); c->SaveAs("test.eps"); delete data2 ; return; }