80 std::map<std::string, RooAbsPdf *> pdfMap;
81 auto indexCatIt = inIndexCat.
begin();
82 for (
unsigned int i = 0; i < inPdfList.
size(); ++i) {
83 auto pdf =
static_cast<RooAbsPdf *
>(&inPdfList[i]);
84 const auto &nameIdx = (*indexCatIt++);
85 pdfMap[nameIdx.first] = pdf;
144 if (inPdfList.
size() != inIndexCat.
size()) {
145 std::stringstream errMsg;
146 errMsg <<
"RooSimultaneous::ctor(" << GetName()
147 <<
" ERROR: Number PDF list entries must match number of index category states, no PDFs added";
148 coutE(InputArguments) << errMsg.str() << std::endl;
149 throw std::invalid_argument(errMsg.str());
172 _plotCoefNormSet(
"!plotCoefNormSet",
"plotCoefNormSet", this, false, false),
176 for (std::size_t i = 0; i < initInfo.finalPdfs.size(); ++i) {
177 addPdf(*initInfo.finalPdfs[i], initInfo.finalCatLabels[i].c_str());
181 if (initInfo.superIndex) {
182 addOwnedComponents(std::move(initInfo.superIndex));
190namespace RooSimultaneousAux {
195 std::unique_ptr<RooArgSet> subIndexComps;
201std::unique_ptr<RooSimultaneous::InitializationOutput>
203 std::map<std::string, RooAbsPdf *>
const& pdfMap)
206 auto out = std::make_unique<RooSimultaneous::InitializationOutput>();
207 out->indexCat = &inIndexCat;
210 bool simComps(
false) ;
211 for (
auto const& item : pdfMap) {
220 for (
auto const& item : pdfMap) {
221 out->addPdf(*item.second,item.first);
226 std::string msgPrefix =
"RooSimultaneous::initialize(" +
name +
") ";
229 oocoutI(
nullptr, InputArguments) << msgPrefix <<
"INFO: one or more input component of simultaneous p.d.f.s are"
230 <<
" simultaneous p.d.f.s themselves, rewriting composite expressions as one-level simultaneous p.d.f. in terms of"
231 <<
" final constituents and extended index category" << std::endl;
235 std::map<string,RooSimultaneousAux::CompInfo> compMap ;
236 for (
auto const& item : pdfMap) {
237 RooSimultaneousAux::CompInfo ci ;
238 ci.pdf = item.second ;
241 ci.simPdf = simComp ;
242 ci.subIndex = &simComp->
indexCat() ;
244 ? std::make_unique<RooArgSet>(simComp->
indexCat())
246 allAuxCats.
add(*ci.subIndexComps,
true) ;
249 ci.subIndex =
nullptr;
251 compMap[item.first] = std::move(ci);
256 allCats.
add(allAuxCats) ;
257 std::string siname =
name +
"_index";
258 out->superIndex = std::make_unique<RooSuperCategory>(siname.c_str(),siname.c_str(),allCats) ;
259 auto *superIndex = out->superIndex.get();
260 out->indexCat = superIndex;
263 for (
auto const& citem : compMap) {
266 if (citem.second.subIndexComps) {
267 repliCats.
remove(*citem.second.subIndexComps) ;
269 inIndexCat.
setLabel(citem.first.c_str()) ;
271 if (!citem.second.simPdf) {
277 for (
const auto& nameIdx : repliSuperCat) {
279 repliSuperCat.
setLabel(nameIdx.first) ;
281 string superLabel = superIndex->getCurrentLabel() ;
282 out->addPdf(*citem.second.pdf,superLabel);
284 <<
"assigning pdf " << citem.second.pdf->GetName() <<
" to super label " << superLabel << std::endl ;
290 if (repliCats.
empty()) {
294 for (
const auto& type : *citem.second.subIndex) {
297 RooAbsPdf* compPdf = citem.second.simPdf->getPdf(type.first);
299 out->addPdf(*compPdf,superLabel);
301 <<
"assigning pdf " << compPdf->
GetName() <<
"(member of " << citem.second.pdf->GetName()
302 <<
") to super label " << superLabel << std::endl ;
304 oocoutW(
nullptr, InputArguments) << msgPrefix <<
"WARNING: No p.d.f. associated with label "
305 << type.second <<
" for component RooSimultaneous p.d.f " << citem.second.pdf->GetName()
306 <<
"which is associated with master index label " << citem.first << std::endl ;
317 for (
const auto& stype : *citem.second.subIndex) {
320 for (
const auto& nameIdx : repliSuperCat) {
321 repliSuperCat.setLabel(nameIdx.first) ;
322 const string superLabel = superIndex->getCurrentLabel() ;
323 RooAbsPdf* compPdf = citem.second.simPdf->getPdf(stype.first);
325 out->addPdf(*compPdf,superLabel);
327 <<
"assigning pdf " << compPdf->
GetName() <<
"(member of " << citem.second.pdf->GetName()
328 <<
") to super label " << superLabel << std::endl ;
330 oocoutW(
nullptr, InputArguments) << msgPrefix <<
"WARNING: No p.d.f. associated with label "
331 << stype.second <<
" for component RooSimultaneous p.d.f " << citem.second.pdf->GetName()
332 <<
"which is associated with master index label " << citem.first << std::endl ;
357 _pdfProxyList.Add(new RooRealProxy(proxy->GetName(),this,*proxy)) ;
379 return proxy ?
static_cast<RooAbsPdf*
>(proxy->absArg()) :
nullptr;
402 coutE(InputArguments) <<
"RooSimultaneous::addPdf(" <<
GetName() <<
"): PDF '" << pdf.
GetName()
403 <<
"' overlaps with index category '" <<
_indexCat.arg().GetName() <<
"'."<< std::endl ;
409 coutE(InputArguments) <<
"RooSimultaneous::addPdf(" <<
GetName() <<
"): index state '"
410 << catLabel <<
"' has already an associated PDF." << std::endl ;
417 coutE(InputArguments) <<
"RooSimultaneous::addPdf(" <<
GetName()
418 <<
") ERROR: you cannot add a RooSimultaneous component to a RooSimultaneous using addPdf()."
419 <<
" Use the constructor with RooArgList if input p.d.f.s or the map<string,RooAbsPdf&> instead." << std::endl ;
440 bool anyCanExtend =
false;
443 auto &pdf =
static_cast<RooAbsPdf const&
>(proxy->arg());
444 if (pdf.mustBeExtended())
446 anyCanExtend |= pdf.canBeExtended();
463 double nEvtTot = 1.0;
464 double nEvtCat = 1.0;
473 auto &pdf2 =
static_cast<RooAbsPdf const &
>(proxy2->arg());
474 if(!pdf2.canBeExtended()) {
481 const double nEvt = pdf2.expectedEvents(
_normSet);
483 if (proxy == proxy2) {
490 double catFrac = nEvtCat / nEvtTot;
494 return *proxy * catFrac;
510 sum += (
static_cast<RooAbsPdf*
>(proxy->absArg()))->expectedEvents(nset) ;
521 if (proxy==
nullptr)
return 0 ;
524 return (
static_cast<RooAbsPdf*
>(proxy->absArg()))->expectedEvents(nset);
536 const RooArgSet* normSet,
const char* rangeName)
const
539 analVars.
add(allVars) ;
554 cache->
_partIntList.
addOwned(std::unique_ptr<RooAbsReal>{proxy->arg().createIntegral(analVars,normSet,
nullptr,rangeName)});
604 pc.
defineObject(
"sliceCatList",
"SliceCat",0,
nullptr,
true) ;
611 pc.
defineSet(
"projDataSet",
"ProjData",0) ;
625 std::unique_ptr<RooArgSet> sliceSet( sliceSetTmp ? (
static_cast<RooArgSet*
>(sliceSetTmp->
Clone())) :
nullptr );
627 double scaleFactor = pc.
getDouble(
"scaleFactor") ;
632 const char* sliceCatState = pc.
getString(
"sliceCatState",
nullptr,
true) ;
638 sliceSet = std::make_unique<RooArgSet>();
645 unsigned int tokenIndex = 0;
647 const char* slabel = tokenIndex >= catTokens.size() ? nullptr : catTokens[tokenIndex++].c_str();
651 scat->setLabel(slabel) ;
653 sliceSet->add(*scat,
false) ;
660 coutE(InputArguments) <<
"RooSimultaneous::plotOn(" <<
GetName() <<
") ERROR: must have a projection dataset for index category" << std::endl ;
670 for (
const auto sliceArg : *sliceSet) {
673 projectedVars.
remove(*arg) ;
675 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") slice variable "
676 << sliceArg->GetName() <<
" was not projected anyway" << std::endl ;
679 }
else if (projSet) {
685 bool projIndex(
false) ;
693 coutE(Plotting) <<
"RooSimultaneous::plotOn(" <<
GetName() <<
") ERROR: Projection over index category "
694 <<
"requested, but projection data set doesn't contain index category" << std::endl ;
707 bool anyServers(
false) ;
709 if (projectedVars.
find(server->GetName())) {
711 projIdxServers.
add(*server) ;
719 bool allServers(
true) ;
721 for (
const auto server : projIdxServers) {
722 if (!projData->
get()->
find(server->GetName())) {
724 missing = server->GetName();
729 coutE(Plotting) <<
"RooSimultaneous::plotOn(" <<
GetName()
730 <<
") ERROR: Projection dataset doesn't contain complete set of index categories to do projection."
731 <<
"\n\tcategory " << missing <<
" is missing." << std::endl ;
741 std::unique_ptr<Roo1DTable> wTable( projData->
table(
_indexCat.arg()) );
751 std::unique_ptr<RooArgSet> idxCompSliceSet( idxCatClone->getObservables(frame->
getNormVars()) );
757 <<
" represents a slice in the index category (" <<
_indexCat.arg().GetName() <<
")" << std::endl ;
765 if (
auto* slicedComponent =
static_cast<const RooAbsCategory*
>(sliceSet->find(*idxComp))) {
766 idxComp->setIndex(slicedComponent->getCurrentIndex(),
false);
774 projDataVars.
remove(*idxCompSliceSet,
true,
true) ;
776 std::unique_ptr<RooAbsData>
786 if (!cmdList.
find(
"Asymmetry")) {
787 replaceOrAdd(cmdList2, tmp1);
789 replaceOrAdd(cmdList2, tmp2);
800 idxCompSliceSet->remove(projectedVars,
true,
true) ;
806 double sumWeight(0) ;
809 idxCatClone->setLabel(proxy->name()) ;
813 for (
const auto idxSliceCompArg : *idxCompSliceSet) {
814 const auto idxSliceComp =
static_cast<RooAbsCategory*
>(idxSliceCompArg);
824 wgtCompList.
addOwned(std::make_unique<RooRealVar>(proxy->name(),
"coef",wTable->get(proxy->name())));
825 sumWeight += wTable->getFrac(proxy->name()) ;
828 pdfCompList.
add(proxy->arg()) ;
832 RooAddPdf plotVar{plotVarName,
"weighted sum of RS components",pdfCompList,wgtCompList};
839 std::unique_ptr<RooAbsData> projDataTmp;
851 projDataVars.
remove(idxCatServers,
true,
true) ;
858 projSetTmp.
add(*projSet) ;
859 projSetTmp.
remove(idxCatServers,
true,
true);
864 if (
_indexCat.arg().isDerived() && !idxCompSliceSet->empty()) {
866 <<
" represents a slice in index category components " << *idxCompSliceSet << std::endl ;
870 idxCompProjSet.
remove(*idxCompSliceSet,
true,
true) ;
871 if (!idxCompProjSet.
empty()) {
873 <<
" averages with data index category components " << idxCompProjSet << std::endl ;
877 <<
" averages with data index category (" <<
_indexCat.arg().GetName() <<
")" << std::endl ;
887 if (!cmdList.
find(
"Asymmetry")) {
888 replaceOrAdd(cmdList2, tmp1);
890 replaceOrAdd(cmdList2, tmp2);
893 if (!projSetTmp.
empty()) {
896 replaceOrAdd(cmdList2, tmp3);
897 frame2 = plotVar.
plotOn(frame,cmdList2) ;
900 frame2 = plotVar.
plotOn(frame,cmdList2) ;
935 const RooArgSet* auxProto,
bool verbose,
bool autoBinned,
const char* binnedTag)
const
937 const char* idxCatName =
_indexCat.arg().GetName() ;
939 if (vars.
find(idxCatName) && prototype==
nullptr
940 && (auxProto==
nullptr || auxProto->
empty())
941 && (autoBinned || (binnedTag && strlen(binnedTag)))) {
949 return genContext(vars,prototype,auxProto,verbose) ;
959 const RooArgSet* auxProto,
bool verbose)
const
962 if(prototype) allVars.
add(*prototype->
get());
972 if(catsAmongAllVars.
empty()) {
973 coutE(InputArguments) <<
"RooSimultaneous::generateSimGlobal(" <<
GetName()
974 <<
") asking to generate without the index category!\n"
975 <<
"It's not clear what to do. you probably want to either:\n"
977 <<
" 1. Generate according to the currently-selected pdf.\n"
978 <<
" Please do this explicitly with:\n"
979 <<
" simpdf->getPdf(simpdf->indexCat().getCurrentLabel())->generate(vars, ...)\n"
981 <<
" 1. Generate global observable values according to the union of all component pdfs.\n"
982 <<
" For this, please use simpdf->generateSimGlobal(vars, ...)\n"
993 coutE(Plotting) <<
"RooSimultaneous::genContext: ERROR: prototype must include either all "
994 <<
" components of the RooSimultaneous index category or none " << std::endl;
1010 bool correctForBinVolume,
1011 bool showProgress)
const
1014 correctForBinVolume, showProgress) ==
nullptr)
1047 if(!catsAmongAllVars.
empty()) {
1048 coutE(InputArguments) <<
"RooSimultaneous::generateSimGlobal(" <<
GetName()
1049 <<
") asking to generate global obserables at the same time as the index category!\n"
1050 <<
"This doesn't make any sense: global observables are generally not related to a specific channel.\n"
1059 auto data = std::make_unique<RooDataSet>(
"gensimglobal",
"gensimglobal",whatVars);
1061 for (
Int_t i=0 ; i<nEvents ; i++) {
1062 for (
const auto& nameIdx :
indexCat()) {
1072 if (!globtmp.
empty()) {
1073 globClone.
assign(*std::unique_ptr<RooDataSet>{pdftmp->
generate(globtmp,1)}->get(0)) ;
1076 data->add(globClone) ;
1089 if (precision < 0.)
return;
1093 for (
auto const &item : this->
indexCat()) {
1095 auto const &catName = item.first;
1096 auto &pdf = *this->
getPdf(catName);
1102 newSamplingPdf->setAttribute(
1103 (std::string(
"ORIGNAME:") + pdf.GetName()).c_str());
1104 newSamplingPdfs.
addOwned(std::move(newSamplingPdf));
1126 std::map<std::string, double>
const& precisions,
1127 bool useCategoryNames ) {
1129 constexpr double defaultPrecision = -1.;
1133 for (
auto const &item : this->
indexCat()) {
1135 auto const &catName = item.first;
1136 auto &pdf = *this->
getPdf(catName);
1137 std::string pdfName = pdf.GetName();
1139 auto found = precisions.find(useCategoryNames ? catName : pdfName);
1140 const double precision =
1141 found != precisions.end() ? found->second : defaultPrecision;
1149 newSamplingPdf->setAttribute(
1150 (std::string(
"ORIGNAME:") + pdf.GetName()).c_str());
1151 newSamplingPdfs.
addOwned(std::move(newSamplingPdf));
1169 return superCat->inputCatList();
1183 if (server->isFundamental() && normSet.
find(*server)) {
1184 markObs(server, prefix, normSet);
1185 server->setAttribute(
"__obs__");
1186 }
else if (!server->isFundamental()) {
1187 markObs(server, prefix, normSet);
1199 if (server->isFundamental() && normSet.
find(*server)) {
1200 prefixArgs(server, prefix, normSet);
1201 }
else if (!server->isFundamental()) {
1202 prefixArgs(server, prefix, normSet);
1209std::unique_ptr<RooAbsArg>
1218 std::vector<std::string> catNames;
1221 catNames.emplace_back(proxy->GetName());
1222 std::string
const &catName = catNames.back();
1223 const std::string prefix =
"_" + catName +
"_";
1225 const std::string origname = proxy->arg().GetName();
1229 markObs(pdfClone.get(), prefix, normSet);
1231 std::unique_ptr<RooArgSet> pdfNormSet{
1232 std::unique_ptr<RooArgSet>(pdfClone->getVariables())->selectByAttrib(
"__obs__",
true)};
1233 std::unique_ptr<RooArgSet> condVarSet{
1234 std::unique_ptr<RooArgSet>(pdfClone->getVariables())->selectByAttrib(
"__conditional__",
true)};
1236 pdfNormSet->remove(*condVarSet,
true,
true);
1244 auto *pdfFinal = pdfContext.
compile(*pdfClone, *newSimPdf, *pdfNormSet);
1253 prefixArgs(pdfFinal, prefix, normSet);
1255 pdfFinal->fixAddCoefNormalization(*pdfNormSet,
false);
1257 pdfClone->SetName((std::string(
"_") + pdfClone->GetName()).c_str());
1258 pdfFinal->addOwnedComponents(std::move(pdfClone));
1260 pdfFinal->setAttribute((
"ORIGNAME:" + origname).c_str());
1261 newPdfs.
add(*pdfFinal);
1265 newSimPdf->removeServer(
const_cast<RooAbsReal &
>(proxy->arg()),
true);
1273 newSimPdf->_pdfProxyList.Delete();
1276 for (std::size_t i = 0; i < newPdfs.
size(); ++i) {
1277 const char *label = catNames[i].c_str();
1278 newSimPdf->_pdfProxyList.Add(
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
RooTemplateProxy< RooAbsReal > RooRealProxy
Compatibility typedef replacing the old RooRealProxy class.
int Int_t
Signed integer 4 bytes (int).
Common abstract base class for objects that represent a value and a "shape" in RooFit.
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.
void SetName(const char *name) override
Set the name of the TNamed.
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 redirectServers(const RooAbsCollection &newServerList, bool mustReplaceAll=false, bool nameChange=false, bool isRecursionStep=false)
Replace all direct servers of this object with the new servers in newServerList.
const RefCountList_t & servers() const
List of all servers of this object.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree).
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
virtual bool isFundamental() const
Is this object a fundamental type that can be added to a dataset?
RooAbsArg()
Default constructor.
Abstract base class for objects that represent a discrete value that can be set from the outside,...
virtual bool setLabel(const char *label, bool printError=true)=0
Change category state by specifying a state name.
A space to attach TBranches.
virtual value_type getCurrentIndex() const
Return index number of current state.
virtual const char * getCurrentLabel() const
Return label string of current state.
std::map< std::string, value_type >::const_iterator begin() const
Iterator for category state names. Points to pairs of index and name.
std::size_t size() const
Number of states defined.
bool contains(const char *name) const
Check if collection contains an argument with a specific name.
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.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
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
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 binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual Roo1DTable * table(const RooArgSet &catSet, const char *cuts="", const char *opts="") const
Construct table for product of categories in catSet.
RooFit::OwningPtr< RooAbsData > reduce(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 a reduced copy of this dataset.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract base class for generator contexts of RooAbsPdf objects.
Abstract interface for all probability density functions.
RooPlot * plotOn(RooPlot *frame, 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 RooCmdArg &arg9={}, const RooCmdArg &arg10={}) const override
Helper calling plotOn(RooPlot*, RooLinkedList&) const.
RooArgSet const * _normSet
! Normalization set with for above integral
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
RooFit::OwningPtr< RooDataSet > generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={})
See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,...
RooAbsPdf()
Default constructor.
RooDataHist * fillDataHist(RooDataHist *hist, const RooArgSet *nset, double scaleFactor, bool correctForBinVolume=false, bool showProgress=false) const
Fill a RooDataHist with values sampled from this function at the bin centers.
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
virtual void fixAddCoefNormalization(const RooArgSet &addNormSet=RooArgSet(), bool force=true)
Fix the interpretation of the coefficient of any RooAddPdf component in the expression tree headed by...
bool plotSanityChecks(RooPlot *frame) const
Utility function for plotOn(), perform general sanity check on frame to ensure safe plotting operatio...
void makeProjectionSet(const RooAbsArg *plotVar, const RooArgSet *allVars, RooArgSet &projectedVars, bool silent) const
Utility function for plotOn() that constructs the set of observables to project when plotting ourselv...
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.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
static std::unique_ptr< RooAbsPdf > create(RooAbsPdf &pdf, RooAbsData const &data, double precision)
Creates a wrapping RooBinSamplingPdf if appropriate.
Named container for two doubles, two integers two object points and three string pointers that can be...
Configurable parser for RooCmdArg named arguments.
void defineMutex(const char *head, Args_t &&... tail)
Define arguments where any pair is mutually exclusive.
bool process(const RooCmdArg &arg)
Process given RooCmdArg.
double getDouble(const char *name, double defaultValue=0.0) const
Return double property registered with name 'name'.
bool defineDouble(const char *name, const char *argName, int doubleNum, double defValue=0.0)
Define double property name 'name' mapped to double in slot 'doubleNum' in RooCmdArg with name argNam...
RooArgSet * getSet(const char *name, RooArgSet *set=nullptr) const
Return RooArgSet property registered with name 'name'.
bool defineSet(const char *name, const char *argName, int setNum, const RooArgSet *set=nullptr)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
bool ok(bool verbose) const
Return true of parsing was successful.
bool defineObject(const char *name, const char *argName, int setNum, const TObject *obj=nullptr, bool isArray=false)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
const char * getString(const char *name, const char *defaultValue="", bool convEmptyToNull=false) const
Return string property registered with name 'name'.
bool defineString(const char *name, const char *argName, int stringNum, const char *defValue="", bool appendMode=false)
Define double property name 'name' mapped to double in slot 'stringNum' in RooCmdArg with name argNam...
const RooLinkedList & getObjectList(const char *name) const
Return list of objects registered with name 'name'.
bool defineInt(const char *name, const char *argName, int intNum, int defValue=0)
Define integer property name 'name' mapped to integer in slot 'intNum' in RooCmdArg with name argName...
void allowUndefined(bool flag=true)
If flag is true the processing of unrecognized RooCmdArgs is not considered an error.
int getInt(const char *name, int defaultValue=0) const
Return integer property registered with name 'name'.
TObject * getObject(const char *name, TObject *obj=nullptr) const
Return TObject property registered with name 'name'.
Container class to hold N-dimensional binned data.
double weight(std::size_t i) const
Return weight of i-th bin.
void set(std::size_t binNumber, double weight, double wgtErr)
Set bin content of bin that was last loaded with get(std::size_t).
double sumEntries() const override
Sum the weights of all bins.
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
void compileServers(RooAbsArg &arg, RooArgSet const &normSet)
bool likelihoodMode() const
void setLikelihoodMode(bool flag)
T * compile(T &arg, RooAbsArg &owner, RooArgSet const &normSet)
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
bool Replace(const TObject *oldArg, const TObject *newArg)
Replace object 'oldArg' in collection with new object 'newArg'.
TObject * find(const char *name) const
Return pointer to object with given name in collection.
virtual void Add(TObject *arg)
TObject * FindObject(const char *name) const override
Return pointer to object with given name.
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
Plot frame and a container for graphics objects within that frame.
const RooArgSet * getNormVars() const
RooAbsRealLValue * getPlotVar() const
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
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...
double evaluate() const override
Return the current value: the value of the PDF associated with the current index category state.
Int_t _numPdf
Number of registered PDFs.
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...
TList _pdfProxyList
List of PDF proxies (named after applicable category state).
RooObjCacheManager _partIntMgr
! Component normalization manager
~RooSimultaneous() override
Destructor.
RooFit::OwningPtr< RooDataSet > generateSimGlobal(const RooArgSet &whatVars, Int_t nEvents) override
Special generator interface for generation of 'global observables' – for RooStats tools.
RooArgSet const & flattenedCatList() const
Internal utility function to get a list of all category components for this RooSimultaneous.
ExtendMode extendMode() const override
Examine the pdf components and check if one of them can be extended or must be extended.
RooCategoryProxy _indexCat
Index category.
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Return analytical integration defined by given code.
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Forward determination of analytical integration capabilities to component p.d.f.s A unique code is as...
double expectedEvents(const RooArgSet *nset) const override
Return the number of expected events: If the index is in nset, then return the sum of the expected ev...
friend class RooSimGenContext
RooAbsGenContext * autoGenContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false, bool autoBinned=true, const char *binnedTag="") const override
RooAbsPdf * getPdf(RooStringView catName) const
Return the p.d.f associated with the given index category name.
std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const override
static std::unique_ptr< RooSimultaneous::InitializationOutput > initialize(std::string const &name, RooAbsCategoryLValue &inIndexCat, std::map< std::string, RooAbsPdf * > const &pdfMap)
void wrapPdfsInBinSamplingPdfs(RooAbsData const &data, double precision)
Wraps the components of this RooSimultaneous in RooBinSamplingPdfs.
const TNamed * _plotCoefNormRange
RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const override
Return specialized generator context for simultaneous p.d.f.s.
std::unique_ptr< RooArgSet > _indexCatSet
! Index category wrapped in a RooArgSet if needed internally
bool addPdf(const RooAbsPdf &pdf, const char *catLabel)
Associate given PDF with index category state label 'catLabel'.
RooPlot * plotOn(RooPlot *frame, 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 RooCmdArg &arg9={}, const RooCmdArg &arg10={}) const override
RooSetProxy _plotCoefNormSet
const RooAbsCategoryLValue & indexCat() const
friend class RooSimSplitGenContext
virtual RooDataHist * fillDataHist(RooDataHist *hist, const RooArgSet *nset, double scaleFactor, bool correctForBinVolume=false, bool showProgress=false) const
The RooStringView is a wrapper around a C-style string that can also be constructed from a std::strin...
const char * c_str() const
Joins several RooAbsCategoryLValue objects into a single category.
bool setLabel(const char *label, bool printError=true) override
Set the value of the super category by specifying the state name.
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
RooCmdArg SelectVars(const RooArgSet &vars)
RooCmdArg ProjWData(const RooAbsData &projData, bool binData=false)
RooCmdArg Project(const RooArgSet &projSet)
RooCmdArg Normalization(double scaleFactor)
RooCmdArg Cut(const char *cutSpec)
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
std::string makeSliceCutString(RooArgSet const &sliceDataSet)
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
std::unique_ptr< T > cloneTreeWithSameParameters(T const &arg, RooArgSet const *observables=nullptr)
Clone RooAbsArg object and reattach to original parameters.
std::string getRangeNameForSimComponent(std::string const &rangeName, bool splitRange, std::string const &catName)
Internal struct used for initialization.
std::vector< RooAbsPdf const * > finalPdfs
std::vector< std::string > finalCatLabels
void addPdf(const RooAbsPdf &pdf, std::string const &catLabel)
static uint64_t sum(uint64_t i)