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)
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)
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
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)
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)