Ejemplo n.º 1
0
def Shapelet_setOrder(self,order):
    """Deprecated method to change the order"""
    depr('setOrder',1.1,'shapelet = galsim.Shapelet(sigma, order, ...)')
    if self.order == order: return
    # Preserve the existing values as much as possible.
    if self.order > order:
        bvec = galsim.shapelet.LVector(order, self.bvec[0:galsim.ShapeletSize(order)])
    else:
        import numpy
        a = numpy.zeros(galsim.ShapeletSize(order))
        a[0:len(self.bvec)] = self.bvec
        bvec = galsim.shapelet.LVector(order,a)
    galsim.GSObject.__init__(self, galsim._galsim.SBShapelet(self.sigma, bvec))
Ejemplo n.º 2
0
def test_shapelet_gaussian():
    """Test that the simplest Shapelet profile is equivalent to a Gaussian
    """
    import time
    t1 = time.time()

    ftypes = [np.float32, np.float64]
    scale = 0.2
    test_flux = 23.

    # First, a Shapelet with only b_00 = 1 should be identically a Gaussian
    im1 = galsim.ImageF(64,64, scale=scale)
    im2 = galsim.ImageF(64,64, scale=scale)
    for sigma in [1., 0.6, 2.4]:
        gauss = galsim.Gaussian(flux=test_flux, sigma=sigma)
        gauss.drawImage(im1, method='no_pixel')
        for order in [0, 2, 8]:
            bvec = np.zeros(galsim.ShapeletSize(order))
            bvec[0] = test_flux
            shapelet = galsim.Shapelet(sigma=sigma, order=order, bvec=bvec)
            shapelet.drawImage(im2, method='no_pixel')
            printval(im2,im1)
            np.testing.assert_array_almost_equal(
                    im1.array, im2.array, 5,
                    err_msg="Shapelet with (only) b00=1 disagrees with Gaussian result"
                    "for flux=%f, sigma=%f, order=%d"%(test_flux,sigma,order))

    t2 = time.time()
    print 'time for %s = %.2f'%(funcname(),t2-t1)
Ejemplo n.º 3
0
def Shapelet_setBVec(self, bvec):
    """Deprecated method to change the bvec"""
    depr('setBVec', 1.1, 'shapelet = galsim.Shapelet(sigma, order, bvec=bvec)')
    bvec_size = galsim.ShapeletSize(self.order)
    if len(bvec) != bvec_size:
        raise ValueError("bvec is the wrong size for the Shapelet order")
    import numpy
    bvec = galsim.shapelet.LVector(self.order, numpy.array(bvec))
    self._sbp = galsim._galsim.SBShapelet(self.sigma, bvec)
