예제 #1
0
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)
예제 #2
0
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())
예제 #3
0
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)
예제 #4
0
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()
예제 #5
0
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)
예제 #6
0
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')