62 ClassImp(RooFormulaVar);
73 RooFormulaVar::RooFormulaVar(
const char *name,
const char *title,
const char* inFormula,
const RooArgList& dependents,
74 bool checkVariables) :
75 RooAbsReal(name,title),
76 _actualVars(
"actualVars",
"Variables used by formula expression",this),
79 _actualVars.add(dependents) ;
81 if (_actualVars.getSize()==0) {
82 _value = traceEval(0);
84 _formula.reset(
new RooFormula(GetName(), _formExpr, _actualVars, checkVariables));
85 _formExpr = _formula->formulaString().c_str();
97 RooFormulaVar::RooFormulaVar(
const char *name,
const char *title,
const RooArgList& dependents,
98 bool checkVariables) :
99 RooAbsReal(name,title),
100 _actualVars(
"actualVars",
"Variables used by formula expression",this),
103 _actualVars.add(dependents) ;
105 if (_actualVars.getSize()==0) {
106 _value = traceEval(0);
108 _formula.reset(
new RooFormula(GetName(), _formExpr, _actualVars, checkVariables));
109 _formExpr = _formula->formulaString().c_str();
118 RooFormulaVar::RooFormulaVar(
const RooFormulaVar& other,
const char* name) :
119 RooAbsReal(other, name),
120 _actualVars(
"actualVars",this,other._actualVars),
121 _formExpr(other._formExpr)
123 if (other._formula && other._formula->ok()) {
124 _formula.reset(
new RooFormula(GetName(), _formExpr, _actualVars));
125 _formExpr = _formula->formulaString().c_str();
132 RooFormula& RooFormulaVar::formula()
const
136 auto theFormula =
new RooFormula(GetName(), _formExpr, _actualVars);
137 const_cast<std::unique_ptr<RooFormula>&
>(this->_formula).reset(theFormula);
138 const_cast<TString&
>(_formExpr) = _formula->formulaString().c_str();
149 Double_t RooFormulaVar::evaluate()
const
151 return formula().eval(_lastNSet);
158 Bool_t RooFormulaVar::redirectServersHook(
const RooAbsCollection& newServerList, Bool_t mustReplaceAll, Bool_t nameChange, Bool_t )
160 bool success = formula().changeDependents(newServerList,mustReplaceAll,nameChange);
162 _formExpr = formula().GetTitle();
171 void RooFormulaVar::printMultiline(ostream& os, Int_t contents, Bool_t verbose, TString indent)
const
173 RooAbsReal::printMultiline(os,contents,verbose,indent);
177 formula().printMultiline(os,contents,verbose,indent);
186 void RooFormulaVar::printMetaArgs(ostream& os)
const
188 os <<
"formula=\"" << _formExpr <<
"\" " ;
197 Bool_t RooFormulaVar::readFromStream(istream& , Bool_t , Bool_t )
199 coutE(InputArguments) <<
"RooFormulaVar::readFromStream(" << GetName() <<
"): can't read" << endl ;
208 void RooFormulaVar::writeToStream(ostream& os, Bool_t compact)
const
211 cout << getVal() << endl ;
222 std::list<Double_t>* RooFormulaVar::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi)
const
224 for (
const auto par : _actualVars) {
225 auto func =
static_cast<const RooAbsReal*
>(par);
226 list<Double_t>* binb =
nullptr;
228 if (func && (binb = func->binBoundaries(obs,xlo,xhi)) ) {
241 std::list<Double_t>* RooFormulaVar::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi)
const
243 for (
const auto par : _actualVars) {
244 auto func =
dynamic_cast<const RooAbsReal*
>(par);
245 list<Double_t>* hint =
nullptr;
247 if (func && (hint = func->plotSamplingHint(obs,xlo,xhi)) ) {
266 Double_t RooFormulaVar::defaultErrorLevel()
const
268 RooAbsReal* nllArg(0) ;
269 RooAbsReal* chi2Arg(0) ;
271 for (
const auto arg : _actualVars) {
272 if (dynamic_cast<RooNLLVar*>(arg)) {
273 nllArg = (RooAbsReal*)arg ;
275 if (dynamic_cast<RooChi2Var*>(arg)) {
276 chi2Arg = (RooAbsReal*)arg ;
280 if (nllArg && !chi2Arg) {
281 coutI(Minimization) <<
"RooFormulaVar::defaultErrorLevel(" << GetName()
282 <<
") Formula contains a RooNLLVar, using its error level" << endl ;
283 return nllArg->defaultErrorLevel() ;
284 }
else if (chi2Arg && !nllArg) {
285 coutI(Minimization) <<
"RooFormulaVar::defaultErrorLevel(" << GetName()
286 <<
") Formula contains a RooChi2Var, using its error level" << endl ;
287 return chi2Arg->defaultErrorLevel() ;
288 }
else if (!nllArg && !chi2Arg) {
289 coutI(Minimization) <<
"RooFormulaVar::defaultErrorLevel(" << GetName() <<
") WARNING: "
290 <<
"Formula contains neither RooNLLVar nor RooChi2Var server, using default level of 1.0" << endl ;
292 coutI(Minimization) <<
"RooFormulaVar::defaultErrorLevel(" << GetName() <<
") WARNING: "
293 <<
"Formula contains BOTH RooNLLVar and RooChi2Var server, using default level of 1.0" << endl ;