'ORGANIZATION AND SIMULTANEOUS FITS' RooFit tutorial macro #512
Illustration of operator expressions and expression-based basic p.d.f.s in the workspace factory syntax
Author: Clemens Lange, Wouter Verkerke (C version)
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:16 PM.
import ROOT
w = ROOT.RooWorkspace("w")
You can define typedefs for even shorter construction semantics
w.factory("$Typedef(Gaussian,Gaus)")
w.factory("$Typedef(Chebychev,Cheby)")
<cppyy.gbl.RooAbsArg object at 0x(nil)>
PDF addition is done with SUM (coef1*pdf1,pdf2)
w.factory("SUM::summodel( f[0,1]*Gaussian::gx(x[-10,10],m[0],1.0), Chebychev::ch(x,{0.1,0.2,-0.3}) )")
<cppyy.gbl.RooAddPdf object at 0x9965e40>
Extended PDF addition is done with SUM (yield1pdf1,yield2pdf2)
w.factory("SUM::extsummodel( Nsig[0,1000]*gx, Nbkg[0,1000]*ch )")
<cppyy.gbl.RooAddPdf object at 0x9b5b7f0>
PDF multiplication is done with PROD ( pdf1, pdf2 )
w.factory("PROD::gxz( gx, Gaussian::gz(z[-10,10],0,1) )")
<cppyy.gbl.RooProdPdf object at 0x9b805e0>
Conditional p.d.f multiplication is done with PROD ( pdf1|obs, pdf2 )
w.factory("Gaussian::gy( y[-10,10], x, 1.0 )")
w.factory("PROD::gxycond( gy|x, gx )")
<cppyy.gbl.RooProdPdf object at 0x9c19260>
Convolution (numeric/ fft) is done with NCONV/FCONV (obs,pdf1,pdf2)
w.factory("FCONV::lxg( x, Gaussian::g(x,mg[0],1), Landau::lc(x,0,1) )")
<cppyy.gbl.RooFFTConvPdf object at 0x9ce3780>
[#1] INFO:Caching -- Changing internal binning of variable 'x' in FFT 'lxg' from 100 to 930 to improve the precision of the numerical FFT. This can be done manually by setting an additional binning named 'cache'.
Simultaneous p.d.f.s are constructed with SIMUL( index, state1=pdf1, state2=pdf2,...)
w.factory("SIMUL::smodel( c[A=0,B=1], A=Gaussian::gs(x,m,s[1.0, 0.01, 10.0]), B=Landau::ls(x,0,1) )")
<cppyy.gbl.RooSimultaneous object at 0x9d1eea0>
Function multiplication is done with prod (func1, func2,...)
w.factory("prod::uv(u[10],v[10])")
<cppyy.gbl.RooProduct object at 0x9dcc500>
Function addition is done with sum(func1,func2)
w.factory("sum::uv2(u,v)")
<cppyy.gbl.RooAddition object at 0x9deeb00>
Lagrangian morphing function for the example shown in rf711_lagrangianmorph
infilename = ROOT.gROOT.GetTutorialDir().Data() + "/roofit/input_histos_rf_lagrangianmorph.root"
w.factory(
"lagrangianmorph::morph($observableName('pTV'),$fileName('"
+ infilename
+ "'),$couplings({cHq3[0,1],SM[1]}),$NewPhysics(cHq3=1,SM=0),$folders({'SM_NPsq0','cHq3_NPsq1','cHq3_NPsq2'}))"
)
<cppyy.gbl.RooLagrangianMorphFunc object at 0xa07a750>
[#0] PROGRESS:InputArguments -- initializing physics inputs from file /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/tutorials/roofit/input_histos_rf_lagrangianmorph.root with object name(s) 'pTV' [#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing dataset dh_SM_NPsq0_morph [#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing dataset dh_cHq3_NPsq1_morph [#1] INFO:ObjectHandling -- RooWorkspace::import(w) importing dataset dh_cHq3_NPsq2_morph
Taylor expansion is done with taylorexpand(func,{var1,var2,...},val,order)
w.factory("taylorexpand::te(expr::poly('x^4+5*x^3+2*x^2+x+1',x),{x},0.0,2)")
<cppyy.gbl.RooPolyFunc object at 0xa159af0>
Create a ROOT.RooGenericPdf interpreted p.d.f. You can use single quotes to pass the expression string argument
w.factory("EXPR::G('x*x+1',x)")
<cppyy.gbl.RooGenericPdf object at 0xa1c4770>
Create a custom compiled p.d.f similar to the above interpreted p.d.f. The code required to make self p.d.f. is automatically embedded in the workspace
w.factory("CEXPR::GC('x*x+a',{x,a[1]})")
<cppyy.gbl.RooCFAuto000Pdf object at 0x86de6f0>
[#1] INFO:ObjectHandling -- RooWorkspace::autoImportClass(w) importing code of class RooCFAuto000Pdf from /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/master_TMP/notebooks/RooCFAuto000Pdf.cxx and RooCFAuto000Pdf.h
Info in <TUnixSystem::ACLiC>: creating shared library /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/master_TMP/notebooks/RooCFAuto000Pdf_cxx.so
Compiled and interpreted functions (rather than p.d.f.s) can be made with the lower case 'expr' and 'cexpr' types
Print workspace contents
w.Print()
RooWorkspace(w) w contents variables --------- (Nbkg,Nsig,SM,a,binWidth_pTV,c,cHq3,f,m,mg,nNP0,nNP1,nNP2,nNP3,nNP4,pTV,s,te_c0,te_c1,te_c2,te_x^0,te_x^1,te_x^2,u,v,x,y,z) p.d.f.s ------- RooGenericPdf::G[ actualVars=(x) formula="x[0]*x[0]+1" ] = 1 RooCFAuto000Pdf::GC[ x=x a=a ] = 1 RooChebychev::ch[ x=x coefList=(0.1,0.2,-0.3) ] = 0.8 RooAddPdf::extsummodel[ Nsig * gx + Nbkg * ch ] = 0.9/1 RooGaussian::g[ x=x mean=mg sigma=1 ] = 1 RooGaussian::gs[ x=x mean=m sigma=s ] = 1 RooGaussian::gx[ x=x mean=m sigma=1 ] = 1 RooProdPdf::gxycond[ gx * gy|x ] = 1 RooProdPdf::gxz[ gx * gz ] = 1 RooGaussian::gy[ x=y mean=x sigma=1 ] = 1 RooGaussian::gz[ x=z mean=0 sigma=1 ] = 1 RooLandau::lc[ x=x mean=0 sigma=1 ] = 0.178854 RooLandau::ls[ x=x mean=0 sigma=1 ] = 0.178854 RooFFTConvPdf::lxg[ g(x) (*) lc(x) ] = 375639 RooSimultaneous::smodel[ indexCat=c A=gs B=ls ] = 1 RooAddPdf::summodel[ f * gx + [%] * ch ] = 0.9/1 functions -------- RooLagrangianMorphFunc::morph[ physics=(phys_SM_NPsq0_morph,phys_cHq3_NPsq1_morph,phys_cHq3_NPsq2_morph) operators=(cHq3,SM) observables=(pTV) binWidths=(binWidth_pTV) flags=(nNP0,nNP1,nNP2,nNP3,nNP4) binWidth_pTV * SM_NPsq0_morph + binWidth_pTV * cHq3_NPsq1_morph + binWidth_pTV * cHq3_NPsq2_morph ] = 35.9835 RooHistFunc::phys_SM_NPsq0_morph[ depList=(pTV) ] = 65.1309 RooHistFunc::phys_cHq3_NPsq1_morph[ depList=(pTV) ] = 544.966 RooHistFunc::phys_cHq3_NPsq2_morph[ depList=(pTV) ] = 1528.22 RooFormulaVar::poly[ actualVars=(x) formula="x^4+5*x^3+2*x^2+x+1" ] = 1 RooPolyFunc::te[ vars=(x) te_t0=(te_x^0,te_c0) te_t1=(te_x^1,te_c1) te_t2=(te_x^2,te_c2) ] = 1 RooProduct::uv[ u * v ] = 100 RooAddition::uv2[ u + v ] = 20 embedded datasets (in pdfs and functions) ----------------------------------------- RooDataHist::dh_SM_NPsq0_morph(pTV) RooDataHist::dh_cHq3_NPsq1_morph(pTV) RooDataHist::dh_cHq3_NPsq2_morph(pTV) embedded class code ------------------- RooCFAuto000Pdf embedded precalculated expensive components ------------------------------------------- uid = 0 key=lxg_g_CONV_lc_CACHEHIST_Obs[x]_BufFrac0.1_BufStrat0 value=RooDataHist::lxg_g_CONV_lc_CACHEHIST_Obs[x]_BufFrac0.1_BufStrat0 parameters=( mg=0 )
Make workspace visible on command line
ROOT.gDirectory.Add(w)
Draw all canvases
from ROOT import gROOT
gROOT.GetListOfCanvases().Draw()