41using std::endl, std::list;
50 RooRealVar numBins(
"numBins",
"Number of bins in range",100) ;
52 std::string
name =
"RooBinIntegrator";
55 return std::make_unique<RooBinIntegrator>(function, config);
71RooBinIntegrator::RooBinIntegrator(
const RooAbsFunc &function,
int numBins)
74 assert(_function && _function->isValid());
77 _x.resize(_function->getDimension());
80 _xmin.resize(_function->getDimension()) ;
81 _xmax.resize(_function->getDimension()) ;
83 for (
UInt_t i=0 ; i<_function->getDimension() ; i++) {
84 _xmin[i]= _function->getMinLimit(i);
85 _xmax[i]= _function->getMaxLimit(i);
88 std::unique_ptr<list<double>> tmp{ _function->binBoundaries(i) };
90 oocoutW(
nullptr,Integration) <<
"RooBinIntegrator::RooBinIntegrator WARNING: integrand provide no binning definition observable #"
91 << i <<
" substituting default binning of " << _numBins <<
" bins" << std::endl ;
92 tmp = std::make_unique<list<double>>( );
93 for (
Int_t j=0 ; j<=_numBins ; j++) {
94 tmp->push_back(_xmin[i]+j*(_xmax[i]-_xmin[i])/_numBins) ;
97 _binb.emplace_back(tmp->begin(), tmp->end());
109 RooBinIntegrator(
function, static_cast<
int>(config.getConfigSection(
"RooBinIntegrator").getRealValue(
"numBins")))
119bool RooBinIntegrator::setLimits(
double *
xmin,
double *
xmax)
121 if(_useIntegrandLimits) {
122 oocoutE(
nullptr,Integration) <<
"RooBinIntegrator::setLimits: cannot override integrand's limits" << std::endl;
127 return checkLimits();
135bool RooBinIntegrator::checkLimits()
const
137 if(_useIntegrandLimits) {
138 assert(
nullptr != integrand() && integrand()->isValid());
139 _xmin.resize(_function->getDimension()) ;
140 _xmax.resize(_function->getDimension()) ;
141 for (
UInt_t i=0 ; i<_function->getDimension() ; i++) {
142 _xmin[i]= integrand()->getMinLimit(i);
143 _xmax[i]= integrand()->getMaxLimit(i);
146 for (
UInt_t i=0 ; i<_function->getDimension() ; i++) {
147 if (_xmax[i]<=_xmin[i]) {
148 oocoutE(
nullptr,Integration) <<
"RooBinIntegrator::checkLimits: bad range with min >= max (_xmin = " << _xmin[i] <<
" _xmax = " << _xmax[i] <<
")" << std::endl;
163double RooBinIntegrator::integral(
const double *)
166 if (_function->getDimension() < 1)
return 0.;
170 recursive_integration(0,1.,
sum);
182 const std::vector<double>& binb = _binb[
d];
183 const bool isLastDim =
d+1 == _function->getDimension();
184 for (
unsigned int ibin=0; ibin < binb.size() - 1; ++ibin) {
185 const double hi = binb[ibin + 1];
186 const double lo = binb[ibin];
187 const double mid = (
hi+lo)/2.;
190 const double binInt = integrand(_x.data())*(
hi-lo)*delta;
194 recursive_integration(
d+1, (
hi-lo)*delta,
sum);
int Int_t
Signed integer 4 bytes (int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
The Kahan summation is a compensated summation algorithm, which significantly reduces numerical error...
Abstract interface for evaluating a real-valued function of one real variable and performing numerica...
Abstract interface for integrators of real-valued functions that implement the RooAbsFunc interface.
bool setLabel(const char *label, bool printError=true) override
Set value by specifying the name of the desired state.
Holds the configuration parameters of the various numeric integrators used by RooRealIntegral.
static RooNumIntConfig & defaultConfig()
Return reference to instance of default numeric integrator configuration object.
Factory to instantiate numeric integrators from a given function binding and a given configuration.
bool registerPlugin(std::string const &name, Creator const &creator, const RooArgSet &defConfig, bool canIntegrate1D, bool canIntegrate2D, bool canIntegrateND, bool canIntegrateOpenEnded, const char *depName="")
Method accepting registration of a prototype numeric integrator along with a RooArgSet of its default...
static constexpr int isInfinite(double x)
Return true if x is infinite by RooNumber internal specification.
Variable that can be changed from the outside.
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
static uint64_t sum(uint64_t i)