ROOT logo

From $ROOTSYS/tutorials/fit/fitLinear.C

#include "TGraphErrors.h"
#include "TF1.h"
#include "TRandom.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TMath.h"


void makePoints(Int_t n, Double_t *x, Double_t *y, Double_t *e, Int_t p);

void fitLinear()
{
   //Example of fitting with a linear function, using TLinearFitter
   //This example is for a TGraphErrors, but it can also be used 
   //when fitting a histogram, a TGraph2D or a TMultiGraph
   //Author: Anna Kreshuk
   
   Int_t n = 40;
   Double_t *x = new Double_t[n];
   Double_t *y = new Double_t[n];
   Double_t *e = new Double_t[n];
   TCanvas *myc = new TCanvas("myc", 
      "Fitting 3 TGraphErrors with linear functions");
   myc->SetFillColor(42);
   myc->SetGrid();

   //Generate points along a 3rd degree polynomial:
   makePoints(n, x, y, e, 3);
   TGraphErrors *gre3 = new TGraphErrors(n, x, y, 0, e);
   gre3->Draw("a*");
   //Fit the graph with the predefined "pol3" function
   gre3->Fit("pol3");
   //Access the fit resuts
   TF1 *f3 = gre3->GetFunction("pol3");
   f3->SetLineWidth(1);

   //Generate points along a sin(x)+sin(2x) function
   makePoints(n, x, y, e, 2);
   TGraphErrors *gre2=new TGraphErrors(n, x, y, 0, e);
   gre2->Draw("*same");
   gre2->SetMarkerColor(kBlue);
   gre2->SetLineColor(kBlue);
   //The fitting function can be predefined and passed to the Fit function
   //The "++" mean that the linear fitter should be used, and the following
   //formula is equivalent to "[0]*sin(x) + [1]*sin(2*x)"
   //A function, defined this way, is in no way different from any other TF1,
   //it can be evaluated, drawn, you can get its parameters, etc.
   //The fit result (parameter values, parameter errors, chisquare, etc) are
   //written into the fitting function.
   TF1 *f2 = new TF1("f2", "sin(x) ++ sin(2*x)", -2, 2);
   gre2->Fit(f2);
   f2 = gre2->GetFunction("f2");
   f2->SetLineColor(kBlue);
   f2->SetLineWidth(1);

   //Generate points along a -2+exp(-x) function
   makePoints(n, x, y, e, 4);
   TGraphErrors *gre4=new TGraphErrors(n, x, y, 0, e);
   gre4->Draw("*same");
   gre4->SetMarkerColor(kRed);
   gre4->SetLineColor(kRed);
   //If you don't want to define the function, you can just pass the string 
   //with the the formula:
   gre4->Fit("1 ++ exp(-x)");
   //Access the fit results:
   TF1 *f4 = gre4->GetFunction("1 ++ exp(-x)");
   f4->SetName("f4");
   f4->SetLineColor(kRed);
   f4->SetLineWidth(1);

   TLegend *leg = new TLegend(0.3, 0.7, 0.65, 0.9);
   leg->AddEntry(gre3, " -7 + 2*x*x + x*x*x", "p");
   leg->AddEntry(gre2, "sin(x) + sin(2*x)", "p");
   leg->AddEntry(gre4, "-2 + exp(-x)", "p");
   leg->Draw();
   leg->SetFillColor(42);


} 

void makePoints(Int_t n, Double_t *x, Double_t *y, Double_t *e, Int_t p)
{
  Int_t i;
  TRandom r;

  if (p==2) {
    for (i=0; i<n; i++) {
      x[i] = r.Uniform(-2, 2);
      y[i]=TMath::Sin(x[i]) + TMath::Sin(2*x[i]) + r.Gaus()*0.1;
      e[i] = 0.1;
    }
  }
  if (p==3) {
    for (i=0; i<n; i++) {
      x[i] = r.Uniform(-2, 2);
      y[i] = -7 + 2*x[i]*x[i] + x[i]*x[i]*x[i]+ r.Gaus()*0.1;
      e[i] = 0.1;
    }
  }
  if (p==4) {
    for (i=0; i<n; i++) {
      x[i] = r.Uniform(-2, 2);
      y[i]=-2 + TMath::Exp(-x[i]) + r.Gaus()*0.1;
      e[i] = 0.1;
    }
  }
}
 fitLinear.C:1
 fitLinear.C:2
 fitLinear.C:3
 fitLinear.C:4
 fitLinear.C:5
 fitLinear.C:6
 fitLinear.C:7
 fitLinear.C:8
 fitLinear.C:9
 fitLinear.C:10
 fitLinear.C:11
 fitLinear.C:12
 fitLinear.C:13
 fitLinear.C:14
 fitLinear.C:15
 fitLinear.C:16
 fitLinear.C:17
 fitLinear.C:18
 fitLinear.C:19
 fitLinear.C:20
 fitLinear.C:21
 fitLinear.C:22
 fitLinear.C:23
 fitLinear.C:24
 fitLinear.C:25
 fitLinear.C:26
 fitLinear.C:27
 fitLinear.C:28
 fitLinear.C:29
 fitLinear.C:30
 fitLinear.C:31
 fitLinear.C:32
 fitLinear.C:33
 fitLinear.C:34
 fitLinear.C:35
 fitLinear.C:36
 fitLinear.C:37
 fitLinear.C:38
 fitLinear.C:39
 fitLinear.C:40
 fitLinear.C:41
 fitLinear.C:42
 fitLinear.C:43
 fitLinear.C:44
 fitLinear.C:45
 fitLinear.C:46
 fitLinear.C:47
 fitLinear.C:48
 fitLinear.C:49
 fitLinear.C:50
 fitLinear.C:51
 fitLinear.C:52
 fitLinear.C:53
 fitLinear.C:54
 fitLinear.C:55
 fitLinear.C:56
 fitLinear.C:57
 fitLinear.C:58
 fitLinear.C:59
 fitLinear.C:60
 fitLinear.C:61
 fitLinear.C:62
 fitLinear.C:63
 fitLinear.C:64
 fitLinear.C:65
 fitLinear.C:66
 fitLinear.C:67
 fitLinear.C:68
 fitLinear.C:69
 fitLinear.C:70
 fitLinear.C:71
 fitLinear.C:72
 fitLinear.C:73
 fitLinear.C:74
 fitLinear.C:75
 fitLinear.C:76
 fitLinear.C:77
 fitLinear.C:78
 fitLinear.C:79
 fitLinear.C:80
 fitLinear.C:81
 fitLinear.C:82
 fitLinear.C:83
 fitLinear.C:84
 fitLinear.C:85
 fitLinear.C:86
 fitLinear.C:87
 fitLinear.C:88
 fitLinear.C:89
 fitLinear.C:90
 fitLinear.C:91
 fitLinear.C:92
 fitLinear.C:93
 fitLinear.C:94
 fitLinear.C:95
 fitLinear.C:96
 fitLinear.C:97
 fitLinear.C:98
 fitLinear.C:99
 fitLinear.C:100
 fitLinear.C:101
 fitLinear.C:102
 fitLinear.C:103
 fitLinear.C:104
 fitLinear.C:105
 fitLinear.C:106
 fitLinear.C:107
 fitLinear.C:108