# Example of a fitting program # ============================ # # 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 from ROOT import * from array import array; Error = 0; z = array( 'f', ( 1., 0.96, 0.89, 0.85, 0.78 ) ) errorz = array( 'f', 5*[0.01] ) x = array( 'f', ( 1.5751, 1.5825, 1.6069, 1.6339, 1.6706 ) ) y = array( 'f', ( 1.0642, 0.97685, 1.13168, 1.128654, 1.44016 ) ) ncount = 0 ##______________________________________________________________________________ def testfit(): gMinuit = TMinuit(5) gMinuit.SetFCN( fcn ) arglist = array( 'd', 10*[0.] ) ierflg = Long(0) arglist[0] = 1 gMinuit.mnexcm( "SET ERR", arglist, 1, ierflg ) # Set starting values and step sizes for parameters vstart = array( 'd', ( 3, 1, 0.1, 0.01 ) ) step = array( 'd', ( 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 amin, edm, errdef = 0.18, 0.19, 0.20 nvpar, nparx, icstat = 1983, 1984, 1985 gMinuit.mnstat( amin, edm, errdef, nvpar, nparx, icstat ) gMinuit.mnprin( 3, amin ) ##______________________________________________________________________________ def fcn( npar, gin, f, par, iflag ): global ncount nbins = 5 # calculate chisquare chisq, delta = 0., 0. for i in range(nbins): delta = (z[i]-func(x[i],y[i],par))/errorz[i] chisq += delta*delta f[0] = chisq ncount += 1 def func( x, y, par ): value = ( (par[0]*par[0])/(x*x)-1)/ ( par[1]+par[2]*y-par[3]*y*y) return value ##______________________________________________________________________________ if __name__ == '__main__': testfit()