'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 Wednesday, April 17, 2024 at 11:19 AM.
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 0xa15f140>
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 0xa397020>
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 0xa3b98e0>
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 0xa452a70>
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 0xa50ba50>
[#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 0xa560180>
Function multiplication is done with prod (func1, func2,...)
w.factory("prod::uv(u[10],v[10])")
<cppyy.gbl.RooProduct object at 0xa61b7d0>
Function addition is done with sum(func1,func2)
w.factory("sum::uv2(u,v)")
<cppyy.gbl.RooAddition object at 0xa5dd0f0>
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 0xa8b4d20>
[#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 0xa97e310>
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 0xa9de640>
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 0xae1b3b0>
[#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()