\subsection{Results and uncertainties}

After every minimisation, the information about the process as well as the 
results are returned as a \pyth{FitResult}. This object does not only store 
information but is also capable of performing uncertainty estimations of the 
parameters. 

The most important information that it collects is:

\begin{itemize}
	\item Information about the parameters, including the values at 
	the function minimum, information about their limits and uncertainties 
	calculated using different methods.
	\item General information about the minimisation 
	itself, including
	\begin{itemize}
		\item A flag that indicates whether the minimisation was 
		successful or not.
		\item The minimum of the loss function that was determined by the 
		minimiser.
		\item An estimation made by the 
		minimiser of how far away the minimum value is from the actual true 
		minimum.
		\item All the additional information produced by a minimiser. This can 
		highly vary depending on which minimiser was used.
	\end{itemize}
	
	\item The instance of the minimiser that was used to perform 
	minimisation. Since 
	minimisers are stateless, no information is stored in it.\footnote{Ideally. 
	Some minimisers like iminuit have a state and can be accessed like this. A 
	copy of the actual minimiser is stored in the \pyth{FitResult}}
	\item The instance of the loss that was minimised. Since a 
	loss keeps references to the model and data it was built with, it is 
	possible to thereby
	retrieve all information regarding this minimisation.
\end{itemize}

As the last of five steps in the minimisation workflow, the \pyth{FitResult} 
serves again as an 
additional abstraction layer. A lot of different statistical quantities such as 
limits, confidence intervals and more can be calculated using the result, loss 
and minimiser. Since they are all bundled together in the \pyth{FitResult}, 
no other object is required for advanced statistical treatment of fit results.

\subsubsection{Parameter uncertainties}

The values of the parameters at the minimum are important, but they are 
meaningless without an uncertainty estimate. Therefore, the \pyth{FitResult} 
provides two ways of calculating it:

\begin{itemize}
	\item For a fast, approximative and symmetric estimate, the \pyth{hesse} 
	method can be invoked. It provides an estimation based on the Hessian 
	matrix, assuming a second order approximation of the loss around the 
	minimum value of the parameter. 
	\item If there are high non-linearities in the loss and the 
	parameter correlations, the actual uncertainties differ strongly from what 
	\pyth{hesse} returns. Good estimates can 
	be retrieved by creating a profile: fixing the parameter at a certain value 
	and run a complete minimisation. The calculation is invoked by using the 
	\pyth{error} method. If the Minuit minimiser was used to perform the 
	minimisation, the \pyth{minos} method can be invoked in this way. 
	Currently, no other error estimation is implemented, but any custom 
	statistical method can be easily applied thanks to the information 
	contained in the fit result.
	
\end{itemize}

To only calculate the uncertainties with respect to specific parameters, the 
desired parameters can be given as arguments to \pyth{hesse} and \pyth{error}. 
The results for each parameter are cached and won't be recomputed on an 
additional call.