Logo ROOT  
Reference Guide
fitCircle.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_fit
3/// \notebook
4/// Generate points distributed with some errors around a circle
5/// Fit a circle through the points and draw
6/// To run the script, do, eg
7///
8/// ~~~{.cpp}
9/// root > .x fitCircle.C (10000 points by default)
10/// root > .x fitCircle.C(100); (with only 100 points
11/// root > .x fitCircle.C++(100000); with ACLIC
12/// ~~~
13///
14/// \macro_image
15/// \macro_output
16/// \macro_code
17///
18/// \author Rene Brun
19
20#include "TCanvas.h"
21#include "TRandom3.h"
22#include "TGraph.h"
23#include "TMath.h"
24#include "TArc.h"
25#include "Fit/Fitter.h"
26#include <Math/Functor.h>
27
28//____________________________________________________________________
29void fitCircle(Int_t n=10000) {
30 //generates n points around a circle and fit them
31 TCanvas *c1 = new TCanvas("c1","c1",600,600);
32 c1->SetGrid();
33 TGraph* gr = new TGraph(n);
34 if (n> 999) gr->SetMarkerStyle(1);
35 else gr->SetMarkerStyle(3);
36 TRandom3 r;
37 Double_t x,y;
38 for (Int_t i=0;i<n;i++) {
39 r.Circle(x,y,r.Gaus(4,0.3));
40 gr->SetPoint(i,x,y);
41 }
42 c1->DrawFrame(-5,-5,5,5);
43 gr->Draw("p");
44
45
46 auto chi2Function = [&](const Double_t *par) {
47 //minimisation function computing the sum of squares of residuals
48 // looping at the graph points
49 Int_t np = gr->GetN();
50 Double_t f = 0;
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);
57 f += dr*dr;
58 }
59 return f;
60 };
61
62 // wrap chi2 function in a function object for the fit
63 // 3 is the number of fit parameters (size of array par)
64 ROOT::Math::Functor fcn(chi2Function,3);
65 ROOT::Fit::Fitter fitter;
66
67
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");
73
74 // do the fit
75 bool ok = fitter.FitFCN();
76 if (!ok) {
77 Error("line3Dfit","Line3D Fit failed");
78 }
79
80 const ROOT::Fit::FitResult & result = fitter.Result();
81 result.Print(std::cout);
82
83 //Draw the circle on top of the points
84 TArc *arc = new TArc(result.Parameter(0),result.Parameter(1),result.Parameter(2));
85 arc->SetLineColor(kRed);
86 arc->SetLineWidth(4);
87 arc->SetFillStyle(0);
88 arc->Draw();
89}
ROOT::R::TRInterface & r
Definition: Object.C:4
#define f(i)
Definition: RSha256.hxx:104
int Int_t
Definition: RtypesCore.h:41
double Double_t
Definition: RtypesCore.h:55
@ kRed
Definition: Rtypes.h:64
void Error(const char *location, const char *msgfmt,...)
double sqrt(double)
const ParameterSettings & ParSettings(unsigned int i) const
get the parameter settings for the i-th parameter (const method)
Definition: FitConfig.h:75
class containg the result of the fit and all the related information (fitted parameter values,...
Definition: FitResult.h:48
void Print(std::ostream &os, bool covmat=false) const
print the result and optionaly covariance matrix and correlations
Definition: FitResult.cxx:439
double Parameter(unsigned int i) const
parameter value by index
Definition: FitResult.h:182
Fitter class, entry point for performing all type of fits.
Definition: Fitter.h:77
bool FitFCN(unsigned int npar, Function &fcn, const double *params=0, unsigned int dataSize=0, bool chi2fit=false)
Fit using the a generic FCN function as a C++ callable object implementing double () (const double *)...
Definition: Fitter.h:610
bool SetFCN(unsigned int npar, Function &fcn, const double *params=0, unsigned int dataSize=0, bool chi2fit=false)
Set a generic FCN function as a C++ callable object implementing double () (const double *) Note that...
Definition: Fitter.h:615
const FitResult & Result() const
get fit result
Definition: Fitter.h:384
const FitConfig & Config() const
access to the fit configuration (const method)
Definition: Fitter.h:412
void SetName(const std::string &name)
interaction
Documentation for class Functor class.
Definition: Functor.h:392
Create an Arc.
Definition: TArc.h:28
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition: TAttFill.h:39
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition: TAttLine.h:43
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition: TAttLine.h:40
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition: TAttMarker.h:40
The Canvas class.
Definition: TCanvas.h:31
virtual void Draw(Option_t *option="")
Draw this ellipse with its current attributes.
Definition: TEllipse.cxx:166
A Graph is a graphics object made of two arrays X and Y with npoints each.
Definition: TGraph.h:41
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Definition: TGraph.cxx:2257
Double_t * GetY() const
Definition: TGraph.h:131
Int_t GetN() const
Definition: TGraph.h:123
virtual void Draw(Option_t *chopt="")
Draw this graph with its current attributes.
Definition: TGraph.cxx:753
Double_t * GetX() const
Definition: TGraph.h:130
Random number generator class based on M.
Definition: TRandom3.h:27
return c1
Definition: legend1.C:41
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
const Int_t n
Definition: legend1.C:16
TGraphErrors * gr
Definition: legend1.C:25