StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
fit_laser.C
1 // $Id: fit_laser.C,v 1.2 2006/03/15 15:14:06 jcs Exp $
2 //
3 // $Log: fit_laser.C,v $
4 // Revision 1.2 2006/03/15 15:14:06 jcs
5 // add lines for listing CVS update info
6 //
7 
8 // fit laser mit Minuit (test)
9 
10 Float_t x[5],y[5],z[5];
11 
12 //______________________________________________________________________________
13 
14 void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
15 {
16  const Int_t nbins = 5;
17 
18  Int_t i; //calculate chisquare
19 
20  Double_t chisq = 0;
21  Double_t delta;
22  for (i=0;i<nbins; i++)
23  {
24  //delta = (y[i]-func(x[i],par));
25  delta=(z[i]-func(x[i],y[i],par));
26  chisq += delta*delta;
27  }
28 
29  f = chisq;
30 }
31 
32 //______________________________________________________________________________
33 
34 Double_t func(float x,float y,Double_t *par)
35 //Double_t func(float x,Double_t *par)
36 {
37  //Double_t value=( (par[0]*par[0])/(x*x)-1)/ ( par[1]+par[2]*y-par[3]*y*y);
38  //Double_t value=par[0]*x+par[1];
39  //value=(par[0]*x+par[1]*y+par[2])*par[3];
40  Double_t value=(par[0]*x+par[1]*y+par[2]);
41  //cout<<x<<" "<<y<<" "<<value<<endl;
42  return value;
43 }
44 
45 Double_t ffunc(Double_t *x,Double_t *par)
46 {
47  Double_t value=(par[0]*x[0]+par[1]*x[1]+par[2]);
48  //cout<<x<<" "<<y<<" "<<value<<endl;
49  return value;
50 }
51 //______________________________________________________________________________
52 
53 void fit_laser()
54 {
55 
56 // the x values
57  x[0]=1;
58  x[1]=2;
59  x[2]=3;
60  x[3]=4;
61  x[4]=5;
62 // the y values
63  y[0]=1;
64  y[1]=1;
65  y[2]=1;
66  y[3]=1;
67  y[4]=1;
68 
69  z[0]=4;//1;
70  z[1]=5;//2;
71  z[2]=6;//3;
72  z[3]=7;//4;
73  z[4]=8;//5;
74 
75  TH3F *h3d=new TH3F("h3d","h3d",6,0,5,6,0,5,11,0,10);
76  for (int i=0;i<5;i++)
77  h3d->Fill(x[i],y[i],z[i]);
78 
79  h3d->SetMarkerStyle(22);
80  //h3d->Draw();
81 
82  TMinuit *gMinuit = new TMinuit(5);
83 
84  //initialize TMinuit with a maximum of 5 params
85  gMinuit->SetFCN(fcn);
86 
87  Double_t arglist[10];
88  Int_t ierflg = 0;
89  arglist[0] = 1;
90 
91  gMinuit->mnexcm("SET ERR", arglist ,1,ierflg);
92 
93  // Set starting values and step sizes for parameters
94  //static Double_t vstart[4] = {3, 1 , 0.1 , 0.01}; //org
95  static Double_t vstart[3] = {1,1,1};
96  static Double_t step[3] = {0.01,0.01,0.01};
97  gMinuit->mnparm(0, "a1", vstart[0], step[0], 0,0,ierflg);
98  gMinuit->mnparm(1, "a2", vstart[1], step[1], 0,0,ierflg);
99  gMinuit->mnparm(2, "a3", vstart[2], step[2], 0,0,ierflg);
100  //gMinuit->mnparm(3, "a4", vstart[3], step[3], 0,0,ierflg);
101  // Now ready for minimization step
102  arglist[0] = 1000;
103  arglist[1] = 1.;
104 
105  gMinuit->mnexcm("MIGRAD", arglist ,2,ierflg);
106 
107  // Print results
108  Double_t amin,edm,errdef;
109  Int_t nvpar,nparx,icstat;
110  gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat);
111  gMinuit->mnprin(3,amin);
112 
113  //TGraph *test=new TGraph(5,x,y);
114  //test->Draw("PA");
115 
116  TF2 *ffunc=new TF2("ffunc",ffunc,0,5,0,5,3);
117  //cout<<func(1,1,arglist)<<endl;
118 
119  //for (int i=0;i<3;i++)
120  //cout<<gMinuit->GetNumFreePars()<<endl;
121  //cout<<gMinuit->GetNumFixedPars()<<endl;
122 
123  Double_t v,ev;
124  for (int i=0;i<3;i++)
125  {
126  gMinuit->GetParameter(i,v,ev);
127  ffunc->SetParameter(i,v);
128  cout<<v<<" "<<ev<<endl;
129  cout<<ffunc->GetParameter(i)<<endl;
130  }
131 
132 
133  ffunc->DrawCopy("lego");
134  h3d->DrawCopy("same");
135  //cout<<ffunc->GetZmax()<<endl;
136  //cout<<amin[1]<<endl;
137  //TGraph *mcont=(TGraph*) gMinuit->Contour();
138  //mcont->Draw("APcolz");
139 }
140