File indexing completed on 2025-12-12 10:09:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef RooFit_ModelConfig_h
0018 #define RooFit_ModelConfig_h
0019
0020 #include <RooAbsData.h>
0021 #include <RooAbsPdf.h>
0022 #include <RooArgSet.h>
0023 #include <RooGlobalFunc.h>
0024 #include <RooWorkspaceHandle.h>
0025
0026 #include <string>
0027
0028 class RooFitResult;
0029
0030
0031 namespace RooStats {
0032
0033
0034 class ModelConfig final : public TNamed, public RooWorkspaceHandle {
0035
0036 public:
0037 ModelConfig(RooWorkspace *ws = nullptr)
0038 {
0039 if (ws)
0040 SetWS(*ws);
0041 }
0042
0043 ModelConfig(const char *name, RooWorkspace *ws = nullptr) : TNamed(name, name)
0044 {
0045 if (ws)
0046 SetWS(*ws);
0047 }
0048
0049 ModelConfig(const char *name, const char *title, RooWorkspace *ws = nullptr) : TNamed(name, title)
0050 {
0051 if (ws)
0052 SetWS(*ws);
0053 }
0054
0055
0056 ModelConfig *Clone(const char *name = "") const override
0057 {
0058 ModelConfig *mc = new ModelConfig(*this);
0059 if (strcmp(name, "") == 0) {
0060 mc->SetName(this->GetName());
0061 } else {
0062 mc->SetName(name);
0063 }
0064 return mc;
0065 }
0066
0067
0068 void SetWS(RooWorkspace &ws) override;
0069
0070 void SetWorkspace(RooWorkspace &ws) { SetWS(ws); }
0071
0072
0073 void ReplaceWS(RooWorkspace *ws) override
0074 {
0075 fRefWS = nullptr;
0076 SetWS(*ws);
0077 }
0078
0079
0080 void SetProtoData(RooAbsData &data)
0081 {
0082 ImportDataInWS(data);
0083 SetProtoData(data.GetName());
0084 }
0085
0086
0087 void SetPdf(const RooAbsPdf &pdf)
0088 {
0089 ImportPdfInWS(pdf);
0090 SetPdf(pdf.GetName());
0091 }
0092
0093
0094 void SetPriorPdf(const RooAbsPdf &pdf)
0095 {
0096 ImportPdfInWS(pdf);
0097 SetPriorPdf(pdf.GetName());
0098 }
0099
0100
0101 void SetParameters(const RooArgSet &set)
0102 {
0103 if (!SetHasOnlyParameters(set, "ModelConfig::SetParameters"))
0104 return;
0105 fPOIName = std::string(GetName()) + "_POI";
0106 DefineSetInWS(fPOIName.c_str(), set);
0107 }
0108
0109
0110 void SetParametersOfInterest(const RooArgSet &set)
0111 {
0112 if (!SetHasOnlyParameters(set, "ModelConfig::SetParametersOfInterest"))
0113 return;
0114 SetParameters(set);
0115 }
0116
0117
0118
0119 void SetParameters(const char *argList)
0120 {
0121 if (!GetWS())
0122 return;
0123 SetParameters(GetWS()->argSet(argList));
0124 }
0125
0126
0127
0128 void SetParametersOfInterest(const char *argList) { SetParameters(argList); }
0129
0130
0131 void SetNuisanceParameters(const RooArgSet &set)
0132 {
0133 if (!SetHasOnlyParameters(set, "ModelConfig::SetNuisanceParameters"))
0134 return;
0135 fNuisParamsName = std::string(GetName()) + "_NuisParams";
0136 DefineSetInWS(fNuisParamsName.c_str(), set);
0137 }
0138
0139
0140
0141 void SetNuisanceParameters(const char *argList)
0142 {
0143 if (!GetWS())
0144 return;
0145 SetNuisanceParameters(GetWS()->argSet(argList));
0146 }
0147
0148
0149 void SetConstraintParameters(const RooArgSet &set)
0150 {
0151 if (!SetHasOnlyParameters(set, "ModelConfig::SetConstrainedParameters"))
0152 return;
0153 fConstrParamsName = std::string(GetName()) + "_ConstrainedParams";
0154 DefineSetInWS(fConstrParamsName.c_str(), set);
0155 }
0156
0157
0158 void SetConstraintParameters(const char *argList)
0159 {
0160 if (!GetWS())
0161 return;
0162 SetConstraintParameters(GetWS()->argSet(argList));
0163 }
0164
0165
0166 void SetObservables(const RooArgSet &set)
0167 {
0168 if (!SetHasOnlyParameters(set, "ModelConfig::SetObservables"))
0169 return;
0170 fObservablesName = std::string(GetName()) + "_Observables";
0171 DefineSetInWS(fObservablesName.c_str(), set);
0172 }
0173
0174
0175 void SetObservables(const char *argList)
0176 {
0177 if (!GetWS())
0178 return;
0179 SetObservables(GetWS()->argSet(argList));
0180 }
0181
0182 void SetConditionalObservables(const RooArgSet &set);
0183
0184
0185 void SetConditionalObservables(const char *argList)
0186 {
0187 if (!GetWS())
0188 return;
0189 SetConditionalObservables(GetWS()->argSet(argList));
0190 }
0191
0192 void SetGlobalObservables(const RooArgSet &set);
0193
0194
0195 void SetGlobalObservables(const char *argList)
0196 {
0197 if (!GetWS())
0198 return;
0199 SetGlobalObservables(GetWS()->argSet(argList));
0200 }
0201
0202 void SetExternalConstraints(const RooArgSet &set);
0203
0204
0205 void SetExternalConstraints(const char *argList)
0206 {
0207 if (!GetWS())
0208 return;
0209 SetExternalConstraints(GetWS()->argSet(argList));
0210 }
0211
0212
0213
0214 void SetSnapshot(const RooArgSet &set);
0215
0216
0217 void SetPdf(const char *name)
0218 {
0219 if (!GetWS())
0220 return;
0221
0222 if (GetWS()->pdf(name)) {
0223 fPdfName = name;
0224 } else {
0225 std::stringstream ss;
0226 ss << "pdf " << name << " does not exist in workspace";
0227 const std::string errorMsg = ss.str();
0228 coutE(ObjectHandling) << errorMsg << std::endl;
0229 throw std::runtime_error(errorMsg);
0230 }
0231 }
0232
0233
0234 void SetPriorPdf(const char *name)
0235 {
0236 if (!GetWS())
0237 return;
0238
0239 if (GetWS()->pdf(name)) {
0240 fPriorPdfName = name;
0241 } else {
0242 std::stringstream ss;
0243 ss << "pdf " << name << " does not exist in workspace";
0244 const std::string errorMsg = ss.str();
0245 coutE(ObjectHandling) << errorMsg << std::endl;
0246 throw std::runtime_error(errorMsg);
0247 }
0248 }
0249
0250
0251 void SetProtoData(const char *name)
0252 {
0253 if (!GetWS())
0254 return;
0255
0256 if (GetWS()->data(name)) {
0257 fProtoDataName = name;
0258 } else {
0259 std::stringstream ss;
0260 ss << "dataset " << name << " does not exist in workspace";
0261 const std::string errorMsg = ss.str();
0262 coutE(ObjectHandling) << errorMsg << std::endl;
0263 throw std::runtime_error(errorMsg);
0264 }
0265 }
0266
0267
0268
0269
0270 RooAbsPdf *GetPdf() const { return (GetWS()) ? GetWS()->pdf(fPdfName) : nullptr; }
0271
0272
0273 const RooArgSet *GetParametersOfInterest() const { return (GetWS()) ? GetWS()->set(fPOIName) : nullptr; }
0274
0275
0276 const RooArgSet *GetNuisanceParameters() const { return (GetWS()) ? GetWS()->set(fNuisParamsName) : nullptr; }
0277
0278
0279 const RooArgSet *GetConstraintParameters() const { return (GetWS()) ? GetWS()->set(fConstrParamsName) : nullptr; }
0280
0281
0282 RooAbsPdf *GetPriorPdf() const { return (GetWS()) ? GetWS()->pdf(fPriorPdfName) : nullptr; }
0283
0284
0285 const RooArgSet *GetObservables() const { return (GetWS()) ? GetWS()->set(fObservablesName) : nullptr; }
0286
0287
0288 const RooArgSet *GetConditionalObservables() const
0289 {
0290 return (GetWS()) ? GetWS()->set(fConditionalObsName) : nullptr;
0291 }
0292
0293
0294 const RooArgSet *GetGlobalObservables() const { return (GetWS()) ? GetWS()->set(fGlobalObsName) : nullptr; }
0295
0296
0297 const RooArgSet *GetExternalConstraints() const { return (GetWS()) ? GetWS()->set(fExtConstraintsName) : nullptr; }
0298
0299
0300 RooAbsData *GetProtoData() const { return (GetWS()) ? GetWS()->data(fProtoDataName) : nullptr; }
0301
0302
0303 const RooArgSet *GetSnapshot() const;
0304
0305 void LoadSnapshot() const;
0306
0307 RooWorkspace *GetWS() const override;
0308
0309 RooWorkspace *GetWorkspace() const { return GetWS(); }
0310
0311 void GuessObsAndNuisance(const RooArgSet &obsSet, bool printModelConfig = true);
0312
0313 inline void GuessObsAndNuisance(const RooDataSet &data, bool printModelConfig = true)
0314 {
0315 return GuessObsAndNuisance(*data.get(), printModelConfig);
0316 }
0317
0318
0319 void Print(Option_t *option = "") const override;
0320
0321 template <typename... CmdArgs_t>
0322 std::unique_ptr<RooAbsReal> createNLL(RooAbsData &data, CmdArgs_t const &...cmdArgs) const
0323 {
0324 return createNLLImpl(data, *RooFit::Detail::createCmdList(&cmdArgs...));
0325 }
0326
0327 template <typename... CmdArgs_t>
0328 std::unique_ptr<RooFitResult> fitTo(RooAbsData &data, CmdArgs_t const &...cmdArgs) const
0329 {
0330 return fitToImpl(data, *RooFit::Detail::createCmdList(&cmdArgs...));
0331 }
0332
0333 protected:
0334
0335 bool SetHasOnlyParameters(const RooArgSet &set, const char *errorMsgPrefix = nullptr);
0336
0337
0338 void DefineSetInWS(const char *name, const RooArgSet &set);
0339
0340
0341 void ImportPdfInWS(const RooAbsPdf &pdf);
0342
0343
0344 void ImportDataInWS(RooAbsData &data);
0345
0346
0347
0348 RooWorkspace *fRefWS = nullptr;
0349
0350 std::string fPdfName;
0351 std::string fDataName;
0352 std::string fPOIName;
0353
0354 std::string fNuisParamsName;
0355 std::string fConstrParamsName;
0356 std::string fPriorPdfName;
0357
0358 std::string fConditionalObsName;
0359 std::string fGlobalObsName;
0360 std::string fExtConstraintsName;
0361 std::string fProtoDataName;
0362
0363 std::string fSnapshotName;
0364
0365 std::string fObservablesName;
0366
0367 private:
0368 std::unique_ptr<RooAbsReal> createNLLImpl(RooAbsData &data, const RooLinkedList &cmdList) const;
0369 std::unique_ptr<RooFitResult> fitToImpl(RooAbsData &data, const RooLinkedList &cmdList) const;
0370
0371 ClassDefOverride(ModelConfig, 7);
0372 };
0373
0374 }
0375
0376 namespace RooFit {
0377 using ModelConfig = RooStats::ModelConfig;
0378 }
0379
0380 #endif