58 ClassImp(RooNumIntFactory)
65 void RooNumIntFactory::init() {
66 RooBinIntegrator::registerIntegrator(*
this) ;
67 RooIntegrator1D::registerIntegrator(*
this) ;
68 RooIntegrator2D::registerIntegrator(*
this) ;
69 RooSegmentedIntegrator1D::registerIntegrator(*
this) ;
70 RooSegmentedIntegrator2D::registerIntegrator(*
this) ;
71 RooImproperIntegrator1D::registerIntegrator(*
this) ;
72 RooMCIntegrator::registerIntegrator(*
this) ;
76 RooAdaptiveIntegratorND::registerIntegrator(*
this) ;
78 RooNumIntConfig::defaultConfig().method1D().setLabel(
"RooIntegrator1D") ;
79 RooNumIntConfig::defaultConfig().method1DOpen().setLabel(
"RooImproperIntegrator1D") ;
80 RooNumIntConfig::defaultConfig().method2D().setLabel(
"RooAdaptiveIntegratorND") ;
81 RooNumIntConfig::defaultConfig().methodND().setLabel(
"RooAdaptiveIntegratorND") ;
84 #ifdef R__HAS_MATHMORE
85 int iret = gSystem->Load(
"libRooFitMore");
87 oocoutE((TObject*)
nullptr, Integration) <<
" RooNumIntFactory::Init : libRooFitMore cannot be loaded. GSL integrators will not beavailable ! " << std::endl;
96 RooNumIntFactory& RooNumIntFactory::instance()
98 static unique_ptr<RooNumIntFactory> instance;
105 instance.reset(
new RooNumIntFactory);
119 Bool_t RooNumIntFactory::storeProtoIntegrator(RooAbsIntegrator* proto,
const RooArgSet& defConfig,
const char* depName)
121 TString name = proto->IsA()->GetName() ;
123 if (getProtoIntegrator(name)) {
129 _map[name.Data()] = std::make_pair(unique_ptr<RooAbsIntegrator>(proto), std::string(depName));
132 RooNumIntConfig::defaultConfig().addConfigSection(proto,defConfig) ;
142 const RooAbsIntegrator* RooNumIntFactory::getProtoIntegrator(
const char* name)
const
144 auto item = _map.find(name);
146 return item == _map.end() ?
nullptr : item->second.first.get();
154 const char* RooNumIntFactory::getDepIntegratorName(
const char* name)
const
156 auto item = _map.find(name);
158 return item == _map.end() ?
nullptr : item->second.second.c_str();
172 RooAbsIntegrator* RooNumIntFactory::createIntegrator(RooAbsFunc& func,
const RooNumIntConfig& config, Int_t ndimPreset, Bool_t isBinned)
const
175 Int_t ndim = ndimPreset>0 ? ndimPreset : ((Int_t)func.getDimension()) ;
177 Bool_t openEnded = kFALSE ;
179 for (i=0 ; i<ndim ; i++) {
180 if(RooNumber::isInfinite(func.getMinLimit(i)) ||
181 RooNumber::isInfinite(func.getMaxLimit(i))) {
190 method = openEnded ? config.method1DOpen().getLabel() : config.method1D().getLabel() ;
194 method = openEnded ? config.method2DOpen().getLabel() : config.method2D().getLabel() ;
198 method = openEnded ? config.methodNDOpen().getLabel() : config.methodND().getLabel() ;
203 if (isBinned & !openEnded) {
204 method =
"RooBinIntegrator" ;
208 if (!method.CompareTo(
"N/A")) {
209 oocoutE((TObject*)0,Integration) <<
"RooNumIntFactory::createIntegrator: No integration method has been defined for "
210 << (openEnded?
"an open ended ":
"a ") << ndim <<
"-dimensional integral" << endl ;
215 const RooAbsIntegrator* proto = getProtoIntegrator(method) ;
216 RooAbsIntegrator* engine = proto->clone(func,config) ;
217 if (config.printEvalCounter()) {
218 engine->setPrintEvalCounter(kTRUE) ;