// example of using ROOT::Fit::Fitter class as TLinearFitter void generateData(int n, double *x, double *y) { TRandom3 r; double a = 2; double b = 3; for (int i = 0; i < n; i++) { x[i] = double(i+1); y[i] = r.Gaus( a*x[i] + b); } } void exampleFitter() { int n = 10; std::vector x(n); std::vector y(n); generateData(10,x.data(),y.data()); std::vector formula = {"pol0","pol1","pol2","pol3","pol4","pol5"}; for (int ifit = 0; ifit < formula.size(); ifit++) { std::cout << "\n**** Doing polynomial fit using " << formula[ifit] << std::endl; TF1 f1("f1",formula[ifit].c_str()); ROOT::Fit::Fitter fitter; // wrapped TF1 in the correct interface ROOT::Math::WrappedMultiTF1 modelFunc(f1, 1); fitter.SetFunction(modelFunc); // we don't have error in the point value. In case we have it use // ROOT::Fit::BinData::kValueError ROOT::Fit::BinData data(n, f1.GetNdim(), ROOT::Fit::BinData::kNoError); for (int ipoint = 0; ipoint < n; ipoint++) data.Add( &x[ipoint], y[ipoint]); // in case of non-linear fitters we need to set the initial parameter values int npar = fitter.Config().NPar(); for (int ipar = 0; ipar 0) { //fix last parameter to zero fitter.Config().ParSettings(npar-1).SetValue(0.); fitter.Config().ParSettings(npar-1).Fix(); } // set minimizer fitter.Config().SetMinimizer("Minuit2"); // do the fit now std::cout << " fitting....\n"; bool ret = fitter.Fit(data); // get fit result auto & result = fitter.Result(); result.Print(std::cout); if (ret) { // parameter results std::cout << "fit chi2 " << result.Chi2() << std::endl; for (int ipar = 0; ipar < npar; ipar++) std::cout << "param " << ipar << " : " << result.Parameter(ipar) << " +/- " << result.ParError(ipar) << std::endl; } else { std::cout << "Error - fit failed with status = " << result.Status() << std::endl; } } }