46 ClassImp(RooBinIntegrator);
54 void RooBinIntegrator::registerIntegrator(RooNumIntFactory& fact)
56 RooRealVar numBins(
"numBins",
"Number of bins in range",100) ;
57 RooBinIntegrator* proto =
new RooBinIntegrator() ;
58 fact.storeProtoIntegrator(proto,RooArgSet(numBins)) ;
59 RooNumIntConfig::defaultConfig().method1D().setLabel(proto->IsA()->GetName()) ;
67 RooBinIntegrator::RooBinIntegrator() : _numBins(0), _useIntegrandLimits(kFALSE), _x(0)
75 RooBinIntegrator::RooBinIntegrator(
const RooAbsFunc&
function) :
76 RooAbsIntegrator(function)
78 _useIntegrandLimits= kTRUE;
79 assert(0 != integrand() && integrand()->isValid());
82 _x =
new Double_t[_function->getDimension()] ;
85 _xmin.resize(_function->getDimension()) ;
86 _xmax.resize(_function->getDimension()) ;
88 for (UInt_t i=0 ; i<_function->getDimension() ; i++) {
89 _xmin[i]= integrand()->getMinLimit(i);
90 _xmax[i]= integrand()->getMaxLimit(i);
93 list<Double_t>* tmp = integrand()->binBoundaries(i) ;
95 oocoutW((TObject*)0,Integration) <<
"RooBinIntegrator::RooBinIntegrator WARNING: integrand provide no binning definition observable #"
96 << i <<
" substituting default binning of " << _numBins <<
" bins" << endl ;
97 tmp =
new list<Double_t> ;
98 for (Int_t j=0 ; j<=_numBins ; j++) {
99 tmp->push_back(_xmin[i]+j*(_xmax[i]-_xmin[i])/_numBins) ;
102 _binb.push_back(tmp) ;
112 RooBinIntegrator::RooBinIntegrator(
const RooAbsFunc&
function,
const RooNumIntConfig& config) :
113 RooAbsIntegrator(function), _binb(0)
115 const RooArgSet& configSet = config.getConfigSection(IsA()->GetName()) ;
116 _useIntegrandLimits= kTRUE;
117 _numBins = (Int_t) configSet.getRealValue(
"numBins") ;
118 assert(0 != integrand() && integrand()->isValid());
121 _x =
new Double_t[_function->getDimension()] ;
123 for (UInt_t i=0 ; i<_function->getDimension() ; i++) {
124 _xmin.push_back(integrand()->getMinLimit(i));
125 _xmax.push_back(integrand()->getMaxLimit(i));
128 list<Double_t>* tmp = integrand()->binBoundaries(i) ;
130 oocoutW((TObject*)0,Integration) <<
"RooBinIntegrator::RooBinIntegrator WARNING: integrand provide no binning definition observable #"
131 << i <<
" substituting default binning of " << _numBins <<
" bins" << endl ;
132 tmp =
new list<Double_t> ;
133 for (Int_t j=0 ; j<=_numBins ; j++) {
134 tmp->push_back(_xmin[i]+j*(_xmax[i]-_xmin[i])/_numBins) ;
137 _binb.push_back(tmp) ;
147 RooAbsIntegrator* RooBinIntegrator::clone(
const RooAbsFunc&
function,
const RooNumIntConfig& config)
const
149 return new RooBinIntegrator(
function,config) ;
159 RooBinIntegrator::~RooBinIntegrator()
162 for (vector<list<Double_t>*>::iterator iter = _binb.begin() ; iter!=_binb.end() ; ++iter) {
174 Bool_t RooBinIntegrator::setLimits(Double_t *xmin, Double_t *xmax)
176 if(_useIntegrandLimits) {
177 oocoutE((TObject*)0,Integration) <<
"RooBinIntegrator::setLimits: cannot override integrand's limits" << endl;
182 return checkLimits();
190 Bool_t RooBinIntegrator::checkLimits()
const
192 if(_useIntegrandLimits) {
193 assert(0 != integrand() && integrand()->isValid());
194 _xmin.resize(_function->getDimension()) ;
195 _xmax.resize(_function->getDimension()) ;
196 for (UInt_t i=0 ; i<_function->getDimension() ; i++) {
197 _xmin[i]= integrand()->getMinLimit(i);
198 _xmax[i]= integrand()->getMaxLimit(i);
201 for (UInt_t i=0 ; i<_function->getDimension() ; i++) {
202 if (_xmax[i]<=_xmin[i]) {
203 oocoutE((TObject*)0,Integration) <<
"RooBinIntegrator::checkLimits: bad range with min >= max (_xmin = " << _xmin[i] <<
" _xmax = " << _xmax[i] <<
")" << endl;
206 if (RooNumber::isInfinite(_xmin[i]) || RooNumber::isInfinite(_xmax[i])) {
218 Double_t RooBinIntegrator::integral(
const Double_t *)
224 if (_function->getDimension()==1) {
225 list<Double_t>::iterator iter = _binb[0]->begin() ;
226 Double_t xlo = *iter ; ++iter ;
227 for (; iter!=_binb[0]->end() ; ++iter) {
228 Double_t xhi = *iter ;
229 Double_t xcenter = (xhi+xlo)/2 ;
230 Double_t binInt = integrand(xvec(xcenter))*(xhi-xlo) ;
237 if (_function->getDimension()==2) {
239 list<Double_t>::iterator iter1 = _binb[0]->begin() ;
241 Double_t x1lo = *iter1 ; ++iter1 ;
242 for (; iter1!=_binb[0]->end() ; ++iter1) {
244 Double_t x1hi = *iter1 ;
245 Double_t x1center = (x1hi+x1lo)/2 ;
247 list<Double_t>::iterator iter2 = _binb[1]->begin() ;
248 Double_t x2lo = *iter2 ; ++iter2 ;
249 for (; iter2!=_binb[1]->end() ; ++iter2) {
251 Double_t x2hi = *iter2 ;
252 Double_t x2center = (x2hi+x2lo)/2 ;
254 Double_t binInt = integrand(xvec(x1center,x2center))*(x1hi-x1lo)*(x2hi-x2lo) ;
263 if (_function->getDimension()==3) {
265 list<Double_t>::iterator iter1 = _binb[0]->begin() ;
267 Double_t x1lo = *iter1 ; ++iter1 ;
268 for (; iter1!=_binb[0]->end() ; ++iter1) {
270 Double_t x1hi = *iter1 ;
271 Double_t x1center = (x1hi+x1lo)/2 ;
273 list<Double_t>::iterator iter2 = _binb[1]->begin() ;
274 Double_t x2lo = *iter2 ; ++iter2 ;
275 for (; iter2!=_binb[1]->end() ; ++iter2) {
277 Double_t x2hi = *iter2 ;
278 Double_t x2center = (x2hi+x2lo)/2 ;
280 list<Double_t>::iterator iter3 = _binb[2]->begin() ;
281 Double_t x3lo = *iter3 ; ++iter3 ;
282 for (; iter3!=_binb[2]->end() ; ++iter3) {
284 Double_t x3hi = *iter3 ;
285 Double_t x3center = (x3hi+x3lo)/2 ;
287 Double_t binInt = integrand(xvec(x1center,x2center,x3center))*(x1hi-x1lo)*(x2hi-x2lo)*(x3hi-x3lo) ;