84 if (
this == &rhs)
return *
this;
110 MATH_WARN_MSG(
"Fitter::SetFunction",
"Requested function does not provide gradient - use it as non-gradient function ");
136 MATH_WARN_MSG(
"Fitter::SetFunction",
"Requested function does not provide gradient - use it as non-gradient function ");
178 unsigned int npar = fcn.
NDim();
180 MATH_ERROR_MSG(
"Fitter::SetFCN",
"FCN function has zero parameters ");
205 if (!
SetFCN(static_cast<const ROOT::Math::IMultiGenFunction &>(fcn),params, dataSize, chi2fit) )
return false;
214 if (!
SetFCN(fcn,params,fcn.
NPoints(), chi2fit) )
return false;
224 if (!
SetFCN(fcn,params,fcn.
NPoints(), chi2fit) )
return false;
235 if (!
SetFCN(fcn, params,dataSize,chi2fit) )
return false;
244 if (!
SetFCN(fcn, params,dataSize, chi2fit) )
return false;
250 if (!
SetFCN(fcn, params) )
return false;
256 if (!
SetFCN(fcn, params) )
return false;
261 bool Fitter::SetFCN(MinuitFCN_t fcn,
int npar,
const double * params ,
unsigned int dataSize ,
bool chi2fit ){
268 MATH_ERROR_MSG(
"Fitter::FitFCN",
"Fit Parameter settings have not been created ");
274 return SetFCN(newFcn,params,dataSize,chi2fit);
277 bool Fitter::FitFCN(MinuitFCN_t fcn,
int npar,
const double * params ,
unsigned int dataSize ,
bool chi2fit ) {
280 if (!
SetFCN(fcn, npar, params, dataSize, chi2fit))
return false;
292 MATH_ERROR_MSG(
"Fitter::FitFCN",
"Objective function has not been set");
309 MATH_ERROR_MSG(
"Fitter::FitFCN",
"Objective function has not been set");
315 double fcnval = (*fObjFunction)(
fResult->GetParams() );
326 std::shared_ptr<BinData> data = std::dynamic_pointer_cast<
BinData>(
fData);
331 MATH_ERROR_MSG(
"Fitter::DoLeastSquareFit",
"model function is not set");
352 MATH_INFO_MSG(
"Fitter::DoLeastSquareFit",
"use gradient from model function");
359 MATH_ERROR_MSG(
"Fitter::DoLeastSquareFit",
"wrong type of function - it does not provide gradient");
368 std::shared_ptr<BinData> data = std::dynamic_pointer_cast<
BinData>(
fData);
375 MATH_ERROR_MSG(
"Fitter::DoLikelihoodFit",
"model function is not set");
385 MATH_INFO_MSG(
"Fitter::DoLikelihoodFit",
"MINOS errors cannot be computed in weighted likelihood fits");
409 MATH_INFO_MSG(
"Fitter::DoLikelihoodFit",
"use gradient from model function");
413 MATH_ERROR_MSG(
"Fitter::DoLikelihoodFit",
"wrong type of function - it does not provide gradient");
419 MATH_WARN_MSG(
"Fitter::DoLikelihoodFit",
"Not-extended binned fit with gradient not yet supported - do an extended fit");
437 std::shared_ptr<UnBinData> data = std::dynamic_pointer_cast<
UnBinData>(
fData);
443 MATH_ERROR_MSG(
"Fitter::DoLikelihoodFit",
"model function is not set");
448 MATH_INFO_MSG(
"Fitter::DoLikelihoodFit",
"MINOS errors cannot be computed in weighted likelihood fits");
480 MATH_INFO_MSG(
"Fitter::DoLikelihoodFit",
"use gradient from model function");
484 MATH_WARN_MSG(
"Fitter::DoLikelihoodFit",
"Extended unbinned fit with gradient not yet supported - do a not-extended fit");
495 MATH_ERROR_MSG(
"Fitter::DoLikelihoodFit",
"wrong type of function - it does not provide gradient");
503 std::shared_ptr<BinData> data = std::dynamic_pointer_cast<
BinData>(
fData);
522 MATH_ERROR_MSG(
"Fitter::CalculateHessErrors",
"Objective function has not been set");
531 MATH_ERROR_MSG(
"Fitter::CalculateHessErrors",
"Re-computation of Hesse errors not implemented for weighted likelihood fits");
532 MATH_INFO_MSG(
"Fitter::CalculateHessErrors",
"Do the Fit using configure option FitConfig::SetParabErrors()");
557 MATH_ERROR_MSG(
"Fitter::CalculateHessErrors",
"Error initializing the minimizer");
564 MATH_ERROR_MSG(
"Fitter::CalculateHessErrors",
"Need to do a fit before calculating the errors");
570 if (!ret)
MATH_WARN_MSG(
"Fitter::CalculateHessErrors",
"Error when calculating Hessian");
602 MATH_ERROR_MSG(
"Fitter::CalculateMinosErrors",
"Minimizer does not exist - cannot calculate Minos errors");
607 MATH_ERROR_MSG(
"Fitter::CalculateMinosErrors",
"Invalid Fit Result - cannot calculate Minos errors");
612 MATH_ERROR_MSG(
"Fitter::CalculateMinosErrors",
"Computation of MINOS errors not implemented for weighted likelihood fits");
622 unsigned int n = (ipars.size() > 0) ? ipars.size() :
fResult->Parameters().size();
624 for (
unsigned int i = 0; i <
n; ++i) {
626 unsigned int index = (ipars.size() > 0) ? ipars[i] : i;
627 bool ret =
fMinimizer->GetMinosError(index, elow, eup);
628 if (ret)
fResult->SetMinosError(index, elow, eup);
632 MATH_ERROR_MSG(
"Fitter::CalculateMinosErrors",
"Minos error calculation failed for all parameters");
641 struct ObjFuncTrait {
642 static unsigned int NCalls(
const Func & ) {
return 0; }
643 static int Type(
const Func & ) {
return -1; }
644 static bool IsGrad() {
return false; }
650 static bool IsGrad() {
return false; }
656 static bool IsGrad() {
return true; }
667 MATH_ERROR_MSG(
"Fitter::DoInitMinimizer",
"wrong function dimension or wrong size for FitConfig");
683 MATH_ERROR_MSG(
"Fitter::DoInitMinimizer",
"wrong type of function - it does not provide gradient");
726 std::cout <<
"ROOT::Fit::Fitter::DoMinimization : ncalls = " <<
fResult->fNCalls <<
" type of objfunc " << fFitFitResType <<
" typeid: " <<
typeid(*fObjFunction).name() <<
" use gradient " <<
fUseGradient << std::endl;
754 for (
unsigned int i = 0; i <
fConfig.
NPar(); ++i) {
767 if (fcn) ncalls = fcn->
NCalls();
771 if (fcn) ncalls = fcn->
NCalls();
786 MATH_ERROR_MSG(
"Fitter::ApplyWeightCorrection",
"Must perform first a fit before applying the correction");
790 unsigned int n = loglw2.
NDim();
792 std::vector<double> cov(n*n);
793 bool ret =
fMinimizer->GetCovMatrix(&cov[0] );
795 MATH_ERROR_MSG(
"Fitter::ApplyWeightCorrection",
"Previous fit has no valid Covariance matrix");
812 MATH_ERROR_MSG(
"Fitter::ApplyWeightCorrection",
"Error running Hesse on weight2 likelihood - cannot compute errors");
817 MATH_WARN_MSG(
"Fitter::ApplyWeightCorrection",
"Covariance matrix for weighted likelihood is not accurate, the errors may be not reliable");
819 MATH_WARN_MSG(
"Fitter::ApplyWeightCorrection",
"Covariance matrix for weighted likelihood was forced to be defined positive");
822 MATH_ERROR_MSG(
"Fitter::ApplyWeightCorrection",
"Covariance matrix for weighted likelihood is not valid !");
836 std::vector<double> hes(n*n);
839 MATH_ERROR_MSG(
"Fitter::ApplyWeightCorrection",
"Error retrieving Hesse on weight2 likelihood - cannot compute errors");
855 std::vector<double> tmp(n*n);
856 for (
unsigned int i = 0; i <
n; ++i) {
857 for (
unsigned int j = 0; j <
n; ++j) {
858 for (
unsigned int k = 0; k <
n; ++k)
859 tmp[i*n+j] += hes[i*n + k] * cov[k*n + j];
863 std::vector<double> newCov(n*n);
864 for (
unsigned int i = 0; i <
n; ++i) {
865 for (
unsigned int j = 0; j <
n; ++j) {
866 for (
unsigned int k = 0; k <
n; ++k)
867 newCov[i*n+j] += cov[i*n + k] * tmp[k*n + j];
872 for (
unsigned int i = 0; i <
n; ++i) {
874 for (
unsigned int j = 0; j <= i; ++j)
875 fResult->fCovMatrix[k++] = newCov[i *n + j];
const FitConfig & Config() const
access to the fit configuration (const method)
Interface (abstract class) for multi-dimensional functions providing a gradient calculation.
const std::string & MinimizerType() const
return type of minimizer package
void ExamineFCN()
look at the user provided FCN and get data and model function is they derive from ROOT::Fit FCN class...
Namespace for new ROOT classes and functions.
ROOT::Math::Minimizer * CreateMinimizer()
create a new minimizer according to chosen configuration
bool CalculateMinosErrors()
perform an error analysis on the result using MINOS To be called only after fitting and when a minimi...
virtual Type_t Type() const
return the type of method, override if needed
Fitter & operator=(const Fitter &rhs)
Assignment operator (disabled, class is not copyable)
bool EvalFCN()
Perform a simple FCN evaluation.
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
virtual BaseObjFunction::Type_t Type() const
get type of fit method function
bool DoBinnedLikelihoodFit(bool extended=true)
binned likelihood fit
LogLikelihoodFCN class for likelihood fits.
virtual unsigned int NPoints() const
return the number of data points used in evaluating the function
bool ParabErrors() const
do analysis for parabolic errors
const std::vector< unsigned int > & MinosParams() const
return vector of parameter indeces for which the Minos Error will be computed
std::shared_ptr< IModelFunction > fFunc
Class describing the unbinned data sets (just x coordinates values) of any dimensions.
double ErrorDef() const
error definition
bool DoLinearFit()
linear least square fit
ROOT::Math::MinimizerOptions & MinimizerOptions()
access to the minimizer control parameter (non const method)
void SetErrorDef(double err)
set error def
#define MATH_WARN_MSG(loc, str)
ClassImp(TIterator) Bool_t TIterator return false
Compare two iterator objects.
std::shared_ptr< ROOT::Fit::FitResult > fResult
copy of the fitted function containing on output the fit result
MultiDimParamFunctionAdapter class to wrap a one-dimensional parametric function in a multi dimension...
bool CalculateHessErrors()
perform an error analysis on the result using the Hessian Errors are obtaied from the inverse of the ...
void SetValue(double val)
set the value
virtual BaseObjFunction::Type_t Type() const
get type of fit method function
void CreateParamsSettings(const ROOT::Math::IParamMultiFunction &func)
set the parameter settings from a model function.
Fitter()
Default constructor.
bool UpdateAfterFit() const
Update configuration after a fit using the FitResult.
class evaluating the log likelihood for binned Poisson likelihood fits it is template to distinguish ...
const std::vector< ROOT::Fit::ParameterSettings > & ParamsSettings() const
get the vector of parameter settings (const method)
bool NormalizeErrors() const
flag to check if resulting errors are be normalized according to chi2/ndf
bool ApplyWeightCorrection(const ROOT::Math::IMultiGenFunction &loglw2, bool minimizeW2L=false)
apply correction in the error matrix for the weights for likelihood fits This method can be called on...
#define MATH_ERROR_MSG(loc, str)
int PrintLevel() const
non-static methods for retrieving options
void UseSumOfWeightSquare(bool on=true)
void SetMinosErrors(bool on=true)
set Minos erros computation to be performed after fitting
Chi2FCN class for binnned fits using the least square methods.
std::shared_ptr< ROOT::Fit::FitData > fData
pointer to used minimizer
#define MATH_INFO_MSG(loc, str)
void SetMinimizer(const char *type, const char *algo=0)
set minimizer type
void SetStepSize(double err)
set the step size
IParamFunction interface (abstract class) describing multi-dimensional parameteric functions It is a ...
BasicFCN class: base class for the objective functions used in the fits It has a reference to the dat...
Fitter class, entry point for performing all type of fits.
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
const ParameterSettings & ParSettings(unsigned int i) const
get the parameter settings for the i-th parameter (const method)
unsigned int NPar() const
number of parameters settings
static double DefaultErrorDef()
bool FitFCN()
Perform a fit with the previously set FCN function.
void UseSumOfWeightSquare(bool on=true)
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
void SetFunction(const IModelFunction &func, bool useGradient=false)
Set the fitted function (model function) from a parametric function interface.
std::shared_ptr< ROOT::Math::Minimizer > fMinimizer
pointer to the object containing the result of the fit
Type
enumeration specifying the integration types.
bool UseWeightCorrection() const
Apply Weight correction for error matrix computation.
Interface (abstract class) for parametric one-dimensional gradient functions providing in addition to...
class containg the result of the fit and all the related information (fitted parameter values...
Specialized IParamFunction interface (abstract class) for one-dimensional parametric functions It is ...
FitMethodFunction class Interface for objective functions (like chi2 and likelihood used in the fit) ...
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
Interface (abstract class) for parametric gradient multi-dimensional functions providing in addition ...
double func(double *x, double *p)
std::shared_ptr< ROOT::Math::IMultiGenFunction > fObjFunction
pointer to the fit data (binned or unbinned data)
bool GetDataFromFCN()
internal functions to get data set and model function from FCN useful for fits done with customized F...
bool DoLeastSquareFit()
least square fit
BasicFitMethodFunction< ROOT::Math::IMultiGradFunction > FitMethodGradFunction
bool SetFCN(unsigned int npar, Function &fcn, const double *params=0, unsigned int dataSize=0, bool chi2fit=false)
Set a generic FCN function as a C++ callable object implementing double () (const double *) Note that...
MultiDimParamGradFunctionAdapter class to wrap a one-dimensional parametric gradient function in a mu...
void SetParamsSettings(unsigned int npar, const double *params, const double *vstep=0)
set the parameter settings from number of parameters and a vector of values and optionally step value...
virtual unsigned int NCalls() const
return the total number of function calls (overrided if needed)
bool MinosErrors() const
do minos errros analysis on the parameters
Documentation for the abstract class IBaseFunctionMultiDim.
virtual BaseObjFunction::Type_t Type() const
get type of fit method function
bool DoMinimization(const BaseFunc &f, const ROOT::Math::IMultiGenFunction *chifunc=0)
do minimization
virtual IBaseFunctionMultiDim * Clone() const =0
Clone a function.
bool DoUnbinnedLikelihoodFit(bool extended=false)
un-binned likelihood fit
BasicFitMethodFunction< ROOT::Math::IMultiGenFunction > FitMethodFunction