Dear all,
in order to perform a multi-parametric chi2 fit of my binned model function f(x_i,p) to a binned data y_i histogram I would like to apply the fit method “GSLMultiFit
” (The reason is that using other standard minimizer, like Minuit
, gives poor convergence in my case when starting slightly away from the expected minimum p_min). The GSLMultiFit
method can be initialized, for example, via
ROOT::Math::Minimizer* min = ROOT::Math::Factory::CreateMinimizer("GSLMultiFit", "");
I understand that this minimizing routine does not work by handing over a common user-derived fit function of type ROOT::Math::IBaseFunctionMultiDim
but instead requires a function of class type ROOT::Fit::Chi2FCN
. This class provides a public method named
virtual double DataElement(const double* x, unsigned int i, double* g)
which can be used to specify – to my understanding – the i-th term (residual) of the chi2 sum (or LogL function, when performing a LogL fit).
Now comes my problem: In my case, the model function f(x_i,p) is not given by any analytical expression. The histogram f(x_i), where x_i denotes the i-th model bin, is computed by a rather complex signal MC simulation (detector response function) and, of course, depends on the fit parameters p. Therefore, I cannot afford to have the model function f be called whenever a single residual i is computed (data and fit histograms have 50 bins, so there are 50 summands in the chi2 sum). Instead, what I would like to do in every minimization step, is compute the entire model histogram f(x_i,p) just once for given p and then sum over all 50 residuals to compute only once the obtained chi2 (afterwards repeat until a minimum chi2 is reached).
Is there anyone having experience with this kind of problem? Is there a way to have the entire model histogram f(x_i) be simulated first and afterwards accessed within “DataElement(..)
” to provide the i-th residual (f(x_i)-y_i)^2/y_i ? How does the private member function “DoEval()
” play a role in this class (when is it called during the actual minimzation process)? Can it be used to achieve what I need (mind that DoEval() const
is a “const
” function thus it cannot modify class members)? I know there is one example code provided this post but I don’t see how it would help solving my particular problem.
Thanks for your support,
cheers
Marc