Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooBinSamplingPdf.h
Go to the documentation of this file.
1// Authors: Stephan Hageboeck, CERN; Andrea Sciandra, SCIPP-UCSC/Atlas; Nov 2020
2
3/*****************************************************************************
4 * Project: RooFit *
5 * Package: RooFitCore *
6 * Authors: *
7 * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
8 * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
9 * *
10 * Copyright (c) 2000-2018, Regents of the University of California *
11 * and Stanford University. All rights reserved. *
12 * *
13 * Redistribution and use in source and binary forms, *
14 * with or without modification, are permitted according to the terms *
15 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
16 *****************************************************************************/
17#ifndef ROO_BIN_SAMPLING__PDF
18#define ROO_BIN_SAMPLING__PDF
19
20#include "RooAbsReal.h"
21#include "RooTemplateProxy.h"
22#include "RooAbsPdf.h"
23
24#include "Math/Integrator.h"
25
26#include <memory>
27
29public:
30
32 RooBinSamplingPdf(const char *name, const char *title, RooAbsRealLValue& observable, RooAbsPdf& inputPdf,
33 double epsilon = 1.E-4);
34
35 RooBinSamplingPdf(const RooBinSamplingPdf& other, const char* name = nullptr);
36
37 TObject* clone(const char* newname) const override {
38 return new RooBinSamplingPdf(*this, newname);
39 }
40
41 // Analytical Integration handling
42 bool forceAnalyticalInt(const RooAbsArg& dep) const override {
43 return _pdf->forceAnalyticalInt(dep);
44 }
45 /// Forwards to the PDF's implementation.
46 Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet* normSet,
47 const char* rangeName=nullptr) const override {
48 return _pdf->getAnalyticalIntegralWN(allVars, analVars, normSet, rangeName);
49 }
50 /// Forwards to the PDF's implementation.
52 const char* rangeName=nullptr) const override {
53 return _pdf->getAnalyticalIntegral(allVars, numVars, rangeName);
54 }
55 /// Forwards to the PDF's implementation.
56 double analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName) const override {
57 return _pdf->analyticalIntegralWN(code, normSet, rangeName);
58 }
59 /// Forwards to the PDF's implementation.
60 double analyticalIntegral(Int_t code, const char* rangeName=nullptr) const override {
61 return _pdf->analyticalIntegral(code, rangeName);
62 }
63 /// Forwards to the PDF's implementation.
64 std::unique_ptr<RooAbsReal> createExpectedEventsFunc(const RooArgSet *nset) const override {
65 return _pdf->createExpectedEventsFunc(nset);
66 }
67
68 /// Forwards to the PDF's implementation.
69 bool selfNormalized() const override { return true; }
70
71 /// Forwards to the PDF's implementation.
73 const RooArgSet* nset=nullptr,
74 const RooNumIntConfig* cfg=nullptr,
75 const char* rangeName=nullptr) const override {
76 return _pdf->createIntegral(iset, nset, cfg, rangeName);
77 }
78
79 ExtendMode extendMode() const override { return _pdf->extendMode(); }
80 double expectedEvents(const RooArgSet* nset) const override { return _pdf->expectedEvents(nset); }
81
82 /// Forwards to the PDF's implementation.
83 Int_t getGenerator(const RooArgSet& directVars, RooArgSet& generateVars, bool staticInitOK = true) const override {
84 return _pdf->getGenerator(directVars, generateVars, staticInitOK);
85 }
86 /// Forwards to the PDF's implementation.
87 void initGenerator(Int_t code) override { _pdf->initGenerator(code); }
88 /// Forwards to the PDF's implementation.
89 void generateEvent(Int_t code) override { _pdf->generateEvent(code); }
90 /// Forwards to the PDF's implementation.
91 bool isDirectGenSafe(const RooAbsArg& arg) const override { return _pdf->isDirectGenSafe(arg); }
92
93
94 // Hints for optimized brute-force sampling
95 Int_t getMaxVal(const RooArgSet& vars) const override { return _pdf->getMaxVal(vars); }
96 double maxVal(Int_t code) const override { return _pdf->maxVal(code); }
97 Int_t minTrialSamples(const RooArgSet& arGenObs) const override { return _pdf->minTrialSamples(arGenObs); }
98
99 // Plotting and binning hints
100 /// Returns true, since this PDF is meant to be binned.
101 bool isBinnedDistribution(const RooArgSet& /*obs*/) const override { return true; }
102 std::list<double>* binBoundaries(RooAbsRealLValue& obs, double xlo, double xhi) const override;
103 std::list<double>* plotSamplingHint(RooAbsRealLValue& obs, double xlo, double xhi) const override;
104
105 std::unique_ptr<ROOT::Math::IntegratorOneDim>& integrator() const;
106
107 static std::unique_ptr<RooAbsPdf> create(RooAbsPdf& pdf, RooAbsData const &data, double precision);
108
109 double epsilon() const { return _relEpsilon; }
110 const RooAbsPdf& pdf() const { return _pdf.arg(); }
111 const RooAbsReal& observable() const { return _observable.arg(); }
112
113 void doEval(RooFit::EvalContext &) const override;
114
115protected:
116 double evaluate() const override;
117 std::span<const double> binBoundaries() const;
118
119private:
120 template<typename Func>
122 // Call operator for our internal integrator.
123 double operator()(double x) const;
124 double integrate(const RooArgSet* normSet, double low, double high) const;
125
126
129 double _relEpsilon{1.E-4}; ///< Default integrator precision.
130
131 mutable std::unique_ptr<ROOT::Math::IntegratorOneDim> _integrator{nullptr}; ///<! Integrator used to sample bins.
132 mutable std::vector<double> _binBoundaries; ///<! Workspace to store data for bin sampling
133
135};
136
137#endif
#define ClassDefOverride(name, id)
Definition Rtypes.h:346
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
char name[80]
Definition TGX11.cxx:110
Template class to wrap any C++ callable object which takes one argument i.e.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
Definition RooAbsArg.h:79
Abstract base class for binned and unbinned datasets.
Definition RooAbsData.h:57
Abstract interface for all probability density functions.
Definition RooAbsPdf.h:40
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
Abstract base class for objects that represent a real value and implements functionality common to al...
Definition RooAbsReal.h:59
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:24
The RooBinSamplingPdf is supposed to be used as an adapter between a continuous PDF and a binned dist...
double integrate(const RooArgSet *normSet, double low, double high) const
Integrate the wrapped PDF using our current integrator, with given norm set and limits.
RooTemplateProxy< RooAbsPdf > _pdf
std::vector< double > _binBoundaries
! Workspace to store data for bin sampling
void doEval(RooFit::EvalContext &) const override
Integrate the PDF over all its bins, and return a batch with those values.
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, const RooArgSet *nset=nullptr, const RooNumIntConfig *cfg=nullptr, const char *rangeName=nullptr) const override
Forwards to the PDF's implementation.
std::unique_ptr< ROOT::Math::IntegratorOneDim > & integrator() const
Direct access to the unique_ptr holding the integrator that's used to sample the bins.
double expectedEvents(const RooArgSet *nset) const override
Return expected number of events to be used in calculation of extended likelihood.
RooTemplateProxy< RooAbsRealLValue > _observable
Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, bool staticInitOK=true) const override
Forwards to the PDF's implementation.
std::unique_ptr< RooAbsReal > createExpectedEventsFunc(const RooArgSet *nset) const override
Forwards to the PDF's implementation.
double epsilon() const
double maxVal(Int_t code) const override
Return maximum value for set of observables identified by code assigned in getMaxVal.
bool forceAnalyticalInt(const RooAbsArg &dep) const override
void initGenerator(Int_t code) override
Forwards to the PDF's implementation.
std::unique_ptr< ROOT::Math::IntegratorOneDim > _integrator
! Integrator used to sample bins.
bool isDirectGenSafe(const RooAbsArg &arg) const override
Forwards to the PDF's implementation.
double _relEpsilon
Default integrator precision.
TObject * clone(const char *newname) const override
ExtendMode extendMode() const override
Returns ability of PDF to provide extended likelihood terms.
std::span< const double > binBoundaries() const
Get the bin boundaries for the observable.
Int_t getMaxVal(const RooArgSet &vars) const override
Advertise capability to determine maximum value of function for given set of observables.
void generateEvent(Int_t code) override
Forwards to the PDF's implementation.
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName) const override
Forwards to the PDF's implementation.
static std::unique_ptr< RooAbsPdf > create(RooAbsPdf &pdf, RooAbsData const &data, double precision)
Creates a wrapping RooBinSamplingPdf if appropriate.
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &analVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Forwards to the PDF's implementation.
Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &numVars, const char *rangeName=nullptr) const override
Forwards to the PDF's implementation.
double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const override
Forwards to the PDF's implementation.
bool isBinnedDistribution(const RooArgSet &) const override
Returns true, since this PDF is meant to be binned.
double operator()(double x) const
Binding used by the integrator to evaluate the PDF.
bool selfNormalized() const override
Forwards to the PDF's implementation.
double evaluate() const override
Integrate the PDF over the current bin of the observable.
Int_t minTrialSamples(const RooArgSet &arGenObs) const override
const RooAbsPdf & pdf() const
std::list< double > * plotSamplingHint(RooAbsRealLValue &obs, double xlo, double xhi) const override
Return a list of all bin edges, so the PDF is plotted as a step function.
const RooAbsReal & observable() const
Holds the configuration parameters of the various numeric integrators used by RooRealIntegral.
Mother of all ROOT objects.
Definition TObject.h:41
Double_t x[n]
Definition legend1.C:17
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
Definition Config.h:35