Ejemplo n.º 4
0
def test_dep_shapelet():
    """Test the deprecated methods in galsim/deprecated/shapelet.py
    """
    np.testing.assert_almost_equal(check_dep(galsim.LVectorSize, 12),
                                   galsim.ShapeletSize(12))

    # The next bit is from the old test_shapelet_adjustments() test

    ftypes = [np.float32, np.float64]

    nx = 128
    ny = 128
    scale = 0.2
    im = galsim.ImageF(nx, ny, scale=scale)

    sigma = 1.8
    order = 6
    bvec = [
        1.3,  # n = 0
        0.02,
        0.03,  # n = 1
        0.23,
        -0.19,
        0.08,  # n = 2
        0.01,
        0.02,
        0.04,
        -0.03,  # n = 3
        -0.09,
        0.07,
        -0.11,
        -0.08,
        0.11,  # n = 4
        -0.03,
        -0.02,
        -0.08,
        0.01,
        -0.06,
        -0.03,  # n = 5
        0.06,
        -0.02,
        0.00,
        -0.05,
        -0.04,
        0.01,
        0.09
    ]  # n = 6

    ref_shapelet = galsim.Shapelet(sigma=sigma, order=order, bvec=bvec)
    ref_im = galsim.ImageF(nx, ny)
    ref_shapelet.drawImage(ref_im, scale=scale, method='no_pixel')

    # test setsigma
    shapelet = galsim.Shapelet(sigma=1., order=order, bvec=bvec)
    check_dep(shapelet.setSigma, sigma)
    shapelet.drawImage(im, method='no_pixel')
    np.testing.assert_array_almost_equal(
        im.array,
        ref_im.array,
        6,
        err_msg="Shapelet set with setSigma disagrees with reference Shapelet")

    # Test setBVec
    shapelet = galsim.Shapelet(sigma=sigma, order=order)
    check_dep(shapelet.setBVec, bvec)
    shapelet.drawImage(im, method='no_pixel')
    np.testing.assert_array_almost_equal(
        im.array,
        ref_im.array,
        6,
        err_msg="Shapelet set with setBVec disagrees with reference Shapelet")

    # Test setOrder
    shapelet = galsim.Shapelet(sigma=sigma, order=2)
    check_dep(shapelet.setOrder, order)
    check_dep(shapelet.setBVec, bvec)
    shapelet.drawImage(im, method='no_pixel')
    np.testing.assert_array_almost_equal(
        im.array,
        ref_im.array,
        6,
        err_msg="Shapelet set with setOrder disagrees with reference Shapelet")

    # Test that changing the order preserves the values to the extent possible.
    shapelet = galsim.Shapelet(sigma=sigma, order=order, bvec=bvec)
    check_dep(shapelet.setOrder, 10)
    np.testing.assert_array_equal(
        shapelet.getBVec()[0:28],
        bvec,
        err_msg="Shapelet setOrder to larger doesn't preserve existing values."
    )
    np.testing.assert_array_equal(
        shapelet.getBVec()[28:66],
        np.zeros(66 - 28),
        err_msg="Shapelet setOrder to larger doesn't fill with zeros.")
    check_dep(shapelet.setOrder, 6)
    np.testing.assert_array_equal(
        shapelet.getBVec(),
        bvec,
        err_msg=
        "Shapelet setOrder back to original from larger doesn't preserve existing values."
    )
    check_dep(shapelet.setOrder, 3)
    np.testing.assert_array_equal(
        shapelet.getBVec()[0:10],
        bvec[0:10],
        err_msg="Shapelet setOrder to smaller doesn't preserve existing values."
    )
    check_dep(shapelet.setOrder, 6)
    np.testing.assert_array_equal(
        shapelet.getBVec()[0:10],
        bvec[0:10],
        err_msg=
        "Shapelet setOrder back to original from smaller doesn't preserve existing values."
    )
    check_dep(shapelet.setOrder, 6)
    np.testing.assert_array_equal(
        shapelet.getBVec()[10:28],
        np.zeros(28 - 10),
        err_msg=
        "Shapelet setOrder back to original from smaller doesn't fill with zeros."
    )

    # Test that setting a Shapelet with setNM gives the right profile
    shapelet = galsim.Shapelet(sigma=sigma, order=order)
    i = 0
    for n in range(order + 1):
        for m in range(n, -1, -2):
            if m == 0:
                check_dep(shapelet.setNM, n, m, bvec[i])
                i = i + 1
            else:
                check_dep(shapelet.setNM, n, m, bvec[i], bvec[i + 1])
                i = i + 2
    shapelet.drawImage(im, method='no_pixel')
    np.testing.assert_array_almost_equal(
        im.array,
        ref_im.array,
        6,
        err_msg="Shapelet set with setNM disagrees with reference Shapelet")

    # Test that setting a Shapelet with setPQ gives the right profile
    shapelet = galsim.Shapelet(sigma=sigma, order=order)
    i = 0
    for n in range(order + 1):
        for m in range(n, -1, -2):
            p = (n + m) // 2
            q = (n - m) // 2
            if m == 0:
                check_dep(shapelet.setPQ, p, q, bvec[i])
                i = i + 1
            else:
                check_dep(shapelet.setPQ, p, q, bvec[i], bvec[i + 1])
                i = i + 2
    shapelet.drawImage(im, method='no_pixel')
    np.testing.assert_array_almost_equal(
        im.array,
        ref_im.array,
        6,
        err_msg="Shapelet set with setPQ disagrees with reference Shapelet")

    # Check fitImage
    s1 = galsim.Shapelet(sigma=sigma, order=10)
    check_dep(s1.fitImage, image=im)
    s2 = galsim.FitShapelet(sigma=sigma, order=10, image=im)
    np.testing.assert_array_almost_equal(s1.getBVec(), s2.getBVec())
