#!/usr/bin/env python # coding: utf-8 # # rf105_funcbinding # 'BASIC FUNCTIONALITY' RooFit tutorial macro #105 # Demonstration of binding ROOT Math functions as RooFit functions # and pdfs # # # # # **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:16 AM. # In[1]: import ROOT # Bind ROOT TMath::Erf C function # --------------------------------------------------- # Bind one-dimensional ROOT.TMath.Erf function as ROOT.RooAbsReal function # In[2]: x = ROOT.RooRealVar("x", "x", -3, 3) erf = ROOT.RooFit.bindFunction("erf", ROOT.TMath.Erf, x) # Print erf definition # In[3]: erf.Print() # Plot erf on frame # In[4]: frame1 = x.frame(Title="TMath.Erf bound as ROOT.RooFit function") erf.plotOn(frame1) # Bind ROOT::Math::beta_pdf C function # ----------------------------------------------------------------------- # Bind pdf ROOT.Math.Beta with three variables as ROOT.RooAbsPdf function # In[5]: x2 = ROOT.RooRealVar("x2", "x2", 0, 0.999) a = ROOT.RooRealVar("a", "a", 5, 0, 10) b = ROOT.RooRealVar("b", "b", 2, 0, 10) beta = ROOT.RooFit.bindPdf("beta", ROOT.Math.beta_pdf, x2, a, b) # Perf beta definition # In[6]: beta.Print() # Generate some events and fit # In[7]: data = beta.generate({x2}, 10000) beta.fitTo(data, PrintLevel=-1) # Plot data and pdf on frame # In[8]: frame2 = x2.frame(Title="ROOT.Math.Beta bound as ROOT.RooFit pdf") data.plotOn(frame2) beta.plotOn(frame2) # Bind ROOT TF1 as RooFit function # --------------------------------------------------------------- # Create a ROOT TF1 function # In[9]: fa1 = ROOT.TF1("fa1", "sin(x)/x", 0, 10) # Create an observable # In[10]: x3 = ROOT.RooRealVar("x3", "x3", 0.01, 20) # Create binding of TF1 object to above observable # In[11]: rfa1 = ROOT.RooFit.bindFunction(fa1, x3) # Print rfa1 definition # In[12]: rfa1.Print() # Make plot frame in observable, TF1 binding function # In[13]: frame3 = x3.frame(Title="TF1 bound as ROOT.RooFit function") rfa1.plotOn(frame3) c = ROOT.TCanvas("rf105_funcbinding", "rf105_funcbinding", 1200, 400) c.Divide(3) c.cd(1) ROOT.gPad.SetLeftMargin(0.15) frame1.GetYaxis().SetTitleOffset(1.6) frame1.Draw() c.cd(2) ROOT.gPad.SetLeftMargin(0.15) frame2.GetYaxis().SetTitleOffset(1.6) frame2.Draw() c.cd(3) ROOT.gPad.SetLeftMargin(0.15) frame3.GetYaxis().SetTitleOffset(1.6) frame3.Draw() c.SaveAs("rf105_funcbinding.png") # Draw all canvases # In[14]: from ROOT import gROOT gROOT.GetListOfCanvases().Draw()