Beispiel #1
0
    def _run_em(self):
        # only run admom if not sent
        if self.ares is None:
            self._run_admom()
        if self.ares is None:
            self.result = {"flags": GMIXEM_ERROR_ADMOM_FAILED}
            return

        im, sky, guess0 = self._do_prep()

        ntry = self.maxtry_em
        for i in xrange(ntry):
            guess = self._perturb_gmix(guess0)
            gm = GMixEM(im, guess, sky=sky, maxiter=self.maxiter, tol=self.tol, cocenter=self.cocenter)
            flags = gm.get_flags()
            if flags == 0:
                break

        if flags != 0:
            print >> stderr, "em flags after", ntry, "tries:"
            gmix_image.printflags("em", flags)

        self._fitter = gm
        gmix = gm.get_gmix()
        self.result = {
            "gmix": gmix,
            "flags": gm.get_flags(),
            "numiter": gm.get_numiter(),
            "fdiff": gm.get_fdiff(),
            "ntry": i + 1,
        }
        if flags == 0:
            stats = self.get_stats()
            self.result.update(stats)
Beispiel #2
0
    def process(self):
        c=self['filternum']
        self.set_admom()

        ntrials = len(self['psf']['trials'])

        chi2arr=zeros(ntrials) + 1.e9
        gmlist=[]

        im=self.psf.copy()
        im_min = im.min()
        if im_min <= 0:
            im -= im_min
            sky=0.001*im.max()
            im += sky
        else:
            sky = im_min


        for i,trial in enumerate(self['psf']['trials']):
            #prior,width = self.get_prior_turb(trial)
            guess = self.get_em_guess(trial)

            if self['verbose']:
                wlog('guess')
                gmix_print(guess,title='guess:')

            gm = gmix_image.GMixEM(im,guess,
                                   sky=sky,
                                   maxiter=4000,
                                   tol=1.e-6,
                                   coellip=False,
                                   cocenter=False) # true required for deconv



            chi2arr[i] = gm.get_fdiff()
            if self['verbose']:
                gmix_print(gm.pars,title='pars:')
                wlog("chi2/pdeg:",chi2arr[i])

            gmlist.append(gm)

        w=chi2arr.argmin()
        self.gm = gmlist[w]

        flags = gm.get_flags()
        if flags != 0:
            printflags('em',flags)
            raise ValueError("error")
        if self['verbose']:
            gmix_print(gm.pars,title='popt:')

            wlog("\n")

            wlog("numiter gmix:",gm.numiter)
Beispiel #3
0
    def process(self):
        c=self['filternum']
        self.set_admom()

        ntrials = len(self['psf']['trials'])

        chi2arr=zeros(ntrials) + 1.e9
        gmlist=[]

        for i,trial in enumerate(self['psf']['trials']):
            ngauss=trial['ngauss']
            if ngauss==3:
                prior,width = self.get_prior_turb(trial)
            elif ngauss==2:
                prior,width = self.get_prior_2generic(trial)
            else:
                raise ValueError("only have ngauss in [2,3] now")
            #prior,width = self.get_prior_2psfield(trial)
            #prior,width = self.get_prior_test(trial)

            if self['verbose']:
                print_pars(prior,front="guess: ")
            gm = gmix_image.GMixFitCoellip(self.psf, self['skysig'],
                                           prior,width, verbose=False)
            #gm = gmix_image.gmix_fit.GMixFitCoellipNoPrior(self.psf, self['skysig'],
            #                                               prior, verbose=False)

            if gm.flags != 0:
                gmix_image.printflags("flags:",gm.flags)
                raise ValueError("error")
            chi2arr[i] = gm.get_chi2per(gm.popt)
            if self['verbose']:
                print_pars(gm.popt,front="pars:  ")
                print_pars(gm.perr,front="perr:  ")
                wlog("chi2/pdeg:",chi2arr[i])

            gmlist.append(gm)

        w=chi2arr.argmin()
        self.gm = gmlist[w]
        wlog('w:',w)

        if self['verbose']:
            print_pars(chi2arr,front='chi2/deg: ')

            wlog("\n")

            print_pars(gm.popt,front='popt: ')
            print_pars(gm.perr,front='perr: ')
            #wlog("s2n:",s2n)
            wlog("numiter gmix:",gm.numiter)
            ngauss=(len(gm.popt)-4)/2
