library: libMinuit #include "TMinuit.h"

# TMinuit

class description - source file - inheritance tree (.pdf)

## class TMinuit : public TNamed

| Inheritance Chart:

`TObject`

<-

`TNamed`

<-

`TMinuit`

        private:

                  TMinuit(const TMinuit& m)

        public:

                           TMinuit()
                           TMinuit(Int_t maxpar)
                   virtual ~TMinuit()
              virtual void BuildArrays(Int_t maxpar = 15)
            static TClass* Class()
          virtual TObject* Clone(const char* newname = "") const
             virtual Int_t Command(const char* command)
          virtual TObject* Contour(Int_t npoints = 10, Int_t pa1 = 0, Int_t pa2 = 1)
             virtual Int_t DefineParameter(Int_t parNo, const char* name, Double_t initVal, Double_t initErr, Double_t lowerLimit, Double_t upperLimit)
              virtual void DeleteArrays()
             virtual Int_t Eval(Int_t npar, Double_t* grad, Double_t& fval, Double_t* par, Int_t flag)
             virtual Int_t FixParameter(Int_t parNo)
                     Int_t GetMaxIterations() const
              TMethodCall* GetMethodCall() const
             virtual Int_t GetNumFixedPars() const
             virtual Int_t GetNumFreePars() const
             virtual Int_t GetNumPars() const
                  TObject* GetObjectFit() const
             virtual Int_t GetParameter(Int_t parNo, Double_t& currentValue, Double_t& currentError) const
          virtual TObject* GetPlot() const
                     Int_t GetStatus() const
           virtual TClass* IsA() const
             virtual Int_t Migrad()
              virtual void mnamin()
              virtual void mnbins(Double_t a1, Double_t a2, Int_t naa, Double_t& bl, Double_t& bh, Int_t& nb, Double_t& bwid)
              virtual void mncalf(Double_t* pvec, Double_t& ycalf)
              virtual void mncler()
              virtual void mncntr(Int_t ke1, Int_t ke2, Int_t& ierrf)
              virtual void mncomd(const char* crdbin, Int_t& icondn)
              virtual void mncont(Int_t ke1, Int_t ke2, Int_t nptu, Double_t* xptu, Double_t* yptu, Int_t& ierrf)
              virtual void mncrck(TString crdbuf, Int_t maxcwd, TString& comand, Int_t& lnc, Int_t mxp, Double_t* plist, Int_t& llist, Int_t& ierr, Int_t isyswr)
              virtual void mncros(Double_t& aopt, Int_t& iercr)
              virtual void mncuve()
              virtual void mnderi()
              virtual void mndxdi(Double_t pint, Int_t ipar, Double_t& dxdi)
              virtual void mneig(Double_t* a, Int_t ndima, Int_t n, Int_t mits, Double_t* work, Double_t precis, Int_t& ifault)
              virtual void mnemat(Double_t* emat, Int_t ndim)
              virtual void mnerrs(Int_t number, Double_t& eplus, Double_t& eminus, Double_t& eparab, Double_t& gcc)
              virtual void mneval(Double_t anext, Double_t& fnext, Int_t& ierev)
              virtual void mnexcm(const char* comand, Double_t* plist, Int_t llist, Int_t& ierflg)
              virtual void mnexin(Double_t* pint)
              virtual void mnfixp(Int_t iint, Int_t& ierr)
              virtual void mnfree(Int_t k)
              virtual void mngrad()
              virtual void mnhelp(TString comd)
              virtual void mnhelp(const char* command = "")
              virtual void mnhes1()
              virtual void mnhess()
              virtual void mnimpr()
              virtual void mninex(Double_t* pint)
              virtual void mninit(Int_t i1, Int_t i2, Int_t i3)
              virtual void mnlims()
              virtual void mnline(Double_t* start, Double_t fstart, Double_t* step, Double_t slope, Double_t toler)
              virtual void mnmatu(Int_t kode)
              virtual void mnmigr()
              virtual void mnmnos()
              virtual void mnmnot(Int_t ilax, Int_t ilax2, Double_t& val2pl, Double_t& val2mi)
              virtual void mnparm(Int_t k, TString cnamj, Double_t uk, Double_t wk, Double_t a, Double_t b, Int_t& ierflg)
              virtual void mnpars(TString& crdbuf, Int_t& icondn)
              virtual void mnpfit(Double_t* parx2p, Double_t* pary2p, Int_t npar2p, Double_t* coef2p, Double_t& sdev2p)
              virtual void mnpint(Double_t& pexti, Int_t i, Double_t& pinti)
              virtual void mnplot(Double_t* xpt, Double_t* ypt, char* chpt, Int_t nxypt, Int_t npagwd, Int_t npagln)
              virtual void mnpout(Int_t iuext, TString& chnam, Double_t& val, Double_t& err, Double_t& xlolim, Double_t& xuplim, Int_t& iuint) const
              virtual void mnprin(Int_t inkode, Double_t fval)
              virtual void mnpsdf()
              virtual void mnrazz(Double_t ynew, Double_t* pnew, Double_t* y, Int_t& jh, Int_t& jl)
              virtual void mnrn15(Double_t& val, Int_t& inseed)
              virtual void mnrset(Int_t iopt)
              virtual void mnsave()
              virtual void mnscan()
              virtual void mnseek()
              virtual void mnset()
              virtual void mnsimp()
              virtual void mnstat(Double_t& fmin, Double_t& fedm, Double_t& errdef, Int_t& npari, Int_t& nparx, Int_t& istat)
              virtual void mntiny(Double_t epsp1, Double_t& epsbak)
                    Bool_t mnunpt(TString& cfname)
              virtual void mnvert(Double_t* a, Int_t l, Int_t m, Int_t n, Int_t& ifail)
              virtual void mnwarn(const char* copt, const char* corg, const char* cmes)
              virtual void mnwerr()
                  TMinuit& operator=(const TMinuit&)
             virtual Int_t Release(Int_t parNo)
             virtual Int_t SetErrorDef(Double_t up)
              virtual void SetFCN(void* fcn)
              virtual void SetFCN(void (*)(Int_t&, Double_t*, Double_t&f, Double_t*, Int_t) fcn)
              virtual void SetGraphicsMode(Bool_t mode = kTRUE)
              virtual void SetMaxIterations(Int_t maxiter = 500)
              virtual void SetObjectFit(TObject* obj)
             virtual Int_t SetPrintLevel(Int_t printLevel = 0)
              virtual void ShowMembers(TMemberInspector& insp, char* parent)
              virtual void Streamer(TBuffer& b)
                      void StreamerNVirtual(TBuffer& b)

### Data Members

        public:

          static const enum TMinuit:: kMAXWARN
                                Int_t fNpfix          Number of fixed parameters
                                Int_t fEmpty          Initialization flag (1 = Minuit initialized)
                                Int_t fMaxpar         Maximum number of parameters
                                Int_t fMaxint         Maximum number of internal parameters
                                Int_t fNpar           Number of free parameters (total number of pars = fNpar + fNfix)
                                Int_t fMaxext         Maximum number of external parameters
                                Int_t fMaxIterations  Maximum number of iterations
                                Int_t fMaxpar5        fMaxpar*(fMaxpar+1)/2
                                Int_t fMaxcpt
                                Int_t fMaxpar2        fMaxpar*fMaxpar
                                Int_t fMaxpar1        fMaxpar*(fMaxpar+1)
                             Double_t fAmin           Minimum value found for FCN
                             Double_t fUp             FCN+-UP defines errors (for chisquare fits UP=1)
                             Double_t fEDM            Estimated vertical distance to the minimum
                             Double_t fFval3
                             Double_t fEpsi
                             Double_t fApsi
                             Double_t fDcovar         Relative change in covariance matrix
                             Double_t fEpsmac         machine precision for floating points:
                             Double_t fEpsma2         sqrt(fEpsmac)
                             Double_t fVlimlo
                             Double_t fVlimhi
                             Double_t fUndefi         Undefined number = -54321
                             Double_t fBigedm         Big EDM = 123456
                             Double_t fUpdflt
                             Double_t fXmidcr
                             Double_t fYmidcr
                             Double_t fXdircr
                             Double_t fYdircr
                            Double_t* fU              [fMaxpar2] External (visible to user in FCN) value of parameters
                            Double_t* fAlim           [fMaxpar2] Lower limits for parameters. If zero no limits
                            Double_t* fBlim           [fMaxpar2] Upper limits for parameters
                            Double_t* fErp            [fMaxpar] Positive Minos errors if calculated
                            Double_t* fErn            [fMaxpar] Negative Minos errors if calculated
                            Double_t* fWerr           [fMaxpar] External parameters error (standard deviation, defined by UP)
                            Double_t* fGlobcc         [fMaxpar] Global Correlation Coefficients
                            Double_t* fX              [fMaxpar] Internal parameters values
                            Double_t* fXt             [fMaxpar] Internal parameters values X saved as Xt
                            Double_t* fDirin          [fMaxpar] (Internal) step sizes for current step
                            Double_t* fXs             [fMaxpar] Internal parameters values saved for fixed params
                            Double_t* fXts            [fMaxpar] Internal parameters values X saved as Xt for fixed params
                            Double_t* fDirins         [fMaxpar] (Internal) step sizes for current step for fixed params
                            Double_t* fGrd            [fMaxpar] First derivatives
                            Double_t* fG2             [fMaxpar]
                            Double_t* fGstep          [fMaxpar] Step sizes
                            Double_t* fGin            [fMaxpar2]
                            Double_t* fDgrd           [fMaxpar] Uncertainties
                            Double_t* fGrds           [fMaxpar]
                            Double_t* fG2s            [fMaxpar]
                            Double_t* fGsteps         [fMaxpar]
                            Double_t* fVhmat          [fMaxpar5] (Internal) error matrix stored as Half MATrix, since it is symmetric
                            Double_t* fVthmat         [fMaxpar5] VHMAT is sometimes saved in VTHMAT, especially in MNMNOT
                            Double_t* fP              [fMaxpar1]
                            Double_t* fPstar          [fMaxpar2]
                            Double_t* fPstst          [fMaxpar]
                            Double_t* fPbar           [fMaxpar]
                            Double_t* fPrho           [fMaxpar] Minimum point of parabola
                            Double_t* fWord7          [fMaxpar]
                            Double_t* fXpt            [fMaxcpt] X array of points for contours
                            Double_t* fYpt            [fMaxcpt] Y array of points for contours
                            Double_t* fCONTgcc        [fMaxpar] array used in mncont
                            Double_t* fCONTw          [fMaxpar] array used in mncont
                            Double_t* fFIXPyy         [fMaxpar] array used in mnfixp
                            Double_t* fGRADgf         [fMaxpar] array used in mngrad
                            Double_t* fHESSyy         [fMaxpar] array used in mnhess
                            Double_t* fIMPRdsav       [fMaxpar] array used in mnimpr
                            Double_t* fIMPRy          [fMaxpar] array used in mnimpr
                            Double_t* fMATUvline      [fMaxpar] array used in mnmatu
                            Double_t* fMIGRflnu       [fMaxpar] array used in mnmigr
                            Double_t* fMIGRstep       [fMaxpar] array used in mnmigr
                            Double_t* fMIGRgs         [fMaxpar] array used in mnmigr
                            Double_t* fMIGRvg         [fMaxpar] array used in mnmigr
                            Double_t* fMIGRxxs        [fMaxpar] array used in mnmigr
                            Double_t* fMNOTxdev       [fMaxpar] array used in mnmnot
                            Double_t* fMNOTw          [fMaxpar] array used in mnmnot
                            Double_t* fMNOTgcc        [fMaxpar] array used in mnmnot
                            Double_t* fPSDFs          [fMaxpar] array used in mnpsdf
                            Double_t* fSEEKxmid       [fMaxpar] array used in mnseek
                            Double_t* fSEEKxbest      [fMaxpar] array used in mnseek
                            Double_t* fSIMPy          [fMaxpar] array used in mnsimp
                            Double_t* fVERTq          [fMaxpar] array used in mnvert
                            Double_t* fVERTs          [fMaxpar] array used in mnvert
                            Double_t* fVERTpp         [fMaxpar] array used in mnvert
                            Double_t* fCOMDplist      [fMaxpar] array used in mncomd
                            Double_t* fPARSplist      [fMaxpar] array used in mnpars
                               Int_t* fNvarl          [fMaxpar2] parameters flag (-1=undefined, 0=constant..)
                               Int_t* fNiofex         [fMaxpar2] Internal parameters number, or zero if not currently variable
                               Int_t* fNexofi         [fMaxpar] External parameters number for currently variable parameters
                               Int_t* fIpfix          [fMaxpar] List of fixed parameters
                                Int_t fNu
                                Int_t fIsysrd         standardInput unit
                                Int_t fIsyswr         standard output unit
                                Int_t fIsyssa
                                Int_t fNpagwd         Page width
                                Int_t fNpagln         Number of lines per page
                                Int_t fNewpag
                                Int_t fIstkrd[10]
                                Int_t fNstkrd
                                Int_t fIstkwr[10]
                                Int_t fNstkwr
                                Int_t fISW[7]         Array of switches
                                Int_t fIdbg[11]       Array of internal debug switches
                                Int_t fNblock         Number of Minuit data blocks
                                Int_t fIcomnd         Number of commands
                                Int_t fNfcn           Number of calls to FCN
                                Int_t fNfcnmx         Maximum number of calls to FCN
                                Int_t fNfcnlc
                                Int_t fNfcnfr
                                Int_t fItaur
                                Int_t fIstrat
                                Int_t fNwrmes[2]
                                Int_t fNfcwar[20]
                                Int_t fIcirc[2]
                                Int_t fStatus         Status flag for the last called Minuit function
                                Int_t fKe1cr
                                Int_t fKe2cr
                               Bool_t fLwarn          true if warning messges are to be put out (default=true)
                               Bool_t fLrepor         true if exceptional conditions are put out (default=false)
                               Bool_t fLimset         true if a parameter is up against limits (for MINOS)
                               Bool_t fLnolim         true if there are no limits on any parameters (not yet used)
                               Bool_t fLnewmn         true if the previous process has unexpectedly improved FCN
                               Bool_t fLphead         true if a heading should be put out for the next parameter definition
                               Bool_t fGraphicsMode   true if graphics mode on (default)
                                char* fChpt           !Character to be plotted at the X,Y contour positions
                             TString* fCpnam          [fMaxpar2] Array of parameters names
                              TString fCfrom
                              TString fCstatu
                              TString fCtitl
                              TString fCword
                              TString fCundef
                              TString fCvrsn
                              TString fCovmes[4]
                              TString fOrigin[100]
                              TString fWarmes[100]
                             TObject* fObjectFit      Pointer to object being fitted
                             TObject* fPlot           Pointer to TGraph object created by mncont
                         TMethodCall* fMethodCall     Pointer to MethodCall in case of interpreted function
                                 void fFCN            !

## Class Description

    *-*-*-*-*-*-*-*-*-*-*-*The Minimization package*-*--*-*-*-*-*-*-*-*-*-*-*
    *-*                    ========================                         *
    *-*                                                                     *
    *-*   This package was originally written in Fortran by Fred James      *
    *-*   and part of PACKLIB (patch D506)                                  *
    *-*                                                                     *
    *-*   It has been converted to a C++ class  by R.Brun                   *
    *-*   The current implementation in C++ is a straightforward conversion *
    *-*   of the original Fortran version: The main changes are:            *
    *-*                                                                     *
    *-*   - The variables in the various Minuit labelled common blocks      *
    *-*     have been changed to the TMinuit class data members.            *
    *-*   - The internal arrays with a maximum dimension depending on the   *
    *-*     maximum number of parameters are now data members arrays with   *
    *-*     a dynamic dimension such that one can fit very large problems   *
    *-*     by simply initialising the TMinuit constructor with the maximum *
    *-*     number of parameters.                                           *
    *-*   - The include file Minuit.h has been commented as much as possible*
    *-*     using existing comments in the code or the printed documentation*
    *-*   - The original Minuit subroutines are now member functions.       *
    *-*   - Constructors and destructor have been added.                    *
    *-*   - Instead of passing the FCN  function in the argument            *
    *-*     list, the addresses of this function is stored as pointer       *
    *-*     in the data members of the class. This is by far more elegant   *
    *-*     and flexible in an interactive environment.                     *
    *-*     The member function SetFCN can be used to define this pointer.  *
    *-*   - The ROOT static function Printf is provided to replace all      *
    *-*     format statements and to print on currently defined output file.*
    *-*   - The functions SetObjectFit(TObject *obj)/GetObjectFit() can be  *
    *-*     used inside the FCN function to set/get a referenced object     *
    *-*     instead of using global variables.                              *
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

## Basic concepts of MINUIT

The MINUIT package acts on a multiparameter Fortran function to which one must give the generic name `FCN`. In the ROOT implementation, the function `FCN` is defined via the MINUIT SetFCN member function when an Histogram.Fit command is invoked. The value of `FCN` will in general depend on one or more variable parameters.

To take a simple example, in case of ROOT histograms (classes TH1C,TH1S,TH1F,TH1D) the Fit function defines the Minuit fitting function as being H1FitChisquare or H1FitLikelihood depending on the options selected. H1FitChisquare calculates the chisquare between the user fitting function (gaussian, polynomial, user defined,etc) and the data for given values of the parameters. It is the task of MINUIT to find those values of the parameters which give the lowest value of chisquare.

### Basic concepts - The transformation for parameters with limits.

For variable parameters with limits, MINUIT uses the following transformation:

      P   = arcsin(2((P   -a)/(b- a))-1)                P    = a+((b- a)/(2))(sinP    +1)
       int             ext                               ext                      int

so that the internal value P can take on any value, while the external int value P can take on values only between the lower limit a and the ext upper limit b. Since the transformation is necessarily non-linear, it would transform a nice linear problem into a nasty non-linear one, which is the reason why limits should be avoided if not necessary. In addition, the transformation does require some computer time, so it slows down the computation a little bit, and more importantly, it introduces additional numerical inaccuracy into the problem in addition to what is introduced in the numerical calculation of the `FCN` value. The effects of non-linearity and numerical roundoff both become more important as the external value gets closer to one of the limits (expressed as the distance to nearest limit divided by distance between limits). The user must therefore be aware of the fact that, for example, if he puts limits of (0,10^10 ) on a parameter, then the values 0.0 and 1. 0 will be indistinguishable to the accuracy of most machines.

The transformation also affects the parameter error matrix, of course, so MINUIT does a transformation of the error matrix (and the ``parabolic'' parameter errors) when there are parameter limits. Users should however realize that the transformation is only a linear approximation, and that it cannot give a meaningful result if one or more parameters is very close to a limit, where partial Pext /partial Pint #0. Therefore, it is recommended that:

1. Limits on variable parameters should be used only when needed in order to prevent the parameter from taking on unphysical values.
2. When a satisfactory minimum has been found using limits, the limits should then be removed if possible, in order to perform or re-perform the error analysis without limits.

### How to get the right answer from MINUIT.

MINUIT offers the user a choice of several minimization algorithms. The MIGRAD algorithm is in general the best minimizer for nearly all functions. It is a variable-metric method with inexact line search, a stable metric updating scheme, and checks for positive-definiteness. Its main weakness is that it depends heavily on knowledge of the first derivatives, and fails miserably if they are very inaccurate.

If parameter limits are needed, in spite of the side effects, then the user should be aware of the following techniques to alleviate problems caused by limits:

#### Getting the right minimum with limits.

If MIGRAD converges normally to a point where no parameter is near one of its limits, then the existence of limits has probably not prevented MINUIT from finding the right minimum. On the other hand, if one or more parameters is near its limit at the minimum, this may be because the true minimum is indeed at a limit, or it may be because the minimizer has become ``blocked'' at a limit. This may normally happen only if the parameter is so close to a limit (internal value at an odd multiple of #((pi)/(2)) that MINUIT prints a warning to this effect when it prints the parameter values. The minimizer can become blocked at a limit, because at a limit the derivative seen by the minimizer partial F/partial Pint is zero no matter what the real derivative partial F/partial Pext is.

    ((partial F)/(partial P   ))= ((partial F)/(partial P   ))((partial P    )/(partial P   )) =((partial F)/(partial P    ))= 0
                           int                           ext             ext             int                           ext

#### Getting the right parameter errors with limits.

In the best case, where the minimum is far from any limits, MINUIT will correctly transform the error matrix, and the parameter errors it reports should be accurate and very close to those you would have got without limits. In other cases (which should be more common, since otherwise you wouldn't need limits), the very meaning of parameter errors becomes problematic. Mathematically, since the limit is an absolute constraint on the parameter, a parameter at its limit has no error, at least in one direction. The error matrix, which can assign only symmetric errors, then becomes essentially meaningless.

### Interpretation of Parameter Errors:

There are two kinds of problems that can arise: the reliability of MINUIT's error estimates, and their statistical interpretation, assuming they are accurate.

### Statistical interpretation:

For discussuion of basic concepts, such as the meaning of the elements of the error matrix, or setting of exact confidence levels see:

1. F.James. Determining the statistical Significance of experimental Results. Technical Report DD/81/02 and CERN Report 81-03, CERN, 1981.
2. W.T.Eadie, D.Drijard, F.James, M.Roos, and B.Sadoulet. Statistical Methods in Experimental Physics. North-Holland, 1971.

### Reliability of MINUIT error estimates.

MINUIT always carries around its own current estimates of the parameter errors, which it will print out on request, no matter how accurate they are at any given point in the execution. For example, at initialization, these estimates are just the starting step sizes as specified by the user. After a HESSE step, the errors are usually quite accurate, unless there has been a problem. MINUIT, when it prints out error values, also gives some indication of how reliable it thinks they are. For example, those marked `CURRENT GUESS ERROR` are only working values not to be believed, and `APPROXIMATE ERROR` means that they have been calculated but there is reason to believe that they may not be accurate.

If no mitigating adjective is given, then at least MINUIT believes the errors are accurate, although there is always a small chance that MINUIT has been fooled. Some visible signs that MINUIT may have been fooled are:

1. Warning messages produced during the minimization or error analysis.
2. Failure to find new minimum.
3. Value of `EDM` too big (estimated Distance to Minimum).
4. Correlation coefficients exactly equal to zero, unless some parameters are known to be uncorrelated with the others.
5. Correlation coefficients very close to one (greater than 0.99). This indicates both an exceptionally difficult problem, and one which has been badly parameterized so that individual errors are not very meaningful because they are so highly correlated.
6. Parameter at limit. This condition, signalled by a MINUIT warning message, may make both the function minimum and parameter errors unreliable. See the discussion above ``Getting the right parameter errors with limits''.

The best way to be absolutely sure of the errors, is to use ``independent'' calculations and compare them, or compare the calculated errors with a picture of the function. Theoretically, the covariance matrix for a ``physical'' function must be positive-definite at the minimum, although it may not be so for all points far away from the minimum, even for a well-determined physical problem. Therefore, if MIGRAD reports that it has found a non-positive-definite covariance matrix, this may be a sign of one or more of the following:

##### A non-physical region:

On its way to the minimum, MIGRAD may have traversed a region which has unphysical behaviour, which is of course not a serious problem as long as it recovers and leaves such a region.

##### An underdetermined problem:

If the matrix is not positive-definite even at the minimum, this may mean that the solution is not well-defined, for example that there are more unknowns than there are data points, or that the parameterization of the fit contains a linear dependence. If this is the case, then MINUIT (or any other program) cannot solve your problem uniquely, and the error matrix will necessarily be largely meaningless, so the user must remove the underdeterminedness by reformulating the parameterization. MINUIT cannot do this itself.

##### Numerical inaccuracies:

It is possible that the apparent lack of positive-definiteness is in fact only due to excessive roundoff errors in numerical calculations in the user function or not enough precision. This is unlikely in general, but becomes more likely if the number of free parameters is very large, or if the parameters are badly scaled (not all of the same order of magnitude), and correlations are also large. In any case, whether the non-positive-definiteness is real or only numerical is largely irrelevant, since in both cases the error matrix will be unreliable and the minimum suspicious.

##### An ill-posed problem:

For questions of parameter dependence, see the discussion above on positive-definiteness.

Possible other mathematical problems are the following:

##### Excessive numerical roundoff:

Be especially careful of exponential and factorial functions which get big very quickly and lose accuracy.

##### Starting too far from the solution:

The function may have unphysical local minima, especially at infinity in some variables.

##### Minuit parameter errors in the presence of limits

This concerns the way Minuit reports the symmetric (or parabolic) errors on parameters. It does not apply to the errors reported from Minos, which are in general asymmetric.

The symmetric errors reported by Minuit are always calculated from the covariance matrix, assuming that this matrix has been calculated, usually as the result of a Migrad minimization or a direct calculation by Hesse which inverts the second derivative matrix.

When there are no limits on the parameter in question, the error reported by Minuit should therefore be exactly equal to the square root of the corresponding diagonal element of the error matrix reported by Minuit.

However, when there are limits on the parameter, there is a transformation between the internal parameter values seen by Minuit (which are unbounded) and the external parameter values seen by the user in FCN (which remain inside the desired limits). Therefore the internal error matrix kept by Minuit must be transformed to an external error matrix for the user. This is done by multiplying the (I,J)th element by DEXDIN(I)*DEXDIN(J), where DEXDIN is the derivative of the external value with respect to the internal value at the minimum. This is a linearization of the transformation, and is the only way to produce an error matrix in external coordinates meaningful to the user. But when reporting the individual parabolic errors for limited parameters, Minuit can do a little better, so it does. In this case, Minuit actually transforms the ends of the internal "error bar" to external coordinates and reports the length of this transformed interval. Strictly speaking, it is now asymmetric, but since the origin of the asymmetry is only an artificial transformation it does not make much sense, so the transformed errors are symmetrized.

The result of all the above is that for parameters with limits, the error reported by Minuit is not exactly equal to the square root of the diagonal element of the error matrix. The difference is a measure of how much the limits deform the problem. If possible, it is suggested not to use limits on parameters, and the problem goes away. If for some reason limits are necessary, and you are sensitive to the difference between the two ways of calculating the errors, it is suggested to use Minos errors which take into account the non-linearities much more precisely.

TMinuit(): TNamed("MINUIT","The Minimization package")

    *-*-*-*-*-*-*-*-*-*-*Minuit normal constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                  ========================

TMinuit(Int_t maxpar): TNamed("MINUIT","The Minimization package")

    *-*-*-*-*-*-*-*-*-*-*Minuit normal constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                  ========================

      maxpar is the maximum number of parameters used with this TMinuit object.

TMinuit(const TMinuit &minuit) : TNamed(minuit)

     Private TMinuit copy ctor. TMinuit can not be copied.

~TMinuit()

    *-*-*-*-*-*-*-*-*-*-*Minuit default destructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                  =========================

void BuildArrays(Int_t maxpar)

    *-*-*-*-*-*-*Create internal Minuit arrays for the maxpar parameters*-*-*-*
    *-*          =======================================================

TObject* Clone(const char *newname) const

     Make a clone of an object using the Streamer facility.
     Function pointer is copied to Clone

Int_t Command(const char *command)

     execute a Minuit command
         Equivalent to MNEXCM except that the command is given as a
         character string.
     See TMinuit::mnhelp for the full list of available commands

     Returns the status of the execution:
       = 0: command executed normally
         1: command is blank, ignored
         2: command line unreadable, ignored
         3: unknown command, ignored
         4: abnormal termination (e.g., MIGRAD not converged)
         5: command is a request to read PARAMETER definitions
         6: 'SET INPUT' command
         7: 'SET TITLE' command
         8: 'SET COVAR' command
         9: reserved
        10: END command
        11: EXIT or STOP command
        12: RETURN command

    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

TObject* Contour(Int_t npoints, Int_t pa1, Int_t pa2)

     Creates a TGraph object describing the n-sigma contour of a
     TMinuit fit. The contour of the parameters pa1 and pa2 is calculated
     unsing npoints (>=4) points. The TMinuit status will be
      0   on success and
     -1   if errors in the calling sequence (pa1, pa2 not variable)
      1   if less than four points can be found
      2   if npoints<4
      n>3 if only n points can be found (n < npoints)
     The status can be obtained via TMinuit::GetStatus().

     To get the n-sigma contour the ERRDEF parameter in Minuit has to set
     to n^2. The fcn function has to be set before the routine is called.

     The TGraph object is created via the interpreter. The user must cast it
     to a TGraph*

     You can find an example in $ROOTSYS/tutorials/fitcont.C

Int_t DefineParameter( Int_t parNo, const char *name, Double_t initVal, Double_t initErr, Double_t lowerLimit, Double_t upperLimit )

     Define a parameter

void DeleteArrays()

    *-*-*-*-*-*-*-*-*-*-*-*Delete internal Minuit arrays*-*-*-*-*-*-*-*-*
    *-*                    =============================

Int_t Eval(Int_t npar, Double_t *grad, Double_t &fval, Double_t *par, Int_t flag)

     Evaluate the minimisation function
      Input parameters:
        npar:    number of currently variable parameters
        par:     array of (constant and variable) parameters
        flag:    Indicates what is to be calculated (see example below)
        grad:    array of gradients
      Output parameters:
        fval:    The calculated function value.
        grad:    The (optional) vector of first derivatives).

     The meaning of the parameters par is of course defined by the user,
     who uses the values of those parameters to calculate his function value.
     The starting values must be specified by the user.
     Later values are determined by Minuit as it searches for the minimum
     or performs whatever analysis is requested by the user.

     Note that this virtual function may be redefined in a class derived from TMinuit.
     The default function calls the function specified in SetFCN

     Example of Minimisation function:

Int_t FixParameter( Int_t parNo)

     fix a parameter

Int_t GetParameter( Int_t parNo, Double_t &currentValue, Double_t &currentError ) const

     return parameter value and error

Int_t GetNumFixedPars() const

     returns the number of currently fixed parameters

Int_t GetNumFreePars() const

     returns the number of currently free parameters

Int_t GetNumPars() const

     returns the total number of parameters that have been defined.
     (fixed and free)

Int_t Migrad()

     invokes the MIGRAD minimizer

Int_t Release( Int_t parNo)

     release a parameter

Int_t SetErrorDef( Double_t up )

void SetFCN(void (*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t))

    *-*-*-*-*-*-*To set the address of the minimization function*-*-*-*-*-*-*-*
    *-*          ===============================================
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void SetFCN(void *fcn)

    *-*-*-*-*-*-*To set the address of the minimization function*-*-*-*-*-*-*-*
    *-*          ===============================================
         this function is called by CINT instead of the function above
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Int_t SetPrintLevel( Int_t printLevel )

void mnamin()

    *-*-*-*-*-*-*-*-*-*-*-*-*Initialize AMIN*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                      ===============
    *-*C        Called  from many places.  Initializes the value of AMIN by
    *-*C        calling the user function. Prints out the function value and
    *-*C        parameter values if Print Flag value is high enough.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnbins(Double_t a1, Double_t a2, Int_t naa, Double_t &bl, Double_t &bh, Int_t &nb, Double_t &bwid)

    *-*-*-*-*-*-*-*-*-*-*Compute reasonable histogram intervals*-*-*-*-*-*-*-*-*
    *-*                  ======================================
    *-*        Function TO DETERMINE REASONABLE HISTOGRAM INTERVALS
    *-*        GIVEN ABSOLUTE UPPER AND LOWER BOUNDS  A1 AND A2
    *-*        AND DESIRED MAXIMUM NUMBER OF BINS NAA
    *-*        PROGRAM MAKES REASONABLE BINNING FROM BL TO BH OF WIDTH BWID
    *-*        F. JAMES,   AUGUST, 1974 , stolen for Minuit, 1988
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncalf(Double_t *pvec, Double_t &ycalf)

    *-*-*-*-*-*-*-*-*-*Transform FCN to find further minima*-*-*-*-*-*-*-*-*-*
    *-*                ====================================
    *-*        Called only from MNIMPR.  Transforms the function FCN
    *-*        by dividing out the quadratic part in order to find further
    *-*        minima.    Calculates  ycalf = (f-fmin)/(x-xmin)*v*(x-xmin)
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncler()

    *-*-*-*-*-*-*-*-*-*-*Resets the parameter list to UNDEFINED*-*-*-*-*-*-*-*
    *-*                  ======================================
    *-*        Called from MINUIT and by option from MNEXCM
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncntr(Int_t ike1, Int_t ike2, Int_t &ierrf)

    *-*-*-*-*Print function contours in two variables, on line printer*-*-*-*-*
    *-*      =========================================================
    *-*
    *-*                input arguments: parx, pary, devs, ngrid
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncomd(const char *crdbin, Int_t &icondn)

    *-*-*-*-*-*-*-*-*-*-*Reads a command string and executes*-*-*-*-*-*-*-*-*-*
    *-*                  ===================================
    *-*        Called by user.  'Reads' a command string and executes.
    *-*     Equivalent to MNEXCM except that the command is given as a
    *-*          character string.
    *-*
    *-*     ICONDN = 0: command executed normally
    *-*              1: command is blank, ignored
    *-*              2: command line unreadable, ignored
    *-*              3: unknown command, ignored
    *-*              4: abnormal termination (e.g., MIGRAD not converged)
    *-*              5: command is a request to read PARAMETER definitions
    *-*              6: 'SET INPUT' command
    *-*              7: 'SET TITLE' command
    *-*              8: 'SET COVAR' command
    *-*              9: reserved
    *-*             10: END command
    *-*             11: EXIT or STOP command
    *-*             12: RETURN command
    *-*
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncont(Int_t ike1, Int_t ike2, Int_t nptu, Double_t *xptu, Double_t *yptu, Int_t &ierrf)

    *-*-*-*-*-*-*Find points along a contour where FCN is minimum*-*-*-*-*-*-*
    *-*          ================================================
    *-*       Find NPTU points along a contour where the function
    *-*             FMIN (X(KE1),X(KE2)) =  AMIN+UP
    *-*       where FMIN is the minimum of FCN with respect to all
    *-*       the other NPAR-2 variable parameters (if any).
    *-*   IERRF on return will be equal to the number of points found:
    *-*     NPTU if normal termination with NPTU points found
    *-*     -1   if errors in the calling sequence (KE1, KE2 not variable)
    *-*      0   if less than four points can be found (using MNMNOT)
    *-*     n>3  if only n points can be found (n < NPTU)
    *-*
    *-*                 input arguments: parx, pary, devs, ngrid
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncrck(TString cardbuf, Int_t maxcwd, TString &comand, Int_t &lnc, Int_t mxp, Double_t *plist, Int_t &llist, Int_t &ierr, Int_t)

    *-*-*-*-*-*-*-*-*-*-*-*Cracks the free-format input*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                    ============================
    *-*       Cracks the free-format input, expecting zero or more
    *-*         alphanumeric fields (which it joins into COMAND(1:LNC))
    *-*         followed by one or more numeric fields separated by
    *-*         blanks and/or one comma.  The numeric fields are put into
    *-*         the LLIST (but at most MXP) elements of PLIST.
    *-*      IERR = 0 if no errors,
    *-*           = 1 if error(s).
    *-*
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncros(Double_t &aopt, Int_t &iercr)

    *-*-*-*-*-*-*-*-*-*-*Find point where MNEVAL=AMIN+UP*-*-*-*-*-*-*-*-*-*-*-*
    *-*                  ===============================
    *-*       Find point where MNEVAL=AMIN+UP, along the line through
    *-*       XMIDCR,YMIDCR with direction XDIRCR,YDIRCR,   where X and Y
    *-*       are parameters KE1CR and KE2CR.  If KE2CR=0 (from MINOS),
    *-*       only KE1CR is varied.  From MNCONT, both are varied.
    *-*       Crossing point is at
    *-*        (U(KE1),U(KE2)) = (XMID,YMID) + AOPT*(XDIR,YDIR)
    *-*
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mncuve()

    *-*-*-*-*-*-*-*Makes sure that the current point is a local minimum*-*-*-*-*
    *-*            ====================================================
    *-*        Makes sure that the current point is a local
    *-*        minimum and that the error matrix exists,
    *-*        or at least something good enough for MINOS and MNCONT
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnderi()

    *-*-*-*-*-*-*-*Calculates the first derivatives of FCN (GRD)*-*-*-*-*-*-*-*
    *-*            =============================================
    *-*        Calculates the first derivatives of FCN (GRD),
    *-*        either by finite differences or by transforming the user-
    *-*        supplied derivatives to internal coordinates,
    *-*        according to whether fISW[2] is zero or one.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mndxdi(Double_t pint, Int_t ipar, Double_t &dxdi)

    *-*-*-*Calculates the transformation factor between ext/internal values*-*
    *-*    =====================================================================
    *-*        calculates the transformation factor between external and
    *-*        internal parameter values.     this factor is one for
    *-*        parameters which are not limited.     called from MNEMAT.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mneig(Double_t *a, Int_t ndima, Int_t n, Int_t mits, Double_t *work, Double_t precis, Int_t &ifault)

    *-*-*-*-*-*-*-*-*-*-*-*Compute matrix eigen values*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                    ===========================

void mnemat(Double_t *emat, Int_t ndim)

     Calculates the external error matrix from the internal matrix

     Note that if the matrix is declared like Double_t matrix[5][5]
     in the calling program, one has to call mnemat with, eg
         gMinuit->mnemat(&matrix[0][0],5);

void mnerrs(Int_t number, Double_t &eplus, Double_t &eminus, Double_t &eparab, Double_t &gcc)

    *-*-*-*-*-*-*-*-*-*Utility routine to get MINOS errors*-*-*-*-*-*-*-*-*-*-*
    *-*                ===================================
    *-*    Called by user.
    *-*    NUMBER is the parameter number
    *-*    values returned by MNERRS:
    *-*       EPLUS, EMINUS are MINOS errors of parameter NUMBER,
    *-*       EPARAB is 'parabolic' error (from error matrix).
    *-*                 (Errors not calculated are set = 0)
    *-*       GCC is global correlation coefficient from error matrix
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mneval(Double_t anext, Double_t &fnext, Int_t &ierev)

    *-*-*-*-*-*-*Evaluates the function being analyzed by MNCROS*-*-*-*-*-*-*-*
    *-*          ===============================================
    *-*      Evaluates the function being analyzed by MNCROS, which is
    *-*      generally the minimum of FCN with respect to all remaining
    *-*      variable parameters.  The class data members contains the
    *-*      data necessary to know the values of U(KE1CR) and U(KE2CR)
    *-*      to be used, namely     U(KE1CR) = XMIDCR + ANEXT*XDIRCR
    *-*      and (if KE2CR .NE. 0)  U(KE2CR) = YMIDCR + ANEXT*YDIRCR
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnexcm(const char *command, Double_t *plist, Int_t llist, Int_t &ierflg)

    *-*-*-*-*-*Interprets a command and takes appropriate action*-*-*-*-*-*-*-*
    *-*        =================================================
    *-*        either directly by skipping to the corresponding code in
    *-*        MNEXCM, or by setting up a call to a function
    *-*
    *-*  recognized MINUIT commands:
    *-*  obsolete commands:
    *-*      IERFLG is now (94.5) defined the same as ICONDN in MNCOMD
    *-*            = 0: command executed normally
    *-*              1: command is blank, ignored
    *-*              2: command line unreadable, ignored
    *-*              3: unknown command, ignored
    *-*              4: abnormal termination (e.g., MIGRAD not converged)
    *-*              9: reserved
    *-*             10: END command
    *-*             11: EXIT or STOP command
    *-*             12: RETURN command
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnexin(Double_t *pint)

    *-*-*-*-*Transforms the external parameter values U to internal values*-*-*
    *-*      =============================================================
    *-*        Transforms the external parameter values U to internal
    *-*        values in the dense array PINT.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnfixp(Int_t iint1, Int_t &ierr)

    *-*-*-*-*-*-*Removes parameter IINT from the internal parameter list*-*-*
    *-*          =======================================================
    *-*        and arranges the rest of the list to fill the hole.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnfree(Int_t k)

    *-*-*-*Restores one or more fixed parameter(s) to variable status*-*-*-*-*-*
    *-*    ==========================================================
    *-*        Restores one or more fixed parameter(s) to variable status
    *-*        by inserting it into the internal parameter list at the
    *-*        appropriate place.
    *-*
    *-*        K = 0 means restore all parameters
    *-*        K = 1 means restore the last parameter fixed
    *-*        K = -I means restore external parameter I (if possible)
    *-*        IQ = fix-location where internal parameters were stored
    *-*        IR = external number of parameter being restored
    *-*        IS = internal number of parameter being restored
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mngrad()

    *-*-*-*-*-*-*-*-*-*Interprets the SET GRAD command*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                ===============================
    *-*       Called from MNSET
    *-*       Interprets the SET GRAD command, which informs MINUIT whether
    *-*       the first derivatives of FCN will be calculated by the user
    *-*       inside FCN.  It can check the user derivative calculation
    *-*       by comparing it with a finite difference approximation.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnhelp(const char *command)

void mnhelp(TString comd)

    *-*-*-*-*-*-*-*HELP routine for MINUIT interactive commands*-*-*-*-*-*-*-*-*
    *-*            ============================================
    *-*
    *-*      COMD ='*' or "" prints a global help for all commands
    *-*      COMD =Command_name: print detailed help for one command.
    *-*         Note that at least 3 characters must be given for the command
    *-*         name.
    *-*
    *-*     Author: Rene Brun
    *-*             comments extracted from the MINUIT documentation file.
    *-*
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnhess()

    *-*-*-*-*-*Calculates the full second-derivative matrix of FCN*-*-*-*-*-*-*-*
    *-*        ===================================================
    *-*        by taking finite differences. When calculating diagonal
    *-*        elements, it may iterate so that step size is nearly that
    *-*        which gives function change= UP/10. The first derivatives
    *-*        of course come as a free side effect, but with a smaller
    *-*        step size in order to obtain a known accuracy.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnhes1()

    *-*-*-*Calculate first derivatives (GRD) and uncertainties (DGRD)*-*-*-*-*-*
    *-*    ==========================================================
    *-*         and appropriate step sizes GSTEP
    *-*      Called from MNHESS and MNGRAD
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnimpr()

    *-*-*-*-*-*-*Attempts to improve on a good local minimum*-*-*-*-*-*-*-*-*-*
    *-*          ===========================================
    *-*        Attempts to improve on a good local minimum by finding a
    *-*        better one.   The quadratic part of FCN is removed by MNCALF
    *-*        and this transformed function is minimized using the simplex
    *-*        method from several random starting points.
    *-*        ref. -- Goldstein and Price, Math.Comp. 25, 569 (1971)
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mninex(Double_t *pint)

    *-*-*-*-*Transforms from internal coordinates (PINT) to external (U)*-*-*-*
    *-*      ===========================================================
    *-*        The minimizing routines which work in
    *-*        internal coordinates call this routine before calling FCN.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mninit(Int_t i1, Int_t i2, Int_t i3)

    *-*-*-*-*-*Main initialization member function for MINUIT*-*-*-*-*-*-*-*-*
    *-*        ==============================================
    *-*     It initializes some constants
    *-*                (including the logical I/O unit nos.),
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnlims()

    *-*-*-*Interprets the SET LIM command, to reset the parameter limits*-*-*-*
    *-*    =============================================================
    *-*       Called from MNSET
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnline(Double_t *start, Double_t fstart, Double_t *step, Double_t slope, Double_t toler)

    *-*-*-*-*-*-*-*-*-*Perform a line search from position START*-*-*-*-*-*-*-*
    *-*                =========================================
    *-*        along direction STEP, where the length of vector STEP
    *-*                   gives the expected position of minimum.
    *-*        FSTART is value of function at START
    *-*        SLOPE (if non-zero) is df/dx along STEP at START
    *-*        TOLER is initial tolerance of minimum in direction STEP
    *-*
    *-* SLAMBG and ALPHA control the maximum individual steps allowed.
    *-* The first step is always =1. The max length of second step is SLAMBG.
    *-* The max size of subsequent steps is the maximum previous successful
    *-*   step multiplied by ALPHA + the size of most recent successful step,
    *-*   but cannot be smaller than SLAMBG.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnmatu(Int_t kode)

    *-*-*-*-*-*-*-*Prints the covariance matrix v when KODE=1*-*-*-*-*-*-*-*-*
    *-*            ==========================================
    *-*        always prints the global correlations, and
    *-*        calculates and prints the individual correlation coefficients
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnmigr()

    *-*-*-*-*-*-*-*-*Performs a local function minimization*-*-*-*-*-*-*-*-*-*
    *-*              ======================================
    *-*        Performs a local function minimization using basically the
    *-*        method of Davidon-Fletcher-Powell as modified by Fletcher
    *-*        ref. -- Fletcher, Comp.J. 13,317 (1970)   "switching method"
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnmnos()

    *-*-*-*-*-*-*-*-*-*-*Performs a MINOS error analysis*-*-*-*-*-*-*-*-*-*-*-*
    *-*                  ===============================
    *-*        Performs a MINOS error analysis on those parameters for
    *-*        which it is requested on the MINOS command by calling
    *-*        MNMNOT for each parameter requested.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnmnot(Int_t ilax, Int_t ilax2, Double_t &val2pl, Double_t &val2mi)

    *-*-*-*-*-*Performs a MINOS error analysis on one parameter*-*-*-*-*-*-*-*-*
    *-*        ================================================
    *-*        The parameter ILAX is varied, and the minimum of the
    *-*        function with respect to the other parameters is followed
    *-*        until it crosses the value FMIN+UP.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnparm(Int_t k1, TString cnamj, Double_t uk, Double_t wk, Double_t a, Double_t b, Int_t &ierflg)

    *-*-*-*-*-*-*-*-*Implements one parameter definition*-*-*-*-*-*-*-*-*-*-*-*
    *-*              ===================================
    *-*        Called from MNPARS and user-callable
    *-*    Implements one parameter definition, that is:
    *-*          K     (external) parameter number
    *-*          CNAMK parameter name
    *-*          UK    starting value
    *-*          WK    starting step size or uncertainty
    *-*          A, B  lower and upper physical parameter limits
    *-*    and sets up (updates) the parameter lists.
    *-*    Output: IERFLG=0 if no problems
    *-*                  >0 if MNPARM unable to implement definition
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnpars(TString &crdbuf, Int_t &icondn)

    *-*-*-*-*-*-*-*Implements one parameter definition*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*            =========== =======================
    *-*        Called from MNREAD and user-callable
    *-*    Implements one parameter definition, that is:
    *-*       parses the string CRDBUF and calls MNPARM
    *-*
    *-* output conditions:
    *-*        ICONDN = 0    all OK
    *-*        ICONDN = 1    error, attempt to define parameter is ignored
    *-*        ICONDN = 2    end of parameter definitions
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnpfit(Double_t *parx2p, Double_t *pary2p, Int_t npar2p, Double_t *coef2p, Double_t &sdev2p)

    *-*-*-*-*-*-*-*-*-*To fit a parabola to npar2p points*-*-*-*-*-*-*-*-*-*-*
    *-*                ==================================
    *-*   npar2p   no. of points
    *-*   parx2p(i)   x value of point i
    *-*   pary2p(i)   y value of point i
    *-*
    *-*   coef2p(1...3)  coefficients of the fitted parabola
    *-*   y=coef2p(1) + coef2p(2)*x + coef2p(3)*x**2
    *-*   sdev2p= variance
    *-*   method : chi**2 = min equation solved explicitly
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnpint(Double_t &pexti, Int_t i1, Double_t &pinti)

    *-*-*-*-*-*-*Calculates the internal parameter value PINTI*-*-*-*-*-*-*-*
    *-*          =============================================
    *-*        corresponding  to the external value PEXTI for parameter I.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnplot(Double_t *xpt, Double_t *ypt, char *chpt, Int_t nxypt, Int_t npagwd, Int_t npagln)

    *-*-*-*Plots points in array xypt onto one page with labelled axes*-*-*-*-*
    *-*    ===========================================================
    *-*        NXYPT is the number of points to be plotted
    *-*        XPT(I) = x-coord. of ith point
    *-*        YPT(I) = y-coord. of ith point
    *-*        CHPT(I) = character to be plotted at this position
    *-*        the input point arrays XPT, YPT, CHPT are destroyed.
    *-*
    *-*
    *-*   If fGraphicsmode is true (default), a TGraph object is produced
    *-*   via the Plug-in handler. To get the plot, you can do:
    *-*       TGraph *gr = (TGraph*)gMinuit->GetPlot();
    *-*       gr->Draw("al");
    *-*
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnpout(Int_t iuext1, TString &chnam, Double_t &val, Double_t &err, Double_t &xlolim, Double_t &xuplim, Int_t &iuint) const

    *-*-*-*Provides the user with information concerning the current status*-*-*
    *-*    ================================================================
    *-*          of parameter number IUEXT. Namely, it returns:
    *-*        CHNAM: the name of the parameter
    *-*        VAL: the current (external) value of the parameter
    *-*        ERR: the current estimate of the parameter uncertainty
    *-*        XLOLIM: the lower bound (or zero if no limits)
    *-*        XUPLIM: the upper bound (or zero if no limits)
    *-*        IUINT: the internal parameter number (or zero if not variable,
    *-*           or negative if undefined).
    *-*  Note also:  If IUEXT is negative, then it is -internal parameter
    *-*           number, and IUINT is returned as the EXTERNAL number.
    *-*     Except for IUINT, this is exactly the inverse of MNPARM
    *-*     User-called
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnprin(Int_t inkode, Double_t fval)

    *-*-*-*Prints the values of the parameters at the time of the call*-*-*-*-*
    *-*    ===========================================================
    *-*        also prints other relevant information such as function value,
    *-*        estimated distance to minimum, parameter errors, step sizes.
    *-*
    *-*         According to the value of IKODE, the printout is:
    *-*    IKODE=INKODE= 0    only info about function value
    *-*                  1    parameter values, errors, limits
    *-*                  2    values, errors, step sizes, internal values
    *-*                  3    values, errors, step sizes, first derivs.
    *-*                  4    values, parabolic errors, MINOS errors
    *-*    when INKODE=5, MNPRIN chooses IKODE=1,2, or 3, according to fISW[1]
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnpsdf()

    *-*-*-*-*-*Calculates the eigenvalues of v to see if positive-def*-*-*-*-*
    *-*        ======================================================
    *-*        if not, adds constant along diagonal to make positive.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnrazz(Double_t ynew, Double_t *pnew, Double_t *y, Int_t &jh, Int_t &jl)

    *-*-*-*-*Called only by MNSIMP (and MNIMPR) to add a new point*-*-*-*-*-*-*
    *-*      =====================================================
    *-*        and remove an old one from the current simplex, and get the
    *-*        estimated distance to minimum.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnrn15(Double_t &val, Int_t &inseed)

    *-*-*-*-*-*-*This is a super-portable random number generator*-*-*-*-*-*-*
    *-*          ================================================
    *-*         It should not overflow on any 32-bit machine.
    *-*         The cycle is only ~10**9, so use with care!
    *-*         Note especially that VAL must not be undefined on input.
    *-*                    Set Default Starting Seed
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnrset(Int_t iopt)

    *-*-*-*-*-*-*-*Resets function value and errors to UNDEFINED*-*-*-*-*-*-*-*
    *-*            =============================================
    *-*    If IOPT=1,
    *-*    If IOPT=0, sets only MINOS errors to undefined
    *-*        Called from MNCLER and whenever problem changes, for example
    *-*        after SET LIMITS, SET PARAM, CALL FCN 6
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnsave()

    *-*-*-*Writes current parameter values and step sizes onto file ISYSSA*-*-*
    *-*    ===============================================================
    *-*          in format which can be reread by Minuit for restarting.
    *-*       The covariance matrix is also output if it exists.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnscan()

    *-*-*-*-*Scans the values of FCN as a function of one parameter*-*-*-*-*-*
    *-*      ======================================================
    *-*        and plots the resulting values as a curve using MNPLOT.
    *-*        It may be called to scan one parameter or all parameters.
    *-*        retains the best function and parameter values found.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnseek()

    *-*-*-*Performs a rough (but global) minimization by monte carlo search*-*
    *-*    ================================================================
    *-*        Each time a new minimum is found, the search area is shifted
    *-*        to be centered at the best value.  Random points are chosen
    *-*        uniformly over a hypercube determined by current step sizes.
    *-*   The Metropolis algorithm accepts a worse point with probability
    *-*      exp(-d/UP), where d is the degradation.  Improved points
    *-*      are of course always accepted.  Actual steps are random
    *-*      multiples of the nominal steps (DIRIN).
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnset()

    *-*-*-*-*Interprets the commands that start with SET and SHOW*-*-*-*-*-*-*
    *-*      ====================================================
    *-*        Called from MNEXCM
    *-*        file characteristics for SET INPUT
    *-*       'SET ' or 'SHOW',  'ON ' or 'OFF', 'SUPPRESSED' or 'REPORTED  '
    *-*        explanation of print level numbers -1:3  and strategies 0:2
    *-*        identification of debug options
    *-*        things that can be set or shown
    *-*        options not intended for normal users
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnsimp()

    *-*-*-*-*Minimization using the simplex method of Nelder and Mead*-*-*-*-*
    *-*      ========================================================
    *-*        Performs a minimization using the simplex method of Nelder
    *-*        and Mead (ref. -- Comp. J. 7,308 (1965)).
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnstat(Double_t &fmin, Double_t &fedm, Double_t &errdef, Int_t &npari, Int_t &nparx, Int_t &istat)

    *-*-*-*-*Returns concerning the current status of the minimization*-*-*-*-*
    *-*      =========================================================
    *-*       User-called
    *-*          Namely, it returns:
    *-*        FMIN: the best function value found so far
    *-*        FEDM: the estimated vertical distance remaining to minimum
    *-*        ERRDEF: the value of UP defining parameter uncertainties
    *-*        NPARI: the number of currently variable parameters
    *-*        NPARX: the highest (external) parameter number defined by user
    *-*        ISTAT: a status integer indicating how good is the covariance
    *-*           matrix:  0= not calculated at all
    *-*                    1= approximation only, not accurate
    *-*                    2= full matrix, but forced positive-definite
    *-*                    3= full accurate covariance matrix
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mntiny(Double_t epsp1, Double_t &epsbak)

    *-*-*-*-*-*-*-*To find the machine precision*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*            =============================
    *-*        Compares its argument with the value 1.0, and returns
    *-*        the value .TRUE. if they are equal.  To find EPSMAC
    *-*        safely by foiling the Fortran optimizer
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Bool_t mnunpt(TString &cfname)

    *-*-*-*-*-*Returns .TRUE. if CFNAME contains unprintable characters*-*-*-*
    *-*        ========================================================
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnvert(Double_t *a, Int_t l, Int_t, Int_t n, Int_t &ifail)

    *-*-*-*-*-*-*-*-*-*-*-*Inverts a symmetric matrix*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                    ==========================
    *-*        inverts a symmetric matrix.   matrix is first scaled to
    *-*        have all ones on the diagonal (equivalent to change of units)
    *-*        but no pivoting is done since matrix is positive-definite.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnwarn(const char *copt1, const char *corg1, const char *cmes1)

    *-*-*-*-*-*-*-*-*-*-*-*Prints Warning messages*-*-*-*-*-*-*-*-*-*-*-*-*-*
    *-*                    =======================
    *-*     If COPT='W', CMES is a WARning message from CORG.
    *-*     If COPT='D', CMES is a DEBug message from CORG.
    *-*         If SET WARnings is in effect (the default), this routine
    *-*             prints the warning message CMES coming from CORG.
    *-*         If SET NOWarnings is in effect, the warning message is
    *-*             stored in a circular buffer of length MAXMES.
    *-*         If called with CORG=CMES='SHO', it prints the messages in
    *-*             the circular buffer, FIFO, and empties the buffer.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

void mnwerr()

    *-*-*-*-*-*-*-*Calculates the WERR, external parameter errors*-*-*-*-*-*-*
    *-*            ==============================================
    *-*      and the global correlation coefficients, to be called
    *-*      whenever a new covariance matrix is available.
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

### Inline Functions

            TMethodCall* GetMethodCall() const
                TObject* GetObjectFit() const
                   Int_t GetMaxIterations() const
                TObject* GetPlot() const
                   Int_t GetStatus() const
                    void SetGraphicsMode(Bool_t mode = kTRUE)
                    void SetMaxIterations(Int_t maxiter = 500)
                    void SetObjectFit(TObject* obj)
                 TClass* Class()
                 TClass* IsA() const
                    void ShowMembers(TMemberInspector& insp, char* parent)
                    void Streamer(TBuffer& b)
                    void StreamerNVirtual(TBuffer& b)
                TMinuit& operator=(const TMinuit&)

Author: Rene Brun, Frederick James 12/08/95
Last update: root/minuit:$Name: $:$Id: TMinuit.cxx,v 1.47 2004/11/29 22:32:53 brun Exp $
Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *