48 ClassImp(RooGenProdProj);
55 RooGenProdProj::RooGenProdProj() :
67 RooGenProdProj::RooGenProdProj(
const char *name,
const char *title,
const RooArgSet& _prodSet,
const RooArgSet& _intSet,
68 const RooArgSet& _normSet,
const char* isetRangeName,
const char* normRangeName, Bool_t doFactorize) :
69 RooAbsReal(name, title),
72 _compSetN(
"compSetN",
"Set of integral components owned by numerator",this,kFALSE),
73 _compSetD(
"compSetD",
"Set of integral components owned by denominator",this,kFALSE),
74 _intList(
"intList",
"List of integrals",this,kTRUE),
78 setExpensiveObjectCache(_prodSet.first()->expensiveObjectCache()) ;
81 _compSetOwnedN =
new RooArgSet ;
82 _compSetOwnedD =
new RooArgSet ;
84 RooAbsReal* numerator = makeIntegral(
"numerator",_prodSet,_intSet,*_compSetOwnedN,isetRangeName,doFactorize) ;
85 RooAbsReal* denominator = makeIntegral(
"denominator",_prodSet,_normSet,*_compSetOwnedD,normRangeName,doFactorize) ;
93 _compSetN.add(*_compSetOwnedN) ;
94 _compSetD.add(*_compSetOwnedD) ;
96 _intList.add(*numerator) ;
98 _intList.add(*denominator) ;
108 RooGenProdProj::RooGenProdProj(
const RooGenProdProj& other,
const char* name) :
109 RooAbsReal(other, name),
112 _compSetN(
"compSetN",
"Set of integral components owned by numerator",this),
113 _compSetD(
"compSetD",
"Set of integral components owned by denominator",this),
114 _intList(
"intList",
"List of integrals",this)
117 TIterator* iter = serverIterator() ;
119 while((server=(RooAbsArg*)iter->Next())) {
120 removeServer(*server,kTRUE) ;
125 _compSetOwnedN = (RooArgSet*) other._compSetN.snapshot() ;
126 _compSetN.add(*_compSetOwnedN) ;
128 _compSetOwnedD = (RooArgSet*) other._compSetD.snapshot() ;
129 _compSetD.add(*_compSetOwnedD) ;
132 TIterator* nIter = _compSetOwnedN->createIterator() ;
133 while((arg=(RooAbsArg*)nIter->Next())) {
135 arg->setOperMode(_operMode) ;
138 TIterator* dIter = _compSetOwnedD->createIterator() ;
139 while((arg=(RooAbsArg*)dIter->Next())) {
141 arg->setOperMode(_operMode) ;
146 _haveD = other._haveD ;
147 _intList.add(*_compSetN.find(other._intList.at(0)->GetName())) ;
149 _intList.add(*_compSetD.find(other._intList.at(1)->GetName())) ;
158 RooGenProdProj::~RooGenProdProj()
160 if (_compSetOwnedN)
delete _compSetOwnedN ;
161 if (_compSetOwnedD)
delete _compSetOwnedD ;
178 RooAbsReal* RooGenProdProj::makeIntegral(
const char* name,
const RooArgSet& compSet,
const RooArgSet& intSet,
179 RooArgSet& saveSet,
const char* isetRangeName, Bool_t doFactorize)
181 RooArgSet anaIntSet, numIntSet ;
184 TIterator* compIter = compSet.createIterator() ;
185 TIterator* intIter = intSet.createIterator() ;
188 while((arg=(RooAbsArg*)intIter->Next())) {
191 while((pdf=(RooAbsPdf*)compIter->Next())) {
192 if (pdf->dependsOn(*arg)) count++ ;
196 }
else if (count==1) {
197 anaIntSet.add(*arg) ;
204 numIntSet.add(intSet) ;
207 while((pdf=(RooAbsPdf*)compIter->Next())) {
208 if (doFactorize && pdf->dependsOn(anaIntSet)) {
210 Int_t code = pdf->getAnalyticalIntegralWN(anaIntSet,anaSet,0,isetRangeName) ;
213 RooAbsReal* pai = pdf->createIntegral(anaSet,isetRangeName) ;
214 pai->setOperMode(_operMode) ;
220 numIntSet.remove(anaSet) ;
223 saveSet.addOwned(*pai) ;
239 prodName = Form(
"%s_%s_Range[%s]",GetName(),name,isetRangeName) ;
241 prodName = Form(
"%s_%s",GetName(),name) ;
243 RooProduct* prod =
new RooProduct(prodName,
"product",prodSet) ;
244 prod->setExpensiveObjectCache(expensiveObjectCache()) ;
245 prod->setOperMode(_operMode) ;
248 saveSet.addOwned(*prod) ;
251 RooAbsReal* ret = prod->createIntegral(numIntSet,isetRangeName) ;
254 ret->setOperMode(_operMode) ;
255 saveSet.addOwned(*ret) ;
269 Double_t RooGenProdProj::evaluate()
const
271 Double_t nom = ((RooAbsReal*)_intList.at(0))->getVal() ;
273 if (!_haveD)
return nom ;
275 Double_t den = ((RooAbsReal*)_intList.at(1))->getVal() ;
287 void RooGenProdProj::operModeHook()
292 TIterator* nIter = _compSetOwnedN->createIterator() ;
293 while((arg=(RooAbsArg*)nIter->Next())) {
294 arg->setOperMode(_operMode) ;
298 TIterator* dIter = _compSetOwnedD->createIterator() ;
299 while((arg=(RooAbsArg*)dIter->Next())) {
300 arg->setOperMode(_operMode) ;
304 _intList.at(0)->setOperMode(_operMode) ;
305 if (_haveD) _intList.at(1)->setOperMode(Auto) ;