Ejemplo n.º 5
0
def test_shapelet_drawImage():
    """Test some measured properties of a drawn shapelet against the supposed true values
    """
    ftypes = [np.float32, np.float64]
    scale = 0.2
    test_flux = 23.

    im = galsim.ImageF(129, 129, scale=scale)
    for sigma in [1., 0.3, 2.4]:
        for order in [0, 2, 8]:
            bvec = np.zeros(galsim.ShapeletSize(order))
            bvec[0] = 1.  # N,m = 0,0
            k = 0
            for n in range(1, order + 1):
                k += n + 1
                if n % 2 == 0:  # even n
                    bvec[k] = 0.23 / (n * n)  # N,m = n,0  or p,q = n/2,n/2
                    if n >= 2:
                        bvec[k - 2] = 0.14 / n  # N,m = n,2  real part
                        bvec[k - 1] = -0.08 / n  # N,m = n,2  imag part
                else:  # odd n
                    if n >= 1:
                        bvec[k - 1] = -0.08 / n**3.2  # N,m = n,1  real part
                        bvec[k] = 0.05 / n**2.1  # N,m = n,1  imag part
                    if n >= 3:
                        bvec[k - 3] = 0.31 / n**4.2  # N,m = n,3  real part
                        bvec[k - 2] = -0.18 / n**3.9  # N,m = n,3  imag part
            print('shapelet vector = ', bvec)
            shapelet = galsim.Shapelet(sigma=sigma, order=order, bvec=bvec)

            check_basic(shapelet, "Shapelet", approx_maxsb=True)

            # Test normalization  (This is normally part of do_shoot.  When we eventually
            # implement photon shooting, we should go back to the normal do_shoot call,
            # and remove this section.)
            shapelet = shapelet.withFlux(test_flux)
            shapelet.drawImage(im)
            flux = im.array.sum()
            print('im.sum = ', flux, '  cf. ', test_flux)
            np.testing.assert_almost_equal(
                flux / test_flux,
                1.,
                4,
                err_msg=
                "Flux normalization for Shapelet disagrees with expected result"
            )
            np.testing.assert_allclose(
                im.array.max(),
                shapelet.maxSB() * im.scale**2,
                rtol=0.1,
                err_msg="Shapelet maxSB did not match maximum pixel")

            # Test centroid
            # Note: this only works if the image has odd sizes.  If they are even, then
            # setCenter doesn't actually set the center to the true center of the image
            # (since it falls between pixels).
            im.setCenter(0, 0)
            x, y = np.meshgrid(
                np.arange(im.array.shape[0]).astype(float) + im.getXMin(),
                np.arange(im.array.shape[1]).astype(float) + im.getYMin())
            x *= scale
            y *= scale
            flux = im.array.sum()
            mx = (x * im.array).sum() / flux
            my = (y * im.array).sum() / flux
            conv = galsim.Convolve([shapelet, galsim.Pixel(scale)])
            print('centroid = ', mx, my, ' cf. ', conv.centroid())
            np.testing.assert_almost_equal(
                mx,
                shapelet.centroid().x,
                3,
                err_msg=
                "Measured centroid (x) for Shapelet disagrees with expected result"
            )
            np.testing.assert_almost_equal(
                my,
                shapelet.centroid().y,
                3,
                err_msg=
                "Measured centroid (y) for Shapelet disagrees with expected result"
            )
Ejemplo n.º 6
0
def LVectorSize(order):
    """A deprecated synonym for ShapeletSize"""
    depr('LVectorSize', 1.1, 'ShapeletSize')
    return galsim.ShapeletSize(order)