43 _allParams.add(paramList);
51 if (!param->isConstant() && !canBeFloating(*param)) {
52 oocoutW(_context, Minimization) <<
"RooAbsMinimizerFcn::RooAbsMinimizerFcn: removing parameter "
53 << param->GetName() <<
" from list because it is not of type RooRealVar"
58 _allParams.
snapshot(_allParamsInit,
false);
60 std::size_t iParam = 0;
62 if (!treatAsConstant(*param)) {
63 _floatableParamIndices.push_back(iParam);
71bool RooAbsMinimizerFcn::synchronizeParameterSettings(std::vector<ROOT::Fit::ParameterSettings> ¶meters,
76 for (std::size_t i = 0; i < _allParams.size(); ++i) {
77 if (treatAsConstant(_allParamsInit[i]) && !treatAsConstant(_allParams[i])) {
79 ss <<
"RooMinimzer: the parameter named " << _allParams[i].GetName()
80 <<
" is not constant anymore, but it was constant at the time where the RooMinimizer was constructed."
81 " This is illegal. The other way around is supported: you can always change the constant flag of "
82 "parameters that were floating at the time the minimizer was instantiated.";
83 oocxcoutF(
nullptr, LinkStateMgmt) << ss.str() << std::endl;
84 throw std::runtime_error(ss.str());
88 std::vector<ROOT::Fit::ParameterSettings> oldParameters = parameters;
91 for (std::size_t index = 0; index < getNDim(); index++) {
93 auto &par = floatableParam(index);
101 double pmin = par.hasMin() ? par.getMin() : 0.0;
102 double pmax = par.hasMax() ? par.getMax() : 0.0;
105 double pstep = par.getError();
108 if (par.hasMin() && par.hasMax()) {
109 pstep = 0.1 * (pmax - pmin);
112 if (pmax - par.getVal() < 2 * pstep) {
113 pstep = (pmax - par.getVal()) / 2;
114 }
else if (par.getVal() - pmin < 2 * pstep) {
115 pstep = (par.getVal() - pmin) / 2;
120 pstep = 0.1 * (pmax - pmin);
127 oocoutW(_context, Minimization)
128 <<
"RooAbsMinimizerFcn::synchronize: WARNING: no initial error estimate available for " << par.GetName()
129 <<
": using " << pstep << std::endl;
133 if (par.hasMin() && par.hasMax()) {
134 parameters.emplace_back(par.GetName(), par.getVal(), pstep, pmin, pmax);
136 parameters.emplace_back(par.GetName(), par.getVal(), pstep);
138 parameters.back().SetLowerLimit(pmin);
139 }
else if (par.hasMax()) {
140 parameters.back().SetUpperLimit(pmax);
144 par.isConstant() ? parameters.back().Fix() : parameters.back().Release();
148 bool constStateChange =
false;
149 bool constValChange =
false;
150 for (std::size_t i = 0; i < oldParameters.size(); ++i) {
151 auto const &newParam = parameters[i];
152 auto const &oldParam = oldParameters[i];
153 constStateChange &= (newParam.IsFixed() != oldParam.IsFixed());
154 constValChange &= (newParam.IsFixed() && (newParam.Value() != oldParam.Value()));
156 optimizeConstantTerms(constStateChange, constValChange);
162bool RooAbsMinimizerFcn::Synchronize(std::vector<ROOT::Fit::ParameterSettings> ¶meters)
164 return synchronizeParameterSettings(parameters, _optConst);
168void RooAbsMinimizerFcn::BackProp()
170 auto const &results = _context->fitter()->Result();
172 for (std::size_t index = 0; index < getNDim(); index++) {
174 auto ¶m = floatableParam(index);
176 double value = results.fParams[index];
177 SetPdfParamVal(index, value);
180 double err = results.fErrors[index];
183 double eminus = results.lowerError(index);
184 double eplus = results.upperError(index);
186 if (eplus > 0 || eminus < 0) {
188 param.setAsymError(eminus, eplus);
191 param.removeAsymError();
199bool RooAbsMinimizerFcn::SetLogFile(
const char *inLogfile)
202 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setLogFile: closing previous log file" << std::endl;
207 _logfile =
new std::ofstream(inLogfile);
208 if (!_logfile->good()) {
209 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setLogFile: cannot open file " << inLogfile << std::endl;
221void RooAbsMinimizerFcn::ApplyCovarianceMatrix(
TMatrixDSym &V)
223 for (
unsigned int i = 0; i < getNDim(); i++) {
224 floatableParam(i).setError(std::sqrt(V(i, i)));
229bool RooAbsMinimizerFcn::SetPdfParamVal(
int index,
double value)
const
231 auto &par = floatableParam(index);
233 if (par.getVal() != value) {
235 std::cout << par.GetName() <<
"=" << value <<
", ";
247void RooAbsMinimizerFcn::printEvalErrors()
const
249 if (cfg().printEvalErrors < 0)
252 std::ostringstream msg;
253 if (cfg().doEEWall) {
254 msg <<
"RooAbsMinimizerFcn: Minimized function has error status." << std::endl
255 <<
"Returning maximum FCN so far (" << _maxFCN
256 <<
") to force MIGRAD to back out of this region. Error log follows.\n";
258 msg <<
"RooAbsMinimizerFcn: Minimized function has error status but is ignored.\n";
261 msg <<
"Parameter values: ";
262 for (std::size_t i = 0; i < getNDim(); ++i) {
263 auto &var = floatableParam(i);
264 msg <<
"\t" << var.GetName() <<
"=" << var.getVal();
269 ooccoutW(_context, Minimization) << msg.str() << std::endl;
278double RooAbsMinimizerFcn::applyEvalErrorHandling(
double fvalue)
const
285 if (cfg().doEEWall) {
287 fvalue = (std::isfinite(_maxFCN) ? _maxFCN : 0.) + cfg().recoverFromNaN * badness;
290 if (_evalCounter > 0 && _evalCounter == _numBadNLL) {
294 _funcOffset = -fvalue;
296 fvalue += _funcOffset;
297 _maxFCN = std::max(fvalue, _maxFCN);
302void RooAbsMinimizerFcn::finishDoEval()
const
307void RooAbsMinimizerFcn::setOptimizeConst(
int flag)
309 auto ctx = _context->makeEvalErrorContext();
311 if (_optConst && !flag) {
312 if (_context->getPrintLevel() > -1) {
313 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization"
318 }
else if (!_optConst && flag) {
319 if (_context->getPrintLevel() > -1) {
320 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setOptimizeConst: activating const optimization"
325 }
else if (_optConst && flag) {
326 if (_context->getPrintLevel() > -1) {
327 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setOptimizeConst: const optimization already active"
331 if (_context->getPrintLevel() > -1) {
332 oocoutI(_context, Minimization) <<
"RooAbsMinimizerFcn::setOptimizeConst: const optimization wasn't active"
338void RooAbsMinimizerFcn::optimizeConstantTerms(
bool constStatChange,
bool constValChange)
340 auto ctx = _context->makeEvalErrorContext();
342 if (constStatChange) {
344 oocoutI(_context, Minimization)
345 <<
"RooAbsMinimizerFcn::optimizeConstantTerms: set of constant parameters changed, rerunning const optimizer"
348 }
else if (constValChange) {
349 oocoutI(_context, Minimization)
350 <<
"RooAbsMinimizerFcn::optimizeConstantTerms: constant parameter values changed, rerunning const optimizer"
356RooArgList RooAbsMinimizerFcn::floatParams()
const
359 for (RooAbsArg *param : _allParams) {
360 if (!treatAsConstant(*param))
366RooArgList RooAbsMinimizerFcn::constParams()
const
369 for (RooAbsArg *param : _allParams) {
370 if (treatAsConstant(*param))
376RooArgList RooAbsMinimizerFcn::initFloatParams()
const
378 RooArgList initFloatableParams;
380 for (RooAbsArg *param : _allParamsInit) {
381 if (!treatAsConstant(*param))
382 initFloatableParams.
add(*param);
TMatrixTSym< Double_t > TMatrixDSym
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooAbsCollection * snapshot(bool deepCopy=true) const
Take a snap shot of current collection contents.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
static Int_t numEvalErrors()
Return the number of logged evaluation errors since the last clearing.
static void printEvalErrors(std::ostream &os=std::cout, Int_t maxPerNode=10000000)
Print all outstanding logged evaluation error on the given ostream.
static void clearEvalErrorLog()
Clear the stack of evaluation error messages.
RooArgList is a container object that can hold multiple RooAbsArg objects.
Wrapper class around ROOT::Math::Minimizer that provides a seamless interface between the minimizer f...
static float unpackNaN(double val)
If val is NaN and a this NaN has been tagged as containing a payload, unpack the float from the manti...