00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 Float_t x[5],y[5],z[5];
00011
00012
00013
00014 void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
00015 {
00016 const Int_t nbins = 5;
00017
00018 Int_t i;
00019
00020 Double_t chisq = 0;
00021 Double_t delta;
00022 for (i=0;i<nbins; i++)
00023 {
00024
00025 delta=(z[i]-func(x[i],y[i],par));
00026 chisq += delta*delta;
00027 }
00028
00029 f = chisq;
00030 }
00031
00032
00033
00034 Double_t func(float x,float y,Double_t *par)
00035
00036 {
00037
00038
00039
00040 Double_t value=(par[0]*x+par[1]*y+par[2]);
00041
00042 return value;
00043 }
00044
00045 Double_t ffunc(Double_t *x,Double_t *par)
00046 {
00047 Double_t value=(par[0]*x[0]+par[1]*x[1]+par[2]);
00048
00049 return value;
00050 }
00051
00052
00053 void fit_laser()
00054 {
00055
00056
00057 x[0]=1;
00058 x[1]=2;
00059 x[2]=3;
00060 x[3]=4;
00061 x[4]=5;
00062
00063 y[0]=1;
00064 y[1]=1;
00065 y[2]=1;
00066 y[3]=1;
00067 y[4]=1;
00068
00069 z[0]=4;
00070 z[1]=5;
00071 z[2]=6;
00072 z[3]=7;
00073 z[4]=8;
00074
00075 TH3F *h3d=new TH3F("h3d","h3d",6,0,5,6,0,5,11,0,10);
00076 for (int i=0;i<5;i++)
00077 h3d->Fill(x[i],y[i],z[i]);
00078
00079 h3d->SetMarkerStyle(22);
00080
00081
00082 TMinuit *gMinuit = new TMinuit(5);
00083
00084
00085 gMinuit->SetFCN(fcn);
00086
00087 Double_t arglist[10];
00088 Int_t ierflg = 0;
00089 arglist[0] = 1;
00090
00091 gMinuit->mnexcm("SET ERR", arglist ,1,ierflg);
00092
00093
00094
00095 static Double_t vstart[3] = {1,1,1};
00096 static Double_t step[3] = {0.01,0.01,0.01};
00097 gMinuit->mnparm(0, "a1", vstart[0], step[0], 0,0,ierflg);
00098 gMinuit->mnparm(1, "a2", vstart[1], step[1], 0,0,ierflg);
00099 gMinuit->mnparm(2, "a3", vstart[2], step[2], 0,0,ierflg);
00100
00101
00102 arglist[0] = 1000;
00103 arglist[1] = 1.;
00104
00105 gMinuit->mnexcm("MIGRAD", arglist ,2,ierflg);
00106
00107
00108 Double_t amin,edm,errdef;
00109 Int_t nvpar,nparx,icstat;
00110 gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat);
00111 gMinuit->mnprin(3,amin);
00112
00113
00114
00115
00116 TF2 *ffunc=new TF2("ffunc",ffunc,0,5,0,5,3);
00117
00118
00119
00120
00121
00122
00123 Double_t v,ev;
00124 for (int i=0;i<3;i++)
00125 {
00126 gMinuit->GetParameter(i,v,ev);
00127 ffunc->SetParameter(i,v);
00128 cout<<v<<" "<<ev<<endl;
00129 cout<<ffunc->GetParameter(i)<<endl;
00130 }
00131
00132
00133 ffunc->DrawCopy("lego");
00134 h3d->DrawCopy("same");
00135
00136
00137
00138
00139 }
00140