#include "Fit/Fitter.h" #include "Fit/BinData.h" #include "Fit/Chi2FCN.h" #include "TH1.h" #include "TMath.h" #include "Math/WrappedMultiTF1.h" #include "HFitInterface.h" #include "TCanvas.h" #include "TRandom.h" double Gauss(double *x, double *par) { // par[0] is Offset // par[1] is Gaus-height // par[2] is Gaus-mean // par[3] is Gaus-sigma double fitval = par[0]; double arg = 0; if (par[3] != 0) arg = (x[0] - par[2])/par[3]; fitval += par[1]*TMath::Exp(-0.5*arg*arg); return fitval; } void UnbinnedFit() { unsigned int Max = 10000; vector X; for (unsigned int i = 0; i < Max; ++i) { X.push_back(gRandom->Gaus(0, 1)); } TH1D* Hist = new TH1D("Binned", "Binned", 100, -3, 3); for (double x: X) Hist->Fill(x); Hist->Draw(); // Binned test instead // ROOT::Fit::BinData MaxData; // ROOT::Fit::FillData(MaxData, Hist); ROOT::Fit::UnBinData MaxData(X.size(), X.data()); TF1* MaxFit = new TF1("Gauss", Gauss, -3, 3, 4); MaxFit->SetBit(kCanDelete); MaxFit->SetParNames("Offset", "Height", "Mean", "Sigma"); MaxFit->SetParameters(0, 1, 0, 1); ROOT::Math::WrappedMultiTF1 MaxFitFunction(*MaxFit, MaxFit->GetNdim()); ROOT::Fit::Fitter MaxFitter; MaxFitter.SetFunction(MaxFitFunction, false); MaxFitter.Config().MinimizerOptions().SetPrintLevel(1); if (MaxFitter.Fit(MaxData) == true) { ROOT::Fit::FitResult MaxResult = MaxFitter.Result(); MaxFit->SetFitResult(MaxResult); MaxFit->Draw("SAME"); } return; }