コード例 #1
0
    def test1MinuitFit(self):
        """Test minuit callback and fit"""

        # setup minuit and callback
        gMinuit = TMinuit(5)
        gMinuit.SetPrintLevel(-1)  # quiet
        gMinuit.SetGraphicsMode(ROOT.kFALSE)
        gMinuit.SetFCN(fcn)

        arglist = array('d', 10 * [0.])
        ierflg = Long()

        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)

        # verify results
        amin, edm, errdef = Double(), Double(), Double()
        nvpar, nparx, icstat = Long(), Long(), Long()
        gMinuit.mnstat(amin, edm, errdef, nvpar, nparx, icstat)
        # gMinuit.mnprin( 3, amin )

        self.assertEqual(nvpar, 4)
        self.assertEqual(nparx, 4)

        # success means that full covariance matrix is available (icstat==3)
        self.assertEqual(icstat, 3)

        # check results (somewhat debatable ... )
        par, err = Double(), Double()

        gMinuit.GetParameter(0, par, err)
        self.assertEqual(round(par - 2.15, 2), 0.)
        self.assertEqual(round(err - 0.10, 2), 0.)

        gMinuit.GetParameter(1, par, err)
        self.assertEqual(round(par - 0.81, 2), 0.)
        self.assertEqual(round(err - 0.25, 2), 0.)

        gMinuit.GetParameter(2, par, err)
        self.assertEqual(round(par - 0.17, 2), 0.)
        self.assertEqual(round(err - 0.40, 2), 0.)

        gMinuit.GetParameter(3, par, err)
        self.assertEqual(round(par - 0.10, 2), 0.)
        self.assertEqual(round(err - 0.16, 2), 0.)
コード例 #2
0
    def test1MinuitFit(self):
        """Test minuit callback and fit"""

        # setup minuit and callback
        gMinuit = TMinuit(5)
        gMinuit.SetPrintLevel(-1)  # quiet
        gMinuit.SetGraphicsMode(ROOT.kFALSE)
        gMinuit.SetFCN(fcn)

        arglist = array('d', 10 * [0.])
        if not exp_pyroot and sys.hexversion < 0x3000000:
            ierflg = ROOT.Long()
        else:
            ierflg = ctypes.c_int()

        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)

        # verify results
        if exp_pyroot:
            Double = ctypes.c_double
        else:
            Double = ROOT.Double
        amin, edm, errdef = Double(), Double(), Double()
        if not exp_pyroot and sys.hexversion < 0x3000000:
            Long = ROOT.Long
            nvpar, nparx, icstat = Long(), Long(), Long()
        else:
            nvpar, nparx, icstat = ctypes.c_int(), ctypes.c_int(
            ), ctypes.c_int()
        gMinuit.mnstat(amin, edm, errdef, nvpar, nparx, icstat)
        # gMinuit.mnprin( 3, amin )

        if exp_pyroot or sys.hexversion >= 0x3000000:
            nvpar, nparx, icstat = map(lambda x: x.value,
                                       [nvpar, nparx, icstat])
        self.assertEqual(nvpar, 4)
        self.assertEqual(nparx, 4)

        # success means that full covariance matrix is available (icstat==3)
        self.assertEqual(icstat, 3)

        # check results (somewhat debatable ... )
        par, err = Double(), Double()

        if exp_pyroot:
            # ctypes.c_double requires the explicit retrieval of the inner value
            gMinuit.GetParameter(0, par, err)
            self.assertEqual(round(par.value - 2.15, 2), 0.)
            self.assertEqual(round(err.value - 0.10, 2), 0.)

            gMinuit.GetParameter(1, par, err)
            self.assertEqual(round(par.value - 0.81, 2), 0.)
            self.assertEqual(round(err.value - 0.25, 2), 0.)

            gMinuit.GetParameter(2, par, err)
            self.assertEqual(round(par.value - 0.17, 2), 0.)
            self.assertEqual(round(err.value - 0.40, 2), 0.)

            gMinuit.GetParameter(3, par, err)
            self.assertEqual(round(par.value - 0.10, 2), 0.)
            self.assertEqual(round(err.value - 0.16, 2), 0.)
        else:
            gMinuit.GetParameter(0, par, err)
            self.assertEqual(round(par - 2.15, 2), 0.)
            self.assertEqual(round(err - 0.10, 2), 0.)

            gMinuit.GetParameter(1, par, err)
            self.assertEqual(round(par - 0.81, 2), 0.)
            self.assertEqual(round(err - 0.25, 2), 0.)

            gMinuit.GetParameter(2, par, err)
            self.assertEqual(round(par - 0.17, 2), 0.)
            self.assertEqual(round(err - 0.40, 2), 0.)

            gMinuit.GetParameter(3, par, err)
            self.assertEqual(round(par - 0.10, 2), 0.)
            self.assertEqual(round(err - 0.16, 2), 0.)