Beispiel #4
0
    def _run_em(self):
        guess0 = self._get_guess()

        ntry = self.maxtry
        for i in xrange(ntry):
            guess = self._perturb_dlist(guess0)
            gm = GMixEM(
                self.image,
                guess,
                jacobian=self.jacobian,
                sky=self.sky,
                maxiter=self.maxiter,
                tol=self.tol,
                cocenter=self.cocenter,
            )

            flags = gm.get_flags()
            if flags == 0:
                break

        if flags != 0:
            print >> stderr, "em flags after", ntry, "tries:"
            gmix_image.printflags("em", flags)

        self._fitter = gm
        gmix = gm.get_gmix()
        self.result = {
            "gmix": gmix,
            "pars": gmix.get_pars(),
            "flags": flags,
            "numiter": gm.get_numiter(),
            "fdiff": gm.get_fdiff(),
            "ntry": i + 1,
        }
        if flags == 0:
            stats = self.get_stats()
            self.result.update(stats)
Beispiel #5
0
def test_fit_dev_e1e2(ngauss=4, s2n=1.e5):
    import biggles
    import admom
    import fimage
    numpy.random.seed(35)

    ptype='e1e2'

    e = 0.2
    theta = 23.7
    e1,e2 = etheta2e1e2(e,theta)

    print >>stderr,"e:",e,"e1:",e1,"e2:",e2

    nsig=15
    #nsig=7
    npars=2*ngauss+4
    nsigma_vals=20

    f='test-opt-dev-bysigma'
    f += '-s2n%d' % s2n
    f += '.rec'
    pngf=f.replace('.rec','.png')
    if not os.path.exists(f):
        data=numpy.zeros(nsigma_vals,dtype=[('sigma','f8'),('pars','f8',npars)])
        #sigvals = numpy.linspace(1.5,5.0,nsigma_vals)
        sigvals = numpy.linspace(3.,5.0,nsigma_vals)
        #sigvals=array([3.0])
        for isigma,sigma in enumerate(sigvals):
            print '-'*70
            print 'sigma:',sigma
            T = 2*sigma**2

            cov = ellip2mom(T, e=e, theta=theta)
            dim = int(2*nsig*sigma)
            if (dim % 2) == 0:
                dim += 1
            dims=array([dim,dim])
            cen=(dims-1)/2.

            im0 = model_image('dev',dims,cen,cov,nsub=16)
            im,skysig = fimage.add_noise(im0, s2n, check=True)

            dim = int(2*nsig*sigma)
            if (dim % 2) == 0:
                dim += 1
            dims=array([dim,dim])
            cen=(dims-1)/2.

            ares = admom.admom(im0,cen[0],cen[1],guess=T/2,nsub=16)
            Tadmom=ares['Irr'] + ares['Icc']

            if ngauss == 4:
                Tmax = Tadmom*100
                # 0.02620127  0.09348825  0.23987656  0.63958437
                p0 = array([cen[0],
                            cen[1],
                            e1,
                            e2,
                            0.026,
                            0.093,
                            0.24,
                            0.64,
                            Tmax, 
                            Tmax*0.18,
                            Tmax*0.04,
                            Tmax*0.0027])
            else:
                p0 = array([cen[0],
                            cen[1],
                            e1,
                            e2,
                            1./ngauss,
                            1./ngauss,
                            1./ngauss,
                            Tadmom*4.9, 
                            Tadmom*0.82, 
                            Tadmom*0.18])

            print_pars(p0,  front='guess: ')
            verbose=False
            gf=gmix_fit.GMixFitCoellip(im, p0, 
                                       ptype=ptype,
                                       verbose=verbose)

            chi2per = gf.get_chi2per(gf.popt,skysig)
            print 'numiter:',gf.numiter
            print_pars(gf.popt,  front='popt:  ')
            if gf.perr is not None:
                print_pars(gf.perr,  front='perr:  ')
            print 'chi2/deg:',chi2per

            if gf.flags != 0:
                gmix_image.printflags('fit',gf.flags)
                raise RuntimeError("failed")

            data['sigma'][isigma] = sigma
            data['pars'][isigma,:] = gf.popt

            tvals = gf.popt[4+ngauss:]
            tmax=tvals.max()
            print 't ratios:',tvals/tmax
            print 'p values:',gf.popt[4:4+ngauss]
            print 'T vals/Tadmom:',tvals/Tadmom


        # plot the last one
        gmix = gmix_fit.pars2gmix_coellip_pick(gf.popt,ptype=ptype)
        model = gmix2image_em(gmix,im.shape)
        images.compare_images(im,model)
    else:
        data=eu.io.read(f)

    biggles.configure('fontsize_min', 1.0)
    biggles.configure('linewidth',1.0) # frame only
    nrows=3
    ncols=4
    tab=biggles.Table(nrows,ncols)
    for par in xrange(npars):
        plt=biggles.FramedPlot()
        plt.add(biggles.Curve(data['sigma'],data['pars'][:,par]))
        plt.add(biggles.Points(data['sigma'],data['pars'][:,par],
                               type='filled circle'))
        plt.xlabel = r'$\sigma$'
        plt.ylabel = 'p%d' % par
        tab[par//ncols,par%ncols] = plt

    tab.show()
    tab.write_img(1024,1024,pngf)