44 ClassImp(RooSegmentedIntegrator1D);
52 void RooSegmentedIntegrator1D::registerIntegrator(RooNumIntFactory& fact)
54 RooRealVar numSeg(
"numSeg",
"Number of segments",3) ;
55 fact.storeProtoIntegrator(
new RooSegmentedIntegrator1D(),numSeg,RooIntegrator1D::Class()->GetName()) ;
65 RooSegmentedIntegrator1D::RooSegmentedIntegrator1D() : _array(0)
75 RooSegmentedIntegrator1D::RooSegmentedIntegrator1D(
const RooAbsFunc&
function,
const RooNumIntConfig& config) :
76 RooAbsIntegrator(function), _config(config)
78 _nseg = (Int_t) config.getConfigSection(IsA()->GetName()).getRealValue(
"numSeg",3) ;
79 _useIntegrandLimits= kTRUE;
90 RooSegmentedIntegrator1D::RooSegmentedIntegrator1D(
const RooAbsFunc&
function, Double_t xmin, Double_t xmax,
91 const RooNumIntConfig& config) :
92 RooAbsIntegrator(function), _config(config)
94 _nseg = (Int_t) config.getConfigSection(IsA()->GetName()).getRealValue(
"numSeg",3) ;
95 _useIntegrandLimits= kFALSE;
107 RooAbsIntegrator* RooSegmentedIntegrator1D::clone(
const RooAbsFunc&
function,
const RooNumIntConfig& config)
const
109 return new RooSegmentedIntegrator1D(
function,config) ;
114 typedef RooIntegrator1D* pRooIntegrator1D ;
119 Bool_t RooSegmentedIntegrator1D::initialize()
123 Bool_t limitsOK = checkLimits();
124 if (!limitsOK)
return kFALSE ;
127 _array =
new pRooIntegrator1D[_nseg] ;
131 Double_t segSize = (_xmax - _xmin) / _nseg ;
134 _config.setEpsRel(_config.epsRel()/sqrt(1.*_nseg)) ;
135 _config.setEpsAbs(_config.epsAbs()/sqrt(1.*_nseg)) ;
137 for (i=0 ; i<_nseg ; i++) {
138 _array[i] =
new RooIntegrator1D(*_function,_xmin+i*segSize,_xmin+(i+1)*segSize,_config) ;
149 RooSegmentedIntegrator1D::~RooSegmentedIntegrator1D()
152 for (Int_t i=0 ; i<_nseg ; i++) {
166 Bool_t RooSegmentedIntegrator1D::setLimits(Double_t* xmin, Double_t* xmax)
168 if(_useIntegrandLimits) {
169 oocoutE((TObject*)0,InputArguments) <<
"RooSegmentedIntegrator1D::setLimits: cannot override integrand's limits" << endl;
174 return checkLimits();
183 Bool_t RooSegmentedIntegrator1D::checkLimits()
const
185 if(_useIntegrandLimits) {
186 assert(0 != integrand() && integrand()->isValid());
187 _xmin= integrand()->getMinLimit(0);
188 _xmax= integrand()->getMaxLimit(0);
190 _range= _xmax - _xmin;
192 oocoutE((TObject*)0,InputArguments) <<
"RooIntegrator1D::checkLimits: bad range with min >= max" << endl;
195 Bool_t ret = (RooNumber::isInfinite(_xmin) || RooNumber::isInfinite(_xmax)) ? kFALSE : kTRUE;
199 Double_t segSize = (_xmax - _xmin) / _nseg ;
201 for (i=0 ; i<_nseg ; i++) {
202 _array[i]->setLimits(_xmin+i*segSize,_xmin+(i+1)*segSize) ;
215 Double_t RooSegmentedIntegrator1D::integral(
const Double_t *yvec)
221 for (i=0 ; i<_nseg ; i++) {
222 result += _array[i]->integral(yvec) ;