29 void fitCircle(Int_t n=10000) {
31 TCanvas *c1 =
new TCanvas(
"c1",
"c1",600,600);
33 TGraph* gr =
new TGraph(n);
34 if (n> 999) gr->SetMarkerStyle(1);
35 else gr->SetMarkerStyle(3);
38 for (Int_t i=0;i<n;i++) {
39 r.Circle(x,y,r.Gaus(4,0.3));
42 c1->DrawFrame(-5,-5,5,5);
46 auto chi2Function = [&](
const Double_t *par) {
49 Int_t np = gr->GetN();
51 Double_t *x = gr->GetX();
52 Double_t *y = gr->GetY();
53 for (Int_t i=0;i<np;i++) {
54 Double_t u = x[i] - par[0];
55 Double_t v = y[i] - par[1];
56 Double_t dr = par[2] - std::sqrt(u*u+v*v);
64 ROOT::Math::Functor fcn(chi2Function,3);
65 ROOT::Fit::Fitter fitter;
68 double pStart[3] = {0,0,1};
69 fitter.SetFCN(fcn, pStart);
70 fitter.Config().ParSettings(0).SetName(
"x0");
71 fitter.Config().ParSettings(1).SetName(
"y0");
72 fitter.Config().ParSettings(2).SetName(
"R");
75 bool ok = fitter.FitFCN();
77 Error(
"line3Dfit",
"Line3D Fit failed");
80 const ROOT::Fit::FitResult & result = fitter.Result();
81 result.Print(std::cout);
84 TArc *arc =
new TArc(result.Parameter(0),result.Parameter(1),result.Parameter(2));
85 arc->SetLineColor(kRed);