@@ -259,6 +259,108 @@ TEST(RooFitHS3, RooGaussian)
259259 EXPECT_EQ (status, 0 );
260260}
261261
262+ TEST (RooFitHS3, RooGaussianConstVarSigmaExport)
263+ {
264+ RooRealVar x{" x" , " x" , 0.0 , -10.0 , 10.0 };
265+ RooRealVar mean{" mean" , " mean" , 0.0 };
266+ mean.setConstant (true );
267+
268+ RooConstVar sigmaConst{" sigma_const" , " sigma_const" , 1.0 };
269+ RooGaussian gaussConst{" gauss_const" , " gauss_const" , x, mean, sigmaConst};
270+
271+ RooGaussian gaussLiteral{" gauss_literal" , " gauss_literal" , x, mean, RooFit::RooConst (2.0 )};
272+
273+ RooRealVar sigmaReal{" sigma_real" , " sigma_real" , 1.0 , 0.1 , 10.0 };
274+ sigmaReal.setConstant (true );
275+ RooGaussian gaussReal{" gauss_real" , " gauss_real" , x, mean, sigmaReal};
276+
277+ RooWorkspace ws;
278+ ws.import (gaussConst, RooFit::Silence ());
279+ ws.import (gaussLiteral, RooFit::RecycleConflictNodes (), RooFit::Silence ());
280+ ws.import (gaussReal, RooFit::RecycleConflictNodes (), RooFit::Silence ());
281+
282+ const std::string json = RooJSONFactoryWSTool{ws}.exportJSONtoString ();
283+
284+ EXPECT_NE (json.find (" \" sigma\" :\" sigma_const\" " ), std::string::npos);
285+ EXPECT_NE (json.find (" \" name\" :\" sigma_const\" " ), std::string::npos);
286+ EXPECT_NE (json.find (" \" is_const_var\" :1" ), std::string::npos);
287+ EXPECT_EQ (json.find (" \" sigma\" :1.0" ), std::string::npos);
288+ EXPECT_NE (json.find (" \" sigma\" :2.0" ), std::string::npos);
289+
290+ EXPECT_NE (json.find (" \" sigma\" :\" sigma_real\" " ), std::string::npos);
291+ EXPECT_NE (json.find (" \" name\" :\" sigma_real\" " ), std::string::npos);
292+
293+ RooWorkspace imported;
294+ ASSERT_TRUE (RooJSONFactoryWSTool{imported}.importJSONfromString (json));
295+ EXPECT_NE (dynamic_cast <RooConstVar *>(imported.obj (" sigma_const" )), nullptr );
296+ EXPECT_EQ (imported.var (" sigma_const" ), nullptr );
297+ EXPECT_NE (dynamic_cast <RooRealVar *>(imported.obj (" sigma_real" )), nullptr );
298+
299+ const std::string roundTripJson = RooJSONFactoryWSTool{imported}.exportJSONtoString ();
300+ EXPECT_NE (roundTripJson.find (" \" sigma\" :\" sigma_const\" " ), std::string::npos);
301+ EXPECT_NE (roundTripJson.find (" \" is_const_var\" :1" ), std::string::npos);
302+
303+ const std::string legacyJson = R"( {
304+ "metadata":{"hs3_version":"0.2"},
305+ "parameter_points":[{"name":"default_values","parameters":[
306+ {"name":"x","value":0.0},
307+ {"name":"mean","value":0.0},
308+ {"name":"sigma_const","value":1.0,"const":true}
309+ ]}],
310+ "distributions":[{"name":"gauss","type":"gaussian_dist","x":"x","mean":"mean","sigma":"sigma_const"}]
311+ })" ;
312+ RooWorkspace legacyImport;
313+ ASSERT_TRUE (RooJSONFactoryWSTool{legacyImport}.importJSONfromString (legacyJson));
314+ EXPECT_NE (dynamic_cast <RooRealVar *>(legacyImport.obj (" sigma_const" )), nullptr );
315+ EXPECT_EQ (dynamic_cast <RooConstVar *>(legacyImport.obj (" sigma_const" )), nullptr );
316+
317+ const std::string markedConstWithDomainJson = R"( {
318+ "metadata":{"hs3_version":"0.2"},
319+ "domains":[{"name":"default_domain","type":"product_domain","axes":[
320+ {"name":"x","min":-10.0,"max":10.0},
321+ {"name":"mean","min":-10.0,"max":10.0},
322+ {"name":"sigma_const","min":0.0,"max":10.0}
323+ ]}],
324+ "parameter_points":[{"name":"default_values","parameters":[
325+ {"name":"x","value":0.0},
326+ {"name":"mean","value":0.0},
327+ {"name":"sigma_const","value":1.0,"const":true}
328+ ]}],
329+ "distributions":[{"name":"gauss","type":"gaussian_dist","x":"x","mean":"mean","sigma":"sigma_const"}],
330+ "misc":{"ROOT_internal":{"attributes":{"sigma_const":{"is_const_var":1}}}}
331+ })" ;
332+ RooWorkspace markedImport;
333+ ASSERT_TRUE (RooJSONFactoryWSTool{markedImport}.importJSONfromString (markedConstWithDomainJson));
334+ EXPECT_NE (dynamic_cast <RooConstVar *>(markedImport.obj (" sigma_const" )), nullptr );
335+ EXPECT_EQ (markedImport.var (" sigma_const" ), nullptr );
336+ }
337+
338+ TEST (RooFitHS3, RooConstVarCollectionProxyExport)
339+ {
340+ RooRealVar x{" x" , " x" , 0.0 , -10.0 , 10.0 };
341+ RooRealVar mean1{" mean1" , " mean1" , -1.0 };
342+ RooRealVar mean2{" mean2" , " mean2" , 1.0 };
343+ RooRealVar sigma{" sigma" , " sigma" , 1.0 , 0.1 , 10.0 };
344+
345+ RooGaussian g1{" g1" , " g1" , x, mean1, sigma};
346+ RooGaussian g2{" g2" , " g2" , x, mean2, sigma};
347+ RooConstVar frac{" frac_const" , " frac_const" , 0.25 };
348+ RooAddPdf model{" model" , " model" , RooArgList{g1, g2}, RooArgList{frac}};
349+
350+ RooWorkspace ws;
351+ ws.import (model, RooFit::Silence ());
352+
353+ const std::string json = RooJSONFactoryWSTool{ws}.exportJSONtoString ();
354+ EXPECT_NE (json.find (" \" coefficients\" :[\" frac_const\" ]" ), std::string::npos);
355+ EXPECT_NE (json.find (" \" name\" :\" frac_const\" " ), std::string::npos);
356+ EXPECT_NE (json.find (" \" is_const_var\" :1" ), std::string::npos);
357+
358+ RooWorkspace imported;
359+ ASSERT_TRUE (RooJSONFactoryWSTool{imported}.importJSONfromString (json));
360+ EXPECT_NE (dynamic_cast <RooConstVar *>(imported.obj (" frac_const" )), nullptr );
361+ EXPECT_EQ (imported.var (" frac_const" ), nullptr );
362+ }
363+
262364TEST (RooFitHS3, RooBernstein)
263365{
264366 int status = validate ({" RooBernstein::bernstein(x[0, 10], { a[1], 3, b[5, 0, 20] })" });
0 commit comments