#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" #include "TFitResult.h" void GaussFit(TH1D* h1D, TF1* ffit); void FitParScanNew() { //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); GaussFit(h1, f1); } //___________________________________________________________________________________________________ void 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' const ROOT::Fit::FitResult & result = fitter.Result(); result.Print(std::cout); ffit ->SetFitResult(result); h1D ->GetListOfFunctions()->Add(ffit); double pmin = result.Parameter(2) - 10*result.ParError(2); double pmax = result.Parameter(2) + 10*result.ParError(2); UInt_t iNoSteps = 50; TGraph * gr = new TGraph(iNoSteps); ((ROOT::Fit::FitResult &) result).Scan(2, iNoSteps, gr->GetX(), gr->GetY(), pmin,pmax); // for (int i = 0; i < gr->GetN(); i++) // std::cout << gr->GetX()[i] << " " << gr->GetY()[i] << std::endl; gr->Draw("AC"); //return result; }