101 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",
this,
false,
false),
102 _projCacheMgr(
this,10),
103 _pdfList(
"!pdfs",
"List of PDFs",
this),
104 _coefList(
"!coefficients",
"List of coefficients",
this),
105 _coefErrCount{_errorCount}
114 using PdfInfo = std::pair<std::string,RooAbsArg*>;
115 std::set<PdfInfo>
seen;
123 <<
") pdf list contains pdfs with duplicate name \"" << pdf->GetName() <<
"\".";
125 throw std::invalid_argument(
errorMsg.str().c_str());
167 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1.";
169 throw std::invalid_argument(
errorMsg.str().c_str());
175 <<
"): Recursive fractions option can only be used if Npdf=Ncoef+1.";
177 throw std::invalid_argument(
errorMsg.str());
204 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1";
206 throw std::invalid_argument(
errorMsg.str());
210 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") coefficient " << (coef ? coef->GetName() :
"") <<
" is not of type RooAbsReal, ignored";
212 throw std::invalid_argument(
errorMsg.str());
216 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->
GetName() :
"") <<
" is not of type RooAbsPdf, ignored";
218 throw std::invalid_argument(
errorMsg.str());
230 coutE(InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") last argument " <<
inPdfList.at(
inCoefList.size())->GetName() <<
" is not of type RooAbsPdf." << std::endl;
231 throw std::invalid_argument(
"Last argument for RooAddPdf is not a PDF.");
267 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"")
268 <<
" is not of type RooAbsPdf, RooAddPdf constructor call is invalid!";
270 throw std::invalid_argument(
errorMsg.str().c_str());
272 if (!pdf->canBeExtended()) {
274 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << pdf->GetName()
275 <<
" is not extendable, RooAddPdf constructor call is invalid!";
277 throw std::invalid_argument(
errorMsg.str().c_str());
291 _refCoefNorm(
"!refCoefNorm",
this,
other._refCoefNorm),
292 _refCoefRangeName((
TNamed *)
other._refCoefRangeName),
293 _projCacheMgr(
other._projCacheMgr,
this),
294 _codeReg(
other._codeReg),
296 _coefList(
"!coefficients",
this,
other._coefList),
297 _haveLastCoef(
other._haveLastCoef),
298 _allExtendable(
other._allExtendable),
299 _recursive(
other._recursive),
300 _coefErrCount(_errorCount)
349 std::vector<std::string> names;
360 for (std::string
const &
name : names) {
364 throw std::runtime_error(
"Internal logic error in RooAddPdf::materializeRefCoefNormFromAttribute()");
466 if(nset && nset->
empty()) nset =
nullptr;
468 if (nset ==
nullptr) {
493 if(nset ==
nullptr) {
501 if (nset ==
nullptr) {
502 coutW(Eval) <<
"Evaluating RooAddPdf " <<
GetName() <<
" without a defined normalization set. This can lead to ambiguous "
503 "coefficients definition and incorrect results."
504 <<
" Use RooAddPdf::fixCoefNormalization(nset) to provide a normalization set for "
505 "defining uniquely RooAddPdf coefficients!"
513 return {nset, cache};
542 double pdfVal = pdf.getVal(nset);
543 if (pdf.isSelectedComp()) {
557 std::span<double> output = ctx.
output();
570 throw std::runtime_error(
"The RooAddPdf doesn't support per-event coefficients in CUDA mode yet!");
578 std::vector<std::span<const double>>
pdfs;
579 std::vector<double> coefs;
587 if (pdf->isSelectedComp())
589 pdfs.push_back(ctx.
at(pdf));
647 for (
const auto arg : allVars) {
648 if (!
subAnalVars.find(arg->GetName()) && pdf->dependsOn(*arg)) {
666 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
671 coutE(InputArguments) <<
"RooAddPdf::getAnalyticalIntegral(" <<
GetName() <<
") WARNING: component PDF " << pdf->GetName()
672 <<
" advertises inconsistent set of integrals (e.g. (X,Y) but not X or Y individually."
673 <<
" Distributed analytical integration disabled. Please fix PDF" << std::endl ;
709 errorMsg <<
"RooAddPdf::analyticalIntegral(" <<
GetName() <<
"): ERROR unrecognized integration code, " << code;
711 throw std::invalid_argument(
errorMsg.str().c_str());
739 if (pdf->isSelectedComp()) {
759 cxcoutD(Caching) <<
"RooAddPdf::expectedEvents(" <<
GetName() <<
") calling getProjCache with nset = " << (nset?*nset:
RooArgSet()) << std::endl ;
763 if (cache.doProjection()) {
791 std::unique_ptr<RooAbsReal> out;
793 auto name = std::string(
GetName()) +
"_expectedEvents";
797 sumSet.addOwned(pdf->createExpectedEventsFunc(nset));
799 out = std::make_unique<RooAddition>(
name.c_str(),
name.c_str(),
sumSet);
800 out->addOwnedComponents(std::move(
sumSet));
821 std::unique_ptr<RooAbsReal> owner;
830 auto integrl = std::unique_ptr<RooAbsReal>{pdf->createIntegral(*nset, *nset)};
831 auto formulaName = std::string(pdf->GetName()) +
"_formulaVar";
833 next->addOwnedComponents(std::move(
integrl));
836 next->addOwnedComponents(std::move(owner));
837 owner = std::move(next);
842 fracInteg->addOwnedComponents(std::move(owner));
848 std::string
finalName = std::string(out->GetName()) +
"_finalized";
967std::unique_ptr<RooAbsArg>
1010 bool isMultiRange = normRange.find(
',') != std::string::npos;
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
const_iterator begin() const
const_iterator end() const
int store(const std::vector< int > &codeList, RooArgSet *set1=nullptr, RooArgSet *set2=nullptr, RooArgSet *set3=nullptr, RooArgSet *set4=nullptr)
Store given arrays of integer codes, and up to four RooArgSets in the registry (each setX pointer may...
Output retrieve(int masterCode)
Retrieve the array of integer codes associated with the given master code, together with the (up to f...
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void clearValueAndShapeDirty() const
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
RooFit::OwningPtr< RooArgSet > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
bool isValueDirty() const
Abstract container object that can hold multiple RooAbsArg objects.
bool equals(const RooAbsCollection &otherColl) const
Check if this and other collection have identically-named contents.
RooFit::UniqueId< RooAbsCollection > const & uniqueId() const
Returns a unique ID that is different for every instantiated RooAbsCollection.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
Abstract base class for generator contexts of RooAbsPdf objects.
Abstract interface for all probability density functions.
virtual bool syncNormalization(const RooArgSet *dset, bool adjustProxies=true) const
Verify that the normalization integral cached with this PDF is valid for given set of normalization o...
virtual void resetErrorCounters(Int_t resetValue=10)
Reset error counter to given value, limiting the number of future error messages for this pdf to 'res...
bool isActiveNormSet(RooArgSet const *normSet) const
Checks if normSet is the currently active normalization set of this PDF, meaning is exactly the same ...
TString _normRange
Normalization range.
RooAbsReal * _norm
! Normalization integral (owned by _normMgr)
const char * normRange() const
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
Hook function intercepting redirectServer calls.
static Int_t _verboseEval
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
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.
friend class AddCacheElem
double _value
Cache for current value of object.
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}) const
Create an object that represents the integral of the function over one or more observables listed in ...
virtual void doEval(RooFit::EvalContext &) const
Base function for computing multiple values of a RooAbsReal.
static std::unique_ptr< RooAbsGenContext > create(const Pdf_t &pdf, const RooArgSet &vars, const RooDataSet *prototype, const RooArgSet *auxProto, bool verbose)
Returns a RooAddGenContext if possible, or, if the RooAddGenContext doesn't support this particular R...
Efficient implementation of a sum of PDFs of the form.
RooListProxy _coefList
List of coefficients.
bool _allExtendable
Flag indicating if all PDF components are extendable.
void doEval(RooFit::EvalContext &) const override
Compute addition of PDFs in batches.
RooAICRegistry _codeReg
! Registry of component analytical integration codes
RooFit::UniqueId< RooArgSet >::Value_t _idOfLastUsedNormSet
!
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Return analytical integral defined by given scenario code.
const char * getCoefRange() const
std::unique_ptr< const RooArgSet > _copyOfLastNormSet
!
void updateCoefficients(AddCacheElem &cache, const RooArgSet *nset, bool syncCoefValues=true) const
Update the coefficient values in the given cache element: calculate new remainder fraction,...
Int_t _coefErrCount
! Coefficient error counter
bool _haveLastCoef
Flag indicating if last PDFs coefficient was supplied in the constructor.
void selectNormalization(const RooArgSet *depSet=nullptr, bool force=false) override
Interface function used by test statistics to freeze choice of observables for interpretation of frac...
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooAddPdf to more intuitively reflect the contents of the produ...
void finalizeConstruction()
void setCacheAndTrackHints(RooArgSet &) override
Label OK'ed components of a RooAddPdf with cache-and-track.
const RooArgList & coefList() const
bool _recursive
Flag indicating is fractions are treated recursively.
RooObjCacheManager _projCacheMgr
! Manager of cache with coefficient projections and transformations
void materializeRefCoefNormFromAttribute() const
RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const override
Return specialized context to efficiently generate toy events from RooAddPdfs return RooAbsPdf::genCo...
bool checkObservables(const RooArgSet *nset) const override
Check if PDF is valid for given normalization set.
void fixCoefNormalization(const RooArgSet &refCoefNorm)
By default the interpretation of the fraction coefficients is performed in the contextual choice of o...
std::pair< const RooArgSet *, AddCacheElem * > getNormAndCache(const RooArgSet *nset) const
Look up projection cache and per-PDF norm sets.
RooSetProxy _refCoefNorm
Reference observable set for coefficient interpretation.
void selectNormalizationRange(const char *rangeName=nullptr, bool force=false) override
Interface function used by test statistics to freeze choice of range for interpretation of fraction c...
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Determine which part (if any) of given integral can be performed analytically.
void resetErrorCounters(Int_t resetValue=10) override
Reset error counter to given value, limiting the number of future error messages for this pdf to 'res...
double expectedEvents(const RooArgSet *nset) const override
Return expected number of events for extended likelihood calculation, which is the sum of all coeffic...
double getValV(const RooArgSet *set=nullptr) const override
Calculate and return the current value.
std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const override
void fixCoefRange(const char *rangeName)
By default, fraction coefficients are assumed to refer to the default fit range.
AddCacheElem * getProjCache(const RooArgSet *nset, const RooArgSet *iset=nullptr) const
Retrieve cache element for the computation of the PDF normalisation.
std::list< double > * plotSamplingHint(RooAbsRealLValue &obs, double xlo, double xhi) const override
Loop over components for plot sampling hints and merge them if there are multiple.
RooListProxy _pdfList
List of component PDFs.
TNamed * _refCoefRangeName
Reference range name for coefficient interpretation.
const RooArgList & pdfList() const
std::unique_ptr< RooAbsReal > createExpectedEventsFunc(const RooArgSet *nset) const override
Returns an object that represents the expected number of events for a given normalization set,...
bool isBinnedDistribution(const RooArgSet &obs) const override
If all components that depend on obs are binned, so is their sum.
bool redirectServersHook(const RooAbsCollection &, bool, bool, bool) override
Hook function intercepting redirectServer calls.
std::vector< double > _coefCache
! Transient cache with transformed values of coefficients
const RooArgSet & getCoefNormalization() const
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Loop over components for plot sampling hints and merge them if there are multiple.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Minimal configuration struct to steer the evaluation of a single node with the RooBatchCompute librar...
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=nullptr)
Setter function without integration set.
void reset()
Clear the cache.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=nullptr, const TNamed *isetRangeName=nullptr)
Getter function without integration set.
void removeAll() override
Remove all argument inset using remove(const RooAbsArg&).
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
Container class to hold unbinned data.
void markAsCompiled(RooAbsArg &arg) const
void compileServers(RooAbsArg &arg, RooArgSet const &normSet)
std::span< const double > at(RooAbsArg const *arg, RooAbsArg const *caller=nullptr)
std::span< double > output()
RooBatchCompute::Config config(RooAbsArg const *arg) const
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
Efficient implementation of a product of PDFs of the form.
void setCacheAndTrackHints(RooArgSet &) override
Label OK'ed components of a RooRealSumPdf with cache-and-track.
bool checkObservables(const RooArgSet *nset) const override
Check if FUNC is valid for given normalization set.
std::list< double > * plotSamplingHint(RooAbsRealLValue &, double, double) const override
Interface for returning an optional hint for initial sampling points when constructing a curve projec...
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Retrieve bin boundaries if this distribution is binned in obs.
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooRealSumPdf to more intuitively reflect the contents of the p...
bool isBinnedDistribution(const RooArgSet &obs) const override
Check if all components that depend on obs are binned.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
const char * Data() const
RooConstVar & RooConst(double val)
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
void compute(Config cfg, Computer comp, std::span< double > output, VarSpan vars, ArgSpan extraArgs={})
void getSortedComputationGraph(RooAbsArg const &func, RooArgSet &out)
std::string getColonSeparatedNameString(RooArgSet const &argSet, char delim=':')