### Math Libraries

#### MathCore

- Various fixes have been applied in the fitting classes:
  - Fix issue #46006 for normalization of error resulting from fitting a TGraph
  - Fix a problem in Chi2 calculation in case of overflow
  - Fix issue #46601 for avoiding crashes when a linear fit fails.
  - Fix in the FitData classes the bug #45909 occurring when setting a function range outside histogram range
  - Fix default integration method to be Gauss algorithm of MathCore instead of the GSL method, when libMathmore is not built or when the plug-in manager fails to load it.
  - Add a protection against negative log when fitting using the Poisson log likelihood function
  - Improve calculation of derivative in x for fitted function. This fixes some problem observed when fitting using the error on the coordinates.
  - `Fitter` class: add new methods for calculating the error matrix after minimization, `Fitter::CalculateHessErrors()` and for calculating the Minos errors `Fitter::CalculateMinosErrors`
  - `FitConfig`: add in the configuration the possibility to select a sub-set of the parameters for calculating the Minos errors by using the method `FitConfig::SetMinosErrors( listOfParameters )`. If no list is passed, by default the Minos error will be computed on all parameters.
  - `UnBinData` class: add new constructor for creating a unbin data set passing a range to select the data and copy in the internal array
  - `FitResult`: the class now stores a map of the Minos error using as key the parameter index. If the Minos error has not been calculated for the parameter, `FitResult::LowerError(i)` and `FitResult::UpperError(i)` returns the parabolic error
  - Add a new class, `MinimTransformFunction` to perform a transformation of the function object to deal with limited and fixed variables. This class uses the same transformation which are also used inside Minuit, a sin transformation for double bounded variables and a sqrt transformation for single bound variable defined in the class `MinimizerVariableTransformation`. These classes can be used by minimizer which do not support internally the bounds (like the GSL minimizers).
- Add two new method in `ROOT::Math::Minimizer` class:
  - `int Minimizer::CovMatrixStatus()` : returning the status of the covariance matrix. Implemented by Minuit and Minuit2 and follows original Minuit code meaning: code = 0 (not calculated), 1 (approximated), 2 (matrix was made pos def) , 3 (accurate)
  - `bool Hesse()`: to perform a full calculation of the Hessian matrix
- `TMath`
  - Fix a numerical problem in `TMath::ErfcInverse` for small input values. Now the normal quantile function is used for implementing it.

#### MathMore

- Fix 2 bugs in the quartic equation solver (see issue #49031).
  - A protection has been added against numerical errors which could cause NaN due to wrong inputs to an `acos` function. This problem appears also in the GSL cubic solver. A new GSL patched cubic function has been then added in MathMore.
  - A wrong statement (coming from the original CERNLIB code but not applicable in this case) has been removed.
- Add support for limited and fixed variables for all the GSL minimizers ("GSLMultiMin"), including the simulated annealing ("GSLSimAn") and the non-linear least square fit methods ("GSLMultiFit").

#### SMatrix

- Remove an unneeded check on the element value in the factorization routines used for inverting the matrices (both for the LU and for the Bunch-Kaufmann factorization). The check was preventing to inverting matrices when some of the matrix elements (like the diagonal) were smaller than an epsilon value set to ~ 10-15. This is not needed since it is enough to check that the values are not zero (i.e. when the matrix is singular). This bug was causing several failures in the CMS code when inverting matrices.
- Add the Cholesky decomposition method for symmetric positive defined matrices (thanks to Manuel Schiller). A class has been introduced, `ROOT::Math::CholeskyDecomp` which provaids methods for decomposing or inverting a matrix and also for solving a linear system.
  - New methods have also been added in SMatrix: `bool SMatrix::InvertChol()` and `SMatrix & SMatrix::InverseChol(ifail)` for the inversion of a symmetric positive defined matrix. New specialized implementation exists up to matrices with sizes 6x6. The speed is comparable to the Cramer method (SMatrix::InvertFast), but with much better accuracy. The new InvertChol method is in any case faster than the general inverter method for all symmetric matrices (SMatrix::Invert), which uses the Bunch-Kaufman decomposition.
  - Add also a new free function, `ROOT::Math::SolveChol` for solving a symmetric linear system. For users who need the solution, using this functions avoid for them performing the inversion and then a matrix multiplication.
- Add support in the SMatrix class for operator m[i][j]
- Add in the dictionary the typedefs for some square and symmetrix matrices based on double and floats (up to size 7) defined in the file Math/SMatrixDfwd and Math/SMatrixFfwd

#### Minuit

- Apply varius improvements in the `TMInuitMInimizer` class thanks to the feedback of Alfio Lazzaro:
  - implement Hess() and CovMatrixStatus();
  - add new method based on SEEK. The Tolerance() value can be used to specify the volume (in unit of sigma) for searching for the global minimum
  - fix some of the methods, like NCalls() and GlobalCC()

#### Minuit2

- Apply some fixes in MnHesse and MnPosDef classes to check correctly variables to not be zero. (use same checks as in F77Minuit)
- Fix a bug introduced in DavidonErrorCalculator when checking for delgam. Negative values are allowed. This fixes a test problem given privately by A. Suter.
- Uses also a tighter condition on edm when exiting the iterations (factor of 5 smaller). This is more consistent with conditions used by F77Minuit.
- Fix a bug in MnCross in the standalone version of Minuit (when WARNINGMSG was not defined).
- Fix a bug in the sign of the derivative for sine transformation which are used with double bound parameters. The bug could affect the minimization of function with user provided gradient and bound parameters and bound parameters. It could also affected Fumili2. Furthermore, a wrong sign for the correlation matrix could also have been obtained in some cases with bound parameters.
- Use a tolerance of 0.01 instead of 0.05 in MnContours. The value of 0.01 is the same used in Minos. This is sufficient to get good quality contours.
- Improve also the debug in MnContour. Add printing of points as info messages
- Remove some un-necessary assert() when defining the minimization parameters.
- Fix a bug in MnHesse to return the information if the matrix was made pos def. In addition change in MinimumError the codition that when the matrix was made pos def the status of the error is still considered valid and not invalid as before. This makes also the function minimum valid when a matrix was decleared pos def.
- Improvements in the Minuit2Minimizer class:
  - implement the new methods defined in the base class: Hess() using MnHess and CovMatrixStatus();
  - improve the switch-off of the info message according to the print level;
  - define the variables passed with zero step-size as constant (as is done in F77 Minuit)
- Fix a problem in building the parallel version of Minuit2. The parallel version is built if the environment variables USE_PARALLEL_MINUIT2 and USE_OPENMP are set before compiling Minuit2 on a compiler which supports openMP (for example gcc version >= 4.2)
- Add, thanks to Alfio Lazzaro, support for running Minuit2 using multi-process by using MPI. A new class MPIProcess deals with starting and terminating the MPI process. Each process calculates independently the derivatives for a given set of parameters. A Minuit2 library with MPI support can be built by defining before compilation the environment variables USE_PARALLEL_MINUIT2 and USE_MPI.

#### Unuran

Add constructor of Tunuran distributions using function objects defined using the mathcore interfaces:

- `TUnuranContDist (const ROOT::Math::IGenFunction & pdf, const ROOT::Math::IGenFunction * dpdf, bool isLogPdf);`
- `TUnuranMultiContDist (const ROOT::Math::IMultiGenFunction & pdf, bool isLogPdf );`
- `TUnuranDiscrDist (const ROOT::Math::IGenFunction & func );`

#### TRolke

New version of TRolke from J. Lundberg.

- The interface of the class has been changed. The old user interface was very hard to use, and the documentation in the source was also not on par with the correct usage. The old interface was a single get-function with 12 arguments, and the user was supposed to figure out which ~ 5 arguments were relevant for a specific model (1 out of 7 models).
  The new user interface is is easy to use correctly and hard to use incorrectly (TM). It's a single set-method for each method:

      SetPoissonBkgBinomialEff(Int_t x,Int_t y,Int_t z,Double_t tau,Int_t m);
      SetPoissonBkgGaussianEff(Int_t x,Int_t y,Double_t em, Double_t tau,Double_t sde);
      SetGaussianBkgGaussianEff(Int_t x,Double_t bm,Double_t em, Double_t sde,Double_t sdb);
      SetPoissondBkgknownEff(Int_t x,Int_t y,Double_t tau,Double_t e);
      SetGaussianBkgknownEff(Int_t x,Double_t bm,Double_t sdb,Double_t e);
      SetKnownBkgBinomialEff(Int_t x, Int_t z,Int_t m,Double_t b);
      SetknownBkgGaussianEff(Int_t x,Double_t em,Double_t sde,Double_t b);

- New methods for getting sensitivity (average limits) and related quantities and for critical number related to rejection of the null-hypothesis (no signal).
- Some small Bug fixes. Some variables were used uninitialized. (Eg, input arguments which were not supposed to be used were used anyway.)