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();
125 if ( (
fMinimType.find(
"Fumili") == std::string::npos) &&
126 (
fMinimType.find(
"GSLMultiFit") == std::string::npos)
134 const unsigned int npar = min->NDim();
135 if (npar == 0)
return;
138 fParams = std::vector<double>(min->X(), min->X() + npar);
142 for (
unsigned int i = 0; i < npar; ++i ) {
147 if (sizeOfData > min->NFree() )
fNdf = sizeOfData - min->NFree();
161 for (
unsigned int i = 0; i < npar; ++i ) {
168 unsigned int nfree = 0;
169 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
182 MATH_ERROR_MSG(
"FitResult",
"FitConfiguration and Minimizer result are not consistent");
183 std::cout <<
"Number of free parameters from FitConfig = " << nfree << std::endl;
184 std::cout <<
"Number of free parameters from Minimizer = " <<
fNFree << std::endl;
200 if (min->Errors() != 0) {
202 fErrors = std::vector<double>(min->Errors(), min->Errors() + npar ) ;
205 unsigned int r = npar * ( npar + 1 )/2;
207 for (
unsigned int i = 0; i < npar; ++i)
208 for (
unsigned int j = 0; j <= i; ++j)
214 const std::vector<unsigned int> & ipars = fconfig.
MinosParams();
215 unsigned int n = (ipars.size() > 0) ? ipars.size() : npar;
216 for (
unsigned int i = 0; i <
n; ++i) {
218 unsigned int index = (ipars.size() > 0) ? ipars[i] : i;
219 bool ret = min->GetMinosError(index, elow, eup);
226 for (
unsigned int i = 0; i < npar; ++i) {
227 double globcc = min->GlobalCC(i);
228 if (globcc < 0)
break;
250 if (
this == &rhs)
return *
this;
291 bool FitResult::Update(
const std::shared_ptr<ROOT::Math::Minimizer> &
min,
bool isValid,
unsigned int ncalls) {
297 const unsigned int npar =
fParams.size();
298 if (min->NDim() != npar ) {
302 if (min->X() == 0 ) {
307 if (
fNFree != min->NFree() ) {
314 fVal = min->MinValue();
320 if ( min->NCalls() > 0)
fNCalls = min->NCalls();
324 std::copy(min->X(), min->X() + npar,
fParams.begin());
330 if (min->Errors() != 0) {
334 std::copy(min->Errors(), min->Errors() + npar,
fErrors.begin() ) ;
339 unsigned int r = npar * ( npar + 1 )/2;
342 for (
unsigned int i = 0; i < npar; ++i) {
343 for (
unsigned int j = 0; j <= i; ++j)
350 for (
unsigned int i = 0; i < npar; ++i) {
351 double globcc = min->GlobalCC(i);
368 for (
unsigned int i = 0; i <
fErrors.size() ; ++i)
370 for (
unsigned int i = 0; i <
fCovMatrix.size() ; ++i)
384 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);
399 std::map<unsigned int, std::pair<double,double> >::const_iterator itr =
fMinosErrors.find(i);
411 unsigned int npar =
fParams.size();
412 for (
unsigned int i = 0; i < npar; ++i)
427 std::map<unsigned int, unsigned int>::const_iterator itr =
fBoundParams.find(ipar);
449 unsigned int npar =
fParams.size();
451 std::cout <<
"FitResult::Print - Error: Empty FitResult ! " << std::endl;
454 os <<
"\n****************************************\n";
457 os <<
" Invalid FitResult";
458 os <<
" (status = " <<
fStatus <<
" )";
461 os <<
" FitResult before fitting";
463 os <<
"\n****************************************\n";
467 os <<
"Minimizer is " <<
fMinimType << std::endl;
468 const unsigned int nw = 25;
469 const unsigned int nn = 12;
470 const std::ios_base::fmtflags prFmt = os.setf(std::ios::left,std::ios::adjustfield);
473 os << std::left << std::setw(nw) <<
"MinFCN" <<
" = " << std::right << std::setw(nn) <<
fVal << std::endl;
475 os << std::left << std::setw(nw) <<
"Chi2" <<
" = " << std::right << std::setw(nn) <<
fChi2 << std::endl;
476 os << std::left << std::setw(nw) <<
"NDf" <<
" = " << std::right << std::setw(nn) <<
fNdf << std::endl;
477 if (
fMinimType.find(
"Linear") == std::string::npos) {
478 if (
fEdm >=0) os << std::left << std::setw(nw) <<
"Edm" <<
" = " << std::right << std::setw(nn) <<
fEdm << std::endl;
479 os << std::left << std::setw(nw) <<
"NCalls" <<
" = " << std::right << std::setw(nn) <<
fNCalls << std::endl;
481 for (
unsigned int i = 0; i < npar; ++i) {
483 os <<
" = " << std::right << std::setw(nn) <<
fParams[i];
485 os << std::setw(9) <<
" " << std::setw(nn) <<
" " <<
" \t (fixed)";
488 os <<
" +/- " << std::left << std::setw(nn) <<
fErrors[i] << std::right;
490 os <<
" \t (limited)";
496 if (prFmt != os.flags() ) os.setf(prFmt, std::ios::adjustfield);
506 os <<
"\nCovariance Matrix:\n\n";
507 unsigned int npar =
fParams.size();
509 const int kWidth = 8;
511 const int matw = kWidth+4;
514 int prevPrec = os.precision(kPrec);
515 const std::ios_base::fmtflags prevFmt = os.flags();
517 os << std::setw(parw) <<
" " <<
"\t";
518 for (
unsigned int i = 0; i < npar; ++i) {
524 for (
unsigned int i = 0; i < npar; ++i) {
527 for (
unsigned int j = 0; j < npar; ++j) {
529 os.precision(kPrec); os.width(kWidth); os << std::right << std::setw(matw) <<
CovMatrix(i,j);
536 os <<
"\nCorrelation Matrix:\n\n";
537 os << std::setw(parw) <<
" " <<
"\t";
538 for (
unsigned int i = 0; i < npar; ++i) {
544 for (
unsigned int i = 0; i < npar; ++i) {
546 os << std::left << std::setw(parw) << std::left <<
GetParameterName(i) <<
"\t";
547 for (
unsigned int j = 0; j < npar; ++j) {
549 os.precision(kPrec); os.width(kWidth); os << std::right << std::setw(matw) <<
Correlation(i,j);
556 os.setf(prevFmt, std::ios::adjustfield);
557 os.precision(prevPrec);
570 MATH_ERROR_MSG(
"FitResult::GetConfidenceIntervals",
"Cannot compute Confidence Intervals without fitter function");
577 double corrFactor = 1;
578 if (
fChi2 <= 0 ||
fNdf == 0) norm =
false;
587 unsigned int ndim =
fFitFunc->NDim();
588 unsigned int npar =
fFitFunc->NPar();
590 std::vector<double> xpoint(ndim);
591 std::vector<double>
grad(npar);
592 std::vector<double> vsum(npar);
595 for (
unsigned int ipoint = 0; ipoint <
n; ++ipoint) {
597 for (
unsigned int kdim = 0; kdim < ndim; ++kdim) {
598 unsigned int i = ipoint * stride1 + kdim * stride2;
610 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
617 vsum.assign(npar,0.0);
618 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
619 for (
unsigned int jpar = 0; jpar < npar; ++jpar) {
620 vsum[ipar] +=
CovMatrix(ipar,jpar) * grad[jpar];
625 for (
unsigned int ipar = 0; ipar < npar; ++ipar) {
626 r2 += grad[ipar] * vsum[ipar];
629 ci[ipoint] = r * corrFactor;
637 unsigned int ndim = data.
NDim();
639 std::vector<double> xdata( ndim * np );
640 for (
unsigned int i = 0; i <
np ; ++i) {
641 const double *
x = data.
Coords(i);
642 std::vector<double>::iterator itr = xdata.begin()+ ndim * i;
643 std::copy(x,x+ndim,itr);
653 std::vector<double>
result;
655 result.resize(data->
NPoints() );
const std::string & MinimizerType() const
return type of minimizer package
void PrintCovMatrix(std::ostream &os) const
print error matrix and correlations
bool IsParameterFixed(unsigned int ipar) const
query if a parameter is fixed
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
std::shared_ptr< ROOT::Math::IMultiGenFunction > fObjFunc
minimizer object used for fitting
bool IsFixed() const
check if is fixed
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 ...
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
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, at which the quantile is computed 2nd argument - the number of degrees of freedom of the Student distribution When the 3rd argument lower_tail is kTRUE (default)- the algorithm returns such x0, that P(x < x0)=p upper tail (lower_tail is kFALSE)- the algorithm returns such x0, that P(x > x0)=p the algorithm was taken from G.W.Hill, "Algorithm 396, Student's t-quantiles" "Communications of the ACM", 13(10), October 1970.
int Index(const std::string &name) const
get index for parameter name (return -1 if not found)
bool ParameterBounds(unsigned int ipar, double &lower, double &upper) const
retrieve parameter bounds - return false if parameter is not bound
const int gInitialResultStatus
const std::vector< unsigned int > & MinosParams() const
return vector of parameter indeces for which the Minos Error will be computed
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.
double LowerLimit() const
return lower limit value
ClassImp(TIterator) Bool_t TIterator return false
Compare two iterator objects.
std::map< unsigned int, bool > fFixedParams
data set used in the fit
std::vector< double > fErrors
double LowerError(unsigned int i) const
lower Minos error. If Minos has not run for parameter i return the parabolic error ...
void SetFunction(const IGenFunction &f)
Set function for derivative calculation (copy the function if option has been enabled in the construc...
double Correlation(unsigned int i, unsigned int j) const
retrieve correlation elements
std::shared_ptr< FitData > fFitData
model function resulting from the fit.
virtual ~FitResult()
Destructor.
#define MATH_ERROR_MSG(loc, str)
bool HasMinosError(unsigned int i) const
query if parameter i has the Minos error
double CovMatrix(unsigned int i, unsigned int j) const
retrieve covariance matrix element
std::shared_ptr< ROOT::Math::Minimizer > fMinimizer
std::shared_ptr< IModelFunction > fFitFunc
objective function used for fitting
std::map< unsigned int, std::pair< double, double > > fMinosErrors
void SetMinosError(unsigned int i, double elow, double eup)
set the Minos errors for parameter i (called by the Fitter class when running Minos) ...
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
const double * Coords(unsigned int ipoint) const
return a pointer to the coordinates data for the given fit point
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
double Prob() const
p value of the fit (chi2 probability)
const std::string & Name() const
return name
double UpperLimit() const
return upper limit value
OneDimParamFunctionAdapter class to wrap a multi-dim parameteric function in one dimensional one...
bool IsParameterBound(unsigned int ipar) const
query if a parameter is bound
unsigned int NPoints() const
return number of fit points
class containg the result of the fit and all the related information (fitted parameter values...
bool HasUpperLimit() const
check if parameter has upper limit
std::string GetParameterName(unsigned int ipar) const
get name of parameter (deprecated)
void NormalizeErrors()
normalize errors using chi2/ndf for chi2 fits
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
double Error(unsigned int i) const
parameter error by index
double func(double *x, double *p)
void Print(std::ostream &os, bool covmat=false) const
print the result and optionaly covariance matrix and correlations
std::string ParName(unsigned int i) const
name of the parameter
std::vector< std::pair< double, double > > fParamBounds
std::vector< std::string > fParNames
std::string ToString(const T &val)
Utility function for conversion to strings.
double StepSize() const
return step size
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 Value() const
copy constructor and assignment operators (leave them to the compiler)
std::vector< double > fGlobalCC
FitResult()
Default constructor for an empty (non valid) fit result.
const std::string & MinimizerAlgoType() const
return type of minimizer algorithms
std::vector< double > fCovMatrix
void GetConfidenceIntervals(unsigned int n, unsigned int stride1, unsigned int stride2, const double *x, double *ci, double cl=0.95, bool norm=true) const
get confidence intervals for an array of n points x.
bool HasLowerLimit() const
check if parameter has lower limit
std::map< unsigned int, unsigned int > fBoundParams
std::vector< double > fParams
bool MinosErrors() const
do minos errros analysis on the parameters
bool IsBound() const
check if is bound
Documentation for the abstract class IBaseFunctionMultiDim.
double norm(double *x, double *p)
User class for calculating the derivatives of a function.
unsigned int r2[N_CITIES]
double chisquared_quantile(double z, double r)
Inverse ( ) of the cumulative distribution function of the lower tail of the distribution with degr...
bool Update(const std::shared_ptr< ROOT::Math::Minimizer > &min, 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...
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
unsigned int NDim() const
return coordinate data dimension