@@ -395,6 +395,108 @@ TEST(RooFitHS3, RooGaussian)
395395 EXPECT_EQ (status, 0 );
396396}
397397
398+ TEST (RooFitHS3, RooGaussianConstVarSigmaExport)
399+ {
400+ RooRealVar x{" x" , " x" , 0.0 , -10.0 , 10.0 };
401+ RooRealVar mean{" mean" , " mean" , 0.0 };
402+ mean.setConstant (true );
403+
404+ RooConstVar sigmaConst{" sigma_const" , " sigma_const" , 1.0 };
405+ RooGaussian gaussConst{" gauss_const" , " gauss_const" , x, mean, sigmaConst};
406+
407+ RooGaussian gaussLiteral{" gauss_literal" , " gauss_literal" , x, mean, RooFit::RooConst (2.0 )};
408+
409+ RooRealVar sigmaReal{" sigma_real" , " sigma_real" , 1.0 , 0.1 , 10.0 };
410+ sigmaReal.setConstant (true );
411+ RooGaussian gaussReal{" gauss_real" , " gauss_real" , x, mean, sigmaReal};
412+
413+ RooWorkspace ws;
414+ ws.import (gaussConst, RooFit::Silence ());
415+ ws.import (gaussLiteral, RooFit::RecycleConflictNodes (), RooFit::Silence ());
416+ ws.import (gaussReal, RooFit::RecycleConflictNodes (), RooFit::Silence ());
417+
418+ const std::string json = RooJSONFactoryWSTool{ws}.exportJSONtoString ();
419+
420+ EXPECT_NE (json.find (" \" sigma\" :\" sigma_const\" " ), std::string::npos);
421+ EXPECT_NE (json.find (" \" name\" :\" sigma_const\" " ), std::string::npos);
422+ EXPECT_NE (json.find (" \" is_const_var\" :1" ), std::string::npos);
423+ EXPECT_EQ (json.find (" \" sigma\" :1.0" ), std::string::npos);
424+ EXPECT_NE (json.find (" \" sigma\" :2.0" ), std::string::npos);
425+
426+ EXPECT_NE (json.find (" \" sigma\" :\" sigma_real\" " ), std::string::npos);
427+ EXPECT_NE (json.find (" \" name\" :\" sigma_real\" " ), std::string::npos);
428+
429+ RooWorkspace imported;
430+ ASSERT_TRUE (RooJSONFactoryWSTool{imported}.importJSONfromString (json));
431+ EXPECT_NE (dynamic_cast <RooConstVar *>(imported.obj (" sigma_const" )), nullptr );
432+ EXPECT_EQ (imported.var (" sigma_const" ), nullptr );
433+ EXPECT_NE (dynamic_cast <RooRealVar *>(imported.obj (" sigma_real" )), nullptr );
434+
435+ const std::string roundTripJson = RooJSONFactoryWSTool{imported}.exportJSONtoString ();
436+ EXPECT_NE (roundTripJson.find (" \" sigma\" :\" sigma_const\" " ), std::string::npos);
437+ EXPECT_NE (roundTripJson.find (" \" is_const_var\" :1" ), std::string::npos);
438+
439+ const std::string legacyJson = R"( {
440+ "metadata":{"hs3_version":"0.2"},
441+ "parameter_points":[{"name":"default_values","parameters":[
442+ {"name":"x","value":0.0},
443+ {"name":"mean","value":0.0},
444+ {"name":"sigma_const","value":1.0,"const":true}
445+ ]}],
446+ "distributions":[{"name":"gauss","type":"gaussian_dist","x":"x","mean":"mean","sigma":"sigma_const"}]
447+ })" ;
448+ RooWorkspace legacyImport;
449+ ASSERT_TRUE (RooJSONFactoryWSTool{legacyImport}.importJSONfromString (legacyJson));
450+ EXPECT_NE (dynamic_cast <RooRealVar *>(legacyImport.obj (" sigma_const" )), nullptr );
451+ EXPECT_EQ (dynamic_cast <RooConstVar *>(legacyImport.obj (" sigma_const" )), nullptr );
452+
453+ const std::string markedConstWithDomainJson = R"( {
454+ "metadata":{"hs3_version":"0.2"},
455+ "domains":[{"name":"default_domain","type":"product_domain","axes":[
456+ {"name":"x","min":-10.0,"max":10.0},
457+ {"name":"mean","min":-10.0,"max":10.0},
458+ {"name":"sigma_const","min":0.0,"max":10.0}
459+ ]}],
460+ "parameter_points":[{"name":"default_values","parameters":[
461+ {"name":"x","value":0.0},
462+ {"name":"mean","value":0.0},
463+ {"name":"sigma_const","value":1.0,"const":true}
464+ ]}],
465+ "distributions":[{"name":"gauss","type":"gaussian_dist","x":"x","mean":"mean","sigma":"sigma_const"}],
466+ "misc":{"ROOT_internal":{"attributes":{"sigma_const":{"is_const_var":1}}}}
467+ })" ;
468+ RooWorkspace markedImport;
469+ ASSERT_TRUE (RooJSONFactoryWSTool{markedImport}.importJSONfromString (markedConstWithDomainJson));
470+ EXPECT_NE (dynamic_cast <RooConstVar *>(markedImport.obj (" sigma_const" )), nullptr );
471+ EXPECT_EQ (markedImport.var (" sigma_const" ), nullptr );
472+ }
473+
474+ TEST (RooFitHS3, RooConstVarCollectionProxyExport)
475+ {
476+ RooRealVar x{" x" , " x" , 0.0 , -10.0 , 10.0 };
477+ RooRealVar mean1{" mean1" , " mean1" , -1.0 };
478+ RooRealVar mean2{" mean2" , " mean2" , 1.0 };
479+ RooRealVar sigma{" sigma" , " sigma" , 1.0 , 0.1 , 10.0 };
480+
481+ RooGaussian g1{" g1" , " g1" , x, mean1, sigma};
482+ RooGaussian g2{" g2" , " g2" , x, mean2, sigma};
483+ RooConstVar frac{" frac_const" , " frac_const" , 0.25 };
484+ RooAddPdf model{" model" , " model" , RooArgList{g1, g2}, RooArgList{frac}};
485+
486+ RooWorkspace ws;
487+ ws.import (model, RooFit::Silence ());
488+
489+ const std::string json = RooJSONFactoryWSTool{ws}.exportJSONtoString ();
490+ EXPECT_NE (json.find (" \" coefficients\" :[\" frac_const\" ]" ), std::string::npos);
491+ EXPECT_NE (json.find (" \" name\" :\" frac_const\" " ), std::string::npos);
492+ EXPECT_NE (json.find (" \" is_const_var\" :1" ), std::string::npos);
493+
494+ RooWorkspace imported;
495+ ASSERT_TRUE (RooJSONFactoryWSTool{imported}.importJSONfromString (json));
496+ EXPECT_NE (dynamic_cast <RooConstVar *>(imported.obj (" frac_const" )), nullptr );
497+ EXPECT_EQ (imported.var (" frac_const" ), nullptr );
498+ }
499+
398500TEST (RooFitHS3, RooBernstein)
399501{
400502 int status = validate ({" RooBernstein::bernstein(x[0, 10], { a[1], 3, b[5, 0, 20] })" });
0 commit comments