83 RooProdPdf::RooProdPdf() :
87 _useDefaultGen(kFALSE),
100 RooProdPdf::RooProdPdf(
const char *name,
const char *title, Double_t cutOff) :
101 RooAbsPdf(name,title),
105 _pdfList(
"!pdfs",
"List of PDFs",this),
107 _useDefaultGen(kFALSE),
134 RooProdPdf::RooProdPdf(
const char *name,
const char *title,
135 RooAbsPdf& pdf1, RooAbsPdf& pdf2, Double_t cutOff) :
136 RooAbsPdf(name,title),
140 _pdfList(
"!pdfs",
"List of PDFs",this),
142 _useDefaultGen(kFALSE),
147 RooArgSet* nset1 =
new RooArgSet(
"nset") ;
148 _pdfNSetList.Add(nset1) ;
149 if (pdf1.canBeExtended()) {
150 _extendedIndex = _pdfList.index(&pdf1) ;
154 RooArgSet* nset2 =
new RooArgSet(
"nset") ;
155 _pdfNSetList.Add(nset2) ;
157 if (pdf2.canBeExtended()) {
158 if (_extendedIndex>=0) {
160 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" << GetName()
161 <<
") multiple components with extended terms detected,"
162 <<
" product will not be extendible." << endl ;
165 _extendedIndex=_pdfList.index(&pdf2) ;
190 RooProdPdf::RooProdPdf(
const char* name,
const char* title,
const RooArgList& inPdfList, Double_t cutOff) :
191 RooAbsPdf(name,title),
195 _pdfList(
"!pdfs",
"List of PDFs",this),
197 _useDefaultGen(kFALSE),
201 RooFIter iter = inPdfList.fwdIterator();
203 Int_t numExtended(0) ;
204 while((arg=(RooAbsArg*)iter.next())) {
205 RooAbsPdf* pdf =
dynamic_cast<RooAbsPdf*
>(arg) ;
207 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" << GetName() <<
") list arg "
208 << arg->GetName() <<
" is not a PDF, ignored" << endl ;
213 RooArgSet* nset =
new RooArgSet(
"nset") ;
214 _pdfNSetList.Add(nset) ;
216 if (pdf->canBeExtended()) {
217 _extendedIndex = _pdfList.index(pdf) ;
224 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" << GetName()
225 <<
") WARNING: multiple components with extended terms detected,"
226 <<
" product will not be extendible." << endl ;
227 _extendedIndex = -1 ;
267 RooProdPdf::RooProdPdf(
const char* name,
const char* title,
const RooArgSet& fullPdfSet,
268 const RooCmdArg& arg1,
const RooCmdArg& arg2,
269 const RooCmdArg& arg3,
const RooCmdArg& arg4,
270 const RooCmdArg& arg5,
const RooCmdArg& arg6,
271 const RooCmdArg& arg7,
const RooCmdArg& arg8) :
272 RooAbsPdf(name,title),
276 _pdfList(
"!pdfs",
"List of PDFs",this),
278 _useDefaultGen(kFALSE),
283 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
284 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
285 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
286 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
288 initializeFromCmdArgList(fullPdfSet,l) ;
297 RooProdPdf::RooProdPdf(
const char* name,
const char* title,
298 const RooCmdArg& arg1,
const RooCmdArg& arg2,
299 const RooCmdArg& arg3,
const RooCmdArg& arg4,
300 const RooCmdArg& arg5,
const RooCmdArg& arg6,
301 const RooCmdArg& arg7,
const RooCmdArg& arg8) :
302 RooAbsPdf(name,title),
306 _pdfList(
"!pdfList",
"List of PDFs",this),
308 _useDefaultGen(kFALSE),
313 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
314 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
315 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
316 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
318 initializeFromCmdArgList(RooArgSet(),l) ;
327 RooProdPdf::RooProdPdf(
const char* name,
const char* title,
const RooArgSet& fullPdfSet,
const RooLinkedList& cmdArgList) :
328 RooAbsPdf(name,title),
332 _pdfList(
"!pdfs",
"List of PDFs",this),
334 _useDefaultGen(kFALSE),
338 initializeFromCmdArgList(fullPdfSet, cmdArgList) ;
347 RooProdPdf::RooProdPdf(
const RooProdPdf& other,
const char* name) :
348 RooAbsPdf(other,name),
349 _cacheMgr(other._cacheMgr,this),
350 _genCode(other._genCode),
351 _cutOff(other._cutOff),
352 _pdfList(
"!pdfs",this,other._pdfList),
353 _extendedIndex(other._extendedIndex),
354 _useDefaultGen(other._useDefaultGen),
355 _refRangeName(other._refRangeName),
356 _selfNorm(other._selfNorm),
357 _defNormSet(other._defNormSet)
360 RooFIter iter = other._pdfNSetList.fwdIterator();
362 while((nset=(RooArgSet*)iter.next())) {
363 RooArgSet* tmp = (RooArgSet*) nset->snapshot() ;
364 tmp->setName(nset->GetName()) ;
365 _pdfNSetList.Add(tmp) ;
376 void RooProdPdf::initializeFromCmdArgList(
const RooArgSet& fullPdfSet,
const RooLinkedList& l)
378 Int_t numExtended(0) ;
381 RooFIter siter = fullPdfSet.fwdIterator() ;
383 while((pdf=(RooAbsPdf*)siter.next())) {
385 RooArgSet* nset1 =
new RooArgSet(
"nset") ;
386 _pdfNSetList.Add(nset1) ;
388 if (pdf->canBeExtended()) {
389 _extendedIndex = _pdfList.index(pdf) ;
396 RooFIter iter = l.fwdIterator();
398 while((carg=(RooCmdArg*)iter.next())) {
400 if (0 == strcmp(carg->GetName(),
"Conditional")) {
402 Int_t argType = carg->getInt(0) ;
403 RooArgSet* pdfSet = (RooArgSet*) carg->getSet(0) ;
404 RooArgSet* normSet = (RooArgSet*) carg->getSet(1) ;
406 RooFIter siter2 = pdfSet->fwdIterator() ;
408 while ((thePdf=(RooAbsPdf*)siter2.next())) {
409 _pdfList.add(*thePdf) ;
411 RooArgSet* tmp = (RooArgSet*) normSet->snapshot() ;
412 tmp->setName(0 == argType ?
"nset" :
"cset") ;
413 _pdfNSetList.Add(tmp) ;
415 if (thePdf->canBeExtended()) {
416 _extendedIndex = _pdfList.index(thePdf) ;
422 }
else if (0 != strlen(carg->GetName())) {
423 coutW(InputArguments) <<
"Unknown arg: " << carg->GetName() << endl ;
429 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" << GetName()
430 <<
") WARNING: multiple components with extended terms detected,"
431 <<
" product will not be extendible." << endl ;
432 _extendedIndex = -1 ;
443 RooProdPdf::~RooProdPdf()
445 _pdfNSetList.Delete() ;
454 Double_t RooProdPdf::getValV(
const RooArgSet* set)
const
456 _curNormSet = (RooArgSet*)set ;
457 return RooAbsPdf::getValV(set) ;
465 Double_t RooProdPdf::evaluate()
const
468 CacheElem* cache = (CacheElem*) _cacheMgr.getObj(_curNormSet,0,&code) ;
472 code = getPartIntList(_curNormSet,
nullptr) ;
473 cache = (CacheElem*) _cacheMgr.getObj(_curNormSet,0,&code) ;
477 return calculate(*cache) ;
486 Double_t RooProdPdf::calculate(
const RooProdPdf::CacheElem& cache, Bool_t )
const
490 if (cache._isRearranged) {
492 cxcoutD(Eval) <<
"RooProdPdf::calculate(" << GetName() <<
") rearranged product calculation"
493 <<
" calculate: num = " << cache._rearrangedNum->GetName() <<
" = " << cache._rearrangedNum->getVal() << endl ;
495 cxcoutD(Eval) <<
"calculate: den = " << cache._rearrangedDen->GetName() <<
" = " << cache._rearrangedDen->getVal() << endl ;
499 return cache._rearrangedNum->getVal() / cache._rearrangedDen->getVal();
502 Double_t value = 1.0;
503 assert(cache._normList.size() == cache._partList.size());
504 for (std::size_t i = 0; i < cache._partList.size(); ++i) {
505 const auto& partInt =
static_cast<const RooAbsReal&
>(cache._partList[i]);
506 const auto normSet = cache._normList[i].get();
508 const Double_t piVal = partInt.getVal(normSet->getSize() > 0 ? normSet :
nullptr);
510 if (value <= _cutOff)
break;
517 RooSpan<double> RooProdPdf::evaluateBatch(std::size_t begin, std::size_t size)
const {
519 auto cache =
static_cast<CacheElem*
>(_cacheMgr.getObj(_curNormSet,
nullptr, &code));
523 code = getPartIntList(_curNormSet,
nullptr);
524 cache =
static_cast<CacheElem*
>(_cacheMgr.getObj(_curNormSet,
nullptr, &code));
527 if (cache->_isRearranged) {
529 cxcoutD(Eval) <<
"RooProdPdf::calculate(" << GetName() <<
") rearranged product calculation"
530 <<
" calculate: num = " << cache->_rearrangedNum->GetName() <<
" = " << cache->_rearrangedNum->getVal() << endl ;
531 cxcoutD(Eval) <<
"calculate: den = " << cache->_rearrangedDen->GetName() <<
" = " << cache->_rearrangedDen->getVal() << endl ;
534 auto outputs = _batchData.makeWritableBatchUnInit(begin, size);
535 auto numerator = cache->_rearrangedNum->getValBatch(begin, size);
536 auto denominator = cache->_rearrangedDen->getValBatch(begin, size);
538 for (std::size_t i=0; i < outputs.size(); ++i) {
539 outputs[i] = numerator[i] / denominator[i];
545 auto outputs = _batchData.makeWritableBatchInit(begin, size, 1.);
546 assert(cache->_normList.size() == cache->_partList.size());
547 for (std::size_t i = 0; i < cache->_partList.size(); ++i) {
548 const auto& partInt =
static_cast<const RooAbsReal&
>(cache->_partList[i]);
549 const auto normSet = cache->_normList[i].get();
551 const auto partialInts = partInt.getValBatch(begin, size, normSet->getSize() > 0 ? normSet :
nullptr);
552 for (std::size_t j=0; j < outputs.size(); ++j) {
553 outputs[j] *= partialInts[j];
566 void RooProdPdf::factorizeProduct(
const RooArgSet& normSet,
const RooArgSet& intSet,
567 RooLinkedList& termList, RooLinkedList& normList,
568 RooLinkedList& impDepList, RooLinkedList& crossDepList,
569 RooLinkedList& intList)
const
572 RooLinkedList depAllList;
573 RooLinkedList depIntNoNormList;
577 RooArgSet* termNormDeps(0);
578 RooArgSet* termAllDeps(0);
579 RooArgSet* termIntDeps(0);
580 RooArgSet* termIntNoNormDeps(0);
584 RooArgSet* pdfNSetOrig;
585 for (RooFIter pdfIter = _pdfList.fwdIterator(),
586 nIter = _pdfNSetList.fwdIterator();
587 (pdfNSetOrig = (RooArgSet*) nIter.next(),
588 pdf = (RooAbsPdf*) pdfIter.next()); ) {
589 RooArgSet* pdfNSet, *pdfCSet;
592 if (0 == strcmp(
"nset", pdfNSetOrig->GetName())) {
593 pdfNSet = pdf->getObservables(*pdfNSetOrig);
594 pdfCSet =
new RooArgSet;
595 }
else if (0 == strcmp(
"cset", pdfNSetOrig->GetName())) {
596 RooArgSet* tmp = pdf->getObservables(normSet);
597 tmp->remove(*pdfNSetOrig, kTRUE, kTRUE);
598 pdfCSet = pdfNSetOrig;
602 pdfNSet = pdf->getObservables(*pdfNSetOrig);
603 pdfCSet =
new RooArgSet;
607 RooArgSet pdfNormDeps;
608 RooArgSet pdfAllDeps;
611 RooArgSet* tmp = pdf->getObservables(normSet);
612 pdfAllDeps.add(*tmp);
619 if (pdfNSet->getSize() > 0) {
621 RooArgSet* tmp2 = (RooArgSet*) pdfAllDeps.selectCommon(*pdfNSet);
622 pdfNormDeps.add(*tmp2);
626 pdfNormDeps.add(pdfAllDeps);
631 RooArgSet* pdfIntSet = pdf->getObservables(intSet) ;
634 if (0 == pdfNormDeps.getSize() && pdfCSet->getSize() > 0) {
635 pdfIntSet->remove(*pdfCSet, kTRUE, kTRUE);
639 RooArgSet pdfIntNoNormDeps(*pdfIntSet);
640 pdfIntNoNormDeps.remove(pdfNormDeps, kTRUE, kTRUE);
646 for (RooFIter lIter = termList.fwdIterator(),
647 ldIter = normList.fwdIterator(),
648 laIter = depAllList.fwdIterator();
649 (termNormDeps = (RooArgSet*) ldIter.next(),
650 termAllDeps = (RooArgSet*) laIter.next(),
651 term = (RooArgSet*) lIter.next()); ) {
658 Bool_t normOverlap = pdfNormDeps.overlaps(*termNormDeps);
665 termNormDeps->add(pdfNormDeps, kFALSE);
666 termAllDeps->add(pdfAllDeps, kFALSE);
668 termIntDeps =
new RooArgSet(
"termIntDeps");
670 termIntDeps->add(*pdfIntSet, kFALSE);
671 if (!termIntNoNormDeps) {
672 termIntNoNormDeps =
new RooArgSet(
"termIntNoNormDeps");
674 termIntNoNormDeps->add(pdfIntNoNormDeps, kFALSE);
681 if (!(0 == pdfNormDeps.getSize() && 0 == pdfAllDeps.getSize() &&
682 0 == pdfIntSet->getSize()) || 0 == normSet.getSize()) {
684 term =
new RooArgSet(
"term");
685 termNormDeps =
new RooArgSet(
"termNormDeps");
686 termAllDeps =
new RooArgSet(
"termAllDeps");
687 termIntDeps =
new RooArgSet(
"termIntDeps");
688 termIntNoNormDeps =
new RooArgSet(
"termIntNoNormDeps");
691 termNormDeps->add(pdfNormDeps, kFALSE);
692 termAllDeps->add(pdfAllDeps, kFALSE);
693 termIntDeps->add(*pdfIntSet, kFALSE);
694 termIntNoNormDeps->add(pdfIntNoNormDeps, kFALSE);
697 normList.Add(termNormDeps);
698 depAllList.Add(termAllDeps);
699 intList.Add(termIntDeps);
700 depIntNoNormList.Add(termIntNoNormDeps);
707 if (pdfCSet != pdfNSetOrig) {
713 RooArgSet *normDeps, *allDeps, *intNoNormDeps;
714 for (RooFIter lIter = termList.fwdIterator(),
715 ldIter = normList.fwdIterator(),
716 laIter = depAllList.fwdIterator(),
717 innIter = depIntNoNormList.fwdIterator();
718 (normDeps = (RooArgSet*) ldIter.next(),
719 allDeps = (RooArgSet*) laIter.next(),
720 intNoNormDeps = (RooArgSet*) innIter.next(),
721 term=(RooArgSet*)lIter.next()); ) {
723 RooArgSet impDeps(*allDeps);
724 impDeps.remove(*normDeps, kTRUE, kTRUE);
725 impDepList.Add(impDeps.snapshot());
730 RooArgSet* crossDeps = (RooArgSet*) intNoNormDeps->selectCommon(*normDeps);
731 crossDepList.Add(crossDeps->snapshot());
737 depIntNoNormList.Delete();
751 Int_t RooProdPdf::getPartIntList(
const RooArgSet* nset,
const RooArgSet* iset,
const char* isetRangeName)
const
759 Int_t sterileIdx(-1);
761 CacheElem* cache = (CacheElem*) _cacheMgr.getObj(nset,iset,&sterileIdx,isetRangeName);
763 return _cacheMgr.lastIndex();
767 cache =
new CacheElem;
770 RooLinkedList terms, norms, imp, ints, cross;
775 RooArgSet factNset(nset ? (*nset) : _defNormSet);
778 factorizeProduct(factNset, iset ? (*iset) : RooArgSet(), terms, norms, imp, cross, ints);
780 RooArgSet *norm, *integ, *xdeps, *imps;
783 RooLinkedList groupedList;
784 RooArgSet outerIntDeps;
786 groupProductTerms(groupedList, outerIntDeps, terms, norms, imp, ints, cross);
787 RooFIter gIter = groupedList.fwdIterator();
788 RooLinkedList* group;
793 map<string, RooArgSet> ratioTerms;
794 while ((group = (RooLinkedList*) gIter.next())) {
795 if (1 == group->GetSize()) {
798 RooArgSet* term = (RooArgSet*) group->At(0);
800 Int_t termIdx = terms.IndexOf(term);
801 norm=(RooArgSet*) norms.At(termIdx);
802 imps=(RooArgSet*)imp.At(termIdx);
803 RooArgSet termNSet(*norm), termImpSet(*imps);
808 if (termImpSet.getSize() > 0 && 0 != _refRangeName) {
813 Bool_t rangeIdentical(kTRUE);
814 RooFIter niter = termNSet.fwdIterator();
817 while ((normObs = (RooRealVar*) niter.next())) {
819 if (_normRange.Length() > 0) {
820 if (normObs->getMin(_normRange.Data()) != normObs->getMin(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
821 if (normObs->getMax(_normRange.Data()) != normObs->getMax(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
824 if (normObs->getMin() != normObs->getMin(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
825 if (normObs->getMax() != normObs->getMax(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
830 if (!rangeIdentical || 1) {
832 RooAbsReal* ratio = makeCondPdfRatioCorr(*(RooAbsReal*)term->first(), termNSet, termImpSet, normRange(), RooNameReg::str(_refRangeName));
833 ostringstream str; termImpSet.printValue(str);
835 ratioTerms[str.str()].add(*ratio);
842 RooArgSet compTermSet, compTermNorm;
843 RooFIter tIter = group->fwdIterator();
845 while ((term = (RooArgSet*) tIter.next())) {
847 Int_t termIdx = terms.IndexOf(term);
848 norm=(RooArgSet*) norms.At(termIdx);
849 imps=(RooArgSet*)imp.At(termIdx);
850 RooArgSet termNSet(*norm), termImpSet(*imps);
852 if (termImpSet.getSize() > 0 && 0 != _refRangeName) {
855 Bool_t rangeIdentical(kTRUE);
856 RooFIter niter = termNSet.fwdIterator();
859 if(_normRange.Length() > 0) {
860 while ((normObs = (RooRealVar*) niter.next())) {
861 if (normObs->getMin(_normRange.Data()) != normObs->getMin(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
862 if (normObs->getMax(_normRange.Data()) != normObs->getMax(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
865 while ((normObs = (RooRealVar*) niter.next())) {
866 if (normObs->getMin() != normObs->getMin(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
867 if (normObs->getMax() != normObs->getMax(RooNameReg::str(_refRangeName))) rangeIdentical = kFALSE;
871 if (!rangeIdentical || 1) {
873 RooAbsReal* ratio = makeCondPdfRatioCorr(*(RooAbsReal*)term->first(), termNSet, termImpSet, normRange(), RooNameReg::str(_refRangeName));
874 ostringstream str; termImpSet.printValue(str);
875 ratioTerms[str.str()].add(*ratio);
885 gIter = groupedList.fwdIterator();
886 while ((group = (RooLinkedList*) gIter.next())) {
887 if (1 == group->GetSize()) {
888 RooArgSet* term = (RooArgSet*) group->At(0);
890 Int_t termIdx = terms.IndexOf(term);
891 norm = (RooArgSet*) norms.At(termIdx);
892 imps = (RooArgSet*) imp.At(termIdx);
893 RooArgSet termNSet(*norm), termImpSet(*imps);
896 ostringstream str; termNSet.printValue(str);
897 if (ratioTerms[str.str()].getSize() > 0) {
899 term->add(ratioTerms[str.str()]);
902 RooArgSet compTermSet, compTermNorm;
903 RooFIter tIter = group->fwdIterator();
905 while ((term = (RooArgSet*) tIter.next())) {
906 Int_t termIdx = terms.IndexOf(term);
907 norm = (RooArgSet*) norms.At(termIdx);
908 imps = (RooArgSet*) imp.At(termIdx);
909 RooArgSet termNSet(*norm), termImpSet(*imps);
912 ostringstream str; termNSet.printValue(str);
913 if (ratioTerms[str.str()].getSize() > 0) {
915 term->add(ratioTerms[str.str()]);
921 gIter = groupedList.fwdIterator();
922 while ((group = (RooLinkedList*) gIter.next())) {
926 if (1 == group->GetSize()) {
928 RooArgSet* term = (RooArgSet*) group->At(0);
930 Int_t termIdx = terms.IndexOf(term);
931 norm = (RooArgSet*) norms.At(termIdx);
932 integ = (RooArgSet*) ints.At(termIdx);
933 xdeps = (RooArgSet*) cross.At(termIdx);
934 imps = (RooArgSet*) imp.At(termIdx);
936 RooArgSet termNSet, termISet, termXSet, termImpSet;
939 termISet.add(*integ);
943 termXSet.add(*xdeps);
944 termImpSet.add(*imps);
952 Bool_t isOwned(kFALSE);
953 vector<RooAbsReal*> func = processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned);
955 cache->_partList.add(*func[0]);
956 if (isOwned) cache->_ownedList.addOwned(*func[0]);
958 cache->_normList.emplace_back(norm->snapshot(kFALSE));
960 cache->_numList.addOwned(*func[1]);
961 cache->_denList.addOwned(*func[2]);
968 RooArgSet compTermSet, compTermNorm, compTermNum, compTermDen;
969 RooFIter tIter = group->fwdIterator();
971 while ((term = (RooArgSet*) tIter.next())) {
973 Int_t termIdx = terms.IndexOf(term);
974 norm = (RooArgSet*) norms.At(termIdx);
975 integ = (RooArgSet*) ints.At(termIdx);
976 xdeps = (RooArgSet*) cross.At(termIdx);
977 imps = (RooArgSet*) imp.At(termIdx);
979 RooArgSet termNSet, termISet, termXSet, termImpSet;
980 termISet.add(*integ);
982 termXSet.add(*xdeps);
983 termImpSet.add(*imps);
986 termISet.remove(outerIntDeps, kTRUE, kTRUE);
994 Bool_t isOwned =
false;
995 vector<RooAbsReal*> func = processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned, kTRUE);
998 compTermSet.add(*func[0]);
999 if (isOwned) cache->_ownedList.addOwned(*func[0]);
1000 compTermNorm.add(*norm, kFALSE);
1002 compTermNum.add(*func[1]);
1003 compTermDen.add(*func[2]);
1022 const std::string prodname = makeRGPPName(
"SPECPROD", compTermSet, outerIntDeps, RooArgSet(), isetRangeName);
1023 RooProduct* prodtmp =
new RooProduct(prodname.c_str(), prodname.c_str(), compTermSet);
1024 cache->_ownedList.addOwned(*prodtmp);
1026 const std::string intname = makeRGPPName(
"SPECINT", compTermSet, outerIntDeps, RooArgSet(), isetRangeName);
1027 RooRealIntegral* inttmp =
new RooRealIntegral(intname.c_str(), intname.c_str(), *prodtmp, outerIntDeps, 0, 0, isetRangeName);
1028 inttmp->setStringAttribute(
"PROD_TERM_TYPE",
"SPECINT");
1030 cache->_ownedList.addOwned(*inttmp);
1031 cache->_partList.add(*inttmp);
1034 const string prodname_num = makeRGPPName(
"SPECPROD_NUM", compTermNum, RooArgSet(), RooArgSet(), 0);
1035 RooProduct* prodtmp_num =
new RooProduct(prodname_num.c_str(), prodname_num.c_str(), compTermNum);
1036 prodtmp_num->addOwnedComponents(compTermNum);
1037 cache->_ownedList.addOwned(*prodtmp_num);
1040 const string prodname_den = makeRGPPName(
"SPECPROD_DEN", compTermDen, RooArgSet(), RooArgSet(), 0);
1041 RooProduct* prodtmp_den =
new RooProduct(prodname_den.c_str(), prodname_den.c_str(), compTermDen);
1042 prodtmp_den->addOwnedComponents(compTermDen);
1043 cache->_ownedList.addOwned(*prodtmp_den);
1046 string name = Form(
"SPEC_RATIO(%s,%s)", prodname_num.c_str(), prodname_den.c_str());
1047 RooFormulaVar* ndr =
new RooFormulaVar(name.c_str(),
"@0/@1", RooArgList(*prodtmp_num, *prodtmp_den));
1050 RooAbsReal* numtmp = ndr->createIntegral(outerIntDeps,isetRangeName);
1051 numtmp->addOwnedComponents(*ndr);
1053 cache->_numList.addOwned(*numtmp);
1054 cache->_denList.addOwned(*(RooAbsArg*)RooFit::RooConst(1).clone(
"1"));
1055 cache->_normList.emplace_back(compTermNorm.snapshot(kFALSE));
1060 Int_t returnCode = _cacheMgr.setObj(nset, iset, (RooAbsCacheElement*)cache, RooNameReg::ptr(isetRangeName));
1084 if (_normRange.Contains(
",")) {
1085 rearrangeProduct(*cache);
1089 groupedList.Delete();
1105 RooAbsReal* RooProdPdf::makeCondPdfRatioCorr(RooAbsReal& pdf,
const RooArgSet& termNset,
const RooArgSet& ,
const char* normRangeTmp,
const char* refRange)
const
1107 RooAbsReal* ratio_num = pdf.createIntegral(termNset,normRangeTmp) ;
1108 RooAbsReal* ratio_den = pdf.createIntegral(termNset,refRange) ;
1109 RooFormulaVar* ratio =
new RooFormulaVar(Form(
"ratio(%s,%s)",ratio_num->GetName(),ratio_den->GetName()),
"@0/@1",
1110 RooArgList(*ratio_num,*ratio_den)) ;
1112 ratio->addOwnedComponents(RooArgSet(*ratio_num,*ratio_den)) ;
1113 ratio->setAttribute(
"RATIO_TERM") ;
1122 void RooProdPdf::rearrangeProduct(RooProdPdf::CacheElem& cache)
const
1124 RooAbsReal* part, *num, *den ;
1127 list<string> rangeComps ;
1129 char* buf =
new char[strlen(_normRange.Data()) + 1] ;
1130 strcpy(buf,_normRange.Data()) ;
1132 char* token = R__STRTOK_R(buf,
",",&save) ;
1134 rangeComps.push_back(token) ;
1135 token = R__STRTOK_R(0,
",",&save) ;
1141 map<string,RooArgSet> denListList ;
1142 RooArgSet specIntDeps ;
1143 string specIntRange ;
1147 RooFIter iterp = cache._partList.fwdIterator() ;
1148 RooFIter iter1 = cache._numList.fwdIterator() ;
1149 RooFIter iter2 = cache._denList.fwdIterator() ;
1150 while((part=(RooAbsReal*)iterp.next())) {
1152 num = (RooAbsReal*) iter1.next() ;
1153 den = (RooAbsReal*) iter2.next() ;
1160 RooFormulaVar* ratio(0) ;
1161 RooArgSet origNumTerm ;
1163 if (
string(
"SPECINT")==part->getStringAttribute(
"PROD_TERM_TYPE")) {
1165 RooRealIntegral* orig = (RooRealIntegral*) num;
1166 RooFormulaVar* specratio = (RooFormulaVar*) &orig->integrand() ;
1167 RooProduct* func = (RooProduct*) specratio->getParameter(0) ;
1169 RooArgSet* comps = orig->getComponents() ;
1170 RooFIter iter = comps->fwdIterator() ;
1172 while((carg=(RooAbsArg*)iter.next())) {
1173 if (carg->getAttribute(
"RATIO_TERM")) {
1174 ratio = (RooFormulaVar*)carg ;
1181 RooCustomizer cust(*func,
"blah") ;
1182 cust.replaceArg(*ratio,RooFit::RooConst(1)) ;
1183 RooAbsArg* funcCust = cust.build() ;
1186 nomList.add(*funcCust) ;
1188 nomList.add(*func) ;
1195 RooAbsReal* func = num;
1197 if (func->InheritsFrom(RooRealIntegral::Class())) {
1198 func = (RooAbsReal*) &((RooRealIntegral*)(func))->integrand();
1200 if (func->InheritsFrom(RooProduct::Class())) {
1202 RooArgSet comps(((RooProduct*)(func))->components()) ;
1203 RooFIter iter = comps.fwdIterator() ;
1205 while((arg=(RooAbsArg*)iter.next())) {
1206 if (arg->getAttribute(
"RATIO_TERM")) {
1207 ratio = (RooFormulaVar*)(arg) ;
1209 origNumTerm.add(*arg) ;
1217 nomList.add(origNumTerm) ;
1224 for (list<string>::iterator iter = rangeComps.begin() ; iter != rangeComps.end() ; ++iter) {
1229 if (
string(
"SPECINT")==part->getStringAttribute(
"PROD_TERM_TYPE")) {
1232 RooRealIntegral* orig = (RooRealIntegral*) num;
1233 RooFormulaVar* specRatio = (RooFormulaVar*) &orig->integrand() ;
1234 specIntDeps.add(orig->intVars()) ;
1235 if (orig->intRange()) {
1236 specIntRange = orig->intRange() ;
1239 RooProduct* dentmp = (RooProduct*) specRatio->getParameter(1) ;
1245 RooArgSet comps(dentmp->components()) ;
1246 RooFIter piter = comps.fwdIterator() ;
1248 while((parg=(RooAbsReal*)piter.next())) {
1251 if (ratio && parg->dependsOn(*ratio)) {
1255 RooAbsReal* specializedRatio = specializeRatio(*(RooFormulaVar*)ratio,iter->c_str()) ;
1261 RooAbsArg *partCust(0) ;
1262 if (parg->InheritsFrom(RooAddition::Class())) {
1266 RooAddition* tmpadd = (RooAddition*)(parg) ;
1268 RooCustomizer cust(*tmpadd->list1().first(),Form(
"blah_%s",iter->c_str())) ;
1269 cust.replaceArg(*ratio,*specializedRatio) ;
1270 partCust = cust.build() ;
1273 RooCustomizer cust(*parg,Form(
"blah_%s",iter->c_str())) ;
1274 cust.replaceArg(*ratio,*specializedRatio) ;
1275 partCust = cust.build() ;
1282 RooAbsReal* specializedPartCust = specializeIntegral(*(RooAbsReal*)partCust,iter->c_str()) ;
1285 string name = Form(
"%s_divided_by_ratio",specializedPartCust->GetName()) ;
1286 RooFormulaVar* specIntFinal =
new RooFormulaVar(name.c_str(),
"@0/@1",RooArgList(*specializedPartCust,*specializedRatio)) ;
1288 denListList[*iter].add(*specIntFinal) ;
1294 denListList[*iter].add(*specializeIntegral(*parg,iter->c_str())) ;
1303 RooAbsReal* specRatio = specializeRatio(*(RooFormulaVar*)ratio,iter->c_str()) ;
1308 RooArgSet tmp(origNumTerm) ;
1309 tmp.add(*specRatio) ;
1310 const string pname = makeRGPPName(
"PROD",tmp,RooArgSet(),RooArgSet(),0) ;
1311 RooProduct* specDenProd =
new RooProduct(pname.c_str(),pname.c_str(),tmp) ;
1312 RooAbsReal* specInt(0) ;
1314 if (den->InheritsFrom(RooRealIntegral::Class())) {
1315 specInt = specDenProd->createIntegral(((RooRealIntegral*)den)->intVars(),iter->c_str()) ;
1316 }
else if (den->InheritsFrom(RooAddition::Class())) {
1317 RooAddition* orig = (RooAddition*)den ;
1318 RooRealIntegral* origInt = (RooRealIntegral*) orig->list1().first() ;
1319 specInt = specDenProd->createIntegral(origInt->intVars(),iter->c_str()) ;
1321 throw string(
"this should not happen") ;
1325 string name = Form(
"%s_divided_by_ratio",specInt->GetName()) ;
1326 RooFormulaVar* specIntFinal =
new RooFormulaVar(name.c_str(),
"@0/@1",RooArgList(*specInt,*specRatio)) ;
1327 denListList[*iter].add(*specIntFinal) ;
1329 denListList[*iter].add(*specializeIntegral(*den,iter->c_str())) ;
1338 if (nomList.getSize()==0) {
1342 string name = Form(
"%s_numerator",GetName()) ;
1345 RooAbsReal* numerator =
new RooProduct(name.c_str(),name.c_str(),nomList) ;
1347 RooArgSet products ;
1349 for (map<string,RooArgSet>::iterator iter = denListList.begin() ; iter != denListList.end() ; ++iter) {
1351 name = Form(
"%s_denominator_comp_%s",GetName(),iter->first.c_str()) ;
1353 RooProduct* prod_comp =
new RooProduct(name.c_str(),name.c_str(),iter->second) ;
1354 products.add(*prod_comp) ;
1356 name = Form(
"%s_denominator_sum",GetName()) ;
1357 RooAbsReal* norm =
new RooAddition(name.c_str(),name.c_str(),products) ;
1358 norm->addOwnedComponents(products) ;
1360 if (specIntDeps.getSize()>0) {
1363 string namesr = Form(
"SPEC_RATIO(%s,%s)",numerator->GetName(),norm->GetName()) ;
1364 RooFormulaVar* ndr =
new RooFormulaVar(namesr.c_str(),
"@0/@1",RooArgList(*numerator,*norm)) ;
1367 RooAbsReal* numtmp = ndr->createIntegral(specIntDeps,specIntRange.c_str()) ;
1369 numerator = numtmp ;
1370 norm = (RooAbsReal*) RooFit::RooConst(1).Clone() ;
1383 cache._rearrangedNum.reset(numerator);
1384 cache._rearrangedDen.reset(norm);
1385 cache._isRearranged = kTRUE ;
1392 RooAbsReal* RooProdPdf::specializeRatio(RooFormulaVar& input,
const char* targetRangeName)
const
1394 RooRealIntegral* numint = (RooRealIntegral*) input.getParameter(0) ;
1395 RooRealIntegral* denint = (RooRealIntegral*) input.getParameter(1) ;
1397 RooAbsReal* numint_spec = specializeIntegral(*numint,targetRangeName) ;
1399 RooAbsReal* ret =
new RooFormulaVar(Form(
"ratio(%s,%s)",numint_spec->GetName(),denint->GetName()),
"@0/@1",RooArgList(*numint_spec,*denint)) ;
1400 ret->addOwnedComponents(*numint_spec) ;
1409 RooAbsReal* RooProdPdf::specializeIntegral(RooAbsReal& input,
const char* targetRangeName)
const
1411 if (input.InheritsFrom(RooRealIntegral::Class())) {
1414 RooRealIntegral* orig = (RooRealIntegral*)&input ;
1416 return orig->integrand().createIntegral(orig->intVars(),targetRangeName) ;
1418 }
else if (input.InheritsFrom(RooAddition::Class())) {
1421 RooAddition* orig = (RooAddition*)&input ;
1422 RooRealIntegral* origInt = (RooRealIntegral*) orig->list1().first() ;
1424 return origInt->integrand().createIntegral(origInt->intVars(),targetRangeName) ;
1438 void RooProdPdf::groupProductTerms(RooLinkedList& groupedTerms, RooArgSet& outerIntDeps,
1439 const RooLinkedList& terms,
const RooLinkedList& norms,
1440 const RooLinkedList& imps,
const RooLinkedList& ints,
const RooLinkedList& )
const
1443 RooFIter tIter = terms.fwdIterator() ;
1445 while((term=(RooArgSet*)tIter.next())) {
1446 RooLinkedList* group =
new RooLinkedList ;
1448 groupedTerms.Add(group) ;
1452 RooArgSet allImpDeps ;
1453 RooFIter iIter = imps.fwdIterator() ;
1454 RooArgSet *impDeps ;
1455 while((impDeps=(RooArgSet*)iIter.next())) {
1456 allImpDeps.add(*impDeps,kFALSE) ;
1460 RooArgSet allIntDeps ;
1461 iIter = ints.fwdIterator() ;
1462 RooArgSet *intDeps ;
1463 while((intDeps=(RooArgSet*)iIter.next())) {
1464 allIntDeps.add(*intDeps,kFALSE) ;
1467 RooArgSet* tmp = (RooArgSet*) allIntDeps.selectCommon(allImpDeps) ;
1468 outerIntDeps.removeAll() ;
1469 outerIntDeps.add(*tmp) ;
1473 RooFIter oidIter = outerIntDeps.fwdIterator() ;
1474 RooAbsArg* outerIntDep ;
1475 while ((outerIntDep =(RooAbsArg*)oidIter.next())) {
1478 RooLinkedList* newGroup = 0 ;
1481 RooLinkedList* group ;
1482 RooFIter glIter = groupedTerms.fwdIterator() ;
1483 Bool_t needMerge = kFALSE ;
1484 while((group=(RooLinkedList*)glIter.next())) {
1488 RooFIter tIter2 = group->fwdIterator() ;
1489 while((term2=(RooArgSet*)tIter2.next())) {
1491 Int_t termIdx = terms.IndexOf(term2) ;
1492 RooArgSet* termNormDeps = (RooArgSet*) norms.At(termIdx) ;
1493 RooArgSet* termIntDeps = (RooArgSet*) ints.At(termIdx) ;
1494 RooArgSet* termImpDeps = (RooArgSet*) imps.At(termIdx) ;
1496 if (termNormDeps->contains(*outerIntDep) ||
1497 termIntDeps->contains(*outerIntDep) ||
1498 termImpDeps->contains(*outerIntDep)) {
1507 newGroup =
new RooLinkedList ;
1511 tIter2 = group->fwdIterator() ;
1512 while((term2=(RooArgSet*)tIter2.next())) {
1513 newGroup->Add(term2) ;
1517 groupedTerms.Remove(group) ;
1523 groupedTerms.Add(newGroup) ;
1535 std::vector<RooAbsReal*> RooProdPdf::processProductTerm(
const RooArgSet* nset,
const RooArgSet* iset,
const char* isetRangeName,
1536 const RooArgSet* term,
const RooArgSet& termNSet,
const RooArgSet& termISet,
1537 Bool_t& isOwned, Bool_t forceWrap)
const
1549 vector<RooAbsReal*> ret(3) ; ret[0] = 0 ; ret[1] = 0 ; ret[2] = 0 ;
1554 if (termNSet.getSize()>0 && termNSet.getSize()==termISet.getSize() && isetRangeName==0) {
1565 if (nset && termNSet.getSize()==0) {
1573 if (iset && termISet.getSize()>0) {
1574 if (term->getSize()==1) {
1579 RooAbsPdf* pdf = (RooAbsPdf*) term->first() ;
1581 RooAbsReal* partInt = pdf->createIntegral(termISet,termNSet,isetRangeName) ;
1583 partInt->setStringAttribute(
"PROD_TERM_TYPE",
"IIIa") ;
1592 ret[1] = pdf->createIntegral(termISet,isetRangeName) ;
1593 ret[2] = pdf->createIntegral(termNSet,normRange()) ;
1604 const std::string name = makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1605 RooAbsReal* partInt =
new RooGenProdProj(name.c_str(),name.c_str(),*term,termISet,termNSet,isetRangeName) ;
1606 partInt->setStringAttribute(
"PROD_TERM_TYPE",
"IIIb") ;
1614 const std::string name1 = makeRGPPName(
"PROD",*term,RooArgSet(),RooArgSet(),0) ;
1617 RooProduct* tmp_prod =
new RooProduct(name1.c_str(),name1.c_str(),*term) ;
1619 ret[1] = tmp_prod->createIntegral(termISet,isetRangeName) ;
1620 ret[2] = tmp_prod->createIntegral(termNSet,normRange()) ;
1628 if (nset && nset->getSize()>0 && term->getSize()>1) {
1631 const std::string name = makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1632 RooAbsReal* partInt =
new RooGenProdProj(name.c_str(),name.c_str(),*term,termISet,termNSet,isetRangeName,normRange()) ;
1633 partInt->setExpensiveObjectCache(expensiveObjectCache()) ;
1635 partInt->setStringAttribute(
"PROD_TERM_TYPE",
"IVa") ;
1643 const std::string name1 = makeRGPPName(
"PROD",*term,RooArgSet(),RooArgSet(),0) ;
1646 RooProduct* tmp_prod =
new RooProduct(name1.c_str(),name1.c_str(),*term) ;
1648 ret[1] = tmp_prod->createIntegral(termISet,isetRangeName) ;
1649 ret[2] = tmp_prod->createIntegral(termNSet,normRange()) ;
1656 RooFIter pIter = term->fwdIterator() ;
1658 while((pdf=(RooAbsPdf*)pIter.next())) {
1663 TString name(pdf->GetName()) ;
1664 name.Append(
"_NORM[") ;
1665 RooFIter nIter = termNSet.fwdIterator() ;
1667 Bool_t first(kTRUE) ;
1668 while((arg=(RooAbsArg*)nIter.next())) {
1674 name.Append(arg->GetName()) ;
1678 name.Append(normRange()) ;
1682 RooAbsReal* partInt =
new RooRealIntegral(name.Data(),name.Data(),*pdf,RooArgSet(),&termNSet) ;
1683 partInt->setStringAttribute(
"PROD_TERM_TYPE",
"IVb") ;
1690 ret[1] = pdf->createIntegral(RooArgSet()) ;
1691 ret[2] = pdf->createIntegral(termNSet,normRange()) ;
1702 pdf->setStringAttribute(
"PROD_TERM_TYPE",
"IVb") ;
1705 ret[1] = pdf->createIntegral(RooArgSet()) ;
1706 ret[2] = termNSet.getSize()>0 ? pdf->createIntegral(termNSet,normRange()) : ((RooAbsReal*)RooFit::RooConst(1).clone(
"1")) ;
1711 coutE(Eval) <<
"RooProdPdf::processProductTerm(" << GetName() <<
") unidentified term!!!" << endl ;
1721 std::string RooProdPdf::makeRGPPName(
const char* pfx,
const RooArgSet& term,
const RooArgSet& iset,
1722 const RooArgSet& nset,
const char* isetRangeName)
const
1726 std::ostringstream os(pfx);
1729 RooFIter pIter = term.fwdIterator() ;
1731 Bool_t first(kTRUE) ;
1733 while ((pdf=(RooAbsPdf*)pIter.next())) {
1734 if (!first) os <<
"_X_";
1736 os << pdf->GetName();
1738 os <<
"]" << integralNameSuffix(iset,&nset,isetRangeName,kTRUE);
1748 Bool_t RooProdPdf::forceAnalyticalInt(
const RooAbsArg& )
const
1770 Int_t RooProdPdf::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars,
1771 const RooArgSet* normSet,
const char* rangeName)
const
1773 if (_forceNumInt)
return 0 ;
1776 analVars.add(allVars) ;
1779 Int_t code = getPartIntList(normSet,&allVars,rangeName);
1790 Double_t RooProdPdf::analyticalIntegralWN(Int_t code,
const RooArgSet* normSet,
const char* rangeName)
const
1794 return getVal(normSet) ;
1801 CacheElem* cache = (CacheElem*) _cacheMgr.getObjByIndex(code-1) ;
1805 RooArgSet* vars = getParameters(RooArgSet()) ;
1806 RooArgSet* nset = _cacheMgr.nameSet1ByIndex(code-1)->select(*vars) ;
1807 RooArgSet* iset = _cacheMgr.nameSet2ByIndex(code-1)->select(*vars) ;
1809 Int_t code2 = getPartIntList(nset, iset, rangeName) ;
1815 cache = (CacheElem*) _cacheMgr.getObj(nset,iset,&code2,rangeName) ;
1822 Double_t val = calculate(*cache,kTRUE) ;
1833 Bool_t RooProdPdf::checkObservables(
const RooArgSet* )
const
1843 RooAbsPdf::ExtendMode RooProdPdf::extendMode()
const
1845 return (_extendedIndex>=0) ? ((RooAbsPdf*)_pdfList.at(_extendedIndex))->extendMode() : CanNotBeExtended ;
1854 Double_t RooProdPdf::expectedEvents(
const RooArgSet* nset)
const
1856 if (_extendedIndex<0) {
1857 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << endl ;
1858 throw std::logic_error(std::string(
"RooProdPdf ") + GetName() +
" could not be extended.");
1861 return ((RooAbsPdf*)_pdfList.at(_extendedIndex))->expectedEvents(nset) ;
1869 RooAbsGenContext* RooProdPdf::genContext(
const RooArgSet &vars,
const RooDataSet *prototype,
1870 const RooArgSet* auxProto, Bool_t verbose)
const
1872 if (_useDefaultGen)
return RooAbsPdf::genContext(vars,prototype,auxProto,verbose) ;
1873 return new RooProdGenContext(*
this,vars,prototype,auxProto,verbose) ;
1882 Int_t RooProdPdf::getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK)
const
1884 if (!_useDefaultGen)
return 0 ;
1887 RooArgSet directSafe ;
1888 RooFIter dIter = directVars.fwdIterator() ;
1890 while((arg=(RooAbsArg*)dIter.next())) {
1891 if (isDirectGenSafe(*arg)) directSafe.add(*arg) ;
1897 std::vector<Int_t> code;
1899 RooFIter pdfIter = _pdfList.fwdIterator();
1900 while((pdf=(RooAbsPdf*)pdfIter.next())) {
1901 RooArgSet pdfDirect ;
1902 Int_t pdfCode = pdf->getGenerator(directSafe,pdfDirect,staticInitOK);
1903 code.push_back(pdfCode);
1905 generateVars.add(pdfDirect) ;
1910 if (generateVars.getSize()>0) {
1911 Int_t masterCode = _genCode.store(code) ;
1912 return masterCode+1 ;
1924 void RooProdPdf::initGenerator(Int_t code)
1926 if (!_useDefaultGen) return ;
1928 const std::vector<Int_t>& codeList = _genCode.retrieve(code-1) ;
1931 RooFIter pdfIter = _pdfList.fwdIterator();
1932 while((pdf=(RooAbsPdf*)pdfIter.next())) {
1933 if (codeList[i]!=0) {
1934 pdf->initGenerator(codeList[i]) ;
1947 void RooProdPdf::generateEvent(Int_t code)
1949 if (!_useDefaultGen) return ;
1951 const std::vector<Int_t>& codeList = _genCode.retrieve(code-1) ;
1954 RooFIter pdfIter = _pdfList.fwdIterator();
1955 while((pdf=(RooAbsPdf*)pdfIter.next())) {
1956 if (codeList[i]!=0) {
1957 pdf->generateEvent(codeList[i]) ;
1968 RooArgList RooProdPdf::CacheElem::containedArgs(Action)
1971 ret.add(_partList) ;
1974 if (_rearrangedNum) ret.add(*_rearrangedNum) ;
1975 if (_rearrangedDen) ret.add(*_rearrangedDen) ;
1985 void RooProdPdf::CacheElem::printCompactTreeHook(ostream& os,
const char* indent, Int_t curElem, Int_t maxElem)
1988 os << indent <<
"RooProdPdf begin partial integral cache" << endl ;
1991 RooFIter iter = _partList.fwdIterator() ;
1993 TString indent2(indent) ;
1994 indent2 += Form(
"[%d] ",curElem) ;
1995 while((arg=(RooAbsArg*)iter.next())) {
1996 arg->printCompactTree(os,indent2) ;
1999 if (curElem==maxElem) {
2000 os << indent <<
"RooProdPdf end partial integral cache" << endl ;
2010 Bool_t RooProdPdf::isDirectGenSafe(
const RooAbsArg& arg)
const
2013 if (!_useDefaultGen)
return RooAbsPdf::isDirectGenSafe(arg) ;
2016 RooAbsPdf* pdf, *thePdf(0) ;
2017 RooFIter pdfIter = _pdfList.fwdIterator();
2018 while((pdf=(RooAbsPdf*)pdfIter.next())) {
2020 if (pdf->dependsOn(arg)) {
2024 if (thePdf)
return kFALSE ;
2030 return thePdf?(thePdf->isDirectGenSafe(arg)):kFALSE ;
2038 RooArgSet* RooProdPdf::findPdfNSet(RooAbsPdf& pdf)
const
2040 Int_t idx = _pdfList.index(&pdf) ;
2041 if (idx<0)
return 0 ;
2042 return (RooArgSet*) _pdfNSetList.At(idx) ;
2053 RooArgSet* RooProdPdf::getConstraints(
const RooArgSet& observables, RooArgSet& constrainedParams, Bool_t stripDisconnected)
const
2055 RooArgSet constraints ;
2056 RooArgSet pdfParams, conParams ;
2059 RooFIter piter = _pdfList.fwdIterator() ;
2061 while((pdf=(RooAbsPdf*)piter.next())) {
2064 if (!pdf->dependsOnValue(observables) && pdf->dependsOnValue(constrainedParams)) {
2065 constraints.add(*pdf) ;
2066 RooArgSet* tmp = pdf->getParameters(observables) ;
2067 conParams.add(*tmp,kTRUE) ;
2070 RooArgSet* tmp = pdf->getParameters(observables) ;
2071 pdfParams.add(*tmp,kTRUE) ;
2077 RooArgSet* finalConstraints =
new RooArgSet(
"constraints") ;
2078 RooFIter citer = constraints.fwdIterator() ;
2079 while((pdf=(RooAbsPdf*)citer.next())) {
2080 if (pdf->dependsOnValue(pdfParams) || !stripDisconnected) {
2081 finalConstraints->add(*pdf) ;
2083 coutI(Minimization) <<
"RooProdPdf::getConstraints(" << GetName() <<
") omitting term " << pdf->GetName()
2084 <<
" as constraint term as it does not share any parameters with the other pdfs in product. "
2085 <<
"To force inclusion in likelihood, add an explicit Constrain() argument for the target parameter" << endl ;
2091 RooArgSet* cexl = (RooArgSet*) conParams.selectCommon(constrainedParams) ;
2092 cexl->remove(pdfParams,kTRUE,kTRUE) ;
2093 constrainedParams.remove(*cexl,kTRUE,kTRUE) ;
2096 return finalConstraints ;
2108 RooArgSet* RooProdPdf::getConnectedParameters(
const RooArgSet& observables)
const
2110 RooArgSet* connectedPars =
new RooArgSet(
"connectedPars") ;
2111 for (
const auto arg : _pdfList) {
2113 if (arg->dependsOn(observables)) {
2114 RooArgSet* tmp = arg->getParameters(observables) ;
2115 connectedPars->add(*tmp) ;
2119 return connectedPars ;
2127 void RooProdPdf::getParametersHook(
const RooArgSet* nset, RooArgSet* params, Bool_t stripDisconnected)
const
2129 if (!stripDisconnected) return ;
2130 if (!nset || nset->getSize()==0)
return ;
2133 Int_t code = getPartIntList(nset,
nullptr);
2134 RooArgList & plist =
static_cast<CacheElem*
>(_cacheMgr.getObj(nset, &code))->_partList;
2138 for (
auto param : *params) {
2139 Bool_t anyDep(kFALSE) ;
2140 for (
auto term : plist) {
2141 if (term->dependsOnValue(*param)) {
2146 tostrip.add(*param) ;
2150 if (tostrip.getSize()>0) {
2151 params->remove(tostrip,kTRUE,kTRUE);
2162 void RooProdPdf::selectNormalizationRange(
const char* rangeName, Bool_t force)
2164 if (!force && _refRangeName) {
2168 fixRefRange(rangeName) ;
2176 void RooProdPdf::fixRefRange(
const char* rangeName)
2178 _refRangeName = (TNamed*)RooNameReg::ptr(rangeName) ;
2186 std::list<Double_t>* RooProdPdf::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi)
const
2189 RooFIter pdfIter = _pdfList.fwdIterator();
2190 while((pdf=(RooAbsPdf*)pdfIter.next())) {
2191 list<Double_t>* hint = pdf->plotSamplingHint(obs,xlo,xhi) ;
2205 Bool_t RooProdPdf::isBinnedDistribution(
const RooArgSet& obs)
const
2208 RooFIter pdfIter = _pdfList.fwdIterator();
2209 while((pdf=(RooAbsPdf*)pdfIter.next())) {
2210 if (pdf->dependsOn(obs) && !pdf->isBinnedDistribution(obs)) {
2226 std::list<Double_t>* RooProdPdf::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi)
const
2229 RooFIter pdfIter = _pdfList.fwdIterator();
2230 while((pdf=(RooAbsPdf*)pdfIter.next())) {
2231 list<Double_t>* hint = pdf->binBoundaries(obs,xlo,xhi) ;
2246 void RooProdPdf::setCacheAndTrackHints(RooArgSet& trackNodes)
2248 for (
const auto parg : _pdfList) {
2250 if (parg->canNodeBeCached()==Always) {
2251 trackNodes.add(*parg) ;
2255 RooArgSet* pdf_nset = findPdfNSet((RooAbsPdf&)(*parg)) ;
2258 if (
string(
"nset")==pdf_nset->GetName() && pdf_nset->getSize()>0) {
2259 RooNameSet n(*pdf_nset) ;
2260 parg->setStringAttribute(
"CATNormSet",n.content()) ;
2262 if (
string(
"cset")==pdf_nset->GetName()) {
2263 RooNameSet c(*pdf_nset) ;
2264 parg->setStringAttribute(
"CATCondSet",c.content()) ;
2267 coutW(Optimization) <<
"RooProdPdf::setCacheAndTrackHints(" << GetName() <<
") WARNING product pdf does not specify a normalization set for component " << parg->GetName() << endl ;
2279 void RooProdPdf::printMetaArgs(ostream& os)
const
2281 RooFIter niter = _pdfNSetList.fwdIterator() ;
2282 for (
int i=0 ; i<_pdfList.getSize() ; i++) {
2283 if (i>0) os <<
" * " ;
2284 RooArgSet* ncset = (RooArgSet*) niter.next() ;
2285 os << _pdfList.at(i)->GetName() ;
2286 if (ncset->getSize()>0) {
2287 if (
string(
"nset")==ncset->GetName()) {
2291 RooFIter nciter = ncset->fwdIterator() ;
2293 Bool_t first(kTRUE) ;
2294 while((arg=(RooAbsArg*)nciter.next())) {
2300 os << arg->GetName() ;
2313 Bool_t RooProdPdf::redirectServersHook(
const RooAbsCollection& , Bool_t , Bool_t nameChange, Bool_t )
2315 if (nameChange && _pdfList.find(
"REMOVAL_DUMMY")) {
2317 cxcoutD(LinkStateMgmt) <<
"RooProdPdf::redirectServersHook(" << GetName() <<
"): removing REMOVAL_DUMMY" << endl ;
2320 RooAbsArg* pdfDel = _pdfList.find(
"REMOVAL_DUMMY") ;
2322 TObject* setDel = _pdfNSetList.At(_pdfList.index(
"REMOVAL_DUMMY")) ;
2323 _pdfList.remove(*pdfDel) ;
2324 _pdfNSetList.Remove(setDel) ;