4848#include < RooTFnBinding.h>
4949#include < RooTruthModel.h>
5050#include < RooGaussModel.h>
51+ #include < RooWrapperPdf.h>
5152#include < RooWorkspace.h>
5253#include < RooRealIntegral.h>
5354#include < RooSpline.h>
@@ -1187,17 +1188,65 @@ class RooSplineStreamer : public RooFit::JSONIO::Exporter {
11871188 }
11881189};
11891190
1191+ class RooWrapperPdfImporter : public RooFit ::JSONIO ::Importer {
1192+ public:
1193+ bool importArg (RooJSONFactoryWSTool *tool, const RooFit::Detail::JSONNode &node) const override
1194+ {
1195+ if (node[" type" ].val () != " density_function_dist" )
1196+ return false ;
1197+
1198+ auto name = RooJSONFactoryWSTool::name (node);
1199+ auto *func = tool->requestArg <RooAbsReal>(node, " function" );
1200+
1201+ bool selfNormalized = false ;
1202+
1203+ if (auto sn = node.find (" selfNormalized" ))
1204+ selfNormalized = sn->val_bool ();
1205+
1206+ tool->wsEmplace <RooWrapperPdf>(name, *func, selfNormalized);
1207+ return true ;
1208+ }
1209+ };
1210+
1211+ class RooWrapperPdfStreamer : public RooFit ::JSONIO ::Exporter {
1212+ public:
1213+ std::string const &key () const override ;
1214+
1215+ bool exportObject (RooJSONFactoryWSTool *, const RooAbsArg *arg, RooFit::Detail::JSONNode &node) const override
1216+ {
1217+ auto const *pdf = dynamic_cast <RooWrapperPdf const *>(arg);
1218+ if (!pdf)
1219+ return false ;
1220+
1221+ node[" type" ] << " density_function_dist" ;
1222+
1223+ // Proxy name in RooWrapperPdf is "_func" / "func" depending on accessor/proxy export.
1224+ // Prefer a public accessor if one exists; otherwise inspect proxies as below.
1225+ auto const *funcProxy = dynamic_cast <RooRealProxy const *>(pdf->getProxy (0 ));
1226+ if (!funcProxy || !funcProxy->absArg ())
1227+ return false ;
1228+
1229+ node[" function" ] << funcProxy->absArg ()->GetName ();
1230+ if (pdf->selfNormalized ())
1231+ node[" selfnormalized" ] << true ;
1232+
1233+ return true ;
1234+ }
1235+ };
1236+
11901237#define DEFINE_EXPORTER_KEY (class_name, name ) \
11911238 std::string const &class_name::key () const \
11921239 { \
11931240 const static std::string keystring = name; \
11941241 return keystring; \
11951242 }
1243+
11961244template <>
11971245DEFINE_EXPORTER_KEY (RooAddPdfStreamer<RooAddPdf>, " mixture_dist" );
11981246template <>
11991247DEFINE_EXPORTER_KEY (RooAddPdfStreamer<RooAddModel>, " mixture_model" );
12001248DEFINE_EXPORTER_KEY (RooBinSamplingPdfStreamer, " binsampling" );
1249+ DEFINE_EXPORTER_KEY (RooWrapperPdfStreamer, " density_function_dist" );
12011250DEFINE_EXPORTER_KEY (RooBinWidthFunctionStreamer, " binwidth" );
12021251DEFINE_EXPORTER_KEY (RooLegacyExpPolyStreamer, " legacy_exp_poly_dist" );
12031252DEFINE_EXPORTER_KEY (RooExponentialStreamer, " exponential_dist" );
@@ -1223,7 +1272,7 @@ DEFINE_EXPORTER_KEY(RooTFnBindingStreamer, "generic_function");
12231272DEFINE_EXPORTER_KEY (RooRealIntegralStreamer, " integral" );
12241273DEFINE_EXPORTER_KEY (RooDerivativeStreamer, " derivative" );
12251274DEFINE_EXPORTER_KEY (RooFFTConvPdfStreamer, " fft_conv_pdf" );
1226- DEFINE_EXPORTER_KEY (RooExtendPdfStreamer, " extend_pdf " );
1275+ DEFINE_EXPORTER_KEY (RooExtendPdfStreamer, " rate_extended_dist " );
12271276DEFINE_EXPORTER_KEY (ParamHistFuncStreamer, " step" );
12281277DEFINE_EXPORTER_KEY (RooSplineStreamer, " spline" );
12291278
@@ -1234,6 +1283,8 @@ DEFINE_EXPORTER_KEY(RooSplineStreamer, "spline");
12341283STATIC_EXECUTE ([]() {
12351284 using namespace RooFit ::JSONIO ;
12361285
1286+ registerImporter<RooWrapperPdfImporter>(" density_function_dist" );
1287+ registerImporter<RooExtendPdfFactory>(" rate_extended_dist" );
12371288 registerImporter<RooProductFactory>(" product" , false );
12381289 registerImporter<RooProdPdfFactory>(" product_dist" , false );
12391290 registerImporter<RooAdditionFactory>(" sum" , false );
@@ -1264,6 +1315,7 @@ STATIC_EXECUTE([]() {
12641315 registerImporter<ParamHistFuncFactory>(" step" , false );
12651316 registerImporter<RooSplineFactory>(" spline" , false );
12661317
1318+ registerExporter<RooWrapperPdfStreamer>(RooWrapperPdf::Class ());
12671319 registerExporter<RooAddPdfStreamer<RooAddPdf>>(RooAddPdf::Class (), false );
12681320 registerExporter<RooAddPdfStreamer<RooAddModel>>(RooAddModel::Class (), false );
12691321 registerExporter<RooBinSamplingPdfStreamer>(RooBinSamplingPdf::Class (), false );
0 commit comments