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))
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)
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)
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())
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" )
def LVectorSize(order): """A deprecated synonym for ShapeletSize""" depr('LVectorSize', 1.1, 'ShapeletSize') return galsim.ShapeletSize(order)