def test_fit_1gauss_noisy(ellip=0.2, s2n=10000): import images import fimage numpy.random.seed(35) sigma = 1.4 T=2*sigma**2 nsig=5 dim = int(nsig*T) if (dim % 2) == 0: dim += 1 dims=array([dim,dim]) cen=(dims-1.)/2. theta=23.7*numpy.pi/180. #eta=-0.7 #ellip=(1+tanh(eta))/2 eta = ellip2eta(ellip+1.e-8) print >>stderr,'ellip:',ellip pars=array([cen[0],cen[1],eta,theta,1.,T]) print >>stderr,'pars' gmix = gmix_fit.pars2gmix_coellip_pick(pars,ptype='eta') nsub=1 im0=gmix2image_em(gmix,dims,nsub=nsub) im,skysig = fimage.add_noise(im0, s2n,check=True) images.multiview(im,title='nsub: %d' % nsub) p0=pars.copy() p0[0] += 1*(randu()-0.5) # cen0 p0[1] += 1*(randu()-0.5) # cen1 p0[2] += 0.2*(randu()-0.5) # eta p0[3] += 0.5*(randu()-0.5) # theta radians p0[4] += 0.1*(randu()-0.5) # p p0[5] += 1*(randu()-0.5) # T print_pars(pars,front='pars: ') print_pars(p0, front='guess: ') gf=gmix_fit.GMixFitCoellip(im, p0, ptype='eta',verbose=True) print 'numiter:',gf.numiter print_pars(gf.popt, front='popt: ') print_pars(gf.perr, front='perr: ') images.imprint(gf.pcov)
def _get_Rnoise(self, data, weights=None, show=False): import images noise0 = self['target_noise'] print("noise0:",noise0) if 'detrend_noises' in self: target_noises = array( self['detrend_noises'] ) else: target_noises = noise0*array( self['detrend_factors'] ) ndiff = target_noises - noise0 xvals = 2*noise0*ndiff if weights is not None: Rdt, Rdt_psf = self._get_Rnoise_means_weighted(data, weights) else: Rdt, Rdt_psf = self._get_Rnoise_means(data) plot_psf=True if Rdt_psf is None: plot_psf=False Rdt_psf = 0.0*Rdt[:,:,0] A = zeros( (2,2) ) Apsf = zeros(2) p='%s (%.4g +/- %.4g) + (%.4g +/ %.4g) deltan' for i in xrange(2): res = fitline(xvals, Rdt_psf[:,i]) Apsf[i] = res['slope'] if plot_psf: plot_line_fit( self['run'], 'Rnoise-detrend-Rpsf%d' % (i+1), xvals, Rdt_psf[:,i],res, r'$2 n \Delta n$', r'$\Delta R^{PSF}_%d$' % (i+1), show=show, label_error=False, ) for j in xrange(2): res = fitline(xvals, Rdt[:,i,j]) A[i,j] = res['slope'] n='A[%d,%d]' % (i+1,j+1) s=res['slope'] serr=res['slope_err'] o=res['offset'] oerr=res['offset_err'] print(p % (n,o,oerr,s,serr)) plt=plot_line_fit( self['run'], 'Rnoise-detrend-R%d%d' % (i+1,j+1), xvals, Rdt[:,i,j], res, r'$2 n \Delta n$', r'$\Delta R_{%d,%d}$' % (i+1,j+1), show=show, label_error=False, ) Rnoise = A*noise0**2 Rnoise_psf = Apsf*noise0**2 print("Rnoise") images.imprint(Rnoise, fmt='%.4g') print("Rnoise_psf") print('%.4g %.4g' % tuple(Rnoise_psf)) return Rnoise, Rnoise_psf
def calc_gmean(self, data, deep_data=None): """ get gtrue, gmeas, gcov """ import ngmix gtrue = data['shear_true'].mean(axis=0) print("getting weights") wts = self.get_weights(data) if wts is None: print(" weights are None") if deep_data is not None: print("getting deep data weights") deep_wts = self.get_weights(deep_data) if deep_wts is None: print(" weights are None") #print("using sens:",self.sens_field) chunksize = 1000 if chunksize > data.size / 10.0: chunksize = data.size / 10 #print("chunksize:",chunksize) if self.sens_style == 'lensfit': raise RuntimeError("lensfit not working yet") if self.sens_field is None: sens = numpy.ones((data.size, 2)) else: sens = data[self.sens_field].copy() gmeas, gcov = ngmix.lensfit.lensfit_jackknife(data[self.g_field], sens, weights=wts, chunksize=chunksize) elif self.sens_style == 'metacal': if self.sens_field is None: sens = numpy.ones((data.size, 2, 2)) else: import images if deep_data is not None: print(" using mean sensitivity from deep data") wsum = deep_wts.sum() wa = deep_wts[:, newaxis, newaxis] s = deep_data[self.sens_field] sens_mean = (s * wa).sum(axis=0) / wsum sens = numpy.zeros((data.size, 2, 2)) sens[:, 0, 0] = sens_mean[0, 0] sens[:, 0, 1] = sens_mean[0, 1] sens[:, 1, 0] = sens_mean[1, 0] sens[:, 1, 1] = sens_mean[1, 1] else: print(" using sensitivity from this data") sens = data[self.sens_field].copy() print("mean sens:") images.imprint(sens.mean(axis=0), fmt='%g') res = ngmix.metacal.jackknife_shear(data[self.g_field], sens, weights=wts, chunksize=chunksize) gmeas = res['shear'] gcov = res['shear_cov'] elif self.sens_style is None: gmeas = data[self.g_field].mean(axis=0) gcov = numpy.zeros((2, 2)) gcov[0, 0] = data[self.g_field][:, 0].std() / numpy.sqrt(data.size) gcov[1, 1] = data[self.g_field][:, 1].std() / numpy.sqrt(data.size) else: raise ValueError("bad sens_style: '%s'" % self.sens_style) return gtrue, gmeas, gcov
def test_fit_1gauss_galsim(ellip=0.2, s2n=10000): import images import galsim import admom numpy.random.seed(35) #sigma = 1.4 sigma = 1 T=2*sigma**2 e = 0.2 theta=23.7 e1,e2 = etheta2e1e2(e,theta) fimage_cov = ellip2mom(T, e=e, theta=theta) print 'e: ',e print 'e1:',e1 print 'e2:',e2 pixel_scale = 1. nsig=5 dim = int(nsig*T) if (dim % 2) == 0: dim += 1 dims=array([dim,dim]) cen=(dims-1)/2 pix = galsim.Pixel(xw=pixel_scale, yw=pixel_scale) gobj = galsim.Gaussian(sigma=sigma) gobj.applyDistortion(galsim.Ellipse(e1=e1,e2=e2)) gcobj = galsim.Convolve([gobj,pix]) im0 = galsim.ImageD(int(dims[1]),int(dims[0])) gcobj.draw(image=im0, dx=pixel_scale) images.multiview(im0.array) galsim_nsub=16 ares = admom.admom(im0.array,cen[0],cen[1],guess=T/2,nsub=galsim_nsub) print 'galsim sigma:',sqrt( (ares['Irr']+ares['Icc'])/2 ) print 'galsim admom e1:',ares['e1'] print 'galsim admom e2:',ares['e2'] print 'galsim center:',ares['row'],ares['col'] fnsub=16 fim0 = model_image('gauss',dims,cen,fimage_cov,nsub=fnsub) fares = admom.admom(fim0,cen[0],cen[1],guess=T/2,nsub=fnsub) print 'fimage sigma:',sqrt( (fares['Irr']+fares['Icc'])/2 ) print 'fimage admom e1:',fares['e1'] print 'fimage admom e2:',fares['e2'] print 'fimage center:',fares['row'],fares['col'] return theta=23.7*numpy.pi/180. print >>stderr,'ellip:',ellip pars=array([cen[0],cen[1],eta,theta,1.,T]) print >>stderr,'pars' gmix = gmix_fit.pars2gmix_coellip_pick(pars,ptype='eta') nsub=1 im0=gmix2image_em(gmix,dims,nsub=nsub) im,skysig = fimage.add_noise(im0, s2n,check=True) images.multiview(im,title='nsub: %d' % nsub) p0=pars.copy() p0[0] += 1*(randu()-0.5) # cen0 p0[1] += 1*(randu()-0.5) # cen1 p0[2] += 0.2*(randu()-0.5) # eta p0[3] += 0.5*(randu()-0.5) # theta radians p0[4] += 0.1*(randu()-0.5) # p p0[5] += 1*(randu()-0.5) # T print_pars(pars,front='pars: ') print_pars(p0, front='guess: ') gf=gmix_fit.GMixFitCoellip(im, p0, ptype='eta',verbose=True) print 'numiter:',gf.numiter print_pars(gf.popt, front='popt: ') print_pars(gf.perr, front='perr: ') images.imprint(gf.pcov)
def calc_gmean(self, data, deep_data=None): """ get gtrue, gmeas, gcov """ import ngmix gtrue = data['shear_true'].mean(axis=0) print("getting weights") wts=self.get_weights(data) if wts is None: print(" weights are None") if deep_data is not None: print("getting deep data weights") deep_wts = self.get_weights(deep_data) if deep_wts is None: print(" weights are None") #print("using sens:",self.sens_field) chunksize=1000 if chunksize > data.size/10.0: chunksize = data.size/10 #print("chunksize:",chunksize) if self.sens_style=='lensfit': raise RuntimeError("lensfit not working yet") if self.sens_field is None: sens = numpy.ones( (data.size, 2) ) else: sens = data[self.sens_field].copy() gmeas, gcov = ngmix.lensfit.lensfit_jackknife(data[self.g_field], sens, weights=wts, chunksize=chunksize) elif self.sens_style=='metacal': if self.sens_field is None: sens = numpy.ones( (data.size,2,2) ) else: import images if deep_data is not None: print(" using mean sensitivity from deep data") wsum = deep_wts.sum() wa = deep_wts[:,newaxis,newaxis] s=deep_data[self.sens_field] sens_mean = (s*wa).sum(axis=0)/wsum sens = numpy.zeros( (data.size,2,2) ) sens[:,0,0] = sens_mean[0,0] sens[:,0,1] = sens_mean[0,1] sens[:,1,0] = sens_mean[1,0] sens[:,1,1] = sens_mean[1,1] else: print(" using sensitivity from this data") sens = data[self.sens_field].copy() print("mean sens:") images.imprint(sens.mean(axis=0), fmt='%g') res = ngmix.metacal.jackknife_shear(data[self.g_field], sens, weights=wts, chunksize=chunksize) gmeas=res['shear'] gcov=res['shear_cov'] elif self.sens_style is None: gmeas = data[self.g_field].mean(axis=0) gcov=numpy.zeros( (2,2) ) gcov[0,0] = data[self.g_field][:,0].std()/numpy.sqrt(data.size) gcov[1,1] = data[self.g_field][:,1].std()/numpy.sqrt(data.size) else: raise ValueError("bad sens_style: '%s'" % self.sens_style) return gtrue, gmeas, gcov
def _print_pcov(self, res): if res['flags']==0: import images import esutil as eu images.imprint(eu.stat.cov2cor( res['pcov']) , fmt='%10f')