def test_ee(): """Image class: testing ensquared energy.""" wcs = WCS() data = np.ones(shape=(6, 5)) * 2 image1 = Image(data=data, wcs=wcs) image1.mask_region((2, 2), (1.5, 1.5), inside=False, unit_center=None, unit_radius=None) assert image1.ee() == 9 * 2 assert image1.ee(frac=True) == 1.0 ee = image1.ee(center=(2, 2), unit_center=None, radius=1, unit_radius=None) assert ee == 4 * 2 r, eer = image1.eer_curve(center=(2, 2), unit_center=None, unit_radius=None, cont=0) assert r[1] == 1.0 assert eer[1] == 1.0 size = image1.ee_size(center=(2, 2), unit_center=None, unit_size=None, cont=0) assert_almost_equal(size[0], 1.775)
def test_rebin(): """Image class: testing rebin methods.""" wcs = WCS(crval=(0, 0)) data = np.arange(30).reshape(6, 5) image1 = Image(data=data, wcs=wcs, var=np.ones(data.shape) * 0.5) image1.mask_region((2, 2), (1.5, 1.5), inside=False, unit_center=None, unit_radius=None) # The test data array looks as follows: # # ---- ---- ---- ---- ---- # ---- 6.0 7.0 8.0 ---- # ---- 11.0 12.0 13.0 ---- # ---- 16.0 17.0 18.0 ---- # ---- ---- ---- ---- ---- # ---- ---- ---- ---- ---- # # Where ---- signifies a masked value. # # After reducing both dimensions by a factor of 2, we should # get a data array of the following 6 means of 4 pixels each: # # ---- ---- => 6/1 ---- ---- => (7+8)/2 # ---- 6.0 7.0 8.0 # # ---- 11.0 => (11+16)/2 12.0 13.0 => (12+13+17+18)/4 # ---- 16.0 17.0 18.0 # # ---- ---- => ---- ---- ---- => ---- # ---- ---- ---- ---- expected = np.ma.array(data=[[6.0, 7.5], [13.5, 15], [0.0, 0.0]], mask=[[False, False], [False, False], [True, True]]) image2 = image1.rebin(2) assert_masked_allclose(image2.data, expected) image2 = image1.rebin(factor=(2, 2)) assert_masked_allclose(image2.data, expected) # The variances of the original pixels were all 0.5, so taking the # mean of N of these should give the mean a variance of 0.5/N. # Given the number of pixels averaged in each of the above means, # we thus expect the variance array to look as follows. expected = np.ma.array(data=[[0.5, 0.25], [0.25, 0.125], [0.0, 0.0]], mask=[[False, False], [False, False], [True, True]]) assert_masked_allclose(image2.var, expected) # Check the WCS information. start = image2.get_start() assert start[0] == 0.5 assert start[1] == 0.5
def test_mask(): """Image class: testing mask functionalities""" wcs = WCS() data = np.ones(shape=(6, 5)) * 2 # A region of half-width=1 and half-height=1 should have a size of # 2x2 pixels. A 2x2 region of pixels has a center at the shared # corner of the 4 pixels, and the closest corner to the requested # center of 2.1,1.8 is 2.5,1.5, so we expect the square of unmasked pixels # to be pixels 2,3 along the Y axis, and pixels 1,2 along the X axis. image1 = Image(data=data, wcs=wcs) image1.mask_region((2.1, 1.8), (1, 1), inside=False, unit_center=None, unit_radius=None) expected_mask = np.array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 0, 0, 1, 1], [1, 0, 0, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=bool) assert_array_equal(image1._mask, expected_mask) # Test that inside=True gives the opposite result image1.unmask() image1.mask_region((2.1, 1.8), (1, 1), inside=True, unit_center=None, unit_radius=None) assert_array_equal(image1._mask, ~expected_mask) # And test with a rotation, 90° so should give the same result image1.unmask() image1.mask_region((2.1, 1.8), (1, 1), inside=True, unit_center=None, unit_radius=None, posangle=90) assert_array_equal(image1._mask, ~expected_mask) # Try exactly the same experiment as the above, except that the center # and size of the region are specified in world-coordinates instead of # pixels. wcs = WCS(deg=True) image1 = Image(data=data, wcs=wcs) image1.mask_region(wcs.pix2sky([2.1, 1.8]), (3600, 3600), inside=False) assert_array_equal(image1._mask, expected_mask) # And same with a rotation image1.unmask() image1.mask_region(wcs.pix2sky([2.1, 1.8]), (3600, 3600), inside=True, posangle=90) assert_array_equal(image1._mask, ~expected_mask) # Mask around a region of half-width and half-height 1.1 pixels, # specified in arcseconds, centered close to pixel 2.4,3.8. This # ideally corresponds to a region of 2.2x2.2 pixels. The closest # possible size is 2x2 pixels. A region of 2x2 pixels has its # center at the shared corner of these 4 pixels, and the nearest # corner to the desired central index of (2.4,3.8) is (2.5,3.5). # So all of the image should be masked, except for a 2x2 area of # pixel indexes 2,3 along the Y axis and pixel indexes 3,4 along # the X axis. image1.unmask() image1.mask_region(wcs.pix2sky([2.4, 3.8]), 1.1 * 3600.0, inside=False) expected_mask = np.array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=bool) assert_array_equal(image1._mask, expected_mask) # Mask outside an elliptical region centered at pixel 3.5,3.5. # The boolean expected_mask array given below was a verified # output of mask_ellipse() for the specified ellipse parameters. data = np.ones(shape=(8, 8)) image1 = Image(data=data, wcs=wcs) image1.mask_ellipse([3.5, 3.5], (2.5, 3.5), 45.0, unit_radius=None, unit_center=None, inside=False) expected_mask = np.array([ [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], dtype=bool) assert_array_equal(image1._mask, expected_mask) # Use np.where to select the masked pixels and check that mask_selection() # then reproduces the same mask. ksel = np.where(image1.data.mask) image1.unmask() image1.mask_selection(ksel) assert_array_equal(image1._mask, expected_mask) # Check inside=True image1.unmask() image1.mask_ellipse([3.5, 3.5], (2.5, 3.5), 45.0, unit_radius=None, unit_center=None, inside=True) assert_array_equal(image1._mask, ~expected_mask)