Re: fits with external errors

Rene Brun (Rene.Brun@cern.ch)
Thu, 01 May 1997 16:04:52 +0200


Wolfgang Korsch wrote:
>
> Hi,
>
> I would like to fit data points where I calculated the errors
> externally. How can I do that in ROOT?
> I need something comparable to vect/fit in PAW.
> It looks to me that the standard fitting options in the
> fit panel (p0 - p9, gaus, and exp) are equivalent to the
> hist/fit option in PAW. Or am I mistaken?
> Do I have to write my own little routine?
> Thanks

See classes TGraph and TGraphErrors, respectively at:

http://root.cern.ch/root/html/TGraph.html
http://root.cern.ch/root/html/TGraphErrors.html

Also look at tutorial:
http://root.cern.ch/root/html/examples/gerrors.C.html

You can use TGraph::Fit to fit a TGraphErrors object

Below, you will find an example to fit non-equidistant data points
where you can specify your own fitting model (here chisquare method).

Rene Brun

//_______________________Ifit.C___________________________________

// Example of a program to fit non-equidistant data points
// =======================================================
//
// The fitting function fcn is a simple chisquare function
// The data consists of 5 data points (arrays x,y,z) + the errors in
errorsz
// More details on the various functions or parameters for these
functions
// can be obtained in an interactive ROOT session with:
// Root > TMinuit *minuit = new TMinuit(10);
// Root > minuit->mnhelp("*",0) to see the list of possible keywords
// Root > minuit->mnhelp("SET",0) explains most parameters
//

Float_t z[5],x[5],y[5],errorz[5];

//______________________________________________________________________________
void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t
iflag)
{
const Int_t nbins = 5;
Int_t i;

//calculate chisquare
Double_t chisq = 0;
Double_t delta;
for (i=0;i<nbins; i++) {
delta = (z[i]-func(x[i],y[i],par))/errorz[i];
chisq += delta*delta;
}
f = chisq;
}

//______________________________________________________________________________
Double_t func(float x,float y,Double_t *par)
{
Double_t value=( (par[0]*par[0])/(x*x)-1)/ (
par[1]+par[2]*y-par[3]*y*y);
return value;
}

//______________________________________________________________________________
void Ifit()
{
// The z values
z[0]=1;
z[1]=0.96;
z[2]=0.89;
z[3]=0.85;
z[4]=0.78;
______// The errors on z values
Float_t error = 0.01;
errorz[0]=error;
errorz[1]=error;
errorz[2]=error;
errorz[3]=error;
errorz[4]=error;
// the x values
x[0]=1.5751;
x[1]=1.5825;
x[2]=1.6069;
x[3]=1.6339;
x[4]=1.6706;
// the y values
y[0]=1.0642;
y[1]=0.97685;
y[2]=1.13168;
y[3]=1.128654;
y[4]=1.44016;

TMinuit *gMinuit = new TMinuit(5); //initialize TMinuit with a
maximum of 5 params
gMinuit->SetFCN(fcn);

Double_t arglist[10];
Int_t ierflg = 0;

arglist[0] = 1;
gMinuit->mnexcm("SET ERR", arglist ,1,ierflg);

// Set starting values and step sizes for parameters
static Double_t vstart[4] = {3, 1 , 0.1 , 0.01};
static Double_t step[4] = {0.1 , 0.1 , 0.01 , 0.001};
gMinuit->mnparm(0, "a1", vstart[0], step[0], 0,0,ierflg);
gMinuit->mnparm(1, "a2", vstart[1], step[1], 0,0,ierflg);
gMinuit->mnparm(2, "a3", vstart[2], step[2], 0,0,ierflg);
gMinuit->mnparm(3, "a4", vstart[3], step[3], 0,0,ierflg);

// Now ready for minimization step
arglist[0] = 500;
arglist[1] = 1.;
gMinuit->mnexcm("MIGRAD", arglist ,2,ierflg);

// Print results
Double_t amin,edm,errdef;
Int_t nvpar,nparx,icstat;
gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat);
gMinuit->mnprin(3,amin);
}