33namespace Experimental {
50 if (!param->isConstant()) {
70 _funcName(
other._funcName),
73 _hasGradient(
other._hasGradient),
74 _gradientVarBuffer(
other._gradientVarBuffer),
75 _observables(
other._observables)
84 std::map<RooFit::Detail::DataKey, std::span<const double>>
spans;
91 for (
auto const &item :
spans) {
92 std::size_t
n = item.second.size();
95 for (std::size_t i = 0; i <
n; ++i) {
105 errorMsg <<
"In creation of function " << GetName()
106 <<
" wrapper: input param expected to be of type RooAbsReal.";
108 throw std::runtime_error(
errorMsg.str().c_str());
114 _gradientVarBuffer.resize(_params.size());
117 _nodeOutputSizes = RooFit::Detail::BatchModeDataHelpers::determineOutputSizes(
119 auto found =
spans.find(key);
120 return found !=
spans.
end() ? found->second.size() : -1;
125std::string RooFuncWrapper::declareFunction(std::string
const &
funcBody)
128 auto funcName =
"roo_func_wrapper_" + std::to_string(
iFuncWrapper++);
132 bodyWithSigStrm <<
"double " << funcName <<
"(double* params, double const* obs, double const* xlArr) {\n"
136 errorMsg <<
"Function " << funcName <<
" could not be compiled. See above for details.";
138 throw std::runtime_error(
errorMsg.str().c_str());
143void RooFuncWrapper::createGradient()
145 std::string
gradName = _funcName +
"_grad_0";
149 declareToInterpreter(
"#include <Math/CladDerivator.h>\n");
155 " clad::gradient(" << _funcName <<
", \"params\");\n"
161 errorMsg <<
"Function " << GetName() <<
" could not be differentiated. See above for details.";
163 throw std::runtime_error(
errorMsg.str().c_str());
170void RooFuncWrapper::gradient(
double *out)
const
172 updateGradientVarBuffer();
173 std::fill(out, out + _params.size(), 0.0);
175 _grad(_gradientVarBuffer.data(), _observables.data(), _xlArr.data(), out);
178void RooFuncWrapper::updateGradientVarBuffer()
const
180 std::transform(_params.begin(), _params.end(), _gradientVarBuffer.begin(),
181 [](
RooAbsArg *obj) { return static_cast<RooAbsReal *>(obj)->getVal(); });
184double RooFuncWrapper::evaluate()
const
187 return _absReal->getVal();
188 updateGradientVarBuffer();
190 return _func(_gradientVarBuffer.data(), _observables.data(), _xlArr.data());
193void RooFuncWrapper::gradient(
const double *
x,
double *
g)
const
195 std::fill(
g,
g + _params.size(), 0.0);
197 _grad(
const_cast<double *
>(
x), _observables.data(), _xlArr.data(),
g);
207 ctx.
addResult(param,
"params[" + std::to_string(idx) +
"]");
211 for (
auto const &item : _obsInfos) {
212 const char *
name = item.first->GetName();
216 if (item.second.size == 1) {
217 ctx.
addResult(
name,
"obs[" + std::to_string(item.second.idx) +
"]");
228bool RooFuncWrapper::declareToInterpreter(std::string
const &code)
230 _allCode << code << std::endl;
235void RooFuncWrapper::writeDebugMacro(std::string
const &
filename)
const
239 outFile <<
"#include <RooFit/Detail/MathFuncs.h>" << std::endl;
244 updateGradientVarBuffer();
247 outFile <<
"std::vector<double> " <<
name <<
" = {";
248 for (std::size_t i = 0; i <
vec.size(); ++i) {
252 if (i <
vec.size() - 1)
258 outFile <<
"// clang-format off\n" << std::endl;
265 outFile <<
"// clang-format on\n" << std::endl;
268// To run as a ROOT macro
272 std::vector<double> gradientVec(parametersVec.size());
275 << R"((parametersVec.data(), observablesVec.data(), auxConstantsVec.data());
277 << R"(_grad_0(parametersVec.data(), observablesVec.data(), auxConstantsVec.data(), gradientVec.data());
RooAbsReal * _func
Pointer to original input function.
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
Abstract base class for binned and unbinned datasets.
Abstract base class for objects that represent a real value and implements functionality common to al...
RooArgSet is a container object that can hold multiple RooAbsArg objects.
A class to maintain the context for squashing of RooFit models into code.
std::string assembleCode(std::string const &returnExpr)
Assemble and return the final code with the return expression and global statements.
void addResult(RooAbsArg const *key, std::string const &value)
A function to save an expression that includes/depends on the result of the input node.
void addVecObs(const char *key, int idx)
Since the squashed code represents all observables as a single flattened array, it is important to ke...
std::string const & getResult(RooAbsArg const &arg)
Gets the result for the given node using the node name.
A wrapper class to store a C++ function of type 'double (*)(double*, double*)'.
std::unique_ptr< RooAbsReal > _absReal
std::string buildCode(RooAbsReal const &head)
std::vector< double > _observables
void loadParamsAndData(RooAbsArg const *head, RooArgSet const ¶mSet, const RooAbsData *data, RooSimultaneous const *simPdf)
std::map< RooFit::Detail::DataKey, ObsInfo > _obsInfos
std::string declareFunction(std::string const &funcBody)
RooFuncWrapper(const char *name, const char *title, RooAbsReal &obj, const RooAbsData *data=nullptr, RooSimultaneous const *simPdf=nullptr, bool useEvaluator=false)
bool declareToInterpreter(std::string const &code)
Declare code to the interpreter and keep track of all declared code in this RooFuncWrapper.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...