3333#include < RooLegacyExpPoly.h>
3434#include < RooLognormal.h>
3535#include < RooMultiVarGaussian.h>
36+ #include < RooStats/HistFactory/ParamHistFunc.h>
3637#include < RooPoisson.h>
3738#include < RooPolynomial.h>
3839#include < RooPolyVar.h>
@@ -532,6 +533,23 @@ class RooMultiVarGaussianFactory : public RooFit::JSONIO::Importer {
532533 }
533534};
534535
536+ class ParamHistFuncFactory : public RooFit ::JSONIO::Importer {
537+ public:
538+ bool importArg (RooJSONFactoryWSTool *tool, const JSONNode &p) const override
539+ {
540+ std::string name (RooJSONFactoryWSTool::name (p));
541+ RooArgList vars = tool->requestArgList <RooRealVar>(p, " variables" );
542+ std::vector<int > nbins;
543+ nbins << p[" nbins" ];
544+ for (size_t i = 0 ; i < vars.size (); ++i) {
545+ auto *v = dynamic_cast <RooRealVar*>(vars.at (i));
546+ v->setBins (nbins[i]);
547+ }
548+ tool->wsEmplace <ParamHistFunc>(name, vars, tool->requestArgList <RooAbsReal>(p, " parameters" ));
549+ return true ;
550+ }
551+ };
552+
535553// /////////////////////////////////////////////////////////////////////////////////////////////////////
536554// specialized exporter implementations
537555// /////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -696,6 +714,7 @@ class RooFormulaArgStreamer : public RooFit::JSONIO::Exporter {
696714 expr.ReplaceAll (" TMath::Sin" , " sin" );
697715 expr.ReplaceAll (" TMath::Sqrt" , " sqrt" );
698716 expr.ReplaceAll (" TMath::Power" , " pow" );
717+ expr.ReplaceAll (" TMath::Erf" , " erf" );
699718 }
700719};
701720template <class RooArg_t >
@@ -952,6 +971,26 @@ class RooExtendPdfStreamer : public RooFit::JSONIO::Exporter {
952971 }
953972};
954973
974+ class ParamHistFuncStreamer : public RooFit ::JSONIO::Exporter {
975+ public:
976+ std::string const &key () const override ;
977+ bool exportObject (RooJSONFactoryWSTool *, const RooAbsArg *func, JSONNode &elem) const override
978+ {
979+ auto *pdf = static_cast <const ParamHistFunc *>(func);
980+ elem[" type" ] << key ();
981+ RooJSONFactoryWSTool::fillSeq (elem[" variables" ], pdf->dataVars ());
982+ RooJSONFactoryWSTool::fillSeq (elem[" parameters" ], pdf->paramList ());
983+ std::vector<int > nbins;
984+ for (auto *arg : pdf->dataVars ()) {
985+ auto *var = dynamic_cast <RooRealVar*>(arg);
986+ nbins.push_back (var->numBins ());
987+ }
988+ elem[" nbins" ] << nbins;
989+
990+ return true ;
991+ }
992+ };
993+
955994#define DEFINE_EXPORTER_KEY (class_name, name ) \
956995 std::string const &class_name::key () const \
957996 { \
@@ -989,6 +1028,7 @@ DEFINE_EXPORTER_KEY(RooRealIntegralStreamer, "integral");
9891028DEFINE_EXPORTER_KEY (RooDerivativeStreamer, " derivative" );
9901029DEFINE_EXPORTER_KEY (RooFFTConvPdfStreamer, " fft_conv_pdf" );
9911030DEFINE_EXPORTER_KEY (RooExtendPdfStreamer, " extend_pdf" );
1031+ DEFINE_EXPORTER_KEY (ParamHistFuncStreamer, " param_hist_func" );
9921032
9931033// /////////////////////////////////////////////////////////////////////////////////////////////////////
9941034// instantiate all importers and exporters
@@ -1021,6 +1061,7 @@ STATIC_EXECUTE([]() {
10211061 registerImporter<RooDerivativeFactory>(" derivative" , false );
10221062 registerImporter<RooFFTConvPdfFactory>(" fft_conv_pdf" , false );
10231063 registerImporter<RooExtendPdfFactory>(" extend_pdf" , false );
1064+ registerImporter<ParamHistFuncFactory>(" param_hist_func" , false );
10241065
10251066 registerExporter<RooAddPdfStreamer<RooAddPdf>>(RooAddPdf::Class (), false );
10261067 registerExporter<RooAddPdfStreamer<RooAddModel>>(RooAddModel::Class (), false );
@@ -1047,6 +1088,7 @@ STATIC_EXECUTE([]() {
10471088 registerExporter<RooDerivativeStreamer>(RooDerivative::Class (), false );
10481089 registerExporter<RooFFTConvPdfStreamer>(RooFFTConvPdf::Class (), false );
10491090 registerExporter<RooExtendPdfStreamer>(RooExtendPdf::Class (), false );
1091+ registerExporter<ParamHistFuncStreamer>(ParamHistFunc::Class (), false );
10501092});
10511093
10521094} // namespace
0 commit comments