#include "Fit/Fitter.h" #include "Fit/BinData.h" #include "Fit/Chi2FCN.h" #include "TList.h" #include "Math/WrappedMultiTF1.h" #include "HFitInterface.h" #include "TCanvas.h" #include "TStyle.h" #include "TGraphMultiErrors.h" ROOT::Fit::FitResult GaussFit(TH1D* h1D, TF1* ffit); void ParamScan() { ROOT::Fit::FitResult fit_results; auto h1 = new TH1D("h1","h1",100,-5,5); h1->FillRandom("gaus"); TF1 * f1 = new TF1("f1","gaus", -5,5); fit_results = GaussFit(h1, f1); double pmin = fit_results.Parameter(2) - 10*fit_results.ParError(2); double pmax = fit_results.Parameter(2) + 10*fit_results.ParError(2); unsigned int Npts = 100; double xarr[Npts], chiarr[Npts]; fit_results.Scan(2, Npts, xarr, chiarr, pmin, pmax); TGraph *gr = new TGraph(Npts, xarr, chiarr); gr->Draw("AL"); } //___________________________________________________________________________________________________ ROOT::Fit::FitResult GaussFit(TH1D* h1D, TF1* ffit) { //Fit with ROOT::Fit method ROOT::Fit::DataOptions opt; ROOT::Fit::DataRange range; ROOT::Fit::BinData data(opt,range); ROOT::Fit::FillData(data, h1D); ROOT::Math::WrappedMultiTF1 fitfunc(*ffit,1); ROOT::Fit::Fitter fitter; fitter.SetFunction(fitfunc, false); fitter.Config().ParSettings(0).SetLimits(0,1.E6); fitter.Config().ParSettings(2).SetLowerLimit(0); ROOT::Math::MinimizerOptions(mopt); mopt.SetMinimizerType("Minuit2"); mopt.SetPrintLevel(1); // print the default minimizer option values mopt.Print(); fitter.Config().SetMinimizerOptions(mopt); fitter.Fit(data); // chi2 fit' ROOT::Fit::FitResult result = fitter.Result(); result.Print(std::cout); ffit ->SetFitResult(result); h1D ->GetListOfFunctions()->Add(ffit); return result; }