def test_crg_noise_pad(): f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) # If we don't use noise_pad_size, then when we draw an image larger than the original postage # stamp, it gets padded with (nearly) zeros. We can check this by measuring the variance around # the edge of the image (so away from the galaxy light). crg = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=0) psf = galsim.Gaussian(fwhm=0.4) obj = galsim.Convolve(crg, psf) bandpass = f606w_cat.getBandpass() img = obj.drawImage(bandpass, nx=24, ny=24, scale=0.2) x = np.arange(24) x, y = np.meshgrid(x, x) edge = (x < 4) | (x > 19) | (y < 4) | (y > 19) print(np.var(img.array[edge])) edgevar = np.var(img.array[edge]) np.testing.assert_allclose(edgevar, 0.0, rtol=0, atol=1e-11) # If we turn up noise_pad_size though, then the variance of the edge should match the variance # computed via CRG rng = galsim.BaseDeviate(577) crg = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=0, rng=rng, noise_pad_size=4) obj = galsim.Convolve(crg, psf) img = obj.drawImage(bandpass, nx=24, ny=24, scale=0.2) edgevar = np.var(img.array[edge]) print("expected variance: ", obj.noise.getVariance()) print("edge variance: ", edgevar) # Not super accurate, but since we only have a handful of correlated pixels to use, that # may be expected. More detailed tests of noise in test_crg_noise() show better accuracy. np.testing.assert_allclose(obj.noise.getVariance(), edgevar, atol=0, rtol=0.3)
def test_area_norm(): """Check that area_norm works as expected""" f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) psf = galsim.Gaussian(fwhm=0.6) rng = galsim.BaseDeviate(5772) crg1 = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], random=True, rng=rng.duplicate()) crg2 = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], random=True, rng=rng.duplicate(), area_norm=galsim.real.HST_area) assert crg1 != crg2 LSST_i = galsim.Bandpass(os.path.join(bppath, "LSST_r.dat"), 'nm') obj1 = galsim.Convolve(crg1, psf) obj2 = galsim.Convolve(crg2, psf) im1 = obj1.drawImage(LSST_i, exptime=1, area=1) im2 = obj2.drawImage(LSST_i, exptime=1, area=galsim.real.HST_area) printval(im1, im2) np.testing.assert_array_almost_equal(im1.array, im2.array) np.testing.assert_almost_equal( obj1.noise.getVariance(), obj2.noise.getVariance() * galsim.real.HST_area**2) # area_norm is equivalant to an overall scaling crg3 = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], random=True, rng=rng.duplicate()) crg3 /= galsim.real.HST_area obj3 = galsim.Convolve(crg3, psf) im3 = obj3.drawImage(LSST_i, exptime=1, area=galsim.real.HST_area) np.testing.assert_array_almost_equal(im3.array, im2.array) np.testing.assert_almost_equal(obj3.noise.getVariance(), obj2.noise.getVariance()) rg1 = galsim.RealGalaxy(f606w_cat, index=1) rg2 = galsim.RealGalaxy(f606w_cat, index=1, area_norm=galsim.real.HST_area) assert rg1 != rg2 obj1 = galsim.Convolve(rg1, psf) obj2 = galsim.Convolve(rg2, psf) im1 = obj1.drawImage() im2 = obj2.drawImage(exptime=1, area=galsim.real.HST_area) printval(im1, im2) np.testing.assert_array_almost_equal(im1.array, im2.array) np.testing.assert_almost_equal( obj1.noise.getVariance(), obj2.noise.getVariance() * galsim.real.HST_area**2) # area_norm is equivalant to an overall scaling rg3 = galsim.RealGalaxy(f606w_cat, index=1) rg3 /= galsim.real.HST_area obj3 = galsim.Convolve(rg3, psf) im3 = obj3.drawImage(exptime=1, area=galsim.real.HST_area) np.testing.assert_array_almost_equal(im3.array, im2.array) np.testing.assert_almost_equal(obj3.noise.getVariance(), obj2.noise.getVariance())
def test_ne(): """ Check that inequality works as expected.""" rgc = galsim.RealGalaxyCatalog(catalog_file, dir=image_dir) f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) crg1 = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=0) crg2 = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=1) covspec1 = crg1.covspec covspec2 = crg2.covspec gsp = galsim.GSParams(folding_threshold=1.1e-3) objs = [ galsim.RealGalaxy(rgc, index=0), galsim.RealGalaxy(rgc, index=1), galsim.RealGalaxy(rgc, index=0, x_interpolant='Linear'), galsim.RealGalaxy(rgc, index=0, k_interpolant='Linear'), galsim.RealGalaxy(rgc, index=0, flux=1.1), galsim.RealGalaxy(rgc, index=0, flux_rescale=1.2), galsim.RealGalaxy(rgc, index=0, area_norm=2), galsim.RealGalaxy(rgc, index=0, pad_factor=1.1), galsim.RealGalaxy(rgc, index=0, noise_pad_size=5.0), galsim.RealGalaxy(rgc, index=0, gsparams=gsp), crg1, crg2, galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=0, k_interpolant='Linear'), covspec1, covspec2 ] all_obj_diff(objs) for obj in objs[:-5]: do_pickle(obj) # CovarianceSpectrum and ChromaticRealGalaxy are both reprable, but their reprs are rather # large, so the eval(repr) checks take a long time. # Therefore, run them from command line, but not from pytest. if __name__ == '__main__': do_pickle(crg1) do_pickle(covspec1) else: do_pickle(crg1, irreprable=True) do_pickle(covspec1, irreprable=True)
def test_pickle_crg(): """Just do some pickling tests of ChromaticRealGalaxy.""" f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) crg = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=0) do_pickle(crg) do_pickle(crg, lambda x: x.drawImage(f606w_cat.getBandpass())) # Check that missing band raises ValueError orig_band = f606w_cat.band f606w_cat.band = 'eggs' with assert_raises(ValueError): f606w_cat.getBandpass() f606w_cat.band = orig_band f606w_cat.getBandpass()
def test_crg_noise_draw_transform_commutativity(): """Test commutativity of ChromaticRealGalaxy correlated noise under operations of drawImage and applying transformations. """ LSST_i = galsim.Bandpass(os.path.join(bppath, "LSST_r.dat"), 'nm') f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) psf = galsim.Gaussian(fwhm=0.6) crg = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], id=14886, maxk=psf.maxk) factor = 1.5 g1 = g2 = 0.1 mu = 1.2 theta = 45 * galsim.degrees jac = [1.1, 0.1, -0.1, 1.2] orig = galsim.Convolve(crg, psf) orig.drawImage(LSST_i) draw_transform_img = galsim.ImageD(16, 16, scale=0.2) transform_draw_img = draw_transform_img.copy() multiplied = orig * factor multiplied.drawImage(LSST_i) # needed to populate noise property (orig.noise * factor**2).drawImage(image=draw_transform_img) multiplied.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) divided = orig / factor divided.drawImage(LSST_i) (orig.noise / factor**2).drawImage(image=draw_transform_img) divided.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) expanded = orig.expand(factor) expanded.drawImage(LSST_i) orig.noise.expand(factor).drawImage(image=draw_transform_img) expanded.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) dilated = orig.dilate(factor) dilated.drawImage(LSST_i) orig.noise.dilate(factor).drawImage(image=draw_transform_img) dilated.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) magnified = orig.magnify(mu) magnified.drawImage(LSST_i) orig.noise.magnify(mu).drawImage(image=draw_transform_img) magnified.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) lensed = orig.lens(g1, g2, mu) lensed.drawImage(LSST_i) orig.noise.lens(g1, g2, mu).drawImage(image=draw_transform_img) lensed.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) rotated = orig.rotate(theta) rotated.drawImage(LSST_i) orig.noise.rotate(theta).drawImage(image=draw_transform_img) rotated.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) sheared = orig.shear(g1=g1, g2=g2) sheared.drawImage(LSST_i) orig.noise.shear(g1=g1, g2=g2).drawImage(image=draw_transform_img) sheared.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array) transformed = orig.transform(*jac) transformed.drawImage(LSST_i) orig.noise.transform(*jac).drawImage(image=draw_transform_img) transformed.noise.drawImage(image=transform_draw_img) np.testing.assert_array_almost_equal(draw_transform_img.array, transform_draw_img.array)
def test_crg_roundtrip(): """Test that drawing a ChromaticRealGalaxy using the HST collecting area and filter gives back the original image. """ f606w_cat = galsim.RealGalaxyCatalog('AEGIS_F606w_catalog.fits', dir=image_dir) f814w_cat = galsim.RealGalaxyCatalog('AEGIS_F814w_catalog.fits', dir=image_dir) indices = [0] if __name__ != "__main__" else list(range(len(f606w_cat))) for index in indices: orig_f606w = f606w_cat.getGalImage(index) orig_f814w = f814w_cat.getGalImage(index) crg = galsim.ChromaticRealGalaxy([f606w_cat, f814w_cat], index=index) # Note that getPSF() return value already includes convolution by the pixel f606w_obj = galsim.Convolve(crg, f606w_cat.getPSF(index)) f814w_obj = galsim.Convolve(crg, f814w_cat.getPSF(index)) f606w = f606w_cat.getBandpass() f814w = f814w_cat.getBandpass() im_f606w = f606w_obj.drawImage(f606w, image=orig_f606w.copy(), method='no_pixel') im_f814w = f814w_obj.drawImage(f814w, image=orig_f814w.copy(), method='no_pixel') printval(im_f606w, orig_f606w) printval(im_f814w, orig_f814w) orig_f606w_mom = galsim.hsm.FindAdaptiveMom(orig_f606w) orig_f814w_mom = galsim.hsm.FindAdaptiveMom(orig_f814w) im_f606w_mom = galsim.hsm.FindAdaptiveMom(im_f606w) im_f814w_mom = galsim.hsm.FindAdaptiveMom(im_f814w) # Images are only pixel-by-pixel consistent to 5% or so. However, if you actually plot the # residuals (which you can do by flipping False->True in printval in galsim_test_helpers), # they appear as ringing over the whole image. Probably it's unrealistic to expect this # test to work perfectly since we're effectively deconvolving and then reconvolving by the # same PSF, not a fatter PSF. np.testing.assert_allclose(orig_f606w.array, im_f606w.array, rtol=0., atol=5e-2 * orig_f606w.array.max()) np.testing.assert_allclose(orig_f814w.array, im_f814w.array, rtol=0., atol=5e-2 * orig_f814w.array.max()) # Happily, the pixel-by-pixel residuals don't appear to affect the moments much: np.testing.assert_allclose(orig_f606w_mom.moments_amp, im_f606w_mom.moments_amp, rtol=1e-3, atol=0) np.testing.assert_allclose(orig_f606w_mom.moments_centroid.x, im_f606w_mom.moments_centroid.x, rtol=0., atol=1e-2) np.testing.assert_allclose(orig_f606w_mom.moments_centroid.y, im_f606w_mom.moments_centroid.y, rtol=0., atol=1e-2) np.testing.assert_allclose(orig_f606w_mom.moments_sigma, im_f606w_mom.moments_sigma, rtol=1e-3, atol=0) np.testing.assert_allclose(orig_f606w_mom.observed_shape.g1, im_f606w_mom.observed_shape.g1, rtol=0, atol=2e-4) np.testing.assert_allclose(orig_f606w_mom.observed_shape.g2, im_f606w_mom.observed_shape.g2, rtol=0, atol=2e-4) np.testing.assert_allclose(orig_f814w_mom.moments_amp, im_f814w_mom.moments_amp, rtol=1e-3, atol=0) np.testing.assert_allclose(orig_f814w_mom.moments_centroid.x, im_f814w_mom.moments_centroid.x, rtol=0., atol=1e-2) np.testing.assert_allclose(orig_f814w_mom.moments_centroid.y, im_f814w_mom.moments_centroid.y, rtol=0., atol=1e-2) np.testing.assert_allclose(orig_f814w_mom.moments_sigma, im_f814w_mom.moments_sigma, rtol=1e-3, atol=0) np.testing.assert_allclose(orig_f814w_mom.observed_shape.g1, im_f814w_mom.observed_shape.g1, rtol=0, atol=1e-4) np.testing.assert_allclose(orig_f814w_mom.observed_shape.g2, im_f814w_mom.observed_shape.g2, rtol=0, atol=1e-4) # Check some errors cats = [f606w_cat, f814w_cat] assert_raises(TypeError, galsim.ChromaticRealGalaxy, real_galaxy_catalogs=cats) assert_raises(TypeError, galsim.ChromaticRealGalaxy, cats, index=3, id=4) assert_raises(TypeError, galsim.ChromaticRealGalaxy, cats, index=3, random=True) assert_raises(TypeError, galsim.ChromaticRealGalaxy, cats, id=4, random=True) assert_raises(TypeError, galsim.ChromaticRealGalaxy, cats, random=True, rng='foo')