///////////////////////////////////////////////////////////////////////// // // 'ADDITION AND CONVOLUTION' RooFit tutorial macro #207 // // Tools and utilities for manipulation of composite objects // // // 07/2008 - Wouter Verkerke // ///////////////////////////////////////////////////////////////////////// #ifndef __CINT__ #include "RooGlobalFunc.h" #endif #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooChebychev.h" #include "RooExponential.h" #include "RooAddPdf.h" #include "RooPlot.h" #include "RooCustomizer.h" #include "TCanvas.h" #include "TAxis.h" #include "TH1.h" using namespace RooFit ; void rf207_comptools() { // S e t u p c o m p o s i t e p d f, d a t a s e t // -------------------------------------------------------- // Declare observable x RooRealVar x("x","x",0,10) ; // Create two Gaussian PDFs g1(x,mean1,sigma) anf g2(x,mean2,sigma) and their parameters RooRealVar mean("mean","mean of gaussians",5) ; RooRealVar sigma("sigma","width of gaussians",0.5) ; RooGaussian sig("sig","Signal component 1",x,mean,sigma) ; // Build Chebychev polynomial p.d.f. RooRealVar a0("a0","a0",0.5,0.,1.) ; RooRealVar a1("a1","a1",-0.2,0.,1.) ; RooChebychev bkg1("bkg1","Background 1",x,RooArgSet(a0,a1)) ; // Build expontential pdf RooRealVar alpha("alpha","alpha",-1) ; RooExponential bkg2("bkg2","Background 2",x,alpha) ; // Sum the background components into a composite background p.d.f. RooRealVar bkg1frac("bkg1frac","fraction of component 1 in background",0.2,0.,1.) ; RooAddPdf bkg("bkg","Signal",RooArgList(bkg1,bkg2),bkg1frac) ; // Sum the composite signal and background RooRealVar bkgfrac("bkgfrac","fraction of background",0.5,0.,1.) ; RooAddPdf model("model","g1+g2+a",RooArgList(bkg,sig),bkgfrac) ; // Create dummy dataset that has more observables than the above pdf RooRealVar y("y","y",-10,10) ; RooDataSet data("data","data",RooArgSet(x,y)) ; ////////////////////////////////////////////////////////// // B a s i c i n f o r m a t i o n r e q u e s t s // ////////////////////////////////////////////////////////// // G e t l i s t o f o b s e r v a b l e s // --------------------------------------------- // Get list of observables of pdf in context of a dataset // // Observables are define each context as the variables // shared between a model and a dataset. In this case // that is the variable 'x' RooArgSet* model_obs = model.getObservables(data) ; model_obs->Print("v") ; // G e t l i s t o f p a r a m e t e r s // ------------------------------------------- // Get list of parameters, given list of observables RooArgSet* model_params = model.getParameters(x) ; model_params->Print("v") ; // Get list of parameters, given a dataset // (Gives identical results to operation above) RooArgSet* model_params2 = model.getParameters(data) ; model_params2->Print() ; // G e t l i s t o f c o m p o n e n t s // ------------------------------------------- // Get list of component objects, including top-level node RooArgSet* model_comps = model.getComponents() ; model_comps->Print("v") ; ///////////////////////////////////////////////////////////////////////////////////// // M o d i f i c a t i o n s t o s t r u c t u r e o f c o m p o s i t e s // ///////////////////////////////////////////////////////////////////////////////////// // Create a second Gaussian RooRealVar sigma2("sigma2","width of gaussians",1) ; RooGaussian sig2("sig2","Signal component 1",x,mean,sigma2) ; // Create a sum of the original Gaussian plus the new second Gaussian RooRealVar sig1frac("sig1frac","fraction of component 1 in signal",0.8,0.,1.) ; RooAddPdf sigsum("sigsum","sig+sig2",RooArgList(sig,sig2),sig1frac) ; // Construct a customizer utility to customize model RooCustomizer cust(model,"cust") ; // Instruct the customizer to replace node 'sig' with node 'sigsum' cust.replaceArg(sig,sigsum) ; // Build a clone of the input pdf according to the above customization // instructions. Each node that requires modified is clone so that the // original pdf remained untouched. The name of each cloned node is that // of the original node suffixed by the name of the customizer object // // The returned head node own all nodes that were cloned as part of // the build process so when cust_clone is deleted so will all other // nodes that were created in the process. RooAbsPdf* cust_clone = (RooAbsPdf*) cust.build(kTRUE) ; // Print structure of clone of model with sig->sigsum replacement. cust_clone->Print("t") ; delete cust_clone ; }