Data and categories: demonstration of real-->discrete mapping functions
Author: Wouter Verkerke
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:16 PM.
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooCategory.h"
#include "RooThresholdCategory.h"
#include "RooBinningCategory.h"
#include "Roo1DTable.h"
#include "RooArgusBG.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "RooPlot.h"
using namespace RooFit;
Define a dummy PDF in x
RooRealVar x("x", "x", 0, 10);
RooArgusBG a("a", "argus(x)", x, 10.0, -1.0);
Generate a dummy dataset
std::unique_ptr<RooDataSet> data{a.generate(x, 10000)};
input_line_49:2:2: warning: 'data' shadows a declaration with the same name in the 'std' namespace; use '::data' to reference this declaration std::unique_ptr<RooDataSet> 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
RooThresholdCategory xRegion("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");
Add values of threshold function to dataset so that it can be used as observable
data->addColumn(xRegion);
input_line_52:2:2: error: reference to 'data' is ambiguous data->addColumn(xRegion); ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
Make plot of data in x
RooPlot *xframe = x.frame(Title("Demo of threshold and binning mapping functions"));
data->plotOn(xframe);
input_line_53:3:1: error: reference to 'data' is ambiguous data->plotOn(xframe); ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
Use calculated category to select sideband data
data->plotOn(xframe, Cut("xRegion==xRegion::SideBand"), MarkerColor(kRed), LineColor(kRed));
input_line_54:2:2: error: reference to 'data' is ambiguous data->plotOn(xframe, Cut("xRegion==xRegion::SideBand"), MarkerColor(kRed), LineColor(kRed)); ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
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, the binning name and the bin number. If no binning name is specified the default binning is mapped
x.setBins(10, "coarse");
RooBinningCategory xBins("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
Roo1DTable *xbtable = data->table(xBins);
xbtable->Print("v");
input_line_56:2:24: error: reference to 'data' is ambiguous Roo1DTable *xbtable = data->table(xBins); ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
Add values of xBins function to dataset so that it can be used as observable
RooCategory *xb = (RooCategory *)data->addColumn(xBins);
input_line_57:2:35: error: reference to 'data' is ambiguous RooCategory *xb = (RooCategory *)data->addColumn(xBins); ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
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");
input_line_59:2:3: error: use of undeclared identifier 'xb' (xb->setRange("alt", "x_coarse_bin1,x_coarse_bin3,x_coarse_bin5,x_coarse_bin7,x_coarse_bin9")) ^ Error in <HandleInterpreterException>: Error evaluating expression (xb->setRange("alt", "x_coarse_bin1,x_coarse_bin3,x_coarse_bin5,x_coarse_bin7,x_coarse_bin9")) Execution of your code was aborted.
Construct subset of data matching range "alt" but only for the first 5000 events and plot it on the frame
std::unique_ptr<RooAbsData> dataSel{data->reduce(CutRange("alt"), EventRange(0, 5000))};
dataSel->plotOn(xframe, MarkerColor(kGreen), LineColor(kGreen));
new TCanvas("rf405_realtocatfuncs", "rf405_realtocatfuncs", 600, 600);
xframe->SetMinimum(0.01);
gPad->SetLeftMargin(0.15);
xframe->GetYaxis()->SetTitleOffset(1.4);
xframe->Draw();
input_line_60:2:38: error: reference to 'data' is ambiguous std::unique_ptr<RooAbsData> dataSel{data->reduce(CutRange("alt"), EventRange(0, 5000))}; ^ input_line_49:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{a.generate(x, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^ input_line_60:3:17: error: use of undeclared identifier 'xframe' dataSel->plotOn(xframe, MarkerColor(kGreen), LineColor(kGreen)); ^ input_line_60:6:1: error: use of undeclared identifier 'xframe' xframe->SetMinimum(0.01); ^ input_line_60:8:1: error: use of undeclared identifier 'xframe' xframe->GetYaxis()->SetTitleOffset(1.4); ^ input_line_60:9:1: error: use of undeclared identifier 'xframe' xframe->Draw(); ^
Draw all canvases
%jsroot on
gROOT->GetListOfCanvases()->Draw()