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();