71using std::sregex_iterator, std::ostream;
82 for (
unsigned int i = 0; i <
collection.size(); ++i) {
93 for (std::size_t i = 0; i < formula.size(); ++i) {
94 if (match && !
isdigit(formula[i])) {
95 formula.insert(formula.begin() + i,
']');
98 }
else if (!match && formula[i] ==
'@') {
100 formula.insert(formula.begin() + i + 1,
'[');
112 for (std::string::size_type pos{};
inOut.npos != (pos =
inOut.find(
what.data(), pos,
what.length()));
113 pos +=
with.length()) {
123 static const std::regex
r{
"\b"};
124 std::vector<bool> out(s.size() + 1);
126 for (
auto i = std::sregex_iterator(s.begin(), s.end(),
r); i != std::sregex_iterator(); ++i) {
128 m.position()] =
true;
132 out[s.size()] =
true;
141 for (
unsigned int i = 0; i <
varList.size(); ++i) {
148 for (std::string::size_type pos{}; formula.npos != (pos = formula.find(
varName.data(), pos,
varName.length()));
151 std::string::size_type next = pos +
varName.length();
160 if (next < formula.size() && (formula[next] ==
'[' || formula[next] ==
']')) {
182 <<
"Preprocessing formula: replace named references: " <<
varName <<
" --> " <<
replacement <<
"\n\t"
183 << formula << std::endl;
192 for (
unsigned int i = 0; i <
nArgs; ++i) {
193 const auto& var = args[i];
195 regexStr <<
"x\[" << i <<
"\]|@" << i;
198 std::string
replacement = std::string(
"[") + var.GetName() +
"]";
210 for (
unsigned int i = 0; i <
nArgs; ++i) {
212 regexStr <<
"x\[" << i <<
"\]|@" << i;
248 std::unique_ptr<TFormula>
newTF;
249 if (
other._tFormula) {
250 newTF = std::make_unique<TFormula>(*
other._tFormula);
251 newTF->SetName(GetName());
262std::string RooFormula::processFormula(std::string formula)
const {
269 cxcoutD(InputArguments) <<
"Preprocessing formula step 1: find category tags (catName::catState) in "
270 << formula << std::endl;
273 static const std::regex
categoryReg(
"(\w+)::(\w+)");
278 const std::string
fullMatch = (*matchIt)[0];
279 const std::string
catName = (*matchIt)[1];
280 const std::string
catState = (*matchIt)[2];
284 cxcoutD(InputArguments) <<
"Formula " << GetName() <<
" uses '::' to reference a category state as '" <<
fullMatch
285 <<
"' but a category '" <<
catName <<
"' cannot be found in the input variables." << std::endl;
290 coutE(InputArguments) <<
"Formula " << GetName() <<
" uses '::' to reference a category state as '" <<
fullMatch
291 <<
"' but the category '" <<
catName <<
"' does not seem to have the state '" <<
catState <<
"'." << std::endl;
292 throw std::invalid_argument(formula);
299 cxcoutD(InputArguments) <<
"-- End of category tags --"<< std::endl;
306 cxcoutD(InputArguments) <<
"Preprocessing formula step 2: replace category tags\n\t" << formula << std::endl;
311 cxcoutD(InputArguments) <<
"Preprocessing formula step 3: replace '@'-references\n\t" << formula << std::endl;
316 cxcoutD(InputArguments) <<
"Final formula:\n\t" << formula << std::endl;
328 const std::string formula(
_tFormula->GetTitle());
349void RooFormula::dump()
const
351 printMultiline(std::cout, 0);
371 if (arg->getStringAttribute(
"origName")) {
378 coutE(LinkStateMgmt) <<
__func__ <<
": cannot find replacement for " << arg->GetName() << std::endl;
395double RooFormula::eval(
const RooArgSet* nset)
const
398 coutF(Eval) <<
__func__ <<
" (" << GetName() <<
"): Formula didn't compile: " << GetTitle() << std::endl;
399 std::string
what =
"Formula ";
401 what +=
" didn't compile.";
402 throw std::runtime_error(
what);
405 std::vector<double> pars;
407 for (
unsigned int i = 0; i <
_origList.size(); ++i) {
410 pars.push_back(cat.getCurrentIndex());
413 pars.push_back(
real.getVal(nset));
426 for (
int i = 0; i <
nPars; i++) {
431 std::vector<double> pars(
nPars);
432 for (
size_t i = 0; i <
output.size(); i++) {
445 os <<
indent <<
"--- RooFormula ---" << std::endl;
446 os <<
indent <<
" Formula: '" << GetTitle() <<
"'" << std::endl;
456void RooFormula::printValue(ostream& os)
const
464void RooFormula::printName(ostream& os)
const
472void RooFormula::printTitle(ostream& os)
const
480void RooFormula::printClassName(ostream& os)
const
488void RooFormula::printArgs(ostream& os)
const
490 os <<
"[ actualVars=";
492 os <<
" " << arg->GetName();
500void RooFormula::installFormulaOrThrow(
const std::string& formula) {
503 cxcoutD(InputArguments) <<
"RooFormula '" << GetName() <<
"' will be compiled as "
507 <<
"\n with the parameters " <<
_origList << std::endl;
512 std::stringstream
msg;
513 msg <<
"RooFormula '" << GetName() <<
"' did not compile or is invalid."
514 <<
"\nInput:\n\t" << formula
517 throw std::runtime_error(
msg.str());
528 std::stringstream
msg;
529 msg <<
"TFormula interprets the formula " << formula <<
" as " <<
theFormula->GetNdim()+
nullDim <<
"-dimensional with undefined variable(s) {";
530 for (
auto i=0; i <
nullDim; ++i) {
533 msg <<
"}, which could not be supplied by RooFit."
534 <<
"\nThe formula must be modified, or those variables must be supplied in the list of variables." << std::endl;
536 throw std::invalid_argument(
msg.str());
static void indent(ostringstream &buf, int indent_level)
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 r
const_iterator begin() const
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
A space to attach TBranches.
Abstract container object that can hold multiple RooAbsArg objects.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
Abstract base class for objects that represent a real value and implements functionality common to al...
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
std::span< const double > at(RooAbsArg const *arg, RooAbsArg const *caller=nullptr)
std::span< double > output()
A 'mix-in' base class that define the standard RooFit plotting and printing methods.
The TNamed class is the base class for all named ROOT classes.
Mother of all ROOT objects.
RooCmdArg ClassName(const char *name)
void replaceAll(std::string &inOut, std::string_view what, std::string_view with)