diff --git a/roofit/hs3/src/JSONFactories_RooFitCore.cxx b/roofit/hs3/src/JSONFactories_RooFitCore.cxx index 90ffd950c7fe6..e3c9b2080479f 100644 --- a/roofit/hs3/src/JSONFactories_RooFitCore.cxx +++ b/roofit/hs3/src/JSONFactories_RooFitCore.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -1188,17 +1189,66 @@ class RooSplineStreamer : public RooFit::JSONIO::Exporter { } }; +class RooWrapperPdfImporter : public RooFit::JSONIO::Importer { +public: + bool importArg(RooJSONFactoryWSTool *tool, const RooFit::Detail::JSONNode &node) const override + { + if (node["type"].val() != "density_function_dist") + return false; + + auto name = RooJSONFactoryWSTool::name(node); + auto *func = tool->requestArg(node, "function"); + + bool selfNormalized = false; + + if (auto sn = node.find("selfNormalized")) + selfNormalized = sn->val_bool(); + + tool->wsEmplace(name, *func, selfNormalized); + return true; + } +}; + +class RooWrapperPdfStreamer : public RooFit::JSONIO::Exporter { +public: + std::string const &key() const override; + + bool exportObject(RooJSONFactoryWSTool *, const RooAbsArg *arg, + RooFit::Detail::JSONNode &node) const override + { + auto const *pdf = dynamic_cast(arg); + if (!pdf) + return false; + + node["type"] << "density_function_dist"; + + // Proxy name in RooWrapperPdf is "_func" / "func" depending on accessor/proxy export. + // Prefer a public accessor if one exists; otherwise inspect proxies as below. + auto const *funcProxy = dynamic_cast(pdf->getProxy(0)); + if (!funcProxy || !funcProxy->absArg()) + return false; + + node["function"] << funcProxy->absArg()->GetName(); + if (pdf->selfNormalized()) + node["selfnormalized"] << true; + + return true; + } +}; + #define DEFINE_EXPORTER_KEY(class_name, name) \ std::string const &class_name::key() const \ { \ const static std::string keystring = name; \ return keystring; \ } + template <> DEFINE_EXPORTER_KEY(RooAddPdfStreamer, "mixture_dist"); template <> DEFINE_EXPORTER_KEY(RooAddPdfStreamer, "mixture_model"); DEFINE_EXPORTER_KEY(RooBinSamplingPdfStreamer, "binsampling"); +DEFINE_EXPORTER_KEY(RooWrapperPdfStreamer, "density_function_dist"); DEFINE_EXPORTER_KEY(RooBinWidthFunctionStreamer, "binwidth"); DEFINE_EXPORTER_KEY(RooLegacyExpPolyStreamer, "legacy_exp_poly_dist"); DEFINE_EXPORTER_KEY(RooExponentialStreamer, "exponential_dist"); @@ -1224,7 +1274,7 @@ DEFINE_EXPORTER_KEY(RooTFnBindingStreamer, "generic_function"); DEFINE_EXPORTER_KEY(RooRealIntegralStreamer, "integral"); DEFINE_EXPORTER_KEY(RooDerivativeStreamer, "derivative"); DEFINE_EXPORTER_KEY(RooFFTConvPdfStreamer, "fft_conv_pdf"); -DEFINE_EXPORTER_KEY(RooExtendPdfStreamer, "extend_pdf"); +DEFINE_EXPORTER_KEY(RooExtendPdfStreamer, "rate_extended_dist"); DEFINE_EXPORTER_KEY(ParamHistFuncStreamer, "step"); DEFINE_EXPORTER_KEY(RooSplineStreamer, "spline"); @@ -1235,6 +1285,8 @@ DEFINE_EXPORTER_KEY(RooSplineStreamer, "spline"); STATIC_EXECUTE([]() { using namespace RooFit::JSONIO; + registerImporter("density_function_dist"); + registerImporter("rate_extended_dist"); registerImporter("product", false); registerImporter("product_dist", false); registerImporter("sum", false); @@ -1265,6 +1317,7 @@ STATIC_EXECUTE([]() { registerImporter("step", false); registerImporter("spline", false); + registerExporter(RooWrapperPdf::Class()); registerExporter>(RooAddPdf::Class(), false); registerExporter>(RooAddModel::Class(), false); registerExporter(RooBinSamplingPdf::Class(), false);