70std::vector<std::string> extractArguments(std::string expr)
73 expr.erase(std::remove_if(expr.begin(), expr.end(), [](
unsigned char c) { return std::isspace(c); }), expr.end());
75 std::vector<std::string> arguments;
76 size_t startidx = expr.size();
77 for (
size_t i = 0;
i < expr.size(); ++
i) {
78 if (startidx >= expr.size()) {
79 if (isalpha(expr[
i])) {
83 if (!isdigit(expr[
i]) && !isalpha(expr[
i]) && expr[
i] !=
'_') {
85 startidx = expr.size();
88 std::string arg(expr.substr(startidx,
i - startidx));
89 startidx = expr.size();
90 arguments.push_back(arg);
94 if (startidx < expr.size()) {
95 arguments.push_back(expr.substr(startidx));
100template <
class RooArg_t>
103 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
109 TString formula(p[
"expression"].val());
110 RooArgList dependents;
111 for (
const auto &
d : extractArguments(formula.Data())) {
114 tool->
wsImport(RooArg_t{
name.c_str(), formula, dependents});
121 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
132 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
143 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
147 RooAbsPdf *pdf = tool->
requestArg<RooAbsPdf>(p,
"pdf");
148 RooRealVar *obs = tool->
requestArg<RooRealVar>(p,
"observable");
152 obs->GetName() +
"' as indicated by parent RooBinSamplingPdf '" +
name +
156 if (!p.has_child(
"epsilon")) {
159 double epsilon(p[
"epsilon"].val_double());
161 tool->
wsEmplace<RooBinSamplingPdf>(
name, *obs, *pdf, epsilon);
169 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
173 bool extended =
false;
174 if (p.
has_child(
"extended") && p[
"extended"].val_bool()) {
185 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
196 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
206 for (
const auto &coef : p[
"coefficients"].children()) {
210 if (order == 0 && coef.val() ==
"1.0") {
212 }
else if (coefs.empty() && coef.val() ==
"0.0") {
227 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
232 tool->
wsEmplace<RooPoisson>(
name, *
x, *mean, !p[
"integer"].val_bool());
239 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
245 RooArgSet
const *normSetPtr =
nullptr;
246 if (p.has_child(
"normalization")) {
248 normSetPtr = &normSet;
251 bool hasDomain = p.has_child(
"domain");
253 domain = p[
"domain"].val();
256 tool->
wsEmplace<RooRealIntegral>(
name, *func, vars, normSetPtr,
static_cast<RooNumIntConfig *
>(
nullptr),
257 hasDomain ? domain.c_str() :
nullptr);
264 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
271 const std::string muName = p[
"mu"].val();
272 const std::string sigmaName = p[
"sigma"].val();
273 const bool isTransformed =
endsWith(muName,
"_lognormal_log");
274 const std::string suffixToRemove = isTransformed ?
"_lognormal_log" :
"";
286 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
322 const std::string constParamName = p[
"c"].val();
323 const bool isInverted =
endsWith(constParamName,
"_exponential_inverted");
324 const std::string suffixToRemove = isInverted ?
"_exponential_inverted" :
"";
335 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
345 for (
const auto &coef : p[
"coefficients"].children()) {
349 if (order == 0 && coef.val() ==
"1.0") {
351 }
else if (coefs.empty() && coef.val() ==
"0.0") {
366 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
369 bool has_cov = p.
has_child(
"covariances");
371 if (!has_cov && !has_corr) {
381 for (
const auto &row : p[
"covariances"].children()) {
383 for (
const auto &val : row.children()) {
384 covmat(
i, j) = val.val_double();
390 std::vector<double> variances;
391 for (
const auto &
v : p[
"standard_deviations"].children()) {
392 variances.push_back(
v.val_double());
394 covmat.
ResizeTo(variances.size(), variances.size());
396 for (
const auto &row : p[
"correlations"].children()) {
398 for (
const auto &val : row.children()) {
399 covmat(
i, j) = val.val_double() * variances[
i] * variances[j];
417 std::string
const &key()
const override;
418 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
420 const RooAddPdf *pdf =
static_cast<const RooAddPdf *
>(func);
421 elem[
"type"] << key();
431 std::string
const &key()
const override;
432 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
434 const RooRealSumPdf *pdf =
static_cast<const RooRealSumPdf *
>(func);
435 elem[
"type"] << key();
445 std::string
const &key()
const override;
446 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
448 const RooRealSumFunc *pdf =
static_cast<const RooRealSumFunc *
>(func);
449 elem[
"type"] << key();
458 std::string
const &key()
const override;
459 bool exportObject(RooJSONFactoryWSTool *tool,
const RooAbsArg *func, JSONNode &elem)
const override
461 const RooHistFunc *hf =
static_cast<const RooHistFunc *
>(func);
462 elem[
"type"] << key();
463 RooDataHist
const &dh = hf->
dataHist();
471 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
477 std::unique_ptr<RooDataHist> dataHist =
479 tool->
wsEmplace<RooHistFunc>(
name, *dataHist->get(), *dataHist);
486 std::string
const &key()
const override;
487 bool exportObject(RooJSONFactoryWSTool *tool,
const RooAbsArg *func, JSONNode &elem)
const override
489 const RooHistPdf *hf =
static_cast<const RooHistPdf *
>(func);
490 elem[
"type"] << key();
491 RooDataHist
const &dh = hf->
dataHist();
499 bool importArg(RooJSONFactoryWSTool *tool,
const JSONNode &p)
const override
505 std::unique_ptr<RooDataHist> dataHist =
507 tool->
wsEmplace<RooHistPdf>(
name, *dataHist->get(), *dataHist);
514 std::string
const &key()
const override;
515 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
517 const RooBinSamplingPdf *pdf =
static_cast<const RooBinSamplingPdf *
>(func);
518 elem[
"type"] << key();
521 elem[
"epsilon"] << pdf->
epsilon();
528 std::string
const &key()
const override;
529 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
531 const RooBinWidthFunction *pdf =
static_cast<const RooBinWidthFunction *
>(func);
532 elem[
"type"] << key();
539template <
class RooArg_t>
542 std::string
const &key()
const override;
543 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
545 const RooArg_t *pdf =
static_cast<const RooArg_t *
>(func);
546 elem[
"type"] << key();
547 TString expression(pdf->expression());
548 std::vector<std::pair<RooAbsArg *, std::size_t>> paramsWithIndex;
549 paramsWithIndex.reserve(pdf->nParameters());
550 for (
size_t i = 0;
i < pdf->nParameters(); ++
i) {
551 paramsWithIndex.emplace_back(pdf->getParameter(
i),
i);
553 std::sort(paramsWithIndex.begin(), paramsWithIndex.end());
556 for (
auto [par, idx] : paramsWithIndex) {
557 expression.ReplaceAll((
"x[" + std::to_string(idx) +
"]").c_str(), par->GetName());
564 for (
auto it = paramsWithIndex.rbegin(); it != paramsWithIndex.rend(); ++it) {
565 RooAbsArg* par = it->first;
566 std::size_t idx = it->second;
567 expression.ReplaceAll((
"@" + std::to_string(idx)).c_str(), par->
GetName());
569 elem[
"expression"] << expression.Data();
576 std::string
const &key()
const override;
577 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
579 auto *pdf =
static_cast<const RooPolynomial *
>(func);
580 elem[
"type"] << key();
581 elem[
"x"] << pdf->x().GetName();
582 auto &coefs = elem[
"coefficients"].
set_seq();
586 for (
int i = 0;
i < pdf->lowestOrder(); ++
i) {
587 coefs.append_child() << (
i == 0 ?
"1.0" :
"0.0");
589 for (
const auto &coef : pdf->coefList()) {
590 coefs.append_child() << coef->GetName();
598 std::string
const &key()
const override;
599 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
601 auto *pdf =
static_cast<const RooLegacyExpPoly *
>(func);
602 elem[
"type"] << key();
603 elem[
"x"] << pdf->x().GetName();
604 auto &coefs = elem[
"coefficients"].
set_seq();
608 for (
int i = 0;
i < pdf->lowestOrder(); ++
i) {
609 coefs.append_child() << (
i == 0 ?
"1.0" :
"0.0");
611 for (
const auto &coef : pdf->coefList()) {
612 coefs.append_child() << coef->GetName();
620 std::string
const &key()
const override;
621 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
623 auto *pdf =
static_cast<const RooPoisson *
>(func);
624 elem[
"type"] << key();
625 elem[
"x"] << pdf->getX().GetName();
626 elem[
"mean"] << pdf->getMean().GetName();
627 elem[
"integer"] << !pdf->getNoRounding();
634 std::string
const &key()
const override;
635 bool exportObject(RooJSONFactoryWSTool *tool,
const RooAbsArg *func, JSONNode &elem)
const override
637 auto *pdf =
static_cast<const RooLognormal *
>(func);
639 elem[
"type"] << key();
640 elem[
"x"] << pdf->getX().GetName();
642 auto &m0 = pdf->getMedian();
643 auto &k = pdf->getShapeK();
645 if (pdf->useStandardParametrization()) {
646 elem[
"mu"] << m0.GetName();
647 elem[
"sigma"] << k.GetName();
659 std::string
const &key()
const override;
660 bool exportObject(RooJSONFactoryWSTool *tool,
const RooAbsArg *func, JSONNode &elem)
const override
662 auto *pdf =
static_cast<const RooExponential *
>(func);
663 elem[
"type"] << key();
664 elem[
"x"] << pdf->variable().GetName();
665 auto &
c = pdf->coefficient();
666 if (pdf->negateCoefficient()) {
667 elem[
"c"] <<
c.GetName();
678 std::string
const &key()
const override;
679 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
681 auto *pdf =
static_cast<const RooMultiVarGaussian *
>(func);
682 elem[
"type"] << key();
685 elem[
"covariances"].
fill_mat(pdf->covarianceMatrix());
692 std::string
const &key()
const override;
693 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
695 auto *pdf =
static_cast<const RooTFnBinding *
>(func);
696 elem[
"type"] << key();
698 TString formula(pdf->function().GetExpFormula());
699 formula.ReplaceAll(
"x", pdf->observables()[0].GetName());
700 formula.ReplaceAll(
"y", pdf->observables()[1].GetName());
701 formula.ReplaceAll(
"z", pdf->observables()[2].GetName());
702 for (
size_t i = 0;
i < pdf->parameters().
size(); ++
i) {
704 formula.ReplaceAll(pname, pdf->parameters()[
i].GetName());
706 elem[
"expression"] << formula.Data();
713 std::string
const &key()
const override;
714 bool exportObject(RooJSONFactoryWSTool *,
const RooAbsArg *func, JSONNode &elem)
const override
716 auto *integral =
static_cast<const RooRealIntegral *
>(func);
717 elem[
"type"] << key();
718 elem[
"integrand"] << integral->integrand().GetName();
719 if (integral->intRange()) {
720 elem[
"domain"] << integral->intRange();
723 if (RooArgSet
const *funcNormSet = integral->funcNormSet()) {
730#define DEFINE_EXPORTER_KEY(class_name, name) \
731 std::string const &class_name::key() const \
733 const static std::string keystring = name; \
#define DEFINE_EXPORTER_KEY(class_name, name)
bool endsWith(std::string_view str, std::string_view suffix)
std::string removeSuffix(std::string_view str, std::string_view suffix)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
TMatrixTSym< Double_t > TMatrixDSym
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
const RooArgList & coefList() const
ExtendMode extendMode() const override
Returns ability of PDF to provide extended likelihood terms.
const RooArgList & pdfList() const
const RooAbsPdf & pdf() const
const RooAbsReal & observable() const
bool divideByBinWidth() const
const RooHistFunc & histFunc() const
double const * weightArray() const
const RooArgSet * get() const override
Get bin centre of current bin.
virtual bool val_bool() const
virtual std::string val() const =0
virtual size_t num_children() const =0
virtual JSONNode & set_seq()=0
virtual bool has_child(std::string const &) const =0
void fill_mat(Matrix const &mat)
RooDataHist & dataHist()
Return RooDataHist that is represented.
const RooArgList & coefList() const
const RooArgList & funcList() const
const RooArgList & funcList() const
ExtendMode extendMode() const override
Returns ability of PDF to provide extended likelihood terms.
const RooArgList & coefList() const
TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1) override
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
const char * GetName() const override
Returns name of object.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
static bool registerImporter(const std::string &key, bool topPriority=true)
static bool registerExporter(const TClass *key, bool topPriority=true)
#define STATIC_EXECUTE(MY_FUNC)