65 if (exclLVBranches.
empty())
77 for (
const auto client : server->valueClients()) {
79 if (!(exclLVBranches.
find(client->GetName()) == client)) {
80 if (allBranches.
find(client->GetName()) == client) {
81 if (!servesExclusively(client, exclLVBranches, allBranches)) {
92 return (numLVServ == 1);
96 ServerToAdd(
RooAbsArg *theArg,
bool isShape) : arg{theArg}, isShapeServer{isShape} {}
98 bool isShapeServer =
false;
101void addObservableToServers(
RooAbsReal const &function,
RooAbsArg &leaf, std::vector<ServerToAdd> &serversToAdd,
102 const char *rangeName)
105 if (leaflv && leaflv->getBinning(rangeName).isParameterized()) {
108 <<
" has parameterized binning, add value dependence of boundary objects rather than shape of leaf"
110 if (leaflv->getBinning(rangeName).lowBoundFunc()) {
111 serversToAdd.emplace_back(leaflv->getBinning(rangeName).lowBoundFunc(),
false);
113 if (leaflv->getBinning(rangeName).highBoundFunc()) {
114 serversToAdd.emplace_back(leaflv->getBinning(rangeName).highBoundFunc(),
false);
118 <<
" as shape dependent" << std::endl;
119 serversToAdd.emplace_back(&leaf,
true);
123void addParameterToServers(
RooAbsReal const &function,
RooAbsArg &leaf, std::vector<ServerToAdd> &serversToAdd,
126 if (!isShapeServer) {
128 <<
" as value dependent" << std::endl;
131 <<
" as shape dependent" << std::endl;
133 serversToAdd.emplace_back(&leaf, isShapeServer);
136enum class MarkedState { Dependent, Independent, AlreadyAdded };
139void unmarkDepValueClients(
RooAbsArg const &dep,
RooArgSet const &args, std::vector<MarkedState> &marked)
141 assert(args.
size() == marked.size());
144 marked[
index] = MarkedState::Dependent;
145 for (
RooAbsArg *client : dep.valueClients()) {
146 unmarkDepValueClients(*client, args, marked);
151std::vector<ServerToAdd>
152getValueAndShapeServers(
RooAbsReal const &function,
RooArgSet const &depList,
const char *rangeName)
154 std::vector<ServerToAdd> serversToAdd;
158 function.treeNodeServerList(&allArgsList,
nullptr,
true,
true,
false,
false);
164 function.treeNodeServerList(&allValueArgsList,
nullptr,
true,
true,
true,
false);
165 RooArgSet allValueArgs{allValueArgsList};
168 std::vector<MarkedState> marked(allArgs.size(), MarkedState::Independent);
169 marked.back() = MarkedState::Dependent;
177 unmarkDepValueClients(*depInArgs, allArgs, marked);
178 addObservableToServers(function, *depInArgs, serversToAdd, rangeName);
184 for (std::size_t i = 0; i < allArgs.size(); ++i) {
185 if (marked[i] == MarkedState::Dependent) {
186 for (
RooAbsArg *server : allArgs[i]->servers()) {
188 if (
index >= 0 && marked[
index] == MarkedState::Independent) {
189 addParameterToServers(function, *server, serversToAdd, !allValueArgs.find(*server));
190 marked[
index] = MarkedState::AlreadyAdded;
213 if (intDep->namePtr() != branch->namePtr() && branch->dependsOnValue(*intDep)) {
219 filteredIntDeps.
add(*intDep);
223 for (
const auto arg :
function.servers()) {
226 if (!arg->dependsOnValue(filteredIntDeps)) {
228 }
else if (!arg->isValueServer(function) && !arg->isShapeServer(function)) {
236 if (arg->isDerived()) {
239 if ((realArgLV && filteredIntDeps.
find(realArgLV->
GetName()) &&
247 bool overlapOK =
true;
248 for (
const auto otherArg :
function.servers()) {
254 if (arg->overlaps(*otherArg,
true)) {
268 anIntOKDepList.
add(*arg,
true);
270 <<
function.GetName() <<
": Observable " << arg->GetName()
271 <<
" is suitable for analytical integration (if supported by p.d.f)" << std::endl;
303 const char* rangeName) :
306 _respectCompSelect{!_globalSelectComp},
307 _sumList(
"!sumList",
"Categories to be summed numerically",this,false,false),
308 _intList(
"!intList",
"Variables to be integrated numerically",this,false,false),
309 _anaList(
"!anaList",
"Variables to be integrated analytically",this,false,false),
310 _jacList(
"!jacList",
"Jacobian product term",this,false,false),
311 _facList(
"!facList",
"Variables independent of function",this,false,true),
312 _function(
"!func",
"Function to be integrated",this,false,false),
314 _sumCat(
"!sumCat",
"SuperCategory for summation",this,false,false),
338 oocxcoutI(&function,Integration) <<
"RooRealIntegral::ctor(" <<
GetName() <<
") Constructing integral of function "
339 << function.GetName() <<
" over observables" << depList <<
" with normalization "
341 << (rangeName?rangeName:
"<none>") << std::endl ;
355 if (function.dependsOn(*nArg)) {
371 for (
auto arg : intDepList) {
372 if(!arg->isLValue()) {
377 if (!function.dependsOn(*arg)) {
378 std::unique_ptr<RooAbsArg> argClone{
static_cast<RooAbsArg*
>(arg->Clone())};
385 oocxcoutI(&function,Integration) << function.GetName() <<
": Factorizing obserables are " <<
_facList << std::endl ;
396 RooArgSet exclLVBranches(
"exclLVBranches") ;
399 function.branchNodeServerList(&branchList) ;
401 for (
auto branch: branchList) {
404 if ((realArgLV && (realArgLV->
isJacobianOK(intDepList)!=0)) || catArgLV) {
405 exclLVBranches.
add(*branch) ;
407 if (branch != &function && function.dependsOnValue(*branch)) {
408 branchListVD.
add(*branch) ;
411 exclLVBranches.
remove(depList,
true,
true) ;
415 RooArgSet exclLVServers(
"exclLVServers") ;
416 function.getObservables(&intDepList, exclLVServers);
419 bool converged(
false) ;
424 std::vector<RooAbsArg*> toBeRemoved;
425 for (
auto server : exclLVServers) {
426 if (!servesExclusively(server,exclLVBranches,branchListVD)) {
427 toBeRemoved.push_back(server);
431 exclLVServers.
remove(toBeRemoved.begin(), toBeRemoved.end());
435 for (std::size_t i=0; i < exclLVBranches.
size(); ++i) {
436 const RooAbsArg* branch = exclLVBranches[i];
440 bsList.
remove(exclLVServers,
true,
true) ;
441 if (!bsList.
empty()) {
442 exclLVBranches.
remove(*branch,
true,
true) ;
451 for (std::size_t i=0; i < exclLVBranches.
size(); ++i) {
452 const RooAbsArg* branch = exclLVBranches[i];
454 exclLVBranches.
remove(*branch,
true,
true) ;
461 if (!exclLVServers.
empty() && !function.isBinnedDistribution(exclLVBranches)) {
462 intDepList.
remove(exclLVServers) ;
463 intDepList.
add(exclLVBranches) ;
473 for (
auto arg : intDepList) {
474 if (function.forceAnalyticalInt(*arg)) {
475 anIntOKDepList.
add(*arg) ;
479 if (!anIntOKDepList.
empty()) {
480 oocxcoutI(&function,Integration) << function.GetName() <<
": Observables that function forcibly requires to be integrated internally " << anIntOKDepList << std::endl ;
489 auto serversToAdd = getValueAndShapeServers(function, depList, rangeName);
490 fillAnIntOKDepList(function, intDepList, anIntOKDepList, branchListVD);
507 oocxcoutI(&function,Integration) << function.GetName() <<
": Function integrated observables " <<
_anaList <<
" internally with code " <<
_mode << std::endl ;
533 std::unique_ptr<RooArgSet> argDepList{arg->getObservables(&intDepList)};
534 for (
const auto argDep : *argDepList) {
545 if (!exclLVServers.
empty()) {
547 intDepList.
remove(exclLVBranches) ;
548 intDepList.
add(exclLVServers) ;
554 for (
const auto arg : function.servers()) {
566 auto argDeps = std::unique_ptr<RooArgSet>(arg->getObservables(&intDepList));
570 for (
const auto dep : *argDeps) {
580 oocxcoutI(&function,Integration) << function.GetName() <<
": Observables " <<
_anaList <<
" are analytically integrated with code " <<
_mode << std::endl ;
583 oocxcoutI(&function,Integration) << function.GetName() <<
": Observables " <<
_intList <<
" are numerically integrated" << std::endl ;
586 oocxcoutI(&function,Integration) << function.GetName() <<
": Observables " <<
_sumList <<
" are numerically summed" << std::endl ;
621 for(
auto const& toAdd : serversToAdd) {
622 addServer(*toAdd.arg, !toAdd.isShapeServer, toAdd.isShapeServer);
640 for (
const auto leaf : leafSet) {
682 coutE(Integration) <<
ClassName() <<
"::" <<
GetName() <<
": failed to create valid integrand." << std::endl;
692 coutE(Integration) <<
ClassName() <<
"::" <<
GetName() <<
": failed to create valid integrator." << std::endl;
696 cxcoutI(NumIntegration) <<
"RooRealIntegral::init(" <<
GetName() <<
") using numeric integrator "
697 << integratorName <<
" to calculate Int" <<
_intList << std::endl ;
700 cxcoutI(NumIntegration) <<
"RooRealIntegral::init(" <<
GetName() <<
") evaluation requires " <<
_intList.
size() <<
"-D numeric integration step. Evaluation may be slow, sufficient numeric precision for fitting & minimization is not guaranteed" << std::endl ;
712 _valid(other._valid),
713 _respectCompSelect(other._respectCompSelect),
714 _sumList(
"!sumList", this, other._sumList),
715 _intList(
"!intList", this, other._intList),
716 _anaList(
"!anaList", this, other._anaList),
717 _jacList(
"!jacList", this, other._jacList),
718 _facList(
"!facList", this, other._facList),
719 _function(
"!func", this, other._function),
720 _iconfig(other._iconfig),
721 _sumCat(
"!sumCat", this, other._sumCat),
723 _intOperMode(other._intOperMode),
724 _rangeName(other._rangeName)
761 std::unique_ptr<RooArgSet> tmp;
767 tmp = std::make_unique<RooArgSet>();
770 newNormSet = tmp.get();
772 return _function->createIntegral(isetAll,newNormSet,cfg,rangeName);
831 <<
":evaluate: cannot initialize numerical integrator" << std::endl;
863 cxcoutD(Tracing) <<
"RooRealIntegral::evaluate_analytic(" <<
GetName()
897 retVal *= argLV->numTypes() ;
910 ccxcoutD(Tracing) <<
"raw*fact = " << retVal << std::endl ;
928 jacProd *= arg->jacobian() ;
933 return std::abs(jacProd) ;
946 for (
const auto& nameIdx : *sumCat) {
979 bool mustReplaceAll,
bool nameChange,
bool isRecursive)
1002 _params = std::make_unique<RooArgSet>(
"params") ;
1043 std::stringstream errorMsg;
1044 errorMsg <<
"Only analytical integrals and 1D numeric integrals are supported for AD for class"
1046 coutE(Minimization) << errorMsg.str() << std::endl;
1047 throw std::runtime_error(errorMsg.str().c_str());
1053 for (std::string
const&
name : wrapper.collectedFunctions()) {
1058 _function->getParameters(
nullptr, params);
1062 std::stringstream ss;
1068 ss <<
"double " << paramsName <<
"[] = {";
1074 if (param->namePtr() == intVar.namePtr()) {
1076 }
else if (!param->isConstant()) {
1081 if (!args.empty()) {
1084 ss << args <<
"};\n";
1090 <<
" const int n = 1000; // number of sampling points\n"
1091 <<
" double d = " << intVar.getMax(
intRange()) <<
" - " << intVar.getMin(
intRange()) <<
";\n"
1092 <<
" double eps = d / n;\n"
1093 <<
" for (int i = 0; i < n; ++i) {\n"
1094 <<
" " << paramsName <<
"[" << intVarIdx <<
"] = " << intVar.getMin(
intRange()) <<
" + eps * i;\n"
1095 <<
" double tmpA = " << ctx.
buildCall(wrapper.funcName(), paramsName,
nullptr,
nullptr) <<
";\n"
1096 <<
" " << paramsName <<
"[" << intVarIdx <<
"] = " << intVar.getMin(
intRange()) <<
" + eps * (i + 1);\n"
1097 <<
" double tmpB = " << ctx.
buildCall(wrapper.funcName(), paramsName,
nullptr,
nullptr) <<
";\n"
1098 <<
" " << resName <<
" += (tmpA + tmpB) * 0.5 * eps;\n"
1123 os <<
"d[Ana]" << tmp <<
" ";
1129 if (!tmp2.
empty()) {
1130 os <<
" d[Num]" << tmp2 <<
" ";
1140 os <<
indent <<
"--- RooRealIntegral ---" << std::endl;
1141 os <<
indent <<
" Integrates ";
1145 os <<
indent <<
" operating mode is "
1147 os <<
indent <<
" Summed discrete args are " <<
_sumList << std::endl ;
1148 os <<
indent <<
" Numerically integrated args are " <<
_intList << std::endl;
1149 os <<
indent <<
" Analytically integrated args using mode " <<
_mode <<
" are " <<
_anaList << std::endl ;
1150 os <<
indent <<
" Arguments included in Jacobian are " <<
_jacList << std::endl ;
1151 os <<
indent <<
" Factorized arguments are " <<
_facList << std::endl ;
1152 os <<
indent <<
" Function normalization set " ;
1178std::unique_ptr<RooAbsArg>
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
static void indent(ostringstream &buf, int indent_level)
static unsigned int total
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
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
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.
R__DEPRECATED(6, 36, "Use getObservables().") RooFit R__DEPRECATED(6, 36, "Use getObservables().") RooFit R__DEPRECATED(6, 36, "Use getObservables().") RooFit const RooAbsArg &testArg const
void setOperMode(OperMode mode, bool recurseADirty=true)
Set the operation mode of this node.
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.
virtual void setExpensiveObjectCache(RooExpensiveObjectCache &cache)
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
static void setDirtyInhibit(bool flag)
Control global dirty inhibit mode.
virtual std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const
const RefCountList_t & servers() const
List of all servers of this object.
bool dependsOnValue(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr) const
Check whether this object depends on values from an element in the serverList.
void addServer(RooAbsArg &server, bool valueProp=true, bool shapeProp=false, std::size_t refCount=1)
Register another RooAbsArg as a server to us, ie, declare that we depend on it.
virtual bool isDerived() const
Does value or shape of this arg depend on any other arg?
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
bool isValueOrShapeDirtyAndClear() const
bool inhibitDirty() const
Delete watch flag.
void setProxyNormSet(const RooArgSet *nset)
Forward a change in the cached normalization argset to all the registered proxies.
RefCountList_t _serverList
void leafNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool recurseNonDerived=false) const
Fill supplied list with all leaf nodes of the arg tree, starting with ourself as top node.
bool isValueServer(const RooAbsArg &arg) const
Check if this is serving values to arg.
OperMode operMode() const
Query the operation mode of this node.
Abstract base class for objects that represent a discrete value that can be set from the outside,...
Abstract container object that can hold multiple RooAbsArg objects.
RooFit::UniqueId< RooAbsCollection > const & uniqueId() const
Returns a unique ID that is different for every instantiated RooAbsCollection.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Storage_t const & get() const
Const access to the underlying stl container.
void sortTopologically()
Sort collection topologically: the servers of any RooAbsArg will be before that RooAbsArg in the coll...
bool contains(const RooAbsArg &var) const
Check if collection contains an argument with the same name as var.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Int_t index(const RooAbsArg *arg) const
Returns index of given arg, or -1 if arg is not in the collection.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
Storage_t::size_type size() const
RooAbsArg * first() const
RooAbsArg * find(const char *name) const
Find object with given name in list.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Abstract base class for objects that are lvalues, i.e.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
virtual bool isJacobianOK(const RooArgSet &depList) const
Abstract base class for objects that represent a real value and implements functionality common to al...
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 ...
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Structure printing.
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
Function that is called at the end of redirectServers().
double _value
Cache for current value of object.
double traceEval(const RooArgSet *set) const
Calculate current value of object, with error tracing wrapper.
RooFit::UniqueId< RooArgSet >::Value_t _lastNormSetId
Component selection flag for RooAbsPdf::plotCompOn.
RooArgList is a container object that can hold multiple RooAbsArg objects.
bool _valueServer
If true contents is value server of owner.
bool isValueServer() const
Returns true of contents is value server of owner.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
void removeAll() override
Remove all argument inset using remove(const RooAbsArg&).
bool addOwned(RooAbsArg &var, bool silent=false) override
Overloaded RooCollection_t::addOwned() method insert object into owning set and registers object as s...
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...
Represents a constant real-valued object.
Minimal implementation of a TObject holding a double value.
bool registerObject(const char *ownerName, const char *objectName, TObject &cacheObject, const RooArgSet ¶ms)
Register object associated with given name and given associated parameters with given values in cache...
const TObject * retrieveObject(const char *name, TClass *tclass, const RooArgSet ¶ms)
Retrieve object from cache that was registered under given name with given parameters,...
A class to maintain the context for squashing of RooFit models into code.
std::string buildCall(std::string const &funcname, Args_t const &...args)
Build the code to call the function with name funcname, passing some arguments.
void addResult(RooAbsArg const *key, std::string const &value)
A function to save an expression that includes/depends on the result of the input node.
std::string getTmpVarName() const
Get a unique variable name to be used in the generated code.
std::string const & getResult(RooAbsArg const &arg)
Gets the result for the given node using the node name.
void addToGlobalScope(std::string const &str)
Adds the given string to the string block that will be emitted at the top of the squashed function.
Experimental::RooFuncWrapper * _wrapper
A wrapper class to store a C++ function of type 'double (*)(double*, double*)'.
void collectFunction(std::string const &funcName)
Registry for const char* names.
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
Holds the configuration parameters of the various numeric integrators used by RooRealIntegral.
std::unique_ptr< RooAbsIntegrator > createIntegrator(RooAbsFunc &func, const RooNumIntConfig &config, int ndim=0, bool isBinned=false) const
Construct a numeric integrator instance that operates on function 'func' and is configured with 'conf...
std::string getIntegratorName(RooAbsFunc &func, const RooNumIntConfig &config, int ndim=0, bool isBinned=false) const
static RooNumIntFactory & instance()
Static method returning reference to singleton instance of factory.
Performs hybrid numerical/analytical integrals of RooAbsReal objects.
RooNumIntConfig * _iconfig
bool initNumIntegrator() const
(Re)Initialize numerical integration engine if necessary.
RooArgSet const * funcNormSet() const
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, const RooArgSet *nset=nullptr, const RooNumIntConfig *cfg=nullptr, const char *rangeName=nullptr) const override
Create an object that represents the integral of the function over one or more observables listed in ...
void translate(RooFit::Detail::CodeSquashContext &ctx) const override
This function defines a translation for each RooAbsReal based object that can be used to express the ...
void setAllowComponentSelection(bool allow)
Set component selection to be allowed/forbidden.
RooRealProxy _function
Function being integrated.
RooArgSet intVars() const
RooSetProxy _intList
Set of continuous observables over which is integrated numerically.
virtual double sum() const
Perform summation of list of category dependents to be integrated.
RooSetProxy _facList
Set of observables on which function does not depends, which are integrated nevertheless.
std::unique_ptr< RooArgSet > _params
! cache for set of parameters
static void setCacheAllNumeric(Int_t ndim)
Global switch to cache all integral values that integrate at least ndim dimensions numerically.
IntOperMode _intOperMode
integration operation mode
bool _cacheNum
Cache integral if numeric.
double evaluate() const override
Perform the integration and return the result.
const RooArgSet & parameters() const
std::unique_ptr< RooAbsFunc > _numIntegrand
!
void addNumIntDep(RooAbsArg const &arg)
Sort numeric integration variables in summation and integration lists.
RooSetProxy _jacList
Set of lvalue observables over which is analytically integration that have a non-unit Jacobian.
bool isValidReal(double value, bool printError=false) const override
Check if current value is valid.
double getValV(const RooArgSet *set=nullptr) const override
Return value of object.
RooSetProxy _anaList
Set of observables over which is integrated/summed analytically.
bool _restartNumIntEngine
!
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursive) override
Intercept server redirects and reconfigure internal object accordingly.
RooSetProxy _sumList
Set of discrete observable over which is summed numerically.
~RooRealIntegral() override
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooRealIntegral to more intuitively reflect the contents of the...
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Print the state of this object to the specified output stream.
std::unique_ptr< RooAbsIntegrator > _numIntEngine
!
virtual double integrate() const
Perform hybrid numerical/analytical integration over all real-valued dependents.
virtual double jacobianProduct() const
Return product of jacobian terms originating from analytical integration.
static Int_t getCacheAllNumeric()
Return minimum dimensions of numeric integration for which values are cached.
static Int_t _cacheAllNDim
! Cache all integrals with given numeric dimension
RooArgSet const * actualFuncNormSet() const
std::unique_ptr< RooArgSet > _funcNormSet
Optional normalization set passed to function.
std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const override
void autoSelectDirtyMode()
Set appropriate cache operation mode for integral depending on cache operation mode of server objects...
const char * intRange() const
bool getAllowComponentSelection() const
Check if component selection is allowed.
Joins several RooAbsCategoryLValue objects into a single category.
bool setIndex(value_type index, bool printError=true) override
Set the value of the super category to the specified index.
bool inRange(const char *rangeName) const override
Check that all input category states are in the given range.
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.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
TString & Append(const char *cs)
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
std::string makeValidVarName(std::string const &in)
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
constexpr Value_t value() const
Return numerical value of ID.