diff --git a/test_autoarray/dataset/imaging/test_dataset.py b/test_autoarray/dataset/imaging/test_dataset.py index 9a3f03e59..c42a62f06 100644 --- a/test_autoarray/dataset/imaging/test_dataset.py +++ b/test_autoarray/dataset/imaging/test_dataset.py @@ -33,7 +33,7 @@ def make_test_data_path(): return test_data_path -def test__grid__uses_mask_and_settings( +def test__grid__uses_mask_and_settings__lp_grid_matches_grid_2d_7x7( image_7x7, noise_map_7x7, mask_2d_7x7, @@ -57,7 +57,7 @@ def test__grid__uses_mask_and_settings( assert (masked_imaging_7x7.grids.lp.slim == grid_2d_7x7).all() -def test__grids_pixelization__uses_mask_and_settings( +def test__grids_pixelization__uses_mask_and_settings__default_over_sample__matches_grid_2d_7x7( image_7x7, noise_map_7x7, mask_2d_7x7, @@ -75,6 +75,17 @@ def test__grids_pixelization__uses_mask_and_settings( assert (masked_imaging_7x7.grids.pixelization == grid_2d_7x7).all() assert (masked_imaging_7x7.grids.pixelization.slim == grid_2d_7x7).all() + +def test__grids_pixelization__uses_mask_and_settings__custom_over_sample__returns_grid2d_with_correct_size( + image_7x7, + noise_map_7x7, + mask_2d_7x7, + grid_2d_7x7, +): + masked_image_7x7 = aa.Array2D(values=image_7x7.native, mask=mask_2d_7x7) + + masked_noise_map_7x7 = aa.Array2D(values=noise_map_7x7.native, mask=mask_2d_7x7) + masked_imaging_7x7 = aa.Imaging( data=masked_image_7x7, noise_map=masked_noise_map_7x7, @@ -86,7 +97,9 @@ def test__grids_pixelization__uses_mask_and_settings( assert masked_imaging_7x7.grids.over_sample_size_pixelization[0] == 4 -def test__grid_settings__sub_size(image_7x7, noise_map_7x7): +def test__grid_settings__sub_size__returns_correct_over_sample_sizes( + image_7x7, noise_map_7x7 +): dataset_7x7 = aa.Imaging( data=image_7x7, noise_map=noise_map_7x7, @@ -116,7 +129,7 @@ def test__no_noise_map__raises_exception(): aa.Imaging(data=image) -def test__from_fits(): +def test__from_fits__separate_fits_files__loads_data_psf_noise_map_correctly(): dataset = aa.Imaging.from_fits( pixel_scales=0.1, data_path=path.join(test_data_path, "3x3_ones.fits"), @@ -134,6 +147,8 @@ def test__from_fits(): assert dataset.psf.kernel.mask.pixel_scales == (0.1, 0.1) assert dataset.noise_map.mask.pixel_scales == (0.1, 0.1) + +def test__from_fits__all_data_in_one_fits_file_multiple_hdus__loads_data_psf_noise_map_correctly(): dataset = aa.Imaging.from_fits( pixel_scales=0.1, data_path=path.join(test_data_path, "3x3_multiple_hdu.fits"), @@ -155,7 +170,9 @@ def test__from_fits(): assert dataset.noise_map.mask.pixel_scales == (0.1, 0.1) -def test__output_to_fits(imaging_7x7, test_data_path): +def test__output_to_fits__round_trips_data_psf_noise_map_correctly( + imaging_7x7, test_data_path +): imaging_7x7.output_to_fits( data_path=path.join(test_data_path, "data.fits"), @@ -176,7 +193,9 @@ def test__output_to_fits(imaging_7x7, test_data_path): assert dataset.pixel_scales == (0.1, 0.1) -def test__apply_mask(imaging_7x7, mask_2d_7x7, psf_3x3): +def test__apply_mask__data_noise_map_psf_correctly_masked( + imaging_7x7, mask_2d_7x7, psf_3x3 +): masked_imaging_7x7 = imaging_7x7.apply_mask(mask=mask_2d_7x7) assert (masked_imaging_7x7.data.slim == np.ones(9)).all() @@ -198,7 +217,9 @@ def test__apply_mask(imaging_7x7, mask_2d_7x7, psf_3x3): assert type(masked_imaging_7x7.psf) == aa.Convolver -def test__apply_noise_scaling(imaging_7x7, mask_2d_7x7): +def test__apply_noise_scaling__masked_pixel_data_zeroed_and_noise_set_to_noise_value( + imaging_7x7, mask_2d_7x7 +): masked_imaging_7x7 = imaging_7x7.apply_noise_scaling( mask=mask_2d_7x7, noise_value=1e5 ) @@ -207,7 +228,7 @@ def test__apply_noise_scaling(imaging_7x7, mask_2d_7x7): assert masked_imaging_7x7.noise_map.native[4, 4] == 1e5 -def test__apply_noise_scaling__use_signal_to_noise_value( +def test__apply_noise_scaling__use_signal_to_noise_value__noise_map_scaled_to_match_snr( image_7x7, psf_3x3, noise_map_7x7, mask_2d_7x7 ): @@ -233,7 +254,7 @@ def test__apply_noise_scaling__use_signal_to_noise_value( assert masked_imaging_7x7.noise_map.native[3, 3] == 10.0 -def test__apply_mask__noise_covariance_matrix(): +def test__apply_mask__noise_covariance_matrix__submatrix_extracted_for_unmasked_pixels(): image = aa.Array2D.ones(shape_native=(2, 2), pixel_scales=(1.0, 1.0)) noise_covariance_matrix = np.array( @@ -263,7 +284,7 @@ def test__apply_mask__noise_covariance_matrix(): ) -def test__different_imaging_without_mock_objects__customize_constructor_inputs(): +def test__different_imaging_without_mock_objects__customize_constructor_inputs__single_unmasked_pixel_correct(): kernel = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=3.0) psf = aa.Convolver(kernel=kernel) @@ -291,7 +312,7 @@ def test__different_imaging_without_mock_objects__customize_constructor_inputs() assert (masked_dataset.noise_map == np.array([2.0])).all() -def test__noise_map_unmasked_has_zeros_or_negative__raises_exception(): +def test__noise_map_unmasked_has_zeros__raises_exception(): array = aa.Array2D.no_mask([[1.0, 2.0]], pixel_scales=1.0) noise_map = aa.Array2D.no_mask([[0.0, 3.0]], pixel_scales=1.0) @@ -299,6 +320,10 @@ def test__noise_map_unmasked_has_zeros_or_negative__raises_exception(): with pytest.raises(aa.exc.DatasetException): aa.Imaging(data=array, noise_map=noise_map) + +def test__noise_map_unmasked_has_negative_values__raises_exception(): + array = aa.Array2D.no_mask([[1.0, 2.0]], pixel_scales=1.0) + noise_map = aa.Array2D.no_mask([[-1.0, 3.0]], pixel_scales=1.0) with pytest.raises(aa.exc.DatasetException): diff --git a/test_autoarray/dataset/interferometer/test_dataset.py b/test_autoarray/dataset/interferometer/test_dataset.py index 9d07382d6..2cb105fd1 100644 --- a/test_autoarray/dataset/interferometer/test_dataset.py +++ b/test_autoarray/dataset/interferometer/test_dataset.py @@ -14,7 +14,7 @@ ) -def test__dirty_properties( +def test__dirty_image__shape_native_matches_real_space_mask( visibilities_7, visibilities_noise_map_7, uv_wavelengths_7x2, @@ -28,12 +28,39 @@ def test__dirty_properties( ) assert dataset.dirty_image.shape_native == (7, 7) - assert (dataset.transformer.image_from(visibilities=dataset.data)).all() + +def test__dirty_noise_map__shape_native_matches_real_space_mask( + visibilities_7, + visibilities_noise_map_7, + uv_wavelengths_7x2, + mask_2d_7x7, +): + dataset = aa.Interferometer( + data=visibilities_7, + noise_map=visibilities_noise_map_7, + uv_wavelengths=uv_wavelengths_7x2, + real_space_mask=mask_2d_7x7, + ) + assert dataset.dirty_noise_map.shape_native == (7, 7) assert (dataset.transformer.image_from(visibilities=dataset.noise_map)).all() + +def test__dirty_signal_to_noise_map__shape_native_matches_real_space_mask( + visibilities_7, + visibilities_noise_map_7, + uv_wavelengths_7x2, + mask_2d_7x7, +): + dataset = aa.Interferometer( + data=visibilities_7, + noise_map=visibilities_noise_map_7, + uv_wavelengths=uv_wavelengths_7x2, + real_space_mask=mask_2d_7x7, + ) + assert dataset.dirty_signal_to_noise_map.shape_native == (7, 7) assert ( dataset.transformer.image_from(visibilities=dataset.signal_to_noise_map) @@ -102,7 +129,7 @@ def test__output_all_arrays(mask_2d_7x7): assert (dataset.uv_wavelengths[:, 1] == 6.0 * np.ones(3)).all() -def test__transformer( +def test__transformer__dft_class__returns_transformer_dft_instance( visibilities_7, visibilities_noise_map_7, uv_wavelengths_7x2, @@ -118,6 +145,13 @@ def test__transformer( assert type(interferometer_7.transformer) == transformer.TransformerDFT + +def test__transformer__nufft_class__returns_transformer_nufft_instance( + visibilities_7, + visibilities_noise_map_7, + uv_wavelengths_7x2, + mask_2d_7x7, +): interferometer_7 = aa.Interferometer( data=visibilities_7, noise_map=visibilities_noise_map_7, diff --git a/test_autoarray/mask/derive/test_mask_2d.py b/test_autoarray/mask/derive/test_mask_2d.py index 96df64722..c6ca56eaa 100644 --- a/test_autoarray/mask/derive/test_mask_2d.py +++ b/test_autoarray/mask/derive/test_mask_2d.py @@ -24,24 +24,29 @@ def make_derive_mask_2d_9x9(): return aa.DeriveMask2D(mask=mask_2d) -def test__unmasked_mask(derive_mask_2d_9x9): +def test__unmasked_mask__all_false__returns_full_false_array(derive_mask_2d_9x9): assert ( derive_mask_2d_9x9.all_false == np.full(fill_value=False, shape=(9, 9)) ).all() -def test__blurring_mask_from(derive_mask_2d_9x9): +@pytest.mark.parametrize("kernel_shape_native", [(3, 3)]) +def test__blurring_mask_from__3x3_kernel__matches_util_result( + derive_mask_2d_9x9, kernel_shape_native +): blurring_mask_via_util = aa.util.mask_2d.blurring_mask_2d_from( mask_2d=derive_mask_2d_9x9.mask, - kernel_shape_native=(3, 3), + kernel_shape_native=kernel_shape_native, ) - blurring_mask = derive_mask_2d_9x9.blurring_from(kernel_shape_native=(3, 3)) + blurring_mask = derive_mask_2d_9x9.blurring_from( + kernel_shape_native=kernel_shape_native + ) assert (blurring_mask == blurring_mask_via_util).all() -def test__edge_mask(derive_mask_2d_9x9): +def test__edge_mask__9x9_ring_mask__edge_pixels_are_unmasked(derive_mask_2d_9x9): assert ( derive_mask_2d_9x9.edge == np.array( @@ -60,7 +65,7 @@ def test__edge_mask(derive_mask_2d_9x9): ).all() -def test__edge_buffed_mask(): +def test__edge_buffed_mask__5x5_mask_with_centre_masked__buffed_mask_matches_util(): mask = aa.Mask2D.all_false(shape_native=(5, 5), pixel_scales=1.0) mask[2, 2] = True @@ -73,7 +78,7 @@ def test__edge_buffed_mask(): assert (derive_mask_2d.edge_buffed == edge_buffed_mask_manual).all() -def test__border_mask(derive_mask_2d_9x9): +def test__border_mask__9x9_ring_mask__inner_pixels_are_masked(derive_mask_2d_9x9): assert ( derive_mask_2d_9x9.border == np.array( diff --git a/test_autoarray/operators/test_convolver.py b/test_autoarray/operators/test_convolver.py index dfd0998be..64eff758a 100644 --- a/test_autoarray/operators/test_convolver.py +++ b/test_autoarray/operators/test_convolver.py @@ -10,25 +10,26 @@ test_data_path = path.join("{}".format(path.dirname(path.realpath(__file__))), "files") -def test__no_blur(): - convolver = aa.Convolver.no_blur(pixel_scales=1.0) +@pytest.mark.parametrize( + "pixel_scales, expected_pixel_scales", + [ + (1.0, (1.0, 1.0)), + (2.0, (2.0, 2.0)), + ], +) +def test__no_blur__identity_kernel_with_correct_pixel_scales( + pixel_scales, expected_pixel_scales +): + convolver = aa.Convolver.no_blur(pixel_scales=pixel_scales) assert ( convolver.kernel.native == np.array([[0.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 0.0]]) ).all() - assert convolver.kernel.pixel_scales == (1.0, 1.0) + assert convolver.kernel.pixel_scales == expected_pixel_scales - convolver = aa.Convolver.no_blur(pixel_scales=2.0) - assert ( - convolver.kernel.native - == np.array([[0.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 0.0]]) - ).all() - assert convolver.kernel.pixel_scales == (2.0, 2.0) - - -def test__from_gaussian(): +def test__from_gaussian__normalized__kernel_values_match_expected(): convolver = aa.Convolver.from_gaussian( shape_native=(3, 3), @@ -52,7 +53,7 @@ def test__from_gaussian(): ) -def test__normalize(): +def test__normalize__ones_kernel__each_element_equals_one_ninth(): kernel_data = aa.Array2D.ones(shape_native=(3, 3), pixel_scales=1.0) @@ -61,7 +62,7 @@ def test__normalize(): assert convolver.kernel.native == pytest.approx(np.ones((3, 3)) / 9.0, 1e-3) -def test__convolved_image_from(): +def test__convolved_image_from__matches_scipy_convolve2d(): mask = aa.Mask2D.circular( shape_native=(30, 30), pixel_scales=(1.0, 1.0), radius=4.0 @@ -108,7 +109,7 @@ def test__convolved_image_from(): ) -def test__convolve_imaged_from__no_blurring(): +def test__convolve_imaged_from__no_blurring__matches_scipy_convolve2d_with_blurring_mask_zeroed(): # Setup a blurred data, using the PSF to perform the convolution in 2D, then masks it to make a 1d array. mask = aa.Mask2D.circular( @@ -153,7 +154,7 @@ def test__convolve_imaged_from__no_blurring(): ) -def test__convolved_mapping_matrix_from(): +def test__convolved_mapping_matrix_from__single_source_pixel__blurred_values_match_expected(): mask = aa.Mask2D( mask=np.array( [ @@ -202,33 +203,53 @@ def test__convolved_mapping_matrix_from(): blurred_mapping = convolver.convolved_mapping_matrix_from(mapping, mask) - assert ( - blurred_mapping - == pytest.approx( - np.array( - [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0.4, 0], - [0, 0.2, 0], - [0.4, 0, 0], - [0.2, 0, 0.4], - [0.3, 0, 0.2], - [0, 0.1, 0.3], - [0, 0, 0], - [0.1, 0, 0], - [0, 0, 0.1], - [0, 0, 0], - ] - ) + assert blurred_mapping == pytest.approx( + np.array( + [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0.4, 0], + [0, 0.2, 0], + [0.4, 0, 0], + [0.2, 0, 0.4], + [0.3, 0, 0.2], + [0, 0.1, 0.3], + [0, 0, 0], + [0.1, 0, 0], + [0, 0, 0.1], + [0, 0, 0], + ] ), - 1.0e-4, + rel=1.0e-4, ) + +def test__convolved_mapping_matrix_from__multiple_source_pixels__blurred_values_match_expected(): + mask = aa.Mask2D( + mask=np.array( + [ + [True, True, True, True, True, True], + [True, False, False, False, False, True], + [True, False, False, False, False, True], + [True, False, False, False, False, True], + [True, False, False, False, False, True], + [True, True, True, True, True, True], + ] + ), + pixel_scales=1.0, + ) + + kernel = aa.Array2D.no_mask( + values=[[0, 0.0, 0], [0.4, 0.2, 0.3], [0, 0.1, 0]], + pixel_scales=mask.pixel_scales, + ) + + convolver = aa.Convolver(kernel=kernel) + mapping = np.array( [ [0, 1, 0], diff --git a/test_autoarray/operators/test_transformer.py b/test_autoarray/operators/test_transformer.py index cd7d4a6f8..13a072f3b 100644 --- a/test_autoarray/operators/test_transformer.py +++ b/test_autoarray/operators/test_transformer.py @@ -4,7 +4,9 @@ import pytest -def test__dft__visibilities_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7): +def test__dft__visibilities_from__image_with_mixed_values__first_three_visibilities_match_expected( + visibilities_7, uv_wavelengths_7x2, mask_2d_7x7 +): transformer = aa.TransformerDFT( uv_wavelengths=uv_wavelengths_7x2, @@ -38,7 +40,9 @@ def test__dft__visibilities_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7 ) -def test__dft__image_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7): +def test__dft__image_from__visibilities_7__first_three_image_pixels_match_expected( + visibilities_7, uv_wavelengths_7x2, mask_2d_7x7 +): transformer = aa.TransformerDFT( uv_wavelengths=uv_wavelengths_7x2, @@ -50,7 +54,7 @@ def test__dft__image_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7): assert image[0:3] == pytest.approx([-1.49022481, -0.22395855, -0.45588535], 1.0e-4) -def test__nufft__visibilities_from(): +def test__nufft__visibilities_from__all_ones_image__first_visibility_matches_expected(): uv_wavelengths = np.array([[0.2, 1.0], [0.5, 1.1], [0.8, 1.2]]) real_space_mask = aa.Mask2D.all_false(shape_native=(5, 5), pixel_scales=0.005) @@ -69,7 +73,9 @@ def test__nufft__visibilities_from(): assert visibilities_nufft[0] == pytest.approx(25.02317617953263 + 0.0j, 1.0e-7) -def test__nufft__image_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7): +def test__nufft__image_from__visibilities_7__first_three_image_pixels_match_expected( + visibilities_7, uv_wavelengths_7x2, mask_2d_7x7 +): transformer = aa.TransformerNUFFT( uv_wavelengths=uv_wavelengths_7x2, @@ -81,7 +87,7 @@ def test__nufft__image_from(visibilities_7, uv_wavelengths_7x2, mask_2d_7x7): assert image[0:3] == pytest.approx([0.00726546, 0.01149121, 0.01421022], 1.0e-4) -def test__nufft__transform_mapping_matrix(): +def test__nufft__transform_mapping_matrix__ones_mapping_matrix__first_element_matches_expected(): uv_wavelengths = np.array([[0.2, 1.0], [0.5, 1.1], [0.8, 1.2]]) mapping_matrix = np.ones(shape=(25, 3))