00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "RooFit.h"
00041 #include "Riostream.h"
00042
00043 #include "RooFormulaVar.h"
00044 #include "RooFormulaVar.h"
00045 #include "RooStreamParser.h"
00046 #include "RooNLLVar.h"
00047 #include "RooChi2Var.h"
00048 #include "RooMsgService.h"
00049
00050
00051
00052 ClassImp(RooFormulaVar)
00053
00054
00055
00056
00057 RooFormulaVar::RooFormulaVar(const char *name, const char *title, const char* inFormula, const RooArgList& dependents) :
00058 RooAbsReal(name,title),
00059 _actualVars("actualVars","Variables used by formula expression",this),
00060 _formula(0), _formExpr(inFormula)
00061 {
00062
00063
00064 _actualVars.add(dependents) ;
00065
00066 if (_actualVars.getSize()==0) _value = traceEval(0) ;
00067 }
00068
00069
00070
00071
00072 RooFormulaVar::RooFormulaVar(const char *name, const char *title, const RooArgList& dependents) :
00073 RooAbsReal(name,title),
00074 _actualVars("actualVars","Variables used by formula expression",this),
00075 _formula(0), _formExpr(title)
00076 {
00077
00078
00079 _actualVars.add(dependents) ;
00080
00081 if (_actualVars.getSize()==0) _value = traceEval(0) ;
00082 }
00083
00084
00085
00086
00087 RooFormulaVar::RooFormulaVar(const RooFormulaVar& other, const char* name) :
00088 RooAbsReal(other, name),
00089 _actualVars("actualVars",this,other._actualVars),
00090 _formula(0), _formExpr(other._formExpr)
00091 {
00092
00093 }
00094
00095
00096
00097
00098 RooFormulaVar::~RooFormulaVar()
00099 {
00100
00101
00102 if (_formula) delete _formula ;
00103 }
00104
00105
00106
00107
00108 RooFormula& RooFormulaVar::formula() const
00109 {
00110
00111
00112 if (!_formula) {
00113 _formula = new RooFormula(GetName(),_formExpr,_actualVars) ;
00114 }
00115 return *_formula ;
00116 }
00117
00118
00119
00120
00121 Double_t RooFormulaVar::getVal(const RooArgSet* set) const
00122 {
00123
00124
00125 _nset = (RooArgSet*) set ;
00126 return RooAbsReal::getVal(set) ;
00127 }
00128
00129
00130
00131
00132 Double_t RooFormulaVar::evaluate() const
00133 {
00134
00135 return formula().eval(_nset) ;
00136 }
00137
00138
00139
00140
00141 Bool_t RooFormulaVar::isValidReal(Double_t , Bool_t ) const
00142 {
00143
00144 return kTRUE ;
00145 }
00146
00147
00148
00149
00150 Bool_t RooFormulaVar::redirectServersHook(const RooAbsCollection& newServerList, Bool_t mustReplaceAll, Bool_t nameChange, Bool_t )
00151 {
00152
00153 return _formula ? _formula->changeDependents(newServerList,mustReplaceAll,nameChange) : kFALSE ;
00154 }
00155
00156
00157
00158
00159 void RooFormulaVar::printMultiline(ostream& os, Int_t contents, Bool_t verbose, TString indent) const
00160 {
00161
00162
00163 RooAbsReal::printMultiline(os,contents,verbose,indent);
00164 if(verbose) {
00165 indent.Append(" ");
00166 os << indent;
00167 formula().printMultiline(os,contents,verbose,indent);
00168 }
00169 }
00170
00171
00172
00173
00174 void RooFormulaVar::printMetaArgs(ostream& os) const
00175 {
00176
00177 os << "formula=\"" << _formExpr << "\" " ;
00178 }
00179
00180
00181
00182
00183
00184 Bool_t RooFormulaVar::readFromStream(istream& , Bool_t , Bool_t )
00185 {
00186
00187
00188 coutE(InputArguments) << "RooFormulaVar::readFromStream(" << GetName() << "): can't read" << endl ;
00189 return kTRUE ;
00190 }
00191
00192
00193
00194
00195 void RooFormulaVar::writeToStream(ostream& os, Bool_t compact) const
00196 {
00197
00198
00199 if (compact) {
00200 cout << getVal() << endl ;
00201 } else {
00202 os << GetTitle() ;
00203 }
00204 }
00205
00206
00207
00208 Double_t RooFormulaVar::defaultErrorLevel() const
00209 {
00210
00211
00212
00213
00214
00215
00216
00217
00218 RooAbsReal* nllArg(0) ;
00219 RooAbsReal* chi2Arg(0) ;
00220
00221 TIterator* iter = _actualVars.createIterator() ;
00222 RooAbsArg* arg ;
00223 while((arg=(RooAbsArg*)iter->Next())) {
00224 if (dynamic_cast<RooNLLVar*>(arg)) {
00225 nllArg = (RooAbsReal*)arg ;
00226 }
00227 if (dynamic_cast<RooChi2Var*>(arg)) {
00228 chi2Arg = (RooAbsReal*)arg ;
00229 }
00230 }
00231 delete iter ;
00232
00233 if (nllArg && !chi2Arg) {
00234 coutI(Minimization) << "RooFormulaVar::defaultErrorLevel(" << GetName()
00235 << ") Formula contains a RooNLLVar, using its error level" << endl ;
00236 return nllArg->defaultErrorLevel() ;
00237 } else if (chi2Arg && !nllArg) {
00238 coutI(Minimization) << "RooFormulaVar::defaultErrorLevel(" << GetName()
00239 << ") Formula contains a RooChi2Var, using its error level" << endl ;
00240 return chi2Arg->defaultErrorLevel() ;
00241 } else if (!nllArg && !chi2Arg) {
00242 coutI(Minimization) << "RooFormulaVar::defaultErrorLevel(" << GetName() << ") WARNING: "
00243 << "Formula contains neither RooNLLVar nor RooChi2Var server, using default level of 1.0" << endl ;
00244 } else {
00245 coutI(Minimization) << "RooFormulaVar::defaultErrorLevel(" << GetName() << ") WARNING: "
00246 << "Formula contains BOTH RooNLLVar and RooChi2Var server, using default level of 1.0" << endl ;
00247 }
00248
00249 return 1.0 ;
00250 }
00251
00252
00253
00254