5 #include <FairLogger.h>  
    7 #include <Math/Functor.h> 
   10 #include <Fit/FitConfig.h>  
   11 #include <Fit/FitResult.h>  
   12 #include <Fit/Fitter.h> 
   13 #include <Fit/ParameterSettings.h>  
   26    bool weighted = points.size() == charge.size();
 
   27    LOG(debug) << 
"Fitting with" << (weighted ? 
" " : 
"out ") << 
"charge weighting";
 
   32    auto func = [&points, &charge, weighted, 
this](
const double *par) {
 
   35       std::array<double, 3> chi2 = {0, 0, 0};
 
   36       std::array<double, 3> qTot = {0, 0, 0};
 
   38       for (
int i = 0; i < points.size(); ++i) {
 
   39          auto q = weighted ? charge[i] : 1;
 
   44          bool origFF = pointAss < 2;
 
   47          if (origFF && points[i].Rho() < 20)
 
   57       for (
int i = 0; i < 2; ++i) {
 
   58          LOG(debug) << i << 
": " << chi2[i] << 
"/" << qTot[i] << 
" = " << chi2[i] / qTot[i];
 
   60             retVal += chi2[i] / qTot[i];
 
   62       LOG(debug) << 
"Obj: " << retVal;
 
   66    auto functor = ROOT::Math::Functor(func, 12);
 
   68    ROOT::Fit::Fitter fitter;
 
   71    LOG(debug) << 
"Initial parameters";
 
   72    for (
int i = 0; i < iniPar.size(); ++i)
 
   73       LOG(debug) << Form(
"Par_%d", i) << 
"\t = " << iniPar[i];
 
   75    fitter.SetFCN(functor, iniPar.data());
 
   78    for (
int i = 0; i < 3; ++i)
 
   79       fitter.Config().ParSettings(5 + i * 3).Fix();
 
   81    for (
int i = 0; i < 12; ++i)
 
   82       fitter.Config().ParSettings(i).SetStepSize(.01);
 
   84    bool ok = fitter.FitFCN();
 
   86       LOG(error) << 
"Failed to fit the pattern, using result of SAC";
 
   91    auto &result = fitter.Result();
 
   93    fChi2 = result.MinFcnValue();
 
   94    fNFree = points.size() - result.NPar();