Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class PiecewiseInterpolation : public RooAbsReal {
PiecewiseInterpolation() ;
PiecewiseInterpolation(const char *name, const char *title, const RooAbsReal &nominal, const RooArgList &lowSet,
const RooArgList &highSet, const RooArgList &paramSet);
PiecewiseInterpolation(const char *name, const char *title, const RooAbsReal &nominal, const RooArgList &lowSet,
const RooArgList &highSet, const RooArgList &paramSet,
const std::vector<int> &interpolationCodes);
~PiecewiseInterpolation() override ;

PiecewiseInterpolation(const PiecewiseInterpolation& other, const char *name = nullptr);
Expand Down
27 changes: 26 additions & 1 deletion roofit/histfactory/src/PiecewiseInterpolation.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,32 @@ PiecewiseInterpolation::PiecewiseInterpolation(const char *name, const char *tit
TRACE_CREATE;
}


////////////////////////////////////////////////////////////////////////////////
/// Construct a new interpolation and set the interpolation code for each
/// parameter by position.
/// \param name Name of the object.
/// \param title Title (for e.g. plotting).
/// \param nominal Nominal value of the function.
/// \param lowSet Set of down variations.
/// \param highSet Set of up variations.
/// \param paramSet Parameters that control the interpolation.
/// \param interpolationCodes Interpolation code for each parameter.
PiecewiseInterpolation::PiecewiseInterpolation(const char *name, const char *title, const RooAbsReal &nominal,
const RooArgList &lowSet, const RooArgList &highSet,
const RooArgList &paramSet, const std::vector<int> &interpolationCodes)
: PiecewiseInterpolation(name, title, nominal, lowSet, highSet, paramSet)
{
if (interpolationCodes.size() != _paramSet.size()) {
coutE(InputArguments) << "PiecewiseInterpolation::ctor(" << GetName()
<< ") ERROR: interpolation code vector should have the same length as the parameter list"
<< std::endl;
RooErrorHandler::softAbort();
return;
}
for (std::size_t i = 0; i < interpolationCodes.size(); ++i) {
setInterpCodeForParam(i, interpolationCodes[i]);
}
}

////////////////////////////////////////////////////////////////////////////////
/// Copy constructor
Expand Down
19 changes: 19 additions & 0 deletions roofit/histfactory/test/testPiecewiseInterpolation.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,22 @@ TEST(PiecewiseInterpolation, AdditiveOrMultiplicative)
}
}
}

TEST(PiecewiseInterpolation, ConstructWithPerParameterCodes)
{
RooRealVar nominal{"nominal", "nominal", 1.0};
RooRealVar parameter{"parameter", "parameter", 0.0, -2.0, 2.0};
RooRealVar low1{"low1", "low1", 0.8};
RooRealVar low2{"low2", "low2", 0.7};
RooRealVar high1{"high1", "high1", 1.2};
RooRealVar high2{"high2", "high2", 1.4};

// Repeating a parameter is supported by PiecewiseInterpolation, so codes
// need to be assigned by position rather than by looking up the parameter.
RooArgList parameters{parameter, parameter};
RooArgList lows{low1, low2};
RooArgList highs{high1, high2};
PiecewiseInterpolation interpolation{"interpolation", "", nominal, lows, highs, parameters, {0, 2}};

EXPECT_EQ(interpolation.interpolationCodes(), (std::vector<int>{0, 2}));
}
Loading
Loading