46 ClassImp(RooAdaptiveIntegratorND);
54 void RooAdaptiveIntegratorND::registerIntegrator(RooNumIntFactory& fact)
56 RooRealVar maxEval2D(
"maxEval2D",
"Max number of function evaluations for 2-dim integrals",100000) ;
57 RooRealVar maxEval3D(
"maxEval3D",
"Max number of function evaluations for 3-dim integrals",1000000) ;
58 RooRealVar maxEvalND(
"maxEvalND",
"Max number of function evaluations for >3-dim integrals",10000000) ;
59 RooRealVar maxWarn(
"maxWarn",
"Max number of warnings on precision not reached that is printed",5) ;
61 fact.storeProtoIntegrator(
new RooAdaptiveIntegratorND(),RooArgSet(maxEval2D,maxEval3D,maxEvalND,maxWarn)) ;
69 RooAdaptiveIntegratorND::RooAdaptiveIntegratorND()
80 _useIntegrandLimits = kTRUE ;
91 RooAdaptiveIntegratorND::RooAdaptiveIntegratorND(
const RooAbsFunc&
function,
const RooNumIntConfig& config) :
92 RooAbsIntegrator(function)
95 _func =
new RooMultiGenFunction(
function) ;
96 _nWarn =
static_cast<Int_t
>(config.getConfigSection(
"RooAdaptiveIntegratorND").getRealValue(
"maxWarn")) ;
97 switch (_func->NDim()) {
98 case 1:
throw string(Form(
"RooAdaptiveIntegratorND::ctor ERROR dimension of function must be at least 2")) ;
99 case 2: _nmax =
static_cast<Int_t
>(config.getConfigSection(
"RooAdaptiveIntegratorND").getRealValue(
"maxEval2D")) ; break ;
100 case 3: _nmax =
static_cast<Int_t
>(config.getConfigSection(
"RooAdaptiveIntegratorND").getRealValue(
"maxEval3D")) ; break ;
101 default: _nmax =
static_cast<Int_t
>(config.getConfigSection(
"RooAdaptiveIntegratorND").getRealValue(
"maxEvalND")) ; break ;
105 _epsRel = config.epsRel();
106 _integrator =
new ROOT::Math::AdaptiveIntegratorMultiDim(_epsAbs,_epsRel,_nmax) ;
107 _integrator->SetFunction(*_func) ;
108 _useIntegrandLimits=kTRUE ;
115 _intName =
function.getName() ;
123 RooAbsIntegrator* RooAdaptiveIntegratorND::clone(
const RooAbsFunc&
function,
const RooNumIntConfig& config)
const
125 RooAbsIntegrator* ret =
new RooAdaptiveIntegratorND(
function,config) ;
136 RooAdaptiveIntegratorND::~RooAdaptiveIntegratorND()
142 if (_nError>_nWarn) {
143 coutW(NumIntegration) <<
"RooAdaptiveIntegratorND::dtor(" << _intName
144 <<
") WARNING: Number of suppressed warningings about integral evaluations where target precision was not reached is " << _nError-_nWarn << endl ;
155 Bool_t RooAdaptiveIntegratorND::checkLimits()
const
158 _xmin =
new Double_t[_func->NDim()] ;
159 _xmax =
new Double_t[_func->NDim()] ;
162 if (_useIntegrandLimits) {
163 for (UInt_t i=0 ; i<_func->NDim() ; i++) {
164 _xmin[i]= integrand()->getMinLimit(i);
165 _xmax[i]= integrand()->getMaxLimit(i);
178 Bool_t RooAdaptiveIntegratorND::setLimits(Double_t *xmin, Double_t *xmax)
180 if(_useIntegrandLimits) {
181 oocoutE((TObject*)0,Integration) <<
"RooAdaptiveIntegratorND::setLimits: cannot override integrand's limits" << endl;
184 for (UInt_t i=0 ; i<_func->NDim() ; i++) {
189 return checkLimits();
198 Double_t RooAdaptiveIntegratorND::integral(
const Double_t* )
200 Double_t ret = _integrator->Integral(_xmin,_xmax) ;
201 if (_integrator->Status()==1) {
203 if (_nError<=_nWarn) {
204 coutW(NumIntegration) <<
"RooAdaptiveIntegratorND::integral(" << integrand()->getName() <<
") WARNING: target rel. precision not reached due to nEval limit of "
205 << _nmax <<
", estimated rel. precision is " << Form(
"%3.1e",_integrator->RelError()) << endl ;
207 if (_nError==_nWarn) {
208 coutW(NumIntegration) <<
"RooAdaptiveIntegratorND::integral(" << integrand()->getName()
209 <<
") Further warnings on target precision are suppressed conform specification in integrator specification" << endl ;