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;
117 PdfInfo elem{pdf->GetName(), pdf};
118 auto comp = [&](PdfInfo
const&
p){
return p.first == elem.first &&
p.second != elem.second; };
119 auto found = std::find_if(seen.begin(), seen.end(), comp);
120 if(found != seen.end()) {
121 std::stringstream errorMsg;
122 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
123 <<
") pdf list contains pdfs with duplicate name \"" << pdf->GetName() <<
"\".";
124 coutE(InputArguments) << errorMsg.str() << std::endl;
125 throw std::invalid_argument(errorMsg.str().c_str());
159 bool recursiveFractions)
164 if (inPdfList.
size()>inCoefList.
size()+1 || inPdfList.
size()<inCoefList.
size()) {
165 std::stringstream errorMsg;
166 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
167 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1.";
168 coutE(InputArguments) << errorMsg.str() << std::endl;
169 throw std::invalid_argument(errorMsg.str().c_str());
172 if (recursiveFractions && inPdfList.
size()!=inCoefList.
size()+1) {
173 std::stringstream errorMsg;
174 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
175 <<
"): Recursive fractions option can only be used if Npdf=Ncoef+1.";
176 coutE(InputArguments) << errorMsg.str() << std::endl;
177 throw std::invalid_argument(errorMsg.str());
184 partinCoefList.
add(coef) ;
185 if(partinCoefList.
size() == 1) {
190 std::stringstream rfracName;
191 rfracName <<
GetName() <<
"_recursive_fraction_" << pdf.
GetName() <<
"_" << partinCoefList.
size();
192 auto rfrac = std::make_unique<RooRecursiveFraction>(rfracName.str().c_str(),
"Recursive Fraction",partinCoefList) ;
193 auto & rfracRef = *rfrac;
198 for (
auto i = 0u; i < inCoefList.
size(); ++i) {
199 auto coef =
dynamic_cast<RooAbsReal*
>(inCoefList.
at(i));
200 auto pdf =
dynamic_cast<RooAbsPdf*
>(inPdfList.
at(i));
201 if (inPdfList.
at(i) ==
nullptr) {
202 std::stringstream errorMsg;
203 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
204 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1";
205 coutE(InputArguments) << errorMsg.str() << std::endl;
206 throw std::invalid_argument(errorMsg.str());
209 std::stringstream errorMsg;
210 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") coefficient " << (coef ? coef->GetName() :
"") <<
" is not of type RooAbsReal, ignored";
211 coutE(InputArguments) << errorMsg.str() << std::endl;
212 throw std::invalid_argument(errorMsg.str());
215 std::stringstream errorMsg;
216 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->
GetName() :
"") <<
" is not of type RooAbsPdf, ignored";
217 coutE(InputArguments) << errorMsg.str() << std::endl;
218 throw std::invalid_argument(errorMsg.str());
223 _coefList.
add(recursiveFractions ? addRecursiveCoef(*pdf, *coef) : *coef);
226 if (inPdfList.
size() == inCoefList.
size() + 1) {
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.");
236 if (recursiveFractions) {
262 for (
const auto pdfArg : inPdfList) {
263 auto pdf =
dynamic_cast<const RooAbsPdf*
>(pdfArg);
266 std::stringstream errorMsg;
267 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"")
268 <<
" is not of type RooAbsPdf, RooAddPdf constructor call is invalid!";
269 coutE(InputArguments) << errorMsg.str() << std::endl;
270 throw std::invalid_argument(errorMsg.str().c_str());
272 if (!pdf->canBeExtended()) {
273 std::stringstream errorMsg;
274 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << pdf->GetName()
275 <<
" is not extendable, RooAddPdf constructor call is invalid!";
276 coutE(InputArguments) << errorMsg.str() << std::endl;
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),
295 _pdfList(
"!pdfs", this, other._pdfList),
296 _coefList(
"!coefficients", this, other._coefList),
297 _haveLastCoef(other._haveLastCoef),
298 _allExtendable(other._allExtendable),
299 _recursive(other._recursive),
300 _coefErrCount(_errorCount)
319 if (refCoefNorm.
empty()) {
349 std::vector<std::string> names;
360 for (std::string
const &
name : names) {
362 refCoefNorm.
add(*arg);
364 throw std::runtime_error(
"Internal logic error in RooAddPdf::materializeRefCoefNormFromAttribute()");
443 if (syncCoefValues) {
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};
528 bool nsetChanged(
false) ;
539 double snormVal = 1.;
540 snormVal = cache->suppNormVal(i);
542 double pdfVal = pdf.getVal(nset);
543 if (pdf.isSelectedComp()) {
557 std::span<double> output = ctx.
output();
568 if(coefVals.size() > 1) {
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;
584 for (
unsigned int pdfNo = 0; pdfNo <
_pdfList.
size(); ++pdfNo)
587 if (pdf->isSelectedComp())
589 pdfs.push_back(ctx.
at(pdf));
590 coefs.push_back(
_coefCache[pdfNo] / cache->suppNormVal(pdfNo) );
631 const RooArgSet* normSet,
const char* rangeName)
const
641 for (
const auto pdfArg :
_pdfList) {
642 auto pdf =
static_cast<const RooAbsPdf *
>(pdfArg);
644 pdf->getAnalyticalIntegralWN(allVars,subAnalVars,normSet,rangeName) ;
647 for (
const auto arg : allVars) {
648 if (!subAnalVars.
find(arg->GetName()) && pdf->
dependsOn(*arg)) {
649 allAnalVars.
remove(*arg,
true,
true) ;
656 if (allAnalVars.empty()) {
666 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
668 auto allAnalVars2 = std::unique_ptr<RooArgSet>{pdf->getObservables(allAnalVars)} ;
669 subCode[
n] = pdf->getAnalyticalIntegralWN(*allAnalVars2,subAnalVars,normSet,rangeName) ;
670 if (subCode[
n]==0 && !allAnalVars2->empty()) {
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 ;
683 analVars.
add(allAnalVars) ;
705 std::vector<int>
const &subCode = retrieved.
codes;
707 if (subCode.empty()) {
708 std::stringstream errorMsg;
709 errorMsg <<
"RooAddPdf::analyticalIntegral(" <<
GetName() <<
"): ERROR unrecognized integration code, " << code;
710 coutE(InputArguments) << errorMsg.str() << std::endl;
711 throw std::invalid_argument(errorMsg.str().c_str());
714 cxcoutD(Caching) <<
"RooAddPdf::aiWN(" <<
GetName() <<
") calling getProjCache with nset = " << (normSet?*normSet:
RooArgSet()) << std::endl ;
735 snormVal = cache->suppNormVal(i);
738 double val = pdf->analyticalIntegralWN(subCode[i],normSet,rangeName) ;
739 if (pdf->isSelectedComp()) {
757 double expectedTotal{0.0};
759 cxcoutD(Caching) <<
"RooAddPdf::expectedEvents(" <<
GetName() <<
") calling getProjCache with nset = " << (nset?*nset:
RooArgSet()) << std::endl ;
763 if (cache.doProjection()) {
768 expectedTotal += cache.rangeProjScaleFactor(i) * ncomp ;
775 for(
auto *arg : static_range_cast<RooAbsPdf*>(
_pdfList)) {
776 expectedTotal += arg->expectedEvents(nset) ;
779 for(
auto *arg : static_range_cast<RooAbsReal*>(
_coefList)) {
780 expectedTotal += arg->getVal(nset) ;
785 return expectedTotal ;
791 std::unique_ptr<RooAbsReal> out;
793 auto name = std::string(
GetName()) +
"_expectedEvents";
796 for (
auto *pdf : static_range_cast<RooAbsPdf *>(
_pdfList)) {
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));
829 std::unique_ptr<RooAbsReal> owner;
832 for (
auto *pdf : static_range_cast<RooAbsPdf *>(
_pdfList)) {
834 pdf->getObservables(nset, integObs);
835 auto integNum = std::unique_ptr<RooAbsReal>{pdf->createIntegral(integObs, integObs, normRangeName)};
836 auto integDen = std::unique_ptr<RooAbsReal>{
837 refRangeName.empty() ? pdf->createIntegral(integObs, integObs)
838 : pdf->createIntegral(integObs, integObs, refRangeName.c_str())};
839 auto fracName = std::string(pdf->GetName()) +
"_rangeFraction";
840 auto frac = std::make_unique<RooRatio>(fracName.c_str(), fracName.c_str(), *integNum, *integDen);
841 frac->addOwnedComponents(std::move(integNum), std::move(integDen));
844 frac->addOwnedComponents(std::move(owner));
845 owner = std::move(frac);
847 auto fracIntegName = std::string(
GetName()) +
"_integSum";
849 std::make_unique<RooRealSumFunc>(fracIntegName.c_str(), fracIntegName.c_str(),
_coefList, terms);
850 fracInteg->addOwnedComponents(std::move(owner));
852 out = std::move(fracInteg);
856 std::string finalName = std::string(out->GetName()) +
"_finalized";
857 if (prodList.
empty()) {
863 auto finalOut = std::make_unique<RooProduct>(finalName.c_str(), finalName.c_str(), prodList);
864 finalOut->addOwnedComponents(std::move(prodList));
912 const RooArgSet* auxProto,
bool verbose)
const
956 bool nameChange,
bool isRecursiveStep)
965std::unique_ptr<RooAbsArg>
978 for (
auto *pdf : static_range_cast<RooAbsPdf *>(
_pdfList)) {
1001 class ResetNormRangesRAII {
1003 ResetNormRangesRAII(
RooAbsCollection const &pdfs, std::string
const &normRange)
1005 _componentPdfs.reserve(pdfs.
size());
1006 _oldNormRanges.reserve(pdfs.
size());
1008 bool isMultiRange = normRange.find(
',') != std::string::npos;
1010 for (
auto *componentPdf : static_range_cast<RooAbsPdf *>(pdfs)) {
1014 bool changeRange = !(isMultiRange &&
dynamic_cast<RooProdPdf *
>(componentPdf));
1016 const char *old = componentPdf->normRange();
1017 const char *newVal = changeRange ? normRange.c_str() : old;
1018 componentPdf->setNormRange(newVal);
1019 _componentPdfs.emplace_back(componentPdf);
1020 _oldNormRanges.emplace_back(old ? old :
"");
1023 ~ResetNormRangesRAII()
1025 for (std::size_t i = 0; i < _componentPdfs.size(); ++i) {
1026 _componentPdfs[i]->setNormRange(_oldNormRanges[i].c_str());
1031 std::vector<RooAbsPdf *> _componentPdfs;
1032 std::vector<std::string> _oldNormRanges;
1066 std::string finalName = std::string(
GetName()) +
"_conditional";
1067 std::unique_ptr<RooAbsReal> denom{newArg->createIntegral(normSet,
_refCoefNorm)};
1068 auto finalArg = std::make_unique<RooGenericPdf>(finalName.c_str(),
"@0/@1",
RooArgList{*newArg, *denom});
1073 finalArg->addOwnedComponents(std::move(newArg));
1074 finalArg->addOwnedComponents(std::move(denom));
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
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
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
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 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.
Storage_t::size_type size() const
RooAbsArg * first() const
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
RooAbsArg * find(const char *name) const
Find object with given name in list.
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()
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.
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=':')
std::vector< int > const & codes