41 ClassImp(RooProjectedPdf);
48 RooProjectedPdf::RooProjectedPdf() : _curNormSet(0)
57 RooProjectedPdf::RooProjectedPdf(
const char *name,
const char *title, RooAbsReal& _intpdf,
const RooArgSet& intObs) :
58 RooAbsPdf(name,title),
59 intpdf(
"!IntegratedPdf",
"intpdf",this,_intpdf,kFALSE,kFALSE),
60 intobs(
"!IntegrationObservables",
"intobs",this,kFALSE,kFALSE),
61 deps(
"!Dependents",
"deps",this,kTRUE,kTRUE),
67 RooArgSet* tmpdeps = _intpdf.getParameters(intObs) ;
77 RooProjectedPdf::RooProjectedPdf(
const RooProjectedPdf& other,
const char* name) :
78 RooAbsPdf(other,name),
79 intpdf(
"!IntegratedPdf",this,other.intpdf),
80 intobs(
"!IntegrationObservable",this,other.intobs),
81 deps(
"!Dependents",this,other.deps),
82 _cacheMgr(other._cacheMgr,this)
91 Double_t RooProjectedPdf::getValV(
const RooArgSet* set)
const
93 _curNormSet = (RooArgSet*)set ;
95 return RooAbsPdf::getValV(set) ;
103 Double_t RooProjectedPdf::evaluate()
const
107 const RooAbsReal* proj = getProjection(&intobs,_curNormSet,0,code) ;
109 return proj->getVal() ;
120 const RooAbsReal* RooProjectedPdf::getProjection(
const RooArgSet* iset,
const RooArgSet* nset,
const char* rangeName,
int& code)
const
124 Int_t sterileIdx(-1) ;
125 CacheElem* cache = (CacheElem*) _cacheMgr.getObj(iset,nset,&sterileIdx,RooNameReg::ptr(rangeName)) ;
127 code = _cacheMgr.lastIndex() ;
128 return static_cast<const RooAbsReal*
>(cache->_projection);
131 RooArgSet* nset2 = intpdf.arg().getObservables(*nset) ;
136 RooAbsReal* proj = intpdf.arg().createIntegral(iset?*iset:RooArgSet(),nset2,0,rangeName) ;
139 cache =
new CacheElem ;
140 cache->_projection = proj ;
142 code = _cacheMgr.setObj(iset,nset,(RooAbsCacheElement*)cache,RooNameReg::ptr(rangeName)) ;
144 coutI(Integration) <<
"RooProjectedPdf::getProjection(" << GetName() <<
") creating new projection " << proj->GetName() <<
" with code " << code << endl ;
157 RooAbsPdf* RooProjectedPdf::createProjection(
const RooArgSet& iset)
159 RooArgSet combiset(iset) ;
160 combiset.add(intobs) ;
161 return static_cast<RooAbsPdf&
>(
const_cast<RooAbsReal&
>(intpdf.arg()) ).createProjection(combiset) ;
169 Bool_t RooProjectedPdf::forceAnalyticalInt(
const RooAbsArg& )
const
179 Int_t RooProjectedPdf::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars,
const RooArgSet* normSet,
const char* rangeName)
const
181 analVars.add(allVars) ;
185 RooArgSet allVars2(allVars) ;
186 allVars2.add(intobs) ;
187 getProjection(&allVars2,normSet,rangeName,code) ;
197 Double_t RooProjectedPdf::analyticalIntegralWN(Int_t code,
const RooArgSet* ,
const char* rangeName)
const
199 CacheElem *cache = (CacheElem*) _cacheMgr.getObjByIndex(code-1) ;
202 Double_t ret= cache->_projection->getVal() ;
206 RooArgSet* vars = getParameters(RooArgSet()) ;
208 RooArgSet* iset = _cacheMgr.nameSet1ByIndex(code-1)->select(*vars) ;
209 RooArgSet* nset = _cacheMgr.nameSet2ByIndex(code-1)->select(*vars) ;
212 const RooAbsReal* proj = getProjection(iset,nset,rangeName,code2) ;
218 Double_t ret = proj->getVal() ;
229 Int_t RooProjectedPdf::getGenerator(
const RooArgSet& , RooArgSet& , Bool_t )
const
239 void RooProjectedPdf::generateEvent(Int_t )
251 Bool_t RooProjectedPdf::redirectServersHook(
const RooAbsCollection& newServerList, Bool_t ,
255 RooAbsArg* newPdf = newServerList.find(intpdf.arg().GetName()) ;
259 RooArgSet olddeps(deps) ;
260 RooArgSet* newdeps = newPdf->getParameters(intobs) ;
261 RooArgSet* common = (RooArgSet*) newdeps->selectCommon(deps) ;
262 newdeps->remove(*common,kTRUE,kTRUE) ;
263 olddeps.remove(*common,kTRUE,kTRUE) ;
266 if (newdeps->getSize()>0) {
269 if (olddeps.getSize()>0) {
270 deps.remove(olddeps,kTRUE,kTRUE) ;
285 RooArgList RooProjectedPdf::CacheElem::containedArgs(Action)
287 RooArgList ret(*_projection) ;
297 void RooProjectedPdf::printMetaArgs(ostream& os)
const
299 os <<
"Int " << intpdf.arg().GetName() ;
313 void RooProjectedPdf::CacheElem::printCompactTreeHook(ostream& os,
const char* indent, Int_t curElem, Int_t maxElem)
316 os << indent <<
"RooProjectedPdf begin projection cache" << endl ;
319 TString indent2(indent) ;
320 indent2 += Form(
"[%d] ",curElem) ;
322 _projection->printCompactTree(os,indent2) ;
324 if(curElem==maxElem) {
325 os << indent <<
"RooProjectedPdf end projection cache" << endl ;