99#include " ../interface/VerticalInterpHistPdf.h"
1010#include " ../interface/VerticalInterpPdf.h"
1111#include " ../interface/CombineMathFuncs.h"
12+ #include " ../interface/RooParametricHist.h"
1213
1314#include < RooUniformBinning.h>
1415
@@ -242,6 +243,33 @@ void RooFit::Experimental::codegenImpl(VerticalInterpPdf& arg, CodegenContext& c
242243 arg.quadraticAlgo ()));
243244}
244245
246+ void RooFit::Experimental::codegenImpl (RooParametricHist& arg, CodegenContext& ctx) {
247+ std::vector<double > diffs_flat;
248+ std::vector<double > sums_flat;
249+ if (arg.hasMorphs ()) {
250+ arg.getFlattenedMorphs (diffs_flat, sums_flat);
251+ }
252+
253+ std::string xName = ctx.getResult (arg.observable ());
254+ std::stringstream bin_i;
255+ bin_i << ctx.buildCall (" RooFit::Detail::MathFuncs::parametricHistFindBin" , arg.getNBins (), arg.getBins (), xName);
256+ std::stringstream code;
257+ code << ctx.buildCall (" RooFit::Detail::MathFuncs::parametricHistEvaluate" ,
258+ bin_i.str (),
259+ arg.getPars (),
260+ arg.getBins (),
261+ arg.getNBins (),
262+ arg.getCoeffList (),
263+ static_cast <int >(arg.getCoeffList ().size ()),
264+ arg.hasMorphs () ? diffs_flat : std::vector<double >{},
265+ arg.hasMorphs () ? sums_flat : std::vector<double >{},
266+ arg.getWidths (),
267+ arg.getSmoothRegion ()) +
268+ " ;\n " ;
269+ ctx.addToCodeBody (code.str ());
270+ ctx.addResult (&arg, code.str ());
271+ }
272+
245273std::string RooFit::Experimental::codegenIntegralImpl (VerticalInterpPdf& arg,
246274 int code,
247275 const char * rangeName,
@@ -257,4 +285,31 @@ std::string RooFit::Experimental::codegenIntegralImpl(VerticalInterpPdf& arg,
257285 arg.quadraticAlgo ());
258286}
259287
288+ std::string RooFit::Experimental::codegenIntegralImpl (RooParametricHist& arg,
289+ int code,
290+ const char * rangeName,
291+ CodegenContext& ctx) {
292+ std::vector<double > diffs_flat;
293+ std::vector<double > sums_flat;
294+ if (arg.hasMorphs ()) {
295+ arg.getFlattenedMorphs (diffs_flat, sums_flat);
296+ }
297+ double xMin = rangeName ? arg.getObs ().getMin (rangeName) : -1 ;
298+ double xMax = rangeName ? arg.getObs ().getMax (rangeName) : -1 ; // if rangeName is null, these values won't be used
299+
300+ return ctx.buildCall (" RooFit::Detail::MathFuncs::parametricHistIntegral" ,
301+ arg.getPars (),
302+ arg.getBins (),
303+ arg.getNBins (),
304+ arg.getCoeffList (),
305+ static_cast <int >(arg.getCoeffList ().size ()),
306+ arg.hasMorphs () ? diffs_flat : std::vector<double >{},
307+ arg.hasMorphs () ? sums_flat : std::vector<double >{},
308+ arg.getWidths (),
309+ arg.getSmoothRegion (),
310+ rangeName ? std::string (" \" " ) + rangeName + " \" " : std::string (" nullptr" ),
311+ xMin,
312+ xMax);
313+ }
314+
260315#endif // ROOT_VERSION_CODE >= ROOT_VERSION(6,36,0)
0 commit comments