46 fValid(false), fNormalized(false), fNFree(0), fNdf(0), fNCalls(0),
47 fStatus(-1), fCovStatus(0), fVal(0), fEdm(-1), fChi2(-1)
64 fParams(std::vector<double>( fconfig.NPar() ) ),
65 fErrors(std::vector<double>( fconfig.NPar() ) ),
66 fParNames(std::vector<std::string> ( fconfig.NPar() ) )
75 if ( (
fMinimType.find(
"Fumili") == std::string::npos) &&
76 (
fMinimType.find(
"GSLMultiFit") == std::string::npos)
82 unsigned int npar = fconfig.
NPar();
83 for (
unsigned int i = 0; i < npar; ++i ) {
97 std::cout <<
"create fit result from config - nfree " <<
fNFree << std::endl;
113 fVal = min->MinValue();
124 const unsigned int npar = min->NDim();
125 if (npar == 0)
return;
128 fParams = std::vector<double>(min->X(), min->X() + npar);
132 for (
unsigned int i = 0; i < npar; ++i ) {
137 if (sizeOfData > min->NFree() )
fNdf = sizeOfData - min->NFree();
151 for (
unsigned int i = 0; i < npar; ++i ) {
158 unsigned int nfree = 0;
159 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
172 MATH_ERROR_MSG(
"FitResult",
"FitConfiguration and Minimizer result are not consistent");
173 std::cout <<
"Number of free parameters from FitConfig = " << nfree << std::endl;
174 std::cout <<
"Number of free parameters from Minimizer = " <<
fNFree << std::endl;
190 if (min->Errors() != 0) {
192 fErrors = std::vector<double>(min->Errors(), min->Errors() + npar ) ;
195 unsigned int r = npar * ( npar + 1 )/2;
197 for (
unsigned int i = 0; i < npar; ++i)
198 for (
unsigned int j = 0; j <= i; ++j)
204 const std::vector<unsigned int> & ipars = fconfig.
MinosParams();
205 unsigned int n = (ipars.size() > 0) ? ipars.size() : npar;
206 for (
unsigned int i = 0; i <
n; ++i) {
208 unsigned int index = (ipars.size() > 0) ? ipars[i] : i;
209 bool ret = min->GetMinosError(index, elow, eup);
216 for (
unsigned int i = 0; i < npar; ++i) {
217 double globcc = min->GlobalCC(i);
218 if (globcc < 0)
break;
240 if (
this == &rhs)
return *
this;
290 const unsigned int npar =
fParams.size();
291 if (min->NDim() != npar ) {
295 if (min->X() == 0 ) {
300 if (
fNFree != min->NFree() ) {
307 fVal = min->MinValue();
313 if ( min->NCalls() > 0)
fNCalls = min->NCalls();
317 std::copy(min->X(), min->X() + npar,
fParams.begin());
323 if (min->Errors() != 0) {
327 std::copy(min->Errors(), min->Errors() + npar,
fErrors.begin() ) ;
332 unsigned int r = npar * ( npar + 1 )/2;
335 for (
unsigned int i = 0; i < npar; ++i) {
336 for (
unsigned int j = 0; j <= i; ++j)
343 for (
unsigned int i = 0; i < npar; ++i) {
344 double globcc = min->GlobalCC(i);
361 for (
unsigned int i = 0; i <
fErrors.size() ; ++i)
363 for (
unsigned int i = 0; i <
fCovMatrix.size() ; ++i)
377 std::map<unsigned int, std::pair<double,double> >::const_iterator itr =
fMinosErrors.find(i);
385 std::map<unsigned int, std::pair<double,double> >::const_iterator itr =
fMinosErrors.find(i);
392 std::map<unsigned int, std::pair<double,double> >::const_iterator itr =
fMinosErrors.find(i);
404 unsigned int npar =
fParams.size();
405 for (
unsigned int i = 0; i < npar; ++i)
420 std::map<unsigned int, unsigned int>::const_iterator itr =
fBoundParams.find(ipar);
422 lower = -std::numeric_limits<Double_t>::infinity();
423 upper = std::numeric_limits<Double_t>::infinity();
442 unsigned int npar =
fParams.size();
444 os <<
"<Empty FitResult>\n";
447 os <<
"\n****************************************\n";
450 os <<
" Invalid FitResult";
451 os <<
" (status = " <<
fStatus <<
" )";
454 os <<
" FitResult before fitting";
456 os <<
"\n****************************************\n";
460 os <<
"Minimizer is " <<
fMinimType << std::endl;
461 const unsigned int nw = 25;
462 const unsigned int nn = 12;
463 const std::ios_base::fmtflags prFmt = os.setf(std::ios::left,std::ios::adjustfield);
466 os << std::left << std::setw(nw) <<
"MinFCN" <<
" = " << std::right << std::setw(nn) <<
fVal << std::endl;
468 os << std::left << std::setw(nw) <<
"Chi2" <<
" = " << std::right << std::setw(nn) <<
fChi2 << std::endl;
469 os << std::left << std::setw(nw) <<
"NDf" <<
" = " << std::right << std::setw(nn) <<
fNdf << std::endl;
470 if (
fMinimType.find(
"Linear") == std::string::npos) {
471 if (
fEdm >=0) os << std::left << std::setw(nw) <<
"Edm" <<
" = " << std::right << std::setw(nn) <<
fEdm << std::endl;
472 os << std::left << std::setw(nw) <<
"NCalls" <<
" = " << std::right << std::setw(nn) <<
fNCalls << std::endl;
474 for (
unsigned int i = 0; i < npar; ++i) {
476 os <<
" = " << std::right << std::setw(nn) <<
fParams[i];
478 os << std::setw(9) <<
" " << std::setw(nn) <<
" " <<
" \t (fixed)";
481 os <<
" +/- " << std::left << std::setw(nn) <<
fErrors[i] << std::right;
483 os <<
" \t (limited)";
489 if (prFmt != os.flags() ) os.setf(prFmt, std::ios::adjustfield);
499 os <<
"\nCovariance Matrix:\n\n";
500 unsigned int npar =
fParams.size();
502 const int kWidth = 8;
504 const int matw = kWidth+4;
507 int prevPrec = os.precision(kPrec);
508 const std::ios_base::fmtflags prevFmt = os.flags();
510 os << std::setw(parw) <<
" " <<
"\t";
511 for (
unsigned int i = 0; i < npar; ++i) {
517 for (
unsigned int i = 0; i < npar; ++i) {
520 for (
unsigned int j = 0; j < npar; ++j) {
522 os.precision(kPrec); os.width(kWidth); os << std::right << std::setw(matw) <<
CovMatrix(i,j);
529 os <<
"\nCorrelation Matrix:\n\n";
530 os << std::setw(parw) <<
" " <<
"\t";
531 for (
unsigned int i = 0; i < npar; ++i) {
537 for (
unsigned int i = 0; i < npar; ++i) {
539 os << std::left << std::setw(parw) << std::left <<
GetParameterName(i) <<
"\t";
540 for (
unsigned int j = 0; j < npar; ++j) {
542 os.precision(kPrec); os.width(kWidth); os << std::right << std::setw(matw) <<
Correlation(i,j);
549 os.setf(prevFmt, std::ios::adjustfield);
550 os.precision(prevPrec);
562 MATH_ERROR_MSG(
"FitResult::GetConfidenceIntervals",
"Cannot compute Confidence Intervals without fit model function");
568 double corrFactor = 1;
569 if (
fChi2 <= 0 ||
fNdf == 0) norm =
false;
578 unsigned int ndim =
fFitFunc->NDim();
579 unsigned int npar =
fFitFunc->NPar();
581 std::vector<double> xpoint(ndim);
582 std::vector<double> grad(npar);
583 std::vector<double> vsum(npar);
586 for (
unsigned int ipoint = 0; ipoint <
n; ++ipoint) {
588 for (
unsigned int kdim = 0; kdim < ndim; ++kdim) {
589 unsigned int i = ipoint * stride1 + kdim * stride2;
596 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
599 d.SetFunction(fadapter);
603 d.SetStepSize( std::max(
fErrors[ipar]*1.E-5, 1.E-15) );
605 d.SetStepSize( std::min(std::max(
fParams[ipar]*1.E-5, 1.E-15), 0.0001 ) );
614 vsum.assign(npar,0.0);
615 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
616 for (
unsigned int jpar = 0; jpar < npar; ++jpar) {
617 vsum[ipar] +=
CovMatrix(ipar,jpar) * grad[jpar];
622 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
623 r2 += grad[ipar] * vsum[ipar];
626 ci[ipoint] =
r * corrFactor;
634 unsigned int ndim = data.
NDim();
635 unsigned int np = data.
NPoints();
636 std::vector<double> xdata( ndim * np );
637 for (
unsigned int i = 0; i < np ; ++i) {
638 const double *
x = data.
Coords(i);
639 std::vector<double>::iterator itr = xdata.begin()+ ndim * i;
640 std::copy(
x,
x+ndim,itr);
650 std::vector<double> result;
652 result.resize(data->
NPoints() );
656 MATH_ERROR_MSG(
"FitResult::GetConfidenceIntervals",
"Cannot compute Confidence Intervals without the fit bin data");
688 if (!pntsx || !pntsy || !npoints)
692 MATH_ERROR_MSG(
"FitResult::Scan",
"Minimizer is not available - cannot Scan");
707bool FitResult::Contour(
unsigned int ipar,
unsigned int jpar,
unsigned int &npoints,
double *pntsx,
double *pntsy,
double confLevel)
709 if (!pntsx || !pntsy || !npoints)
713 MATH_ERROR_MSG(
"FitResult::Contour",
"Minimizer is not available - cannot produce Contour");
725 bool ret =
fMinimizer->Contour(ipar, jpar, npoints, pntsx, pntsy);
#define MATH_ERROR_MSG(loc, str)
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
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 indeces for which the Minos Error will be computed
const std::string & MinimizerAlgoType() const
return type of minimizer algorithms
unsigned int NPar() const
number of parameters settings
std::string MinimizerName() const
return Minimizer full name (type / algorithm)
const std::string & MinimizerType() const
return type of minimizer package
const ParameterSettings & ParSettings(unsigned int i) const
get the parameter settings for the i-th parameter (const method)
bool MinosErrors() const
do minos errros analysis on the parameters
unsigned int NPoints() const
return number of fit points
unsigned int NDim() const
return coordinate data dimension
const double * Coords(unsigned int ipoint) const
return a pointer to the coordinates data for the given fit point
class containg the result of the fit and all the related information (fitted parameter values,...
std::vector< double > fGlobalCC
bool Update(const std::shared_ptr< ROOT::Math::Minimizer > &min, const ROOT::Fit::FitConfig &fconfig, bool isValid, unsigned int ncalls=0)
Update the fit result with a new minimization status To be run only if same fit is performed with sam...
std::map< unsigned int, unsigned int > fBoundParams
const BinData * FittedBinData() const
return BinData used in the fit (return a nullptr in case a different fit is done or the data are not ...
double UpperError(unsigned int i) const
upper Minos error. If Minos has not run for parameter i return the parabolic error
void FillResult(const std::shared_ptr< ROOT::Math::Minimizer > &min, const FitConfig &fconfig, const std::shared_ptr< IModelFunction > &f, bool isValid, unsigned int sizeOfData=0, bool binFit=true, const ROOT::Math::IMultiGenFunction *chi2func=0, unsigned int ncalls=0)
Fill the fit result from a Minimizer instance after fitting Run also Minos if requested from the conf...
FitResult & operator=(const FitResult &rhs)
Assignment operator.
std::vector< double > fErrors
std::shared_ptr< ROOT::Math::Minimizer > fMinimizer
bool IsParameterFixed(unsigned int ipar) const
query if a parameter is fixed
double Error(unsigned int i) const
parameter error by index
double CovMatrix(unsigned int i, unsigned int j) const
retrieve covariance matrix element
void GetConfidenceIntervals(unsigned int n, unsigned int stride1, unsigned int stride2, const double *x, double *ci, double cl=0.95, bool norm=false) const
get confidence intervals for an array of n points x.
bool Scan(unsigned int ipar, unsigned int &npoints, double *pntsx, double *pntsy, double xmin=0, double xmax=0)
scan likelihood value of parameter and fill the given graph.
FitResult()
Default constructor for an empty (non valid) fit result.
std::shared_ptr< FitData > fFitData
model function resulting from the fit.
std::string GetParameterName(unsigned int ipar) const
get name of parameter (deprecated)
bool ParameterBounds(unsigned int ipar, double &lower, double &upper) const
retrieve parameter bounds - return false if parameter is not bound
std::vector< double > fParams
std::vector< double > fCovMatrix
void SetMinosError(unsigned int i, double elow, double eup)
set the Minos errors for parameter i (called by the Fitter class when running Minos)
void Print(std::ostream &os, bool covmat=false) const
print the result and optionaly covariance matrix and correlations
double LowerError(unsigned int i) const
lower Minos error. If Minos has not run for parameter i return the parabolic error
void PrintCovMatrix(std::ostream &os) const
print error matrix and correlations
bool Contour(unsigned int ipar, unsigned int jpar, unsigned int &npoints, double *pntsx, double *pntsy, double confLevel=0.683)
create contour of two parameters around the minimum pass as option confidence level: default is a val...
bool HasMinosError(unsigned int i) const
query if parameter i has the Minos error
std::vector< std::pair< double, double > > fParamBounds
std::shared_ptr< IModelFunction > fFitFunc
objective function used for fitting
std::map< unsigned int, bool > fFixedParams
data set used in the fit
double Correlation(unsigned int i, unsigned int j) const
retrieve correlation elements
std::shared_ptr< ROOT::Math::IMultiGenFunction > fObjFunc
minimizer object used for fitting
virtual ~FitResult()
Destructor.
int Index(const std::string &name) const
get index for parameter name (return -1 if not found)
double Prob() const
p value of the fit (chi2 probability)
std::string ParName(unsigned int i) const
name of the parameter
void NormalizeErrors()
normalize errors using chi2/ndf for chi2 fits
bool IsParameterBound(unsigned int ipar) const
query if a parameter is bound
std::vector< std::string > fParNames
std::map< unsigned int, std::pair< double, double > > fMinosErrors
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
bool IsFixed() const
check if is fixed
bool HasUpperLimit() const
check if parameter has upper limit
double LowerLimit() const
return lower limit value
const std::string & Name() const
return name
bool HasLowerLimit() const
check if parameter has lower limit
double Value() const
copy constructor and assignment operators (leave them to the compiler)
double StepSize() const
return step size
double UpperLimit() const
return upper limit value
bool IsBound() const
check if is bound
Documentation for the abstract class IBaseFunctionMultiDim.
OneDimParamFunctionAdapter class to wrap a multi-dim parameteric function in one dimensional one.
User class for calculating the derivatives of a function.
double chisquared_cdf_c(double x, double r, double x0=0)
Complement of the cumulative distribution function of the distribution with degrees of freedom (upp...
double chisquared_quantile(double z, double r)
Inverse ( ) of the cumulative distribution function of the lower tail of the distribution with degr...
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
const int gInitialResultStatus
std::string ToString(const T &val)
Utility function for conversion to strings.
static constexpr double s
Double_t ChisquareQuantile(Double_t p, Double_t ndf)
Evaluate the quantiles of the chi-squared probability distribution function.
Double_t StudentQuantile(Double_t p, Double_t ndf, Bool_t lower_tail=kTRUE)
Computes quantiles of the Student's t-distribution 1st argument is the probability,...