54namespace TestStatistics {
60 std::string
const &global_observables_tag)
64 bool doStripDisconnected =
false;
69 bool did_default_constraint_algo =
false;
70 std::size_t N_default_constraints = 0;
72 if (constrained_parameters.
empty()) {
74 constrained_parameters.
add(*default_constraints);
75 doStripDisconnected =
true;
77 did_default_constraint_algo =
true;
78 N_default_constraints = default_constraints->getSize();
82 if (did_default_constraint_algo) {
83 assert(N_default_constraints ==
static_cast<std::size_t
>(constrained_parameters.
getSize()));
90 if (!global_observables_tag.empty()) {
91 if (!global_observables.
empty()) {
95 global_observables.
add(*
dynamic_cast<RooArgSet *
>(allVars->selectByAttrib(global_observables_tag.c_str(),
true)));
96 oocoutI(
nullptr,
Minimization) <<
"User-defined specification of global observables definition with tag named '"
97 << global_observables_tag <<
"'" << std::endl;
98 }
else if (global_observables.
empty()) {
104 <<
"p.d.f. provides built-in specification of global observables definition with tag named '"
105 << defGlobObsTag <<
"'" << std::endl;
106 std::unique_ptr<RooArgSet> allVars{pdf->
getVariables()};
107 global_observables.
add(*
dynamic_cast<RooArgSet *
>(allVars->selectByAttrib(defGlobObsTag,
true)));
113 if (!constrained_parameters.
empty()) {
114 std::unique_ptr<RooArgSet> constraints{
116 allConstraints.
add(*constraints);
118 if (!external_constraints.
empty()) {
119 allConstraints.
add(external_constraints);
122 return allConstraints;
146 std::string
const &global_observables_tag)
148 auto allConstraints = getConstraintsSet(pdf,
data, constrained_parameters, external_constraints, global_observables,
149 global_observables_tag);
151 std::unique_ptr<RooSubsidiaryL> subsidiary_likelihood;
153 if (!allConstraints.
empty()) {
155 oocoutI(
nullptr,
Minimization) <<
" Including the following constraint terms in minimization: " << allConstraints
157 if (!global_observables.
empty()) {
158 oocoutI(
nullptr,
Minimization) <<
"The following global observables have been defined: " << global_observables
161 std::string
name(
"likelihood for pdf ");
163 subsidiary_likelihood = std::make_unique<RooSubsidiaryL>(
164 name, allConstraints, (!global_observables.
empty()) ? global_observables : constrained_parameters);
167 return subsidiary_likelihood;
186 for (
const auto component : ((
RooProdPdf *)pdf)->pdfList()) {
187 if (component->getAttribute(
"BinnedLikelihood") && component->IsA()->InheritsFrom(
RooRealSumPdf::Class())) {
217 TString simCatName(simCat.GetName());
220 std::unique_ptr<TList> dsetList{
_data.
split(*sim_pdf, process_empty_data_sets)};
222 throw std::logic_error(
223 "getSimultaneousComponents ERROR, index category of simultaneous pdf is missing in dataset, aborting");
227 std::size_t N_components = 0;
229 for (
const auto &catState : simCat) {
231 RooAbsPdf *component_pdf = sim_pdf->getPdf(catState.first.c_str());
232 auto *dset =
static_cast<RooAbsData *
>(dsetList->FindObject(catState.first.c_str()));
234 if (component_pdf && dset && (0. != dset->sumEntries() || process_empty_data_sets)) {
240 std::vector<std::unique_ptr<RooAbsL>> components;
241 components.reserve(N_components);
246 for (
const auto &catState : simCat) {
247 const std::string &catName = catState.first;
249 RooAbsPdf *component_pdf = sim_pdf->getPdf(catName.c_str());
250 auto *dset =
static_cast<RooAbsData *
>(dsetList->FindObject(catName.c_str()));
252 if (component_pdf && dset && (0. != dset->sumEntries() || process_empty_data_sets)) {
253 ooccoutI(
nullptr,
Fitting) <<
"getSimultaneousComponents: creating slave calculator #" <<
n <<
" for state "
254 << catName <<
" (" << dset->numEntries() <<
" dataset entries)" << std::endl;
256 RooAbsPdf *binnedPdf = getBinnedPdf(component_pdf);
257 bool binnedL = (binnedPdf !=
nullptr);
260 for (
const auto component : ((
RooProdPdf *)component_pdf)->pdfList()) {
261 if (component->getAttribute(
"MAIN_MEASUREMENT")) {
272 components.push_back(std::make_unique<RooBinnedL>((binnedPdf ? binnedPdf : component_pdf), dset));
274 components.push_back(
275 std::make_unique<RooUnbinnedL>((binnedPdf ? binnedPdf : component_pdf), dset,
_extended,
_evalBackend));
278 components.back()->setSimCount(N_components);
282 std::unique_ptr<RooArgSet> actualParams{binnedPdf ? binnedPdf->
getParameters(dset)
289 assert(selTargetParams.
equals(*components.back()->getParameters()));
293 if ((!dset || (0. != dset->sumEntries() && !process_empty_data_sets)) && component_pdf) {
294 ooccoutD(
nullptr,
Fitting) <<
"getSimultaneousComponents: state " << catName
295 <<
" has no data entries, no slave calculator created" << std::endl;
299 oocoutI(
nullptr,
Fitting) <<
"getSimultaneousComponents: created " <<
n <<
" slave calculators." << std::endl;
326 std::unique_ptr<RooAbsL> likelihood;
327 std::vector<std::unique_ptr<RooAbsL>> components;
331 }
else if (
auto binnedPdf = getBinnedPdf(&
_pdf)) {
332 likelihood = std::make_unique<RooBinnedL>(binnedPdf, &
_data);
341 components.push_back(std::move(likelihood));
345 if (!components.empty()) {
346 likelihood = std::make_unique<RooSumL>(&
_pdf, &
_data, std::move(components),
_extended);
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
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)
Abstract base class for objects that represent a discrete value that can be set from the outside,...
bool equals(const RooAbsCollection &otherColl) const
Check if this and other collection have identically-named contents.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
Int_t getSize() const
Return the number of elements in the collection.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
Abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual RooFit::OwningPtr< TList > split(const RooAbsCategory &splitCat, bool createEmptyDataSets=false) const
Split the dataset into subsets based on states of a categorical variable in this dataset.
Abstract interface for all probability density functions.
TClass * IsA() const override
RooArgSet * getAllConstraints(const RooArgSet &observables, RooArgSet &constrainedParams, bool stripDisconnected=true, bool removeConstraintsFromPdf=false) const
This helper function finds and collects all constraints terms of all component p.d....
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet _globalObservables
RooFit::EvalBackend _evalBackend
std::unique_ptr< RooAbsL > build()
std::vector< std::unique_ptr< RooAbsL > > getSimultaneousComponents()
NLLFactory & EvalBackend(RooFit::EvalBackend evalBackend)
RooArgSet _externalConstraints
NLLFactory(RooAbsPdf &pdf, RooAbsData &data)
Create a likelihood builder for a given pdf and dataset.
std::string _globalObservablesTag
RooAbsL::Extended _extended
NLLFactory & ExternalConstraints(const RooArgSet &externalconstraints)
NLLFactory & Extended(RooAbsL::Extended extended)
NLLFactory & GlobalObservables(const RooArgSet &globalObservables)
NLLFactory & ConstrainedParameters(const RooArgSet &constrainedParameters)
RooArgSet _constrainedParameters
NLLFactory & GlobalObservablesTag(const char *globalObservablesTag)
static bool isExtendedHelper(RooAbsPdf *pdf, Extended extended)
Efficient implementation of a product of PDFs of the form.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
const char * GetName() const override
Returns name of object.
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...