As an extra complication, some of the new parameters need to be functions of a mass parameter.
␛[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:
0x7ffeaf8f5e08 RooAddPdf::model = 750.5 [Auto,Dirty]
0x7ffeaf8f7430/V- RooGaussian::gauss = 0 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f7c90/V- RooRealVar::meanG = 100
0x7ffeaf8f7910/V- RooRealVar::sigmaG = 3
0x7ffeaf8f6810/V- RooRealVar::yieldSig = 1
0x7ffeaf8f6bf8/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f70c0/V- RooRealVar::pol1 = 1
0x7ffeaf8f64a0/V- RooRealVar::yieldBkg = 1
PDF 1 with a yield depending on M:
0x559cd593f910 RooAddPdf::model_Sample1 = 1156.8 [Auto,Dirty]
0x7ffeaf8f6bf8/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f70c0/V- RooRealVar::pol1 = 1
0x7ffeaf8f64a0/V- RooRealVar::yieldBkg = 1
0x559cd592cd40/V- RooGaussian::gauss_Sample1 = 0 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f7910/V- RooRealVar::sigmaG = 3
0x559cd58eb6e0/V- RooRealVar::meanG_Sample1 = 100
0x7ffeaf8f4db0/V- RooFormulaVar::yieldSig_Sample1 = 0.29755 [Auto,Clean]
0x7ffeaf8f5170/V- RooRealVar::M = 1
PDF 2 with a yield depending on M:
0x559cd58f3fc0 RooAddPdf::model_Sample2 = 1000.67 [Auto,Dirty]
0x7ffeaf8f6bf8/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f70c0/V- RooRealVar::pol1 = 1
0x7ffeaf8f64a0/V- RooRealVar::yieldBkg = 1
0x559cd5612060/V- RooGaussian::gauss_Sample2 = 0 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f7910/V- RooRealVar::sigmaG = 3
0x559cd593d710/V- RooRealVar::meanG_Sample2 = 100
0x7ffeaf8f4978/V- RooFormulaVar::yieldSig_Sample2 = 0.5 [Auto,Clean]
0x7ffeaf8f5170/V- RooRealVar::M = 1
PDF 3 with a free yield:
0x559cd4fa3fd0 RooAddPdf::model_Sample3 = 750.5 [Auto,Dirty]
0x7ffeaf8f6bf8/V- RooPolynomial::linear = 1501 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f70c0/V- RooRealVar::pol1 = 1
0x7ffeaf8f64a0/V- RooRealVar::yieldBkg = 1
0x559cd58ee600/V- RooGaussian::gauss_Sample3 = 0 [Auto,Dirty]
0x7ffeaf8f8000/V- RooRealVar::Energy = 1500
0x7ffeaf8f7910/V- RooRealVar::sigmaG = 3
0x559cd59370a0/V- RooRealVar::meanG_Sample3 = 100
0x559cd561dca0/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
#include <iostream>
void rf514_RooCustomizer() {
RooRealVar meanG(
"meanG",
"meanG", 100., 0., 3000.);
RooRealVar pol1(
"pol1",
"Constant of the polynomial", 1, -10, 10);
RooRealVar yieldSig(
"yieldSig",
"yieldSig", 1, 0, 1.E4);
RooRealVar yieldBkg(
"yieldBkg",
"yieldBkg", 1, 0, 1.E4);
std::cout << "The proto model before customisation:" << std::endl;
model.Print("T");
sample["Sample1"] = 1;
sample["Sample2"] = 2;
sample["Sample3"] = 3;
RooCustomizer cust(model, sample, newLeafs, &allCustomiserNodes);
cust.splitArg(meanG, sample);
RooFormulaVar yield1(
"yieldSig_Sample1",
"Signal yield in the first sample",
"M/3.360779", mass);
RooFormulaVar yield2(
"yieldSig_Sample2",
"Signal yield in the second sample",
"M/2", mass);
allCustomiserNodes.
add(yield1);
allCustomiserNodes.
add(yield2);
cust.splitArg(yieldSig, sample);
auto pdf1 = cust.build("Sample1");
auto pdf2 = cust.build("Sample2");
auto pdf3 = cust.build("Sample3");
std::cout << "\nPDF 1 with a yield depending on M:" << std::endl;
pdf1->Print("T");
std::cout << "\nPDF 2 with a yield depending on M:" << std::endl;
pdf2->Print("T");
std::cout << "\nPDF 3 with a free yield:" << std::endl;
pdf3->Print("T");
std::cout << "\nThe following leafs have been created automatically while customising:" << std::endl;
auto& meanG1 =
static_cast<RooRealVar&
>(allCustomiserNodes[
"meanG_Sample1"]);
auto& meanG2 =
static_cast<RooRealVar&
>(allCustomiserNodes[
"meanG_Sample2"]);
std::cout << "\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.):" << std::endl;
allCustomiserNodes.
Print(
"V");
}
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
RooAddPdf is an efficient implementation of a sum of PDFs of the form.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE) override
Add element to non-owning set.
RooCategory is an object to represent discrete states.
RooCustomizer is a factory class to produce clones of a prototype composite PDF object with the same ...
RooPolynomial implements a polynomial p.d.f of the form.
RooRealVar represents a variable that can be changed from the outside.
virtual void setVal(Double_t value)
Set value of variable to 'value'.