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);
58 fact.registerPlugin(
name, creator, {numBins},
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 j*(_xmax[i]-_xmin[i])/_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.;
183 const bool isLastDim =
d+1 == _function->getDimension();
187 const double mid = (
hi+lo)/2.;
190 const double binInt = integrand(_x.data())*(
hi-lo)*delta;
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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.
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.
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)