From dc3dea2831934bae9ed68dfc56d7239550de1b19 Mon Sep 17 00:00:00 2001 From: Phmonski Date: Mon, 3 Nov 2025 11:43:56 +0100 Subject: [PATCH 1/3] include cleanExpression and RooResolutionModels in sanitization --- roofit/hs3/src/JSONFactories_RooFitCore.cxx | 41 +++++++-------------- roofit/hs3/src/RooJSONFactoryWSTool.cxx | 12 +++++- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/roofit/hs3/src/JSONFactories_RooFitCore.cxx b/roofit/hs3/src/JSONFactories_RooFitCore.cxx index 9c87e3add0056..049c4a0263ecf 100644 --- a/roofit/hs3/src/JSONFactories_RooFitCore.cxx +++ b/roofit/hs3/src/JSONFactories_RooFitCore.cxx @@ -543,12 +543,6 @@ class RooAddPdfStreamer : public RooFit::JSONIO::Exporter { { const RooArg_t *pdf = static_cast(func); elem["type"] << key(); - std::string name = elem["name"].val(); - /*elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["summands"], pdf->pdfList()); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["coefficients"], pdf->coefList()); - */ - elem["name"] << name; RooJSONFactoryWSTool::fillSeq(elem["summands"], pdf->pdfList()); RooJSONFactoryWSTool::fillSeq(elem["coefficients"], pdf->coefList()); elem["extended"] << (pdf->extendMode() != RooArg_t::CanNotBeExtended); @@ -563,12 +557,6 @@ class RooRealSumPdfStreamer : public RooFit::JSONIO::Exporter { { const RooRealSumPdf *pdf = static_cast(func); elem["type"] << key(); - std::string name = elem["name"].val(); - /*elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["samples"], pdf->funcList()); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["coefficients"], pdf->coefList()); - */ - elem["name"] << name; RooJSONFactoryWSTool::fillSeq(elem["samples"], pdf->funcList()); RooJSONFactoryWSTool::fillSeq(elem["coefficients"], pdf->coefList()); elem["extended"] << (pdf->extendMode() != RooAbsPdf::CanNotBeExtended); @@ -583,12 +571,6 @@ class RooRealSumFuncStreamer : public RooFit::JSONIO::Exporter { { const RooRealSumFunc *pdf = static_cast(func); elem["type"] << key(); - std::string name = elem["name"].val(); - /*elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["samples"], pdf->funcList()); - RooJSONFactoryWSTool::fillSeqSanitizedName(elem["coefficients"], pdf->coefList()); - */ - elem["name"] << name; RooJSONFactoryWSTool::fillSeq(elem["samples"], pdf->funcList()); RooJSONFactoryWSTool::fillSeq(elem["coefficients"], pdf->coefList()); return true; @@ -687,6 +669,7 @@ class RooFormulaArgStreamer : public RooFit::JSONIO::Exporter { const RooArg_t *pdf = static_cast(func); elem["type"] << key(); TString expression(pdf->expression()); + cleanExpression(expression); // If the tokens follow the "x[#]" convention, the square braces enclosing each number // ensures that there is a unique mapping between the token and parameter name // If the tokens follow the "@#" convention, the numbers are not enclosed by braces. @@ -701,6 +684,18 @@ class RooFormulaArgStreamer : public RooFit::JSONIO::Exporter { elem["expression"] << expression.Data(); return true; } +private: + void cleanExpression(TString& expr) const + { + expr.ReplaceAll("TMath::Exp", "exp"); + expr.ReplaceAll("TMath::Min", "min"); + expr.ReplaceAll("TMath::Max", "max"); + expr.ReplaceAll("TMath::Log", "log"); + expr.ReplaceAll("TMath::Cos", "cos"); + expr.ReplaceAll("TMath::Sin", "sin"); + expr.ReplaceAll("TMath::Sqrt", "sqrt"); + expr.ReplaceAll("TMath::Power", "pow"); + } }; template class RooPolynomialStreamer : public RooFit::JSONIO::Exporter { @@ -784,9 +779,6 @@ class RooTruthModelStreamer : public RooFit::JSONIO::Exporter { { auto *pdf = static_cast(func); elem["type"] << key(); - std::string name = elem["name"].val(); - // elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - elem["name"] << name; elem["x"] << pdf->convVar().GetName(); return true; @@ -800,9 +792,6 @@ class RooGaussModelStreamer : public RooFit::JSONIO::Exporter { { auto *pdf = static_cast(func); elem["type"] << key(); - std::string name = elem["name"].val(); - // elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - elem["name"] << name; elem["x"] << pdf->convVar().GetName(); elem["mean"] << pdf->getMean().GetName(); elem["sigma"] << pdf->getSigma().GetName(); @@ -913,10 +902,6 @@ class RooRealIntegralStreamer : public RooFit::JSONIO::Exporter { bool exportObject(RooJSONFactoryWSTool *, const RooAbsArg *func, JSONNode &elem) const override { auto *integral = static_cast(func); - std::string name = elem["name"].val(); - // elem["name"] << RooJSONFactoryWSTool::sanitizeName(name); - elem["name"] << name; - elem["type"] << key(); std::string integrand = integral->integrand().GetName(); // elem["integrand"] << RooJSONFactoryWSTool::sanitizeName(integrand); diff --git a/roofit/hs3/src/RooJSONFactoryWSTool.cxx b/roofit/hs3/src/RooJSONFactoryWSTool.cxx index e599ca8ec1b29..0ef700840583e 100644 --- a/roofit/hs3/src/RooJSONFactoryWSTool.cxx +++ b/roofit/hs3/src/RooJSONFactoryWSTool.cxx @@ -2508,6 +2508,10 @@ RooWorkspace RooJSONFactoryWSTool::cleanWS(const RooWorkspace &ws, bool onlyMode tmpWS.import(*obj); } + for (auto *obj : ws.allResolutionModels()) { + tmpWS.import(*obj); + } + /* if (auto* mc = dynamic_cast(obj)) { // Import the PDF @@ -2582,7 +2586,13 @@ RooWorkspace RooJSONFactoryWSTool::sanitizeWS(const RooWorkspace &ws) obj->SetName(sanitizeName(obj->GetName()).c_str()); } } - + + // Resolution Models + for (auto *obj : tmpWS.allResolutionModels()){ + if (!isValidName(obj->GetName())) { + obj->SetName(sanitizeName(obj->GetName()).c_str()); + } + } // Datasets for (auto *data : tmpWS.allData()) { // Sanitize dataset name From 26a15ec4c3b341e4f73dc7a51426c1fb4113dcbc Mon Sep 17 00:00:00 2001 From: Phmonski Date: Mon, 3 Nov 2025 12:40:45 +0100 Subject: [PATCH 2/3] clang-format clean-up --- roofit/hs3/src/JSONFactories_RooFitCore.cxx | 17 +++++++++-------- roofit/hs3/src/RooJSONFactoryWSTool.cxx | 6 +++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/roofit/hs3/src/JSONFactories_RooFitCore.cxx b/roofit/hs3/src/JSONFactories_RooFitCore.cxx index 049c4a0263ecf..7cc8754df560b 100644 --- a/roofit/hs3/src/JSONFactories_RooFitCore.cxx +++ b/roofit/hs3/src/JSONFactories_RooFitCore.cxx @@ -684,15 +684,16 @@ class RooFormulaArgStreamer : public RooFit::JSONIO::Exporter { elem["expression"] << expression.Data(); return true; } + private: - void cleanExpression(TString& expr) const + void cleanExpression(TString &expr) const { - expr.ReplaceAll("TMath::Exp", "exp"); - expr.ReplaceAll("TMath::Min", "min"); - expr.ReplaceAll("TMath::Max", "max"); - expr.ReplaceAll("TMath::Log", "log"); - expr.ReplaceAll("TMath::Cos", "cos"); - expr.ReplaceAll("TMath::Sin", "sin"); + expr.ReplaceAll("TMath::Exp", "exp"); + expr.ReplaceAll("TMath::Min", "min"); + expr.ReplaceAll("TMath::Max", "max"); + expr.ReplaceAll("TMath::Log", "log"); + expr.ReplaceAll("TMath::Cos", "cos"); + expr.ReplaceAll("TMath::Sin", "sin"); expr.ReplaceAll("TMath::Sqrt", "sqrt"); expr.ReplaceAll("TMath::Power", "pow"); } @@ -1045,7 +1046,7 @@ STATIC_EXECUTE([]() { registerExporter(RooRealIntegral::Class(), false); registerExporter(RooDerivative::Class(), false); registerExporter(RooFFTConvPdf::Class(), false); - registerExporter(RooExtendPdf::Class(), false); + registerExporter(RooExtendPdf::Class(), false); }); } // namespace diff --git a/roofit/hs3/src/RooJSONFactoryWSTool.cxx b/roofit/hs3/src/RooJSONFactoryWSTool.cxx index 0ef700840583e..8a6f383b7e4c8 100644 --- a/roofit/hs3/src/RooJSONFactoryWSTool.cxx +++ b/roofit/hs3/src/RooJSONFactoryWSTool.cxx @@ -2510,7 +2510,7 @@ RooWorkspace RooJSONFactoryWSTool::cleanWS(const RooWorkspace &ws, bool onlyMode for (auto *obj : ws.allResolutionModels()) { tmpWS.import(*obj); - } + } /* if (auto* mc = dynamic_cast(obj)) { @@ -2586,9 +2586,9 @@ RooWorkspace RooJSONFactoryWSTool::sanitizeWS(const RooWorkspace &ws) obj->SetName(sanitizeName(obj->GetName()).c_str()); } } - + // Resolution Models - for (auto *obj : tmpWS.allResolutionModels()){ + for (auto *obj : tmpWS.allResolutionModels()) { if (!isValidName(obj->GetName())) { obj->SetName(sanitizeName(obj->GetName()).c_str()); } From ce031b3cac0d8660df435cd4f257e1efee1b94e5 Mon Sep 17 00:00:00 2001 From: Phmonski Date: Wed, 5 Nov 2025 11:24:06 +0100 Subject: [PATCH 3/3] Fix Data axes sorting Bug --- roofit/hs3/src/RooJSONFactoryWSTool.cxx | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/roofit/hs3/src/RooJSONFactoryWSTool.cxx b/roofit/hs3/src/RooJSONFactoryWSTool.cxx index 8a6f383b7e4c8..5618ddc9af33d 100644 --- a/roofit/hs3/src/RooJSONFactoryWSTool.cxx +++ b/roofit/hs3/src/RooJSONFactoryWSTool.cxx @@ -483,18 +483,13 @@ void exportAttributes(const RooAbsArg *arg, JSONNode &rootnode) * * @param ws The RooWorkspace in which the observables will be created. * @param node The JSONNode containing information about the observables to be created. - * @param out The RooArgSet to which the created observables will be added. + * @param out The RooAbsCollection to which the created observables will be added. * @return void */ -void getObservables(RooWorkspace const &ws, const JSONNode &node, RooArgSet &out) +void getObservables(RooWorkspace const &ws, const JSONNode &node, RooAbsCollection &out) { - std::map vars; for (const auto &p : node["axes"].children()) { - vars.emplace(RooJSONFactoryWSTool::name(p), Var(p)); - } - - for (auto v : vars) { - std::string name(v.first); + std::string name(RooJSONFactoryWSTool::name(p)); if (ws.var(name)) { out.add(*ws.var(name)); } else { @@ -528,9 +523,9 @@ std::unique_ptr loadData(const JSONNode &p, RooWorkspace &workspace) return RooJSONFactoryWSTool::readBinnedData(p, name, RooJSONFactoryWSTool::readAxes(p)); } else if (type == "unbinned") { // unbinned - RooArgSet vars; - getObservables(workspace, p, vars); - RooArgList varlist(vars); + RooArgList varlist; + getObservables(workspace, p, varlist); + RooArgSet vars(varlist); auto data = std::make_unique(name, name, vars, RooFit::WeightVar()); auto &coords = p["entries"]; if (!coords.is_seq()) {