Data and categories: demonstration of real-discrete mapping functions
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:18 AM.
import ROOT
Define a dummy PDF in x
x = ROOT.RooRealVar("x", "x", 0, 10)
a = ROOT.RooArgusBG("a", "argus(x)", x, 10.0, -1.0)
Generate a dummy dataset
data = a.generate({x}, 10000)
A RooThresholdCategory is a category function that maps regions in a real-valued input observable observables to state names. At construction time a 'default' state name must be specified to which all values of x are mapped that are not otherwise assigned
xRegion = ROOT.RooThresholdCategory("xRegion", "region of x", x, "Background")
Specify thresholds and state assignments one-by-one. Each statement specifies that all values below the given value (and above any lower specified threshold) are mapped to the category state with the given name
Background | SideBand | Signal | SideBand | Background 4.23 5.23 8.23 9.23
xRegion.addThreshold(4.23, "Background")
xRegion.addThreshold(5.23, "SideBand")
xRegion.addThreshold(8.23, "Signal")
xRegion.addThreshold(9.23, "SideBand")
False
Add values of threshold function to dataset so that it can be used as observable
data.addColumn(xRegion)
<cppyy.gbl.RooCategory object at 0x9ee5500>
Make plot of data in x
xframe = x.frame(Title="Demo of threshold and binning mapping functions")
data.plotOn(xframe)
<cppyy.gbl.RooPlot object at 0xa13fdf0>
Use calculated category to select sideband data
data.plotOn(xframe, Cut="xRegion==xRegion::SideBand", MarkerColor="r", LineColor="r")
<cppyy.gbl.RooPlot object at 0xa13fdf0>
[#1] INFO:Plotting -- RooTreeData::plotOn: plotting 2748 events out of 10000 total events
A RooBinningCategory is a category function that maps bins of a (named) binning definition in a real-valued input observable observables to state names. The state names are automatically constructed from the variable name, binning name and the bin number. If no binning name is specified the default binning is mapped
x.setBins(10, "coarse")
xBins = ROOT.RooBinningCategory("xBins", "coarse bins in x", x, "coarse")
Print table of xBins state multiplicity. Note that xBins does not need to be an observable in data it can be a function of observables in data as well
xbtable = data.table(xBins)
xbtable.Print("v")
Table xBins : aData +---------------+------+ | x_coarse_bin0 | 105 | | x_coarse_bin1 | 329 | | x_coarse_bin2 | 499 | | x_coarse_bin3 | 739 | | x_coarse_bin4 | 934 | | x_coarse_bin5 | 1218 | | x_coarse_bin6 | 1450 | | x_coarse_bin7 | 1675 | | x_coarse_bin8 | 1767 | | x_coarse_bin9 | 1284 | +---------------+------+
Add values of xBins function to dataset so that it can be used as observable
xb = data.addColumn(xBins)
Define range "alt" as including bins 1,3,5,7,9
xb.setRange("alt", "x_coarse_bin1,x_coarse_bin3,x_coarse_bin5,x_coarse_bin7,x_coarse_bin9")
Construct subset of data matching range "alt" but only for the first 5000 events and plot it on the frame
dataSel = data.reduce(CutRange="alt", EventRange=(0, 5000))
dataSel.plotOn(xframe, MarkerColor="g", LineColor="g")
c = ROOT.TCanvas("rf405_realtocatfuncs", "rf405_realtocatfuncs", 600, 600)
xframe.SetMinimum(0.01)
ROOT.gPad.SetLeftMargin(0.15)
xframe.GetYaxis().SetTitleOffset(1.4)
xframe.Draw()
c.SaveAs("rf405_realtocatfuncs.png")
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 2627 will supersede previous event count of 10000 for normalization of PDF projections
Info in <TCanvas::Print>: png file rf405_realtocatfuncs.png has been created
Draw all canvases
from ROOT import gROOT
gROOT.GetListOfCanvases().Draw()