56 ClassImp(RooRealIntegral);
60 Int_t RooRealIntegral::_cacheAllNDim(2) ;
65 RooRealIntegral::RooRealIntegral() :
67 _respectCompSelect(true),
73 _restartNumIntEngine(kFALSE),
94 RooRealIntegral::RooRealIntegral(
const char *name,
const char *title,
95 const RooAbsReal&
function,
const RooArgSet& depList,
96 const RooArgSet* funcNormSet,
const RooNumIntConfig* config,
97 const char* rangeName) :
98 RooAbsReal(name,title),
100 _respectCompSelect(true),
101 _sumList(
"!sumList",
"Categories to be summed numerically",this,kFALSE,kFALSE),
102 _intList(
"!intList",
"Variables to be integrated numerically",this,kFALSE,kFALSE),
103 _anaList(
"!anaList",
"Variables to be integrated analytically",this,kFALSE,kFALSE),
104 _jacList(
"!jacList",
"Jacobian product term",this,kFALSE,kFALSE),
105 _facList(
"!facList",
"Variables independent of function",this,kFALSE,kTRUE),
106 _function(
"!func",
"Function to be integrated",this,
107 const_cast<RooAbsReal&>(function),kFALSE,kFALSE),
108 _iconfig((RooNumIntConfig*)config),
109 _sumCat(
"!sumCat",
"SuperCategory for summation",this,kFALSE,kFALSE),
112 _intOperMode(Hybrid),
113 _restartNumIntEngine(kFALSE),
116 _rangeName((TNamed*)RooNameReg::ptr(rangeName)),
141 oocxcoutI(&
function,Integration) <<
"RooRealIntegral::ctor(" << GetName() <<
") Constructing integral of function "
142 <<
function.GetName() <<
" over observables" << depList <<
" with normalization "
143 << (funcNormSet?*funcNormSet:RooArgSet()) <<
" with range identifier "
144 << (rangeName?rangeName:
"<none>") << endl ;
148 setExpensiveObjectCache(
function.expensiveObjectCache()) ;
152 if (!_iconfig) _iconfig = (RooNumIntConfig*)
function.getIntegratorConfig() ;
156 _funcNormSet =
new RooArgSet ;
157 for (
const auto nArg : *funcNormSet) {
158 if (
function.dependsOn(*nArg)) {
159 _funcNormSet->addClone(*nArg) ;
169 RooArgSet intDepList(depList) ;
176 for (
auto arg : intDepList) {
177 if(!arg->isLValue()) {
178 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
": cannot integrate non-lvalue ";
182 if (!
function.dependsOn(*arg)) {
183 RooAbsArg* argClone = (RooAbsArg*) arg->Clone() ;
184 _facListOwned.addOwned(*argClone) ;
185 _facList.add(*argClone) ;
186 addServer(*argClone,kFALSE,kTRUE) ;
190 if (_facList.getSize()>0) {
191 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Factorizing obserables are " << _facList << endl ;
202 RooArgSet exclLVBranches(
"exclLVBranches") ;
203 RooArgSet branchList,branchListVD ;
204 function.branchNodeServerList(&branchList) ;
206 for (
auto branch: branchList) {
207 RooAbsRealLValue *realArgLV =
dynamic_cast<RooAbsRealLValue*
>(branch) ;
208 RooAbsCategoryLValue *catArgLV =
dynamic_cast<RooAbsCategoryLValue*
>(branch) ;
209 if ((realArgLV && (realArgLV->isJacobianOK(intDepList)!=0)) || catArgLV) {
210 exclLVBranches.add(*branch) ;
214 if (dependsOnValue(*branch)) {
215 branchListVD.add(*branch) ;
220 exclLVBranches.remove(depList,kTRUE,kTRUE) ;
224 RooArgSet exclLVServers(
"exclLVServers") ;
225 exclLVServers.add(intDepList) ;
230 Bool_t converged(kFALSE) ;
235 std::vector<RooAbsArg*> toBeRemoved;
236 for (
auto server : exclLVServers) {
237 if (!servesExclusively(server,exclLVBranches,branchListVD)) {
238 toBeRemoved.push_back(server);
242 exclLVServers.remove(toBeRemoved.begin(), toBeRemoved.end());
246 for (
auto branch : exclLVBranches) {
247 RooArgSet* brDepList = branch->getObservables(&intDepList) ;
248 RooArgSet bsList(*brDepList,
"bsList") ;
250 bsList.remove(exclLVServers,kTRUE,kTRUE) ;
251 if (bsList.getSize()>0) {
252 exclLVBranches.remove(*branch,kTRUE,kTRUE) ;
260 for (
auto branch : exclLVBranches) {
261 if (!branch->dependsOnValue(exclLVServers)) {
263 exclLVBranches.remove(*branch,kTRUE,kTRUE) ;
271 if (exclLVServers.getSize()>0 && !
function.isBinnedDistribution(exclLVBranches)) {
273 intDepList.remove(exclLVServers) ;
274 intDepList.add(exclLVBranches) ;
287 RooArgSet anIntOKDepList ;
288 for (
auto arg : intDepList) {
289 if (
function.forceAnalyticalInt(*arg)) {
290 anIntOKDepList.add(*arg) ;
294 if (anIntOKDepList.getSize()>0) {
295 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Observables that function forcibly requires to be integrated internally " << anIntOKDepList << endl ;
304 for (
const auto arg :
function.servers()) {
309 if (!arg->dependsOnValue(intDepList)) {
313 if (
function.dependsOnValue(*arg)) {
314 addServer(*arg,kTRUE,kFALSE) ;
322 RooArgSet argLeafServers ;
323 arg->leafNodeServerList(&argLeafServers,0,kFALSE) ;
329 if (!arg->isValueServer(
function) && !arg->isShapeServer(
function)) {
334 for (
const auto leaf : argLeafServers) {
338 if (depList.find(leaf->GetName()) &&
function.dependsOnValue(*leaf)) {
340 RooAbsRealLValue* leaflv =
dynamic_cast<RooAbsRealLValue*
>(leaf) ;
341 if (leaflv && leaflv->getBinning(rangeName).isParameterized()) {
342 oocxcoutD(&
function,Integration) <<
function.GetName() <<
" : Observable " << leaf->GetName() <<
" has parameterized binning, add value dependence of boundary objects rather than shape of leaf" << endl ;
343 if (leaflv->getBinning(rangeName).lowBoundFunc()) {
344 addServer(*leaflv->getBinning(rangeName).lowBoundFunc(),kTRUE,kFALSE) ;
346 if(leaflv->getBinning(rangeName).highBoundFunc()) {
347 addServer(*leaflv->getBinning(rangeName).highBoundFunc(),kTRUE,kFALSE) ;
350 oocxcoutD(&
function,Integration) <<
function.GetName() <<
": Adding observable " << leaf->GetName() <<
" of server "
351 << arg->GetName() <<
" as shape dependent" << endl ;
352 addServer(*leaf,kFALSE,kTRUE) ;
354 }
else if (!depList.find(leaf->GetName())) {
356 if (
function.dependsOnValue(*leaf)) {
357 oocxcoutD(&
function,Integration) <<
function.GetName() <<
": Adding parameter " << leaf->GetName() <<
" of server " << arg->GetName() <<
" as value dependent" << endl ;
358 addServer(*leaf,kTRUE,kFALSE) ;
360 oocxcoutD(&
function,Integration) <<
function.GetName() <<
": Adding parameter " << leaf->GetName() <<
" of server " << arg->GetName() <<
" as shape dependent" << endl ;
361 addServer(*leaf,kFALSE,kTRUE) ;
370 Bool_t depOK(kFALSE) ;
375 if (arg->isDerived()) {
376 RooAbsRealLValue *realArgLV =
dynamic_cast<RooAbsRealLValue*
>(arg) ;
377 RooAbsCategoryLValue *catArgLV =
dynamic_cast<RooAbsCategoryLValue*
>(arg) ;
379 if ((realArgLV && intDepList.find(realArgLV->GetName()) && (realArgLV->isJacobianOK(intDepList)!=0)) || catArgLV) {
387 Bool_t overlapOK = kTRUE ;
388 for (
const auto otherArg :
function.servers()) {
390 if (arg==otherArg) continue ;
391 if (otherArg->IsA()==RooConstVar::Class())
continue ;
392 if (arg->overlaps(*otherArg,kTRUE)) {
398 if (!overlapOK) depOK=kFALSE ;
410 anIntOKDepList.add(*arg,kTRUE) ;
411 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Observable " << arg->GetName() <<
" is suitable for analytical integration (if supported by p.d.f)" << endl ;
418 RooArgSet anIntDepList ;
420 RooArgSet *anaSet =
new RooArgSet( _anaList, Form(
"UniqueCloneOf_%s",_anaList.GetName()));
421 _mode = ((RooAbsReal&)_function.arg()).getAnalyticalIntegralWN(anIntOKDepList,*anaSet,_funcNormSet,RooNameReg::str(_rangeName)) ;
422 _anaList.removeAll() ;
423 _anaList.add(*anaSet);
428 _anaList.removeAll() ;
432 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Function integrated observables " << _anaList <<
" internally with code " << _mode << endl ;
437 function.getVal(_funcNormSet) ;
446 RooArgSet numIntDepList ;
450 for (
const auto arg : _anaList) {
453 if (arg->IsA()->InheritsFrom(RooAbsRealLValue::Class()) && arg->isDerived() && !arg->isFundamental()) {
459 auto argDepList = std::unique_ptr<RooArgSet>(arg->getObservables(&intDepList));
460 for (
const auto argDep : *argDepList) {
461 if (argDep->IsA()->InheritsFrom(RooAbsCategoryLValue::Class()) && intDepList.contains(*argDep)) {
462 numIntDepList.add(*argDep,kTRUE) ;
470 if (_anaList.getSize()==0) {
471 if (exclLVServers.getSize()>0) {
473 intDepList.remove(exclLVBranches) ;
474 intDepList.add(exclLVServers) ;
480 for (
const auto arg :
function.servers()) {
485 if (!_anaList.find(arg->GetName()) && arg->dependsOn(intDepList)) {
488 if (dynamic_cast<RooAbsLValue*>(arg) && arg->isDerived() && intDepList.contains(*arg)) {
489 numIntDepList.add(*arg,kTRUE) ;
494 auto argDeps = std::unique_ptr<RooArgSet>(arg->getObservables(&intDepList));
496 if (argDeps->getSize()>0) {
500 for (
const auto dep : *argDeps) {
501 if (!_anaList.find(dep->GetName())) {
502 numIntDepList.add(*dep,kTRUE) ;
515 for (
const auto arg : numIntDepList) {
516 if (arg->IsA()->InheritsFrom(RooAbsRealLValue::Class())) {
518 }
else if (arg->IsA()->InheritsFrom(RooAbsCategoryLValue::Class())) {
523 if (_anaList.getSize()>0) {
524 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Observables " << _anaList <<
" are analytically integrated with code " << _mode << endl ;
526 if (_intList.getSize()>0) {
527 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Observables " << _intList <<
" are numerically integrated" << endl ;
529 if (_sumList.getSize()>0) {
530 oocxcoutI(&
function,Integration) <<
function.GetName() <<
": Observables " << _sumList <<
" are numerically summed" << endl ;
535 if (numIntDepList.getSize()>0) {
537 _intOperMode = Hybrid ;
538 }
else if (_anaList.getSize()>0) {
540 _intOperMode = Analytic ;
543 _intOperMode = PassThrough ;
547 autoSelectDirtyMode() ;
550 _intList.snapshot(_saveInt) ;
551 _sumList.snapshot(_saveSum) ;
554 if (_sumList.getSize()>0) {
555 RooSuperCategory *sumCat =
new RooSuperCategory(Form(
"%s_sumCat",GetName()),
"sumCat",_sumList) ;
556 _sumCatIter = sumCat->typeIterator() ;
557 _sumCat.addOwned(*sumCat) ;
569 void RooRealIntegral::autoSelectDirtyMode()
572 for (
const auto server : _serverList) {
573 if (server->isValueServer(*
this)) {
575 server->leafNodeServerList(&leafSet) ;
576 for (
const auto leaf : leafSet) {
577 if (leaf->operMode()==ADirty && leaf->isValueServer(*
this)) {
578 setOperMode(ADirty) ;
581 if (leaf->getAttribute(
"projectedDependent")) {
582 setOperMode(ADirty) ;
596 Bool_t RooRealIntegral::servesExclusively(
const RooAbsArg* server,
const RooArgSet& exclLVBranches,
const RooArgSet& allBranches)
const
601 if (exclLVBranches.getSize()==0)
return kFALSE ;
604 if (server->_clientList.empty() && exclLVBranches.find(server->GetName())) {
612 for (
const auto client : server->valueClients()) {
614 if (!(exclLVBranches.find(client->GetName())==client)) {
615 if (allBranches.find(client->GetName())==client) {
616 if (!servesExclusively(client,exclLVBranches,allBranches)) {
627 return (numLVServ==1) ;
637 Bool_t RooRealIntegral::initNumIntegrator()
const
640 if(0 != _numIntEngine) {
641 if(_numIntEngine->isValid() && _numIntEngine->checkLimits() && !_restartNumIntEngine )
return kTRUE;
643 delete _numIntEngine ;
645 if(0 != _numIntegrand) {
646 delete _numIntegrand;
652 if(0 == _intList.getSize())
return kTRUE;
657 _numIntegrand=
new RooRealAnalytic(_function.arg(),_intList,_mode,_funcNormSet,_rangeName);
660 _numIntegrand=
new RooRealBinding(_function.arg(),_intList,_funcNormSet,kFALSE,_rangeName);
662 if(0 == _numIntegrand || !_numIntegrand->isValid()) {
663 coutE(Integration) << ClassName() <<
"::" << GetName() <<
": failed to create valid integrand." << endl;
668 Bool_t isBinned = _function.arg().isBinnedDistribution(_intList) ;
669 _numIntEngine = RooNumIntFactory::instance().createIntegrator(*_numIntegrand,*_iconfig,0,isBinned) ;
671 if(0 == _numIntEngine || !_numIntEngine->isValid()) {
672 coutE(Integration) << ClassName() <<
"::" << GetName() <<
": failed to create valid integrator." << endl;
676 cxcoutI(NumIntegration) <<
"RooRealIntegral::init(" << GetName() <<
") using numeric integrator "
677 << _numIntEngine->IsA()->GetName() <<
" to calculate Int" << _intList << endl ;
679 if (_intList.getSize()>3) {
680 cxcoutI(NumIntegration) <<
"RooRealIntegral::init(" << GetName() <<
") evaluation requires " << _intList.getSize() <<
"-D numeric integration step. Evaluation may be slow, sufficient numeric precision for fitting & minimization is not guaranteed" << endl ;
683 _restartNumIntEngine = kFALSE ;
692 RooRealIntegral::RooRealIntegral(
const RooRealIntegral& other,
const char* name) :
693 RooAbsReal(other,name),
694 _valid(other._valid),
695 _respectCompSelect(other._respectCompSelect),
696 _sumList(
"!sumList",this,other._sumList),
697 _intList(
"!intList",this,other._intList),
698 _anaList(
"!anaList",this,other._anaList),
699 _jacList(
"!jacList",this,other._jacList),
700 _facList(
"!facList",
"Variables independent of function",this,kFALSE,kTRUE),
701 _function(
"!func",this,other._function),
702 _iconfig(other._iconfig),
703 _sumCat(
"!sumCat",this,other._sumCat),
706 _intOperMode(other._intOperMode),
707 _restartNumIntEngine(kFALSE),
710 _rangeName(other._rangeName),
714 _funcNormSet = other._funcNormSet ? (RooArgSet*)other._funcNormSet->snapshot(kFALSE) : 0 ;
716 for (
const auto arg : other._facList) {
717 RooAbsArg* argClone = (RooAbsArg*) arg->Clone() ;
718 _facListOwned.addOwned(*argClone) ;
719 _facList.add(*argClone) ;
720 addServer(*argClone,kFALSE,kTRUE) ;
723 other._intList.snapshot(_saveInt) ;
724 other._sumList.snapshot(_saveSum) ;
733 RooRealIntegral::~RooRealIntegral()
736 if (_numIntEngine)
delete _numIntEngine ;
737 if (_numIntegrand)
delete _numIntegrand ;
738 if (_funcNormSet)
delete _funcNormSet ;
739 if (_sumCatIter)
delete _sumCatIter ;
740 if (_params)
delete _params ;
751 RooAbsReal* RooRealIntegral::createIntegral(
const RooArgSet& iset,
const RooArgSet* nset,
const RooNumIntConfig* cfg,
const char* rangeName)
const
754 if (iset.getSize()==0) {
755 return RooAbsReal::createIntegral(iset,nset,cfg,rangeName) ;
759 RooArgSet isetAll(iset) ;
760 isetAll.add(_sumList) ;
761 isetAll.add(_intList) ;
762 isetAll.add(_anaList) ;
763 isetAll.add(_facList) ;
765 const RooArgSet* newNormSet(0) ;
767 if (nset && !_funcNormSet) {
769 }
else if (!nset && _funcNormSet) {
770 newNormSet = _funcNormSet ;
771 }
else if (nset && _funcNormSet) {
772 tmp =
new RooArgSet ;
774 tmp->add(*_funcNormSet,kTRUE) ;
777 RooAbsReal* ret = _function.arg().createIntegral(isetAll,newNormSet,cfg,rangeName) ;
793 Double_t RooRealIntegral::getValV(
const RooArgSet* nset)
const
800 if (nset && nset!=_lastNSet) {
801 ((RooAbsReal*)
this)->setProxyNormSet(nset) ;
802 _lastNSet = (RooArgSet*) nset ;
805 if (isValueOrShapeDirtyAndClear()) {
806 _value = traceEval(nset) ;
819 Double_t RooRealIntegral::evaluate()
const
821 GlobalSelectComponentRAII selCompRAII(_globalSelectComp || !_respectCompSelect);
824 switch (_intOperMode) {
829 RooDouble* cacheVal(0) ;
830 if ((_cacheNum && _intList.getSize()>0) || _intList.getSize()>=_cacheAllNDim) {
831 cacheVal = (RooDouble*) expensiveObjectCache().retrieveObject(GetName(),RooDouble::Class(),parameters()) ;
842 Bool_t origState = inhibitDirty() ;
843 setDirtyInhibit(kTRUE) ;
846 if(!(_valid= initNumIntegrator())) {
847 coutE(Integration) << ClassName() <<
"::" << GetName()
848 <<
":evaluate: cannot initialize numerical integrator" << endl;
853 _saveInt = _intList ;
854 _saveSum = _sumList ;
861 setDirtyInhibit(origState) ;
868 if ((_cacheNum && _intList.getSize()>0) || _intList.getSize()>=_cacheAllNDim) {
869 RooDouble* val =
new RooDouble(retVal) ;
870 expensiveObjectCache().registerObject(_function.arg().GetName(),GetName(),*val,parameters()) ;
879 retVal = ((RooAbsReal&)_function.arg()).analyticalIntegralWN(_mode,_funcNormSet,RooNameReg::str(_rangeName)) / jacobianProduct() ;
880 cxcoutD(Tracing) <<
"RooRealIntegral::evaluate_analytic(" << GetName()
881 <<
")func = " << _function.arg().IsA()->GetName() <<
"::" << _function.arg().GetName()
882 <<
" raw = " << retVal <<
" _funcNormSet = " << (_funcNormSet?*_funcNormSet:RooArgSet()) << endl ;
891 retVal= _function.arg().getVal(_funcNormSet) ;
899 if (_facList.getSize()>0) {
900 for (
const auto arg : _facList) {
902 if (arg->IsA()->InheritsFrom(RooAbsRealLValue::Class())) {
903 RooAbsRealLValue* argLV = (RooAbsRealLValue*)arg ;
904 retVal *= (argLV->getMax() - argLV->getMin()) ;
907 if (arg->IsA()->InheritsFrom(RooAbsCategoryLValue::Class())) {
908 RooAbsCategoryLValue* argLV = (RooAbsCategoryLValue*)arg ;
909 retVal *= argLV->numTypes() ;
915 if (dologD(Tracing)) {
916 cxcoutD(Tracing) <<
"RooRealIntegral::evaluate(" << GetName() <<
") anaInt = " << _anaList <<
" numInt = " << _intList << _sumList <<
" mode = " ;
918 case Hybrid: ccoutD(Tracing) <<
"Hybrid" ; break ;
919 case Analytic: ccoutD(Tracing) <<
"Analytic" ; break ;
920 case PassThrough: ccoutD(Tracing) <<
"PassThrough" ; break ;
923 ccxcoutD(Tracing) <<
"raw*fact = " << retVal << endl ;
934 Double_t RooRealIntegral::jacobianProduct()
const
936 if (_jacList.getSize()==0) {
940 Double_t jacProd(1) ;
941 for (
const auto elm : _jacList) {
942 auto arg =
static_cast<const RooAbsRealLValue*
>(elm);
943 jacProd *= arg->jacobian() ;
948 return fabs(jacProd) ;
956 Double_t RooRealIntegral::sum()
const
958 if (_sumList.getSize()!=0) {
962 _sumCatIter->Reset() ;
964 RooSuperCategory* sumCat = (RooSuperCategory*) _sumCat.first() ;
965 while((type=(RooCatType*)_sumCatIter->Next())) {
966 sumCat->setIndex(type->getVal()) ;
967 if (!_rangeName || sumCat->inRange(RooNameReg::str(_rangeName))) {
968 total += integrate() / jacobianProduct() ;
976 Double_t ret = integrate() / jacobianProduct() ;
985 Double_t RooRealIntegral::integrate()
const
987 if (!_numIntEngine) {
989 return ((RooAbsReal&)_function.arg()).analyticalIntegralWN(_mode,_funcNormSet,RooNameReg::str(_rangeName)) ;
991 return _numIntEngine->calculate() ;
1000 Bool_t RooRealIntegral::redirectServersHook(
const RooAbsCollection& ,
1001 Bool_t , Bool_t , Bool_t )
1003 _restartNumIntEngine = kTRUE ;
1005 autoSelectDirtyMode() ;
1008 _saveInt.removeAll() ;
1009 _saveSum.removeAll() ;
1010 _intList.snapshot(_saveInt) ;
1011 _sumList.snapshot(_saveSum) ;
1026 const RooArgSet& RooRealIntegral::parameters()
const
1029 _params =
new RooArgSet(
"params") ;
1032 for (
const auto server : _serverList) {
1033 if (server->isValueServer(*
this)) _params->add(*server) ;
1045 void RooRealIntegral::operModeHook()
1047 if (_operMode==ADirty) {
1060 Bool_t RooRealIntegral::isValidReal(Double_t , Bool_t )
const
1068 Bool_t RooRealIntegral::getAllowComponentSelection()
const {
1069 return _respectCompSelect;
1075 void RooRealIntegral::setAllowComponentSelection(Bool_t allow){
1076 _respectCompSelect = allow;
1083 void RooRealIntegral::printMetaArgs(ostream& os)
const
1086 if (intVars().getSize()!=0) {
1089 os << _function.arg().GetName() ;
1092 os << *_funcNormSet ;
1097 RooArgSet tmp(_anaList) ;
1099 if (tmp.getSize()>0) {
1106 RooArgSet tmp2(_intList) ;
1107 tmp2.add(_sumList) ;
1108 if (tmp2.getSize()>0) {
1120 void RooRealIntegral::printMultiline(ostream& os, Int_t contents, Bool_t verbose, TString indent)
const
1122 RooAbsReal::printMultiline(os,contents,verbose,indent) ;
1123 os << indent <<
"--- RooRealIntegral ---" << endl;
1124 os << indent <<
" Integrates ";
1125 _function.arg().printStream(os,kName|kArgs,kSingleLine,indent);
1126 TString deeper(indent);
1128 os << indent <<
" operating mode is "
1129 << (_intOperMode==Hybrid?
"Hybrid":(_intOperMode==Analytic?
"Analytic":
"PassThrough")) << endl ;
1130 os << indent <<
" Summed discrete args are " << _sumList << endl ;
1131 os << indent <<
" Numerically integrated args are " << _intList << endl;
1132 os << indent <<
" Analytically integrated args using mode " << _mode <<
" are " << _anaList << endl ;
1133 os << indent <<
" Arguments included in Jacobian are " << _jacList << endl ;
1134 os << indent <<
" Factorized arguments are " << _facList << endl ;
1135 os << indent <<
" Function normalization set " ;
1137 _funcNormSet->Print(
"1") ;
1149 void RooRealIntegral::setCacheAllNumeric(Int_t ndim) {
1150 _cacheAllNDim = ndim ;
1157 Int_t RooRealIntegral::getCacheAllNumeric()
1159 return _cacheAllNDim ;