59#ifdef ROOFIT_MULTIPROCESS
76class FreezeDisconnectedParametersRAII {
81 if (!_frozen.empty()) {
82 oocoutI(_minimizer, Minimization) <<
"Freezing disconnected parameters: " << _frozen << std::endl;
87 if (!_frozen.empty()) {
88 oocoutI(_minimizer, Minimization) <<
"Unfreezing disconnected parameters: " << _frozen << std::endl;
100 std::vector<std::vector<int>>
combos;
101 std::vector<int> base(
maxValues.size(), 0);
103 for (
size_t i = 0; i <
maxValues.size(); ++i) {
105 std::vector<int> tmp = base;
114 const std::vector<int> &base)
117 for (
size_t i = 0; i <
combo.size(); ++i) {
145#ifdef ROOFIT_MULTIPROCESS
149 coutI(InputArguments) <<
"Modular likelihood detected and likelihood parallelization requested, "
150 <<
"also setting parallel gradient calculation mode." << std::endl;
159 _fcn = std::make_unique<RooFit::TestStatistics::MinuitFcnGrad>(
162 static_cast<RooFit::TestStatistics::LikelihoodMode>(int(_cfg.enableParallelDescent))},
165 throw std::logic_error(
166 "Parallel minimization requested, but ROOT was not compiled with multiprocessing enabled, "
167 "please recompile with -Droofit_multiprocess=ON for parallel evaluation");
170 coutW(InputArguments)
171 <<
"Requested modular likelihood without gradient parallelization, some features such as offsetting "
172 <<
"may not work yet. Non-modular likelihoods are more reliable without parallelization." << std::endl;
178 _fcn = std::make_unique<RooMinimizerFcn>(&function,
this);
182 throw std::logic_error(
"In RooMinimizer constructor: Selected likelihood evaluation but a "
183 "non-modular likelihood was given. Please supply ModularL(true) as an "
184 "argument to createNLL for modular likelihoods to use likelihood "
185 "or gradient parallelization.");
187 _fcn = std::make_unique<RooMinimizerFcn>(&function,
this);
195 RooSentinel::activate();
303 std::stringstream
ss;
304 ss <<
"In RooMinimizer::setMinimizerType: only Minuit2 is supported when not using classic function mode!";
306 ss <<
"\nPlease set it as your default minimizer via "
307 "ROOT::Math::MinimizerOptions::SetDefaultMinimizer(\"Minuit2\").";
309 throw std::invalid_argument(
ss.str());
320 coutE(Minimization) <<
"RooMinimizer: all function calls during minimization gave invalid NLL values!"
337#ifdef ROOFIT_MULTIPROCESS
340 throw std::logic_error(
"ProcessTimer, but ROOT was not compiled with multiprocessing enabled, "
341 "please recompile with -Droofit_multiprocess=ON for logging with the "
373 return exec(
"migrad",
"MIGRAD");
378 FreezeDisconnectedParametersRAII
freeze(
this, *
_fcn);
417 coutW(Minimization) <<
"RooMinimizer::hesse: Error, run Migrad before Hesse!" << std::endl;
422 return exec(
"hesse",
"HESSE");
434 coutW(Minimization) <<
"RooMinimizer::minos: Error, run Migrad before Minos!" << std::endl;
439 return exec(
"minos",
"MINOS");
451 coutW(Minimization) <<
"RooMinimizer::minos: Error, run Migrad before Minos!" << std::endl;
454 FreezeDisconnectedParametersRAII
freeze(
this, *
_fcn);
500 return exec(
"seek",
"SEEK");
511 return exec(
"simplex",
"SIMPLEX");
522 return exec(
"migradimproved",
"IMPROVE");
561 coutW(Minimization) <<
"RooMinimizer::save: Error, run minimization before!" << std::endl;
567 auto fitRes = std::make_unique<RooFitResult>(
name.c_str(), title.c_str());
571 fitRes->setNumInvalidNLL(
_fcn->GetNumInvalidNLL());
578 fitRes->setInitParList(
_fcn->initFloatParams());
595double covMatrix(std::vector<double>
const &
covMat,
unsigned int i,
unsigned int j)
603double correlation(std::vector<double>
const &
covMat,
unsigned int i,
unsigned int j)
655 coutE(Minimization) <<
"RooMinimizer::contour(" <<
GetName() <<
") ERROR: " <<
var1.GetName()
656 <<
" is not a floating parameter of " <<
_fcn->getFunctionName() << std::endl;
662 coutE(Minimization) <<
"RooMinimizer::contour(" <<
GetName() <<
") ERROR: " <<
var2.GetName()
663 <<
" is not a floating parameter of PDF " <<
_fcn->getFunctionName() << std::endl;
677 coutW(Minimization) <<
"RooMinimizer::contour: Error, run Migrad before contours!" << std::endl;
692 for (
int ic = 0;
ic < 6;
ic++) {
704 coutE(Minimization) <<
"RooMinimizer::contour(" <<
GetName()
705 <<
") ERROR: MINUIT did not return a contour graph for n=" <<
n[
ic] << std::endl;
711 std::stringstream
name;
712 name <<
"contour_" <<
_fcn->getFunctionName() <<
"_n" <<
n[
ic];
736#ifdef ROOFIT_MULTIPROCESS
747 coutI(Minimization) <<
"Not adding parameters to processtimer because multiprocessing is not enabled." << std::endl;
771 coutI(Minimization) <<
"Command timer: ";
773 coutI(Minimization) <<
"Session timer: ";
781 return _fcn->getMultiGenFcn();
801 oocoutE(
nullptr, InputArguments) <<
"RooMinimizer::save: Error, run minimization before!" << std::endl;
805 auto res = std::make_unique<RooFitResult>(
"lastMinuitFit",
"Last MINUIT fit");
814 for (
unsigned int i = 0; i <
_fcn->getNDim(); ++i) {
824 std::unique_ptr<RooRealVar> var;
841 res->setConstParList(constPars);
846 res->setCovQual(
_minimizer->CovMatrixStatus());
847 res->setStatus(
_result->fStatus);
872 return _fcn->evalCounter();
876 _fcn->zeroEvalCount();
881 return _fcn->getNDim();
886 return _fcn->GetLogFile();
890 return _fcn->GetMaxFCN();
894 return _fcn->getOffset();
904 return std::make_unique<RooAbsReal::EvalErrorContext>(
m);
913 unsigned int npar =
fcn.NDim();
915 coutE(Minimization) <<
"RooMinimizer::fitFCN(): FCN function has zero parameters" << std::endl;
924 for (
auto arg :
_fcn->allParams()) {
925 if (arg->isCategory() && !arg->isConstant())
939 for (
auto arg :
_fcn->allParams()) {
940 if (!arg->isCategory() && !arg->isConstant())
945 coutI(Minimization) <<
"[fitFCN] No discrete parameters, performing continuous minimization only" << std::endl;
946 FreezeDisconnectedParametersRAII
freeze(
this, *
_fcn);
949 _result = std::make_unique<FitResult>();
962 std::set<std::vector<int>>
tried;
963 std::map<std::vector<int>,
double>
nllMap;
977 for (
size_t i = 0; i < nPdfs; ++i)
982 for (
size_t i = 0; i < nPdfs; ++i) {
986 FreezeDisconnectedParametersRAII
freeze(
this, *
_fcn);
989 for (
size_t i = 0; i < nPdfs; ++i)
1004 for (
size_t i = 0; i < nPdfs; ++i) {
1008 FreezeDisconnectedParametersRAII
freeze(
this, *
_fcn);
1011 coutI(Minimization) <<
"All NLL Values per Combination:" << std::endl;
1014 double val =
entry.second;
1016 std::stringstream
ss;
1018 for (
size_t i = 0; i <
combo.size(); ++i) {
1020 if (i + 1 <
combo.size())
1023 ss <<
"], NLL: " << val;
1025 coutI(Minimization) <<
ss.str() << std::endl;
1028 std::stringstream
ssBest;
1029 ssBest <<
"DP Best Indices: [";
1040 _result = std::make_unique<FitResult>();
1053 coutE(Minimization) <<
"RooMinimizer::calculateHessErrors() Error re-initializing the minimizer" << std::endl;
1060 coutE(Minimization) <<
"RooMinimizer::calculateHessErrors() Error when calculating Hessian" << std::endl;
1087 coutE(Minimization) <<
"RooMinimizer::calculateHessErrors() Error re-initializing the minimizer" << std::endl;
1101 coutI(Minimization) <<
"RooMinimizer::calculateMinosErrors() Run again Minos for some parameters because a "
1102 "new Minimum has been found"
1105 for (
int i = 0; i <
iparMax; ++i) {
1123 <<
"RooMinimizer::calculateMinosErrors() Minos error calculation failed for all the selected parameters"
1141 std::vector<double>
v;
1142 for (std::size_t i = 0; i <
_fcn->getNDim(); ++i) {
1161 coutI(Minimization) <<
"RooMinimizer::updateMinimizerOptions(): " <<
msg << std::endl;
1164 std::string
msg =
"Cannot change minimizer. Continue using " +
_result->fMinimType;
1165 coutW(Minimization) <<
"RooMinimizer::updateMinimizerOptions() " <<
msg << std::endl;
1184 for (
unsigned int i = 0; i <
_config.
NPar(); ++i) {
1205 if ((
fMinimType.find(
"Fumili") == std::string::npos) && (
fMinimType.find(
"GSLMultiFit") == std::string::npos)) {
1206 if (!
fconfig.MinimizerAlgoType().empty())
1211 for (
unsigned int i = 0; i <
fconfig.NPar(); ++i) {
1228 _result->fStatus = min.Status();
1229 _result->fCovStatus = min.CovMatrixStatus();
1230 _result->fVal = min.MinValue();
1235 const unsigned int npar = min.NDim();
1240 _result->fParams = std::vector<double>(min.X(), min.X() +
npar);
1244 for (
unsigned int i = 0; i <
npar; ++i) {
1250 for (
unsigned int ipar = 0; ipar <
npar; ++ipar) {
1251 if (
fconfig.ParSettings(ipar).IsFixed())
1252 _result->fFixedParams[ipar] =
true;
1261 if (min.Errors() !=
nullptr) {
1281 _result->fVal = min.MinValue();
1283 _result->fStatus = min.Status();
1284 _result->fCovStatus = min.CovMatrixStatus();
1289 if (min.Errors() !=
nullptr) {
1303 if (
_result->fCovStatus != 0) {
1309 for (
unsigned int i = 0; i <
npar; ++i) {
1310 for (
unsigned int j = 0;
j <= i; ++
j)
1311 _result->fCovMatrix[
l++] = min.CovMatrix(i,
j);
1318 for (
unsigned int i = 0; i <
npar; ++i) {
1319 double globcc = min.GlobalCC(i);
1332 auto itr = fMinosErrors.find(i);
1333 return (
itr != fMinosErrors.
end()) ?
itr->second.first : error(i);
1340 auto itr = fMinosErrors.find(i);
1341 return (
itr != fMinosErrors.
end()) ?
itr->second.second : error(i);
1346 return fFixedParams.find(ipar) != fFixedParams.end();
1351 const size_t nParams = fParams.size();
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
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
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 Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
const std::vector< unsigned int > & MinosParams() const
return vector of parameter indices for which the Minos Error will be computed
void SetMinimizer(const char *type, const char *algo=nullptr)
set minimizer type and algorithm
void SetMinosErrors(bool on=true)
set Minos errors computation to be performed after fitting
unsigned int NPar() const
number of parameters settings
std::string MinimizerName() const
return Minimizer full name (type / algorithm)
const std::vector< ROOT::Fit::ParameterSettings > & ParamsSettings() const
get the vector of parameter settings (const method)
ROOT::Math::Minimizer * CreateMinimizer()
create a new minimizer according to chosen configuration
const ParameterSettings & ParSettings(unsigned int i) const
get the parameter settings for the i-th parameter (const method)
ROOT::Math::MinimizerOptions & MinimizerOptions()
access to the minimizer control parameter (non const method)
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
bool IsFixed() const
check if is fixed
void SetValue(double val)
set the value
void SetStepSize(double err)
set the step size
double Value() const
return parameter value
double StepSize() const
return step size
Documentation for the abstract class IBaseFunctionMultiDim.
void SetMaxFunctionCalls(unsigned int maxfcn)
set maximum of function calls
void SetStrategy(int stra)
set the strategy
void SetMaxIterations(unsigned int maxiter)
set maximum iterations (one iteration can have many function calls)
static const std::string & DefaultMinimizerType()
int PrintLevel() const
non-static methods for retrieving options
void SetErrorDef(double err)
set error def
void SetPrintLevel(int level)
set print level
void SetTolerance(double tol)
set the tolerance
Abstract Minimizer class, defining the interface for the various minimizer (like Minuit2,...
const_iterator begin() const
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
bool isConstant() const
Check if the "Constant" attribute is set.
RooAbsCollection * snapshot(bool deepCopy=true) const
Take a snap shot of current collection contents.
Int_t index(const RooAbsArg *arg) const
Returns index of given arg, or -1 if arg is not in the collection.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
Abstract base class for objects that represent a real value and implements functionality common to al...
static void clearEvalErrorLog()
Clear the stack of evaluation error messages.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Object to represent discrete states.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
static void setDefaultNWorkers(unsigned int N_workers)
static void setTimingAnalysis(bool timingAnalysis)
static void add_metadata(json data)
RooAbsReal that wraps RooAbsL likelihoods for use in RooFit outside of the RooMinimizer context.
Wrapper class around ROOT::Math::Minimizer that provides a seamless interface between the minimizer f...
void setRecoverFromNaNStrength(double strength)
Try to recover from invalid function values.
int getPrintLevel()
Get the MINUIT internal printing level.
void optimizeConst(int flag)
If flag is true, perform constant term optimization on function being minimized.
void initMinimizerFirstPart()
Initialize the part of the minimizer that is independent of the function to be minimized.
std::ofstream * logfile()
int simplex()
Execute SIMPLEX.
std::unique_ptr< TMatrixDSym > _extV
void setMinimizerType(std::string const &type)
Choose the minimizer algorithm.
RooFit::OwningPtr< RooFitResult > save(const char *name=nullptr, const char *title=nullptr)
Save and return a RooFitResult snapshot of current minimizer status.
std::vector< std::pair< std::string, int > > _statusHistory
void profileStart()
Start profiling timer.
RooPlot * contour(RooRealVar &var1, RooRealVar &var2, double n1=1.0, double n2=2.0, double n3=0.0, double n4=0.0, double n5=0.0, double n6=0.0, unsigned int npoints=50)
Create and draw a TH2 with the error contours in the parameters var1 and var2.
std::unique_ptr< ROOT::Math::Minimizer > _minimizer
! pointer to used minimizer
bool setLogFile(const char *logf=nullptr)
void initMinimizerFcnDependentPart(double defaultErrorLevel)
Initialize the part of the minimizer that is dependent on the function to be minimized.
void fillCorrMatrix(RooFitResult &fitRes)
double & fcnOffset() const
ROOT::Fit::FitConfig _config
fitter configuration (options and parameter settings)
void profileStop()
Stop profiling timer and report results of last session.
int minos()
Execute MINOS.
bool calculateHessErrors()
int hesse()
Execute HESSE.
bool calculateMinosErrors()
void setErrorLevel(double level)
Set the level for MINUIT error analysis to the given value.
void determineStatus(bool fitterReturnValue)
int migrad()
Execute MIGRAD.
bool update(bool isValid)
bool updateMinimizerOptions(bool canDifferentMinim=true)
void setEps(double eps)
Change MINUIT epsilon.
void setPrintLevel(int newLevel)
Change the MINUIT internal printing level.
void fillResult(bool isValid)
int exec(std::string const &algoName, std::string const &statusName)
int improve()
Execute IMPROVE.
void setOffsetting(bool flag)
Enable internal likelihood offsetting for enhanced numeric precision.
RooMinimizer::Config _cfg
bool fitFCN(const ROOT::Math::IMultiGenFunction &fcn)
std::unique_ptr< FitResult > _result
! pointer to the object containing the result of the fit
RooFit::OwningPtr< RooFitResult > lastMinuitFit()
void saveStatus(const char *label, int status)
~RooMinimizer() override
Destructor.
int minimize(const char *type, const char *alg=nullptr)
Minimise the function passed in the constructor.
ROOT::Math::IMultiGenFunction * getMultiGenFcn() const
std::unique_ptr< RooAbsReal::EvalErrorContext > makeEvalErrorContext() const
RooMinimizer(RooAbsReal &function, Config const &cfg={})
Construct MINUIT interface to given function.
void setMaxFunctionCalls(int n)
Change maximum number of likelihood function class from MINUIT (RooMinimizer default 500 * #parameter...
void setStrategy(int istrat)
Change MINUIT strategy to istrat.
void setMaxIterations(int n)
Change maximum number of MINUIT iterations (RooMinimizer default 500 * #parameters)
void addParamsToProcessTimer()
Add parameters in metadata field to process timer.
std::unique_ptr< RooAbsMinimizerFcn > _fcn
void applyCovarianceMatrix(TMatrixDSym const &V)
Apply results of given external covariance matrix.
static RooMsgService & instance()
Return reference to singleton instance.
Plot frame and a container for graphics objects within that frame.
void addObject(TObject *obj, Option_t *drawOptions="", bool invisible=false)
Add a generic object to this plot.
Variable that can be changed from the outside.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
A TGraph is an object made of two arrays X and Y with npoints each.
void SetName(const char *name="") override
Set graph name.
virtual const char * GetName() const
Returns name of object.
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Stop()
Stop the stopwatch.
void Print(Option_t *option="") const override
Print the real and cpu time passed between the start and stop events.
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
bool setAllConstant(const RooAbsCollection &coll, bool constant=true)
set all RooRealVars to constants. return true if at least one changed status
Config argument to RooMinimizer constructor.
bool setInitialCovariance
std::string minimizerType
bool enableParallelGradient
double upperError(unsigned int i) const
std::string fMinimType
string indicating type of minimizer
std::vector< double > fErrors
errors
std::vector< double > fParams
parameter values. Size is total number of parameters
void GetCovarianceMatrix(TMatrixDSym &cov) const
std::map< unsigned int, bool > fFixedParams
list of fixed parameters
bool isParameterFixed(unsigned int ipar) const
double lowerError(unsigned int i) const