73 template <
class FitObject>
76 template <
class FitObject>
79 template <
class FitObject>
89 Error(
"Fit",
"function may not be null pointer");
93 Error(
"Fit",
"function is zombie");
97 int npar =
f1->GetNpar();
99 Error(
"Fit",
"function %s has illegal number of parameters = %d",
f1->GetName(), npar);
104 if (
f1->GetNdim() > dim) {
105 Error(
"Fit",
"function %s dimension, %d, is greater than fit object dimension, %d",
106 f1->GetName(),
f1->GetNdim(), dim);
109 if (
f1->GetNdim() < dim-1) {
110 Error(
"Fit",
"function %s dimension, %d, is smaller than fit object dimension -1, %d",
111 f1->GetName(),
f1->GetNdim(), dim);
122 Double_t fxmin, fymin, fzmin, fxmax, fymax, fzmax;
123 f1.GetRange(fxmin, fymin, fzmin, fxmax, fymax, fzmax);
132template<
class FitObject>
139 printf(
"fit function %s\n",
f1->GetName() );
145 if (iret != 0)
return iret;
150 if (
f1->GetNdim() < hdim ) {
151 if (fitOption.
Integral)
Info(
"Fit",
"Ignore Integral option. Model function dimension is less than the data object dimension");
152 if (fitOption.
Like)
Info(
"Fit",
"Ignore Likelihood option. Model function dimension is less than the data object dimension");
157 Int_t special =
f1->GetNumber();
160 if (special==299+npar) linear =
kTRUE;
166 std::shared_ptr<TFitResult> tfr(
new TFitResult() );
168 std::shared_ptr<ROOT::Fit::Fitter> fitter(
new ROOT::Fit::Fitter(std::static_pointer_cast<ROOT::Fit::FitResult>(tfr) ) );
181 if (fitOption.
PChi2 == 1) {
183 }
else if (fitOption.
PChi2 == 2) {
194 printf(
"use range \n" );
199 printf(
"range size %d\n", range.
Size(0) );
201 double x1;
double x2; range.
GetRange(0,x1,x2);
202 printf(
" range in x = [%f,%f] \n",x1,x2);
209 if (fitdata->Size() == 0 ) {
210 Warning(
"Fit",
"Fit data is empty ");
215 printf(
"HFit:: data size is %d \n",fitdata->Size());
216 for (
unsigned int i = 0; i < fitdata->Size(); ++i) {
217 if (fitdata->NDim() == 1) printf(
" x[%d] = %f - value = %f \n", i,*(fitdata->Coords(i)),fitdata->Value(i) );
227 if (special != 0 && !fitOption.
Bound && !linear) {
240 if ( (linear || fitOption.
Gradient) )
242#ifdef R__HAS_STD_EXPERIMENTAL_SIMD
243 else if(
f1->IsVectorized())
254 if (
int(fitdata->NDim()) == hdim -1 ) fitConfig.
SetNormErrors(
true);
262 for (
int i = 0; i < npar; ++i) {
267 f1->GetParLimits(i,plow,pup);
268 if (plow*pup != 0 && plow >= pup) {
271 else if (plow < pup ) {
282 double err =
f1->GetParError(i);
286 double step = 0.1 * (pup - plow);
288 if ( parSettings.
Value() < pup && pup - parSettings.
Value() < 2 * step )
289 step = (pup - parSettings.
Value() ) / 2;
290 else if ( parSettings.
Value() > plow && parSettings.
Value() - plow < 2 * step )
291 step = (parSettings.
Value() - plow ) / 2;
320 std::string type =
"Robust";
346 if (fitOption.
Like) printf(
"do likelihood fit...\n");
347 if (linear) printf(
"do linear fit...\n");
348 printf(
"do now fit...\n");
363 if (fitOption.
User && userFcn)
364 fitok = fitter->FitFCN( userFcn );
365 else if (fitOption.
Like) {
367 bool weight = ((fitOption.
Like & 2) == 2);
369 bool extended = ((fitOption.
Like & 4 ) != 4 );
373 fitok = fitter->LikelihoodFit(fitdata, extended, fitOption.
ExecPolicy);
376 fitok = fitter->Fit(fitdata, fitOption.
ExecPolicy);
378 if ( !fitok && !fitOption.
Quiet )
379 Warning(
"Fit",
"Abnormal termination of minimization.");
385 iret = fitResult.
Status();
388 f1->SetChisquare(fitResult.
Chi2() );
389 f1->SetNDF(fitResult.
Ndf() );
390 f1->SetNumberFitPoints(fitdata->Size() );
393 f1->SetParameters(
const_cast<double*
>(&(fitResult.
Parameters().front())));
394 if (
int( fitResult.
Errors().size()) >=
f1->GetNpar() )
395 f1->SetParErrors( &(fitResult.
Errors().front()) );
409 if (!fitOption.
Quiet) {
411 if (fitter->GetMinimizer() && fitConfig.
MinimizerType() ==
"Minuit" &&
413 fitter->GetMinimizer()->PrintResults();
418 fitResult.
Print(std::cout);
432 bcfitter->
SetFCN(userFcn);
452 title +=
h1->GetTitle();
454 tfr->SetTitle(title);
469 if (range.
Size(0) == 0) {
470 TAxis & xaxis = *(
h1->GetXaxis());
480 if (range.
Size(1) == 0) {
481 TAxis & yaxis = *(
h1->GetYaxis());
491 if (range.
Size(2) == 0) {
492 TAxis & zaxis = *(
h1->GetZaxis());
502 std::cout <<
"xmin,xmax" <<
xmin <<
" " <<
xmax << std::endl;
521 else if (range.
Size(0) == 0) {
523 double xmin = std::numeric_limits<double>::infinity();
524 double xmax = -std::numeric_limits<double>::infinity();
527 while ( (
g = (
TGraph*) next() ) ) {
528 double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
529 g->ComputeRange(x1,y1,x2,y2);
543 if (range.
Size(0) == 0) {
544 double xmin =
gr->GetXmin();
545 double xmax =
gr->GetXmax();
548 if (range.
Size(1) == 0) {
549 double ymin =
gr->GetYmin();
550 double ymax =
gr->GetYmax();
561 for (
int i = 0; i < ndim; ++i ) {
562 if ( range.
Size(i) == 0 ) {
569template<
class FitObject>
575 std::cout <<
"draw and store fit function " <<
f1->GetName() << std::endl;
587 std::cout <<
"draw and store fit function " <<
f1->GetName()
588 <<
" Range in x = [ " <<
xmin <<
" , " <<
xmax <<
" ]" << std::endl;
591 TList * funcList =
h1->GetListOfFunctions();
592 if (funcList ==
nullptr){
593 Error(
"StoreAndDrawFitFunction",
"Function list has not been created - cannot store the fitted function");
601 bool reuseOldFunction =
false;
602 if (delOldFunction) {
605 while ((obj = next())) {
612 reuseOldFunction =
true;
618 TF1 *fnew1 =
nullptr;
619 TF2 *fnew2 =
nullptr;
620 TF3 *fnew3 =
nullptr;
624 if (!reuseOldFunction) {
625 fnew1 = (
TF1*)
f1->IsA()->New();
628 funcList->
Add(fnew1);
638 }
else if (ndim < 3) {
639 if (!reuseOldFunction) {
640 fnew2 = (
TF2*)
f1->IsA()->New();
643 funcList->
Add(fnew2);
646 fnew2 =
dynamic_cast<TF2*
>(
f1);
655 if (!reuseOldFunction) {
656 fnew3 = (
TF3*)
f1->IsA()->New();
659 funcList->
Add(fnew3);
662 fnew3 =
dynamic_cast<TF3*
>(
f1);
673 if (drawFunction && ndim < 3 && h1->InheritsFrom(
TH1::Class() ) ) {
676 if (!
gPad || (
gPad &&
gPad->GetListOfPrimitives()->FindObject(
h1) ==
nullptr ) )
692 if (
option ==
nullptr)
return;
742 if (fitOption.
Like == 1) {
746 if (fitOption.
Like == 2) fitOption.
Like = 6;
747 else fitOption.
Like = 4;
752 Warning(
"Fit",
"Cannot use P or X option in combination of L. Ignore the chi2 option and perform a likelihood fit");
763 constexpr auto length = std::char_traits<char>::length;
766 int numpos =
start + length(
"H=0.");
769 while( (numpos+numlen<len) && isdigit(opt[numpos+numlen]) ) numlen++;
770 TString num = opt(numpos,numlen);
771 opt.
Remove(
start+length(
"H"),length(
"=0.")+numlen);
772 h = atof(num.
Data());
786 Warning(
"FitOptionsMake",
"Cannot use User (U) fit option when running in multi-thread mode. The option is ignored");
814 Info(
"CheckGraphFitOptions",
"L (Log Likelihood fit) is an invalid option when fitting a graph. It is ignored");
818 Info(
"CheckGraphFitOptions",
"I (use function integral) is an invalid option when fitting a graph. It is ignored");
830 std::shared_ptr<ROOT::Fit::UnBinData> fitdata(data);
833 printf(
"tree data size is %d \n",fitdata->Size());
834 for (
unsigned int i = 0; i < fitdata->Size(); ++i) {
835 if (fitdata->NDim() == 1) printf(
" x[%d] = %f \n", i,*(fitdata->Coords(i) ) );
838 if (fitdata->Size() == 0 ) {
839 Warning(
"Fit",
"Fit data is empty ");
844 std::shared_ptr<TFitResult> tfr(
new TFitResult() );
850 unsigned int dim = fitdata->NDim();
865 for (
int i = 0; i < npar; ++i) {
870 if (plow*pup != 0 && plow >= pup) {
873 else if (plow < pup ) {
888 double step = 0.1 * (pup - plow);
890 if ( parSettings.
Value() < pup && pup - parSettings.
Value() < 2 * step )
891 step = (pup - parSettings.
Value() ) / 2;
892 else if ( parSettings.
Value() > plow && parSettings.
Value() - plow < 2 * step )
893 step = (parSettings.
Value() - plow ) / 2;
915 if ( (fitOption.
Like & 2) == 2)
918 bool extended = (fitOption.
Like & 1) == 1;
921 fitok = fitter->LikelihoodFit(fitdata, extended, fitOption.
ExecPolicy);
922 if ( !fitok && !fitOption.
Quiet )
923 Warning(
"UnBinFit",
"Abnormal termination of minimization.");
927 int iret = fitResult.
Status();
951 if (lastFitter)
delete lastFitter;
956 else if (!fitOption.
Quiet) fitResult.
Print(std::cout);
967 tfr->SetTitle(title);
981 if ( ((foption.
Like & 2) == 2) &&
h1->GetSumw2N() == 0) {
982 Warning(
"HFit::FitObject",
"A weighted likelihood fit is requested but histogram is not weighted - do a standard Likelihood fit");
1040template<
class FitObject>
1056 if (data.Size() == 0 ) {
1057 Warning(
"Chisquare",
"data set is empty - return -1");
1064 return 2.* nll(
f1.GetParameters() ) ;
1067 return chi2(
f1.GetParameters() );
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
const Bool_t kIterBackward
Error("WriteTObject","The current directory (%s) is not associated with a file. The object (%s) has not been written.", GetName(), objname)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
externTVirtualMutex * gROOTMutex
externTVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
class describing the range in the coordinates it supports multiple range in a coordinate.
void AddRange(unsigned int icoord, double xmin, double xmax)
add a range [xmin,xmax] for the new coordinate icoord Adding a range does not delete existing one,...
unsigned int Size(unsigned int icoord=0) const
return range size for coordinate icoord (starts from zero) Size == 0 indicates no range is present [-...
void GetRange(unsigned int irange, unsigned int icoord, double &xmin, double &xmax) const
get the i-th range for given coordinate.
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
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
void SetNormErrors(bool on=true)
set the option to normalize the error on the result according to chi2/ndf
bool NormalizeErrors() const
flag to check if resulting errors are be normalized according to chi2/ndf
void SetMinimizerOptions(const ROOT::Math::MinimizerOptions &minopt)
set all the minimizer options using class ROOT::Math::MinimizerOptions
void SetWeightCorrection(bool on=true)
apply the weight correction for error matrix computation
void SetParabErrors(bool on=true)
set parabolic errors
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)
ROOT::Math::MinimizerOptions & MinimizerOptions()
access to the minimizer control parameter (non const method)
class containing the result of the fit and all the related information (fitted parameter values,...
bool IsEmpty() const
True if a fit result does not exist (even invalid) with parameter values.
const std::vector< double > & Errors() const
parameter errors (return st::vector)
const std::vector< double > & Parameters() const
parameter values (return std::vector)
unsigned int Ndf() const
Number of degree of freedom.
double Chi2() const
Return the Chi2 value after fitting In case of unbinned fits (or not defined one, see the documentati...
void Print(std::ostream &os, bool covmat=false) const
print the result and optionally covariance matrix and correlations
void PrintCovMatrix(std::ostream &os) const
print error matrix and correlations
int Status() const
minimizer status code
Fitter class, entry point for performing all type of fits.
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
void SetStepSize(double err)
set the step size
void SetLimits(double low, double up)
set a double side limit, if low == up the parameter is fixed if low > up the limits are removed The c...
double Value() const
return parameter value
void SetUpperLimit(double up)
set a single upper limit
void Fix()
fix the parameter
void SetLowerLimit(double low)
set a single lower limit
Class describing the un-binned data sets (just x coordinates values) of any dimensions.
void SetPrintLevel(int level)
set print level
void SetTolerance(double tol)
set the tolerance
Class to Wrap a ROOT Function class (like TF1) in a IParamMultiFunction interface of multi-dimensions...
Class to manage histogram axis.
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Int_t GetLast() const
Return last bin on the axis i.e.
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
Int_t GetFirst() const
Return first bin on the axis i.e.
Backward compatible implementation of TVirtualFitter.
virtual void SetMethodCall(TMethodCall *m)
For using interpreted function passed by the user.
void SetFCN(void(*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t)) override
Override setFCN to use the Adapter to Minuit2 FCN interface To set the address of the minimization fu...
virtual void SetNDF(Int_t ndf)
virtual void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax)
virtual void GetParLimits(Int_t ipar, Double_t &parmin, Double_t &parmax) const
virtual Int_t GetNpar() const
virtual void SetParent(TObject *p=nullptr)
virtual void SetNumberFitPoints(Int_t npfits)
virtual void SetRange(Double_t xmin, Double_t xmax)
virtual Double_t GetParError(Int_t ipar) const
virtual void SetParameters(const Double_t *params)
virtual void SetParErrors(const Double_t *errors)
virtual Int_t GetNdim() const
virtual Bool_t AddToGlobalList(Bool_t on=kTRUE)
void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax) override
void SetRange(Double_t xmin, Double_t xmax) override
void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax) override
void SetRange(Double_t xmin, Double_t xmax) override
Provides an indirection to the TFitResult class and with a semantics identical to a TFitResult pointe...
Extends the ROOT::Fit::Result class with a TNamed inheritance providing easy possibility for I/O.
TH1 is the base class of all histogram classes in ROOT.
Multidimensional histogram base.
void Add(TObject *obj) override
TObject * Remove(TObject *obj) override
Remove object from the list.
TList * GetListOfGraphs() const
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
Bool_t TestBit(UInt_t f) const
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
void ToUpper()
Change string to upper case.
TString & Remove(Ssiz_t pos)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Abstract Base Class for Fitting.
virtual void SetFitOption(Foption_t option)
virtual void SetObjectFit(TObject *obj)
TMethodCall * GetMethodCall() const
void(* FCNFunc_t)(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag)
virtual void SetUserFunc(TObject *userfunc)
static TVirtualFitter * GetFitter()
static: return the current Fitter
static void SetFitter(TVirtualFitter *fitter, Int_t maxpar=25)
Static function to set an alternative fitter.
void GetDrawingRange(TH1 *h1, ROOT::Fit::DataRange &range)
void GetFunctionRange(const TF1 &f1, ROOT::Fit::DataRange &range)
int CheckFitFunction(const TF1 *f1, int hdim)
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
void FitOptionsMake(const char *option, Foption_t &fitOption)
void CheckGraphFitOptions(Foption_t &fitOption)
void StoreAndDrawFitFunction(FitObject *h1, TF1 *f1, const ROOT::Fit::DataRange &range, bool, bool, const char *goption)
double ComputeChi2(const FitObject &h1, TF1 &f1, bool useRange, ROOT::Fit::EChisquareType type, bool useIntegral=false)
int GetDimension(const TH1 *h1)
TFitResultPtr FitObject(TH1 *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
fitting function for a TH1 (called from TH1::Fit)
double Chisquare(const TH1 &h1, TF1 &f1, bool useRange, EChisquareType type, bool useIntegral=false)
compute the chi2 value for an histogram given a function (see TH1::Chisquare for the documentation)
void FitOptionsMake(EFitObjectType type, const char *option, Foption_t &fitOption)
Decode list of options into fitOption.
void Init2DGaus(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for 2D gaussian function given the fit data Set the sigma limits for zero t...
TFitResultPtr UnBinFit(ROOT::Fit::UnBinData *data, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption)
fit an unbin data set (from tree or from histogram buffer) using a TF1 pointer and fit options.
void FillData(BinData &dv, const TH1 *hist, TF1 *func=nullptr)
fill the data vector from a TH1.
void InitExpo(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for an exponential function given the fit data Set the constant and slope a...
Chi2FCN< ROOT::Math::IMultiGenFunction, ROOT::Math::IParamMultiFunction > Chi2Function
void InitGaus(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for gaussian function given the fit data Set the sigma limits for zero top ...
PoissonLikelihoodFCN< ROOT::Math::IMultiGenFunction, ROOT::Math::IParamMultiFunction > PoissonLLFunction
std::string ToString(const T &val)
Utility function for conversion to strings.
WrappedMultiTF1Templ< double > WrappedMultiTF1
IParametricFunctionMultiDim IParamMultiFunction
IParametricFunctionMultiDimTempl< T > IParamMultiFunctionTempl
The namespace of The Lean Mean C++ Option Parser.
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
Int_t Finite(Double_t x)
Check if it is finite with a mask in order to be consistent in presence of fast math.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
ROOT::EExecutionPolicy ExecPolicy
DataOptions : simple structure holding the options on how the data are filled.
bool fErrors1
use all errors equal to 1, i.e. fit without errors (default is false)
bool fNormBinVolume
normalize data by a normalized the bin volume (bin volume divided by a reference value)
bool fUseRange
use the function range when creating the fit data (default is false)
bool fUseEmpty
use empty bins (default is false) with a fixed error of 1
bool fIntegral
use integral of bin content instead of bin center (default is false)
bool fExpErrors
use expected errors from the function and not from the data
bool fBinVolume
normalize data by the bin volume (it is used in the Poisson likelihood fits)
bool fCoordErrors
use errors on the x coordinates when available (default is true)