50RooGenProdProj::RooGenProdProj(
const char *
name,
const char *title,
const RooArgSet& _prodSet,
const RooArgSet& _intSet,
51 const RooArgSet& _normSet,
const char* isetRangeName,
const char* normRangeName,
bool doFactorize) :
53 _compSetN(
"compSetN",
"Set of integral components owned by numerator",this,false),
54 _compSetD(
"compSetD",
"Set of integral components owned by denominator",this,false),
55 _intList(
"intList",
"List of integrals",this,true)
61 _compSetOwnedN = std::make_unique<RooArgSet>();
62 _compSetOwnedD = std::make_unique<RooArgSet>();
64 RooAbsReal* numerator = makeIntegral(
"numerator",_prodSet,_intSet,*_compSetOwnedN,isetRangeName,doFactorize) ;
65 RooAbsReal* denominator = makeIntegral(
"denominator",_prodSet,_normSet,*_compSetOwnedD,normRangeName,doFactorize) ;
73 _compSetN.add(*_compSetOwnedN) ;
74 _compSetD.add(*_compSetOwnedD) ;
76 _intList.add(*numerator) ;
78 _intList.add(*denominator) ;
88RooGenProdProj::RooGenProdProj(
const RooGenProdProj &other,
const char *
name)
90 _compSetN(
"compSetN",
"Set of integral components owned by numerator", this),
91 _compSetD(
"compSetD",
"Set of integral components owned by denominator", this),
92 _intList(
"intList",
"List of integrals", this),
96 _compSetOwnedN = std::make_unique<RooArgSet>();
97 other._compSetN.snapshot(*_compSetOwnedN);
98 _compSetN.add(*_compSetOwnedN) ;
100 _compSetOwnedD = std::make_unique<RooArgSet>();
101 other._compSetD.snapshot(*_compSetOwnedD);
102 _compSetD.add(*_compSetOwnedD) ;
104 for (
RooAbsArg * arg : *_compSetOwnedN) {
105 arg->setOperMode(_operMode) ;
107 for (
RooAbsArg * arg : *_compSetOwnedD) {
108 arg->setOperMode(_operMode) ;
113 _intList.add(*_compSetN.find(other._intList.at(0)->GetName())) ;
115 _intList.add(*_compSetD.find(other._intList.at(1)->GetName())) ;
134 RooArgSet& saveSet,
const char* isetRangeName,
bool doFactorize)
140 for (
const auto arg : intSet) {
141 auto count = std::count_if(compSet.
begin(), compSet.
end(), [arg](
const RooAbsArg* pdfAsArg){
142 auto pdf = static_cast<const RooAbsPdf*>(pdfAsArg);
143 return (pdf->dependsOn(*arg));
147 anaIntSet.
add(*arg) ;
153 numIntSet.
add(intSet) ;
173 for (
const auto pdfAsArg : compSet) {
174 auto pdf =
static_cast<const RooAbsPdf*
>(pdfAsArg);
176 if (doFactorize && pdf->dependsOn(anaIntSet)) {
178 Int_t code = pdf->getAnalyticalIntegralWN(anaIntSet,anaSet,
nullptr,isetRangeName) ;
181 std::unique_ptr<RooAbsReal> pai{pdf->createIntegral(anaSet,emptyNormSet,isetRangeName)};
182 pai->setOperMode(_operMode) ;
188 numIntSet.
remove(anaSet) ;
205 prodName =
Form(
"%s_%s_Range[%s]",GetName(),
name,isetRangeName) ;
207 prodName =
Form(
"%s_%s",GetName(),
name) ;
217 prodSet.
snapshot(prodSetClone,
false);
219 auto prod = std::make_unique<RooProduct>(prodName,
"product", prodSetClone);
220 prod->setExpensiveObjectCache(expensiveObjectCache()) ;
221 prod->setOperMode(_operMode) ;
224 std::unique_ptr<RooAbsReal> integral{prod->createIntegral(numIntSet,emptyNormSet,isetRangeName)};
225 integral->setOperMode(_operMode) ;
226 auto ret = integral.get();
229 saveSet.
addOwned(std::move(prodSetClone));
231 saveSet.
addOwned(std::move(integral)) ;
243double RooGenProdProj::evaluate()
const
249 if (!_haveD)
return nom ;
263void RooGenProdProj::operModeHook()
268 arg->setOperMode(_operMode) ;
272 arg->setOperMode(_operMode) ;
275 _intList.at(0)->setOperMode(_operMode) ;
276 if (_haveD) _intList.at(1)->setOperMode(Auto) ;
int Int_t
Signed integer 4 bytes (int).
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooExpensiveObjectCache & expensiveObjectCache() const
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
const_iterator end() const
RooAbsArg * first() const
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
const_iterator begin() const
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value and implements functionality common to al...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.