1212
1313#include " Domains.h"
1414
15+ #include < RooAbsBinning.h>
16+ #include < RooBinning.h>
1517#include < RooFitHS3/RooJSONFactoryWSTool.h>
1618#include < RooNumber.h>
1719#include < RooRealVar.h>
@@ -71,12 +73,12 @@ void Domains::readVariable(const char *name, double min, double max, const char
7173
7274void Domains::readVariable (RooRealVar const &var)
7375{
74- readVariable (var.GetName (), var.getMin (), var. getMax (), defaultDomainName );
76+ _map[defaultDomainName]. readVariable (var.GetName (), var.getBinning () );
7577 for (const auto &bname : var.getBinningNames ()) {
7678 if (bname.empty ())
7779 continue ;
7880 auto &binning = var.getBinning (bname.c_str ());
79- readVariable (var.GetName (), binning. lowBound (), binning. highBound (), bname. c_str () );
81+ _map[bname]. readVariable (var.GetName (), binning);
8082 }
8183}
8284
@@ -125,7 +127,34 @@ bool Domains::hasVariable(const char *name) const
125127
126128void Domains::ProductDomain::readVariable (RooRealVar const &var)
127129{
128- readVariable (var.GetName (), var.getMin (), var.getMax ());
130+ readVariable (var.GetName (), var.getBinning ());
131+ }
132+
133+ void Domains::ProductDomain::readBinning (ProductDomainElement &elem, RooAbsBinning const &binning)
134+ {
135+ if (binning.isUniform ()) {
136+ elem.hasNBins = true ;
137+ elem.nBins = binning.numBins ();
138+ elem.edges .clear ();
139+ } else {
140+ elem.hasNBins = false ;
141+ elem.edges .clear ();
142+ elem.edges .push_back (binning.binLow (0 ));
143+ for (int i = 0 ; i < binning.numBins (); ++i) {
144+ elem.edges .push_back (binning.binHigh (i));
145+ }
146+ }
147+ }
148+
149+ void Domains::ProductDomain::readVariable (const char *name, RooAbsBinning const &binning)
150+ {
151+ auto &elem = _map[name];
152+
153+ elem.hasMin = true ;
154+ elem.min = binning.lowBound ();
155+ elem.hasMax = true ;
156+ elem.max = binning.highBound ();
157+ readBinning (elem, binning);
129158}
130159
131160void Domains::ProductDomain::readVariable (const char *name, double min, double max)
@@ -136,6 +165,34 @@ void Domains::ProductDomain::readVariable(const char *name, double min, double m
136165 elem.min = min;
137166 elem.hasMax = true ;
138167 elem.max = max;
168+ elem.hasNBins = false ;
169+ elem.nBins = 0 ;
170+ elem.edges .clear ();
171+ }
172+
173+ void Domains::ProductDomain::applyBinning (RooRealVar &var, ProductDomainElement const &elem, const char *name)
174+ {
175+ if (!elem.edges .empty ()) {
176+ RooBinning binning (elem.edges .front (), elem.edges .back ());
177+ for (double edge : elem.edges ) {
178+ binning.addBoundary (edge);
179+ }
180+ var.setBinning (binning, name);
181+ } else if (elem.hasNBins ) {
182+ var.setBins (elem.nBins , name);
183+ }
184+ }
185+
186+ void Domains::ProductDomain::writeBinning (RooFit::Detail::JSONNode &node, ProductDomainElement const &elem)
187+ {
188+ if (!elem.edges .empty ()) {
189+ auto &edges = node[" edges" ].set_seq ();
190+ for (double edge : elem.edges ) {
191+ edges.append_child () << edge;
192+ }
193+ } else if (elem.hasNBins ) {
194+ node[" nbins" ] << elem.nBins ;
195+ }
139196}
140197void Domains::ProductDomain::writeVariable (RooRealVar &var) const
141198{
@@ -156,6 +213,7 @@ void Domains::ProductDomain::writeVariable(RooRealVar &var) const
156213 var.setMax (elem.max );
157214 }
158215 }
216+ applyBinning (var, elem);
159217 }
160218}
161219
@@ -180,6 +238,27 @@ void Domains::ProductDomain::readJSON(RooFit::Detail::JSONNode const &node)
180238 elem.max = readBound (varNode, " max" , RooNumber::infinity ());
181239 elem.hasMax = true ;
182240 }
241+ if (varNode.has_child (" edges" )) {
242+ elem.hasNBins = false ;
243+ elem.edges .clear ();
244+ for (auto const &edge : varNode[" edges" ].children ()) {
245+ elem.edges .push_back (edge.val_double ());
246+ }
247+ if (!elem.edges .empty ()) {
248+ if (!elem.hasMin ) {
249+ elem.min = elem.edges .front ();
250+ elem.hasMin = true ;
251+ }
252+ if (!elem.hasMax ) {
253+ elem.max = elem.edges .back ();
254+ elem.hasMax = true ;
255+ }
256+ }
257+ } else if (varNode.has_child (" nbins" )) {
258+ elem.hasNBins = true ;
259+ elem.nBins = varNode[" nbins" ].val_int ();
260+ elem.edges .clear ();
261+ }
183262 }
184263}
185264void Domains::ProductDomain::writeJSON (RooFit::Detail::JSONNode &node) const
@@ -195,6 +274,7 @@ void Domains::ProductDomain::writeJSON(RooFit::Detail::JSONNode &node) const
195274 RooFit::Detail::JSONNode &varnode = RooJSONFactoryWSTool::appendNamedChild (variablesNode, item.first );
196275 writeBound (varnode[" min" ], elem.hasMin ? elem.min : -RooNumber::infinity ());
197276 writeBound (varnode[" max" ], elem.hasMax ? elem.max : RooNumber::infinity ());
277+ writeBinning (varnode, elem);
198278 }
199279}
200280void Domains::ProductDomain::populate (RooWorkspace &ws) const
@@ -205,7 +285,9 @@ void Domains::ProductDomain::populate(RooWorkspace &ws) const
205285 const auto &elem = item.second ;
206286 const double vMin = elem.hasMin ? elem.min : -RooNumber::infinity ();
207287 const double vMax = elem.hasMax ? elem.max : RooNumber::infinity ();
208- ws.import (RooRealVar{name.c_str (), name.c_str (), vMin, vMax});
288+ RooRealVar var{name.c_str (), name.c_str (), vMin, vMax};
289+ applyBinning (var, elem);
290+ ws.import (var);
209291 }
210292 }
211293}
@@ -218,6 +300,7 @@ void Domains::ProductDomain::registerBinnings(const char *name, RooWorkspace &ws
218300 const double vMin = item.second .hasMin ? item.second .min : -RooNumber::infinity ();
219301 const double vMax = item.second .hasMax ? item.second .max : RooNumber::infinity ();
220302 var->setRange (name, vMin, vMax);
303+ applyBinning (*var, item.second , name);
221304 }
222305}
223306
0 commit comments