47 ClassImp(RooImproperIntegrator1D);
55 void RooImproperIntegrator1D::registerIntegrator(RooNumIntFactory& fact)
57 RooImproperIntegrator1D* proto =
new RooImproperIntegrator1D() ;
58 fact.storeProtoIntegrator(proto,RooArgSet(),RooIntegrator1D::Class()->GetName()) ;
66 RooImproperIntegrator1D::RooImproperIntegrator1D() :
67 _case(ClosedBothEnds), _xmin(-10), _xmax(10), _useIntegrandLimits(kTRUE),
68 _origFunc(0), _function(0), _integrator1(0), _integrator2(0), _integrator3(0)
77 RooImproperIntegrator1D::RooImproperIntegrator1D(
const RooAbsFunc&
function) :
78 RooAbsIntegrator(function),
79 _useIntegrandLimits(kTRUE),
80 _origFunc((RooAbsFunc*)&function),
86 initialize(&
function) ;
95 RooImproperIntegrator1D::RooImproperIntegrator1D(
const RooAbsFunc&
function,
const RooNumIntConfig& config) :
96 RooAbsIntegrator(function),
97 _useIntegrandLimits(kTRUE),
98 _origFunc((RooAbsFunc*)&function),
105 initialize(&
function) ;
113 RooImproperIntegrator1D::RooImproperIntegrator1D(
const RooAbsFunc&
function, Double_t xmin, Double_t xmax,
const RooNumIntConfig& config) :
114 RooAbsIntegrator(function),
117 _useIntegrandLimits(kFALSE),
118 _origFunc((RooAbsFunc*)&function),
125 initialize(&
function) ;
133 RooAbsIntegrator* RooImproperIntegrator1D::clone(
const RooAbsFunc&
function,
const RooNumIntConfig& config)
const
135 return new RooImproperIntegrator1D(
function,config) ;
143 void RooImproperIntegrator1D::initialize(
const RooAbsFunc*
function)
146 oocoutE((TObject*)0,Integration) <<
"RooImproperIntegrator: cannot integrate invalid function" << endl;
151 _function=
new RooInvTransform(*
function);
153 function = _origFunc ;
155 delete _integrator1 ;
159 delete _integrator2 ;
163 delete _integrator3 ;
170 switch(_case= limitsCase()) {
173 _integrator1=
new RooIntegrator1D(*
function,_xmin,_xmax,_config);
178 _integrator1=
new RooIntegrator1D(*
function,-1,+1,RooIntegrator1D::Trapezoid);
180 _integrator2=
new RooIntegrator1D(*_function,-1,0,RooIntegrator1D::Midpoint);
181 _integrator3=
new RooIntegrator1D(*_function,0,+1,RooIntegrator1D::Midpoint);
183 case OpenBelowSpansZero:
185 _integrator1=
new RooIntegrator1D(*_function,-1,0,RooIntegrator1D::Midpoint);
186 _integrator2=
new RooIntegrator1D(*
function,-1,_xmax,RooIntegrator1D::Trapezoid);
190 _integrator1=
new RooIntegrator1D(*_function,1/_xmax,0,RooIntegrator1D::Midpoint);
192 case OpenAboveSpansZero:
194 _integrator1=
new RooIntegrator1D(*_function,0,+1,RooIntegrator1D::Midpoint);
195 _integrator2=
new RooIntegrator1D(*
function,_xmin,+1,RooIntegrator1D::Trapezoid);
199 _integrator1=
new RooIntegrator1D(*_function,0,1/_xmin,RooIntegrator1D::Midpoint);
211 RooImproperIntegrator1D::~RooImproperIntegrator1D()
213 if(0 != _integrator1)
delete _integrator1;
214 if(0 != _integrator2)
delete _integrator2;
215 if(0 != _integrator3)
delete _integrator3;
216 if(0 != _function)
delete _function;
225 Bool_t RooImproperIntegrator1D::setLimits(Double_t *xmin, Double_t *xmax)
227 if(_useIntegrandLimits) {
228 oocoutE((TObject*)0,Integration) <<
"RooIntegrator1D::setLimits: cannot override integrand's limits" << endl;
234 return checkLimits();
244 Bool_t RooImproperIntegrator1D::checkLimits()
const
247 if (_useIntegrandLimits) {
248 if(_xmin == integrand()->getMinLimit(0) &&
249 _xmax == integrand()->getMaxLimit(0))
return kTRUE;
253 if(limitsCase() != _case) {
255 const_cast<RooImproperIntegrator1D*
>(
this)->initialize() ;
262 _integrator1->setLimits(_xmin,_xmax);
267 case OpenBelowSpansZero:
268 _integrator2->setLimits(-1,_xmax);
271 _integrator1->setLimits(1/_xmax,0);
273 case OpenAboveSpansZero:
274 _integrator2->setLimits(_xmin,+1);
277 _integrator1->setLimits(0,1/_xmin);
290 RooImproperIntegrator1D::LimitsCase RooImproperIntegrator1D::limitsCase()
const
293 if(0 == integrand() || !integrand()->isValid())
return Invalid;
295 if (_useIntegrandLimits) {
296 _xmin= integrand()->getMinLimit(0);
297 _xmax= integrand()->getMaxLimit(0);
300 Bool_t inf1= RooNumber::isInfinite(_xmin);
301 Bool_t inf2= RooNumber::isInfinite(_xmax);
304 return ClosedBothEnds;
306 else if(inf1 && inf2) {
312 return OpenBelowSpansZero;
320 return OpenAboveSpansZero;
333 Double_t RooImproperIntegrator1D::integral(
const Double_t* yvec)
336 if(0 != _integrator1) result+= _integrator1->integral(yvec);
337 if(0 != _integrator2) result+= _integrator2->integral(yvec);
338 if(0 != _integrator3) result+= _integrator3->integral(yvec);