Logo ROOT  
Reference Guide
rf514_RooCustomizer.py File Reference

Namespaces

namespace  rf514_RooCustomizer
 

Detailed Description

View in nbviewer Open in SWAN Using the RooCustomizer to create multiple PDFs that share a lot of properties, but have unique parameters for each category.

As an extra complication, some of the new parameters need to be functions of a mass parameter.

import ROOT
E = ROOT.RooRealVar("Energy", "Energy", 0, 3000)
meanG = ROOT.RooRealVar("meanG", "meanG", 100.0, 0.0, 3000.0)
sigmaG = ROOT.RooRealVar("sigmaG", "sigmaG", 3.0)
gauss = ROOT.RooGaussian("gauss", "gauss", E, meanG, sigmaG)
pol1 = ROOT.RooRealVar("pol1", "Constant of the polynomial", 1, -10, 10)
linear = ROOT.RooPolynomial("linear", "linear", E, pol1)
yieldSig = ROOT.RooRealVar("yieldSig", "yieldSig", 1, 0, 1.0e4)
yieldBkg = ROOT.RooRealVar("yieldBkg", "yieldBkg", 1, 0, 1.0e4)
model = ROOT.RooAddPdf("model", "S + B model", [gauss, linear], [yieldSig, yieldBkg])
print("The proto model before customisation:\n")
model.Print("T") # "T" prints the model as a tree
# Build the categories
sample = ROOT.RooCategory("sample", "sample", {"Sample1": 1, "Sample2": 2, "Sample3": 3})
# Start to customise the proto model that was defined above.
# ---------------------------------------------------------------------------
# We need two sets for bookkeeping of PDF nodes:
newLeafs = ROOT.RooArgSet()
allCustomiserNodes = ROOT.RooArgSet()
# 1. Each sample should have its own mean for the gaussian
# The customiser will make copies of `meanG` for each category.
# These will all appear in the set `newLeafs`, which will own the new nodes.
cust = ROOT.RooCustomizer(model, sample, newLeafs, allCustomiserNodes)
cust.splitArg(meanG, sample)
# 2. Each sample should have its own signal yield, but there is an extra complication:
# We need the yields 1 and 2 to be a function of the variable "mass".
# For this, we pre-define nodes with exacly the names that the customiser would have created automatically,
# that is, "<nodeName>_<categoryName>", and we register them in the set of customiser nodes.
# The customiser will pick them up instead of creating new ones.
# If we don't provide one (e.g. for "yieldSig_Sample3"), it will be created automatically by cloning `yieldSig`.
mass = ROOT.RooRealVar("M", "M", 1, 0, 12000)
yield1 = ROOT.RooFormulaVar("yieldSig_Sample1", "Signal yield in the first sample", "M/3.360779", mass)
yield2 = ROOT.RooFormulaVar("yieldSig_Sample2", "Signal yield in the second sample", "M/2", mass)
allCustomiserNodes.add(yield1)
allCustomiserNodes.add(yield2)
# Instruct the customiser to replace all yieldSig nodes for each sample:
cust.splitArg(yieldSig, sample)
# Now we can start building the PDFs for all categories:
pdf1 = cust.build("Sample1")
pdf2 = cust.build("Sample2")
pdf3 = cust.build("Sample3")
# And we inspect the two PDFs
print("\nPDF 1 with a yield depending on M:\n")
pdf1.Print("T")
print("\nPDF 2 with a yield depending on M:\n")
pdf2.Print("T")
print("\nPDF 3 with a free yield:\n")
pdf3.Print("T")
print("\nThe following leafs have been created automatically while customising:\n")
newLeafs.Print("V")
# If we needed to set reasonable values for the means of the gaussians, this could be done as follows:
meanG1 = allCustomiserNodes["meanG_Sample1"]
meanG1.setVal(200)
meanG2 = allCustomiserNodes["meanG_Sample2"]
meanG2.setVal(300)
print(
"\nThe following leafs have been used while customising\n\t(partial overlap with the set of automatically created leaves.\n\ta new customiser for a different PDF could reuse them if necessary.):"
)
allCustomiserNodes.Print("V")
del cust
␛[1mRooFit v3.60 -- Developed by Wouter Verkerke and David Kirkby␛[0m
Copyright (C) 2000-2013 NIKHEF, University of California & Stanford University
All rights reserved, please read http://roofit.sourceforge.net/license.txt
[#0] WARNING:InputArguments -- The parameter 'sigmaG' with range [-1e+30, 1e+30] of the RooGaussian 'gauss' exceeds the safe range of (0, inf). Advise to limit its range.
The proto model before customisation:
0x55d5c7f15660 RooAddPdf::model = 750.5 [Auto,Dirty]
0x55d5c7a1ee60/V- RooGaussian::gauss = 0 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7829160/V- RooRealVar::meanG = 100
0x55d5c7847ea0/V- RooRealVar::sigmaG = 3
0x55d5c7b772d0/V- RooRealVar::yieldSig = 1
0x55d5c7a64800/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7a68600/V- RooRealVar::pol1 = 1
0x55d5c7b8e1d0/V- RooRealVar::yieldBkg = 1
PDF 1 with a yield depending on M:
0x55d5c85e8a70 RooAddPdf::model_Sample1 = 1156.8 [Auto,Dirty]
0x55d5c7a64800/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7a68600/V- RooRealVar::pol1 = 1
0x55d5c7b8e1d0/V- RooRealVar::yieldBkg = 1
0x55d5c85e9db0/V- RooGaussian::gauss_Sample1 = 0 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7847ea0/V- RooRealVar::sigmaG = 3
0x55d5c8641530/V- RooRealVar::meanG_Sample1 = 100
0x55d5c8520670/V- RooFormulaVar::yieldSig_Sample1 = 0.29755 [Auto,Clean]
0x55d5c8468770/V- RooRealVar::M = 1
PDF 2 with a yield depending on M:
0x55d5c8605670 RooAddPdf::model_Sample2 = 1000.67 [Auto,Dirty]
0x55d5c7a64800/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7a68600/V- RooRealVar::pol1 = 1
0x55d5c7b8e1d0/V- RooRealVar::yieldBkg = 1
0x55d5c853ebf0/V- RooGaussian::gauss_Sample2 = 0 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7847ea0/V- RooRealVar::sigmaG = 3
0x55d5c845c1f0/V- RooRealVar::meanG_Sample2 = 100
0x55d5c85c4480/V- RooFormulaVar::yieldSig_Sample2 = 0.5 [Auto,Clean]
0x55d5c8468770/V- RooRealVar::M = 1
PDF 3 with a free yield:
0x55d5c85dcbc0 RooAddPdf::model_Sample3 = 750.5 [Auto,Dirty]
0x55d5c7a64800/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7a68600/V- RooRealVar::pol1 = 1
0x55d5c7b8e1d0/V- RooRealVar::yieldBkg = 1
0x55d5c85e70f0/V- RooGaussian::gauss_Sample3 = 0 [Auto,Dirty]
0x55d5c78dc490/V- RooRealVar::Energy = 1500
0x55d5c7847ea0/V- RooRealVar::sigmaG = 3
0x55d5c85223d0/V- RooRealVar::meanG_Sample3 = 100
0x55d5c8578000/V- RooRealVar::yieldSig_Sample3 = 1
The following leafs have been created automatically while customising:
1) RooRealVar:: meanG_Sample1 = 100
2) RooRealVar:: meanG_Sample2 = 100
3) RooRealVar:: meanG_Sample3 = 100
4) RooRealVar:: yieldSig_Sample3 = 1
The following leafs have been used while customising
(partial overlap with the set of automatically created leaves.
a new customiser for a different PDF could reuse them if necessary.):
1) RooFormulaVar:: yieldSig_Sample1 = 0.29755
2) RooFormulaVar:: yieldSig_Sample2 = 0.5
3) RooRealVar:: meanG_Sample1 = 200
4) RooRealVar:: meanG_Sample2 = 300
5) RooRealVar:: meanG_Sample3 = 100
6) RooRealVar:: yieldSig_Sample3 = 1
Date
June 2021
Author
Harshal Shende, Stephan Hageboeck (C++ version)

Definition in file rf514_RooCustomizer.py.