// @(#)root/fumili:$Id$ // Author: Rene Brun 31/08/99 #ifndef ROOT_TFumili #define ROOT_TFumili #include "TVirtualFitter.h" class TF1; class TFumili : public TVirtualFitter { private: Int_t fMaxParam; ///< Int_t fNlog; ///< Int_t fNfcn; ///< Number of FCN calls; Int_t fNED1; ///< Number of experimental vectors X=(x1,x2,...xK) Int_t fNED2; ///< K - Length of vector X plus 2 (for chi2) Int_t fNED12; ///< fNED1+fNED2 Int_t fNpar; ///< fNpar - number of parameters Int_t fNstepDec; ///< fNstepDec - maximum number of step decreasing counter Int_t fNlimMul; ///< fNlimMul - after fNlimMul successful iterations permits four-fold increasing of fPL Int_t fNmaxIter; ///< fNmaxIter - maximum number of iterations Int_t fLastFixed; ///< Last fixed parameter number Int_t fENDFLG; ///< End flag of fit Int_t fINDFLG[5]; ///< internal flags; Bool_t fGRAD; ///< user calculated gradients Bool_t fWARN; ///< warnings Bool_t fDEBUG; ///< debug info Bool_t fLogLike; ///< LogLikelihood flag Bool_t fNumericDerivatives; ///< Double_t *fZ0; ///< [fMaxParam2] Matrix of approximate second derivatives of objective function ///< This matrix is diagonal and always contain only variable parameter's ///< derivatives Double_t *fZ; ///< [fMaxParam2] Inverse fZ0 matrix - covariance matrix Double_t *fGr; ///< [fMaxParam] Gradients of objective function Double_t *fParamError; ///< [fMaxParam] Parameter errors Double_t *fSumLog; ///< [fNlog] Double_t *fEXDA; ///< [fNED12] experimental data poInt_ter // don't calculate parameter errors - take them from fParamError array Double_t *fA; ///< [fMaxParam] Fit parameter array Double_t *fPL0; ///< [fMaxParam] Step initial bounds Double_t *fPL; ///< [fMaxParam] Limits for parameters step. If <0, then parameter is fixed // Defines multidimensional parallelepiped with center in param. vector Double_t *fDA; ///< [fMaxParam] Parameter step Double_t *fAMX; ///< [fMaxParam] Maximum param value Double_t *fAMN; ///< [fMaxParam] Minimum param value Double_t *fR; ///< [fMaxParam] Correlation factors Double_t *fDF; ///< [fMaxParam] First derivatives of theoretical function Double_t *fCmPar; ///< [fMaxParam] parameters of commands Double_t fS; ///< fS - objective function value (return) Double_t fEPS; ///< fEPS - required precision of parameters. If fEPS<0 then Double_t fRP; ///< Precision of fit ( machine zero on CDC 6000) quite old yeh? Double_t fAKAPPA; ///< Double_t fGT; ///< Expected function change in next iteration TString *fANames; ///< [fMaxParam] Parameter names TString fCword; ///< Command string // TF1 *fTFNF1; //Pointer to theoretical function // void (*fFCN) (Int_t &, Double_t *, Double_t &f, Double_t *, Int_t); // // //wrapper function to calculate functional value, gradients and Z-matrix // Double_t (*fTFN)(Double_t *, Double_t *, Double_t*); // Wrapper function for TFN public: TFumili(Int_t maxpar=25); ~TFumili() override; void BuildArrays(); Double_t Chisquare(Int_t npar, Double_t *params) const override; void Clear(Option_t *opt="") override; void DeleteArrays(); void Derivatives(Double_t*,Double_t*); Int_t Eval(Int_t& npar, Double_t *grad, Double_t &fval, Double_t *par, Int_t flag); // Evaluate the minimisation function Double_t EvalTFN(Double_t *,Double_t*); Int_t ExecuteCommand(const char *command, Double_t *args, Int_t nargs) override; Int_t ExecuteSetCommand(Int_t ); virtual void FitChisquare(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag); virtual void FitChisquareI(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag); virtual void FitLikelihood(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag); virtual void FitLikelihoodI(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag); void FixParameter(Int_t ipar) override; Double_t *GetCovarianceMatrix() const override; Double_t GetCovarianceMatrixElement(Int_t i, Int_t j) const override; Int_t GetErrors(Int_t ipar,Double_t &eplus, Double_t &eminus, Double_t &eparab, Double_t &globcc) const override; Int_t GetNumberTotalParameters() const override; Int_t GetNumberFreeParameters() const override; Double_t* GetPL0() const { return fPL0;} Double_t GetParError(Int_t ipar) const override; Double_t GetParameter(Int_t ipar) const override ; Int_t GetParameter(Int_t ipar,char *name,Double_t &value,Double_t &verr,Double_t &vlow, Double_t &vhigh) const override; const char *GetParName(Int_t ipar) const override; Int_t GetStats(Double_t &amin, Double_t &edm, Double_t &errdef, Int_t &nvpar, Int_t &nparx) const override; Double_t GetSumLog(Int_t ) override; Double_t* GetZ() const { return fZ;} void InvertZ(Int_t); Bool_t IsFixed(Int_t ipar) const override; Int_t Minimize(); void PrintResults(Int_t k,Double_t p) const override; void ReleaseParameter(Int_t ipar) override; Int_t SGZ(); void SetData(Double_t *,Int_t,Int_t); void SetFitMethod(const char *name) override; Int_t SetParameter(Int_t ipar,const char *parname,Double_t value,Double_t verr,Double_t vlow, Double_t vhigh) override; void SetParNumber(Int_t ParNum); ClassDefOverride(TFumili,0) //The FUMILI Minimization package }; R__EXTERN TFumili * gFumili; #endif