diff --git a/roofit/hs3/src/JSONFactories_RooFitCore.cxx b/roofit/hs3/src/JSONFactories_RooFitCore.cxx index 9c87e3add0056..7cc8754df560b 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,19 @@ 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 +780,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 +793,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 +903,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); @@ -1060,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 e599ca8ec1b29..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()) { @@ -2508,6 +2503,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 @@ -2583,6 +2582,12 @@ RooWorkspace RooJSONFactoryWSTool::sanitizeWS(const RooWorkspace &ws) } } + // 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