From 789e20b18cfb61e6132ac1ec852e0dd4f5f3035e Mon Sep 17 00:00:00 2001 From: "Alec Thomson (S&A, Kensington WA)" Date: Fri, 3 May 2024 12:43:34 +0800 Subject: [PATCH] Update tests --- fixms/data/RACS_1313-72.SB57526.split.ms.zip | Bin 0 -> 79886 bytes fixms/data/SB60933.RACS_1727+37.split.ms.zip | Bin 0 -> 68995 bytes fixms/data/__init__.py | 0 tests/test_fix_ms_corrs.py | 492 ++++++++++++------- 4 files changed, 310 insertions(+), 182 deletions(-) create mode 100644 fixms/data/RACS_1313-72.SB57526.split.ms.zip create mode 100644 fixms/data/SB60933.RACS_1727+37.split.ms.zip create mode 100644 fixms/data/__init__.py diff --git a/fixms/data/RACS_1313-72.SB57526.split.ms.zip b/fixms/data/RACS_1313-72.SB57526.split.ms.zip new file mode 100644 index 0000000000000000000000000000000000000000..5386326da01b6847a469e05113ae694452a63332 GIT binary patch literal 79886 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 l*8HFaXl<*Cfg$B*yC-`Ft*+liq%@S68)xzpf* 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 literal 0 HcmV?d00001 diff --git a/fixms/data/SB60933.RACS_1727+37.split.ms.zip b/fixms/data/SB60933.RACS_1727+37.split.ms.zip new file mode 100644 index 0000000000000000000000000000000000000000..c44c01467dae0e1921d5893d21afb0afc930f8d1 GIT binary patch literal 68995 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

*Wu|wl@-ayg-$=}?mtNlFGWW#X38kA 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 literal 0 HcmV?d00001 diff --git a/fixms/data/__init__.py b/fixms/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_fix_ms_corrs.py b/tests/test_fix_ms_corrs.py index e97a228..4372bbe 100644 --- a/tests/test_fix_ms_corrs.py +++ b/tests/test_fix_ms_corrs.py @@ -3,6 +3,12 @@ """ Test the fixing the MS correlations """ +try: + import importlib_resources as importlib_resources +except ImportWarning: + from importlib import resources as importlib_resources + +import importlib import logging import shutil import unittest @@ -11,6 +17,7 @@ import astropy.units as u import numpy as np +import pytest from casacore.tables import table from fixms.fix_ms_corrs import convert_correlations, fix_ms_corrs, get_pol_axis @@ -20,189 +27,310 @@ class Mueller(NamedTuple): - I: np.ndarray - Q: np.ndarray - U: np.ndarray - V: np.ndarray - - -class Tester(unittest.TestCase): - # def __init__(self): - def setUp(self) -> None: - # Copy the read-only MS file to a temporary file - self.read_only_ms = Path( - "tests/scienceData.RACS_0012+00.SB45305.RACS_0012+00.beam00_averaged_cal.leakage.ms" + stokes_I: np.ndarray + stokes_Q: np.ndarray + stokes_U: np.ndarray + stokes_V: np.ndarray + + +class ExampleData(NamedTuple): + original_ms_path: Path + fixed_ms_path: Path + data_column: str + corrected_data_column: str + pol_axis: u.Quantity + original_data: np.ndarray + fixed_data: np.ndarray + fixed_corrected_data: np.ndarray + + +def get_packaged_resource_path(package: str, filename: str) -> Path: + """Load in the path of a package sources. + + The `package` argument is passed as a though the module + is being speficied as an import statement. + + Args: + package (str): The module path to the resources + filename (str): Filename of the datafile to load + + Returns: + Path: The absolute path to the packaged resource file + """ + logger.info(f"Loading {package=} for {filename=}") + + with importlib_resources.files(package) as p: + full_path = Path(p) / filename + + logger.debug(f"Resolved {full_path=}") + + return full_path + + +@pytest.fixture +def ms_rotated_example(tmpdir) -> ExampleData: + ms_zip = Path( + get_packaged_resource_path( + package="fixms.data", + filename="RACS_1313-72.SB57526.split.ms.zip", ) - self.ms = Path("tests/test.ms") - # Copy the read-only MS file to a temporary file - logger.info(f"Copying {self.read_only_ms} to {self.ms}") - shutil.copytree(self.read_only_ms, self.ms, dirs_exist_ok=True) - # Allow writing to the MS file - self.data_column = "DATA" - self.corrected_data_column = "CORRECTED_DATA" - self.pol_axis = -45 * u.deg - - # Run the fix - logger.info(f"Running fix_ms_corrs on {self.ms}") - fix_ms_corrs( - self.ms, - data_column=self.data_column, - corrected_data_column=self.corrected_data_column, + ) + outpath = Path(tmpdir) / "standard" + + shutil.unpack_archive(ms_zip, outpath) + + original_ms_path = Path(outpath) / "RACS_1313-72.SB57526.split.ms" + fixed_ms_path = Path(outpath) / "RACS_1313-72.SB57526.split.fixed.ms" + shutil.copytree(original_ms_path, fixed_ms_path) + + data_column = "DATA" + corrected_data_column = "CORRECTED_DATA" + # From OMP - common.target.src1.pol_axis = [pa_fixed, 115.859] + pol_axis = 115.859 * u.deg + + # Run the fix + logger.info(f"Running fix_ms_corrs on {fixed_ms_path}") + fix_ms_corrs( + fixed_ms_path, + data_column=data_column, + corrected_data_column=corrected_data_column, + ) + + with table(original_ms_path.as_posix(), readonly=True) as tab: + original_data = tab.getcol(data_column) + + with table(fixed_ms_path.as_posix(), readonly=True) as tab: + fixed_data = tab.getcol(data_column) + fixed_corrected_data = tab.getcol(corrected_data_column) + + logger.debug(f"{fixed_data.shape=}") + + return ExampleData( + original_ms_path=original_ms_path, + fixed_ms_path=fixed_ms_path, + data_column=data_column, + corrected_data_column=corrected_data_column, + pol_axis=pol_axis, + original_data=original_data, + fixed_data=fixed_data, + fixed_corrected_data=fixed_corrected_data, + ) + + +@pytest.fixture +def ms_standard_example(tmpdir) -> ExampleData: + ms_zip = Path( + get_packaged_resource_path( + package="fixms.data", + filename="SB60933.RACS_1727+37.split.ms.zip", ) + ) + outpath = Path(tmpdir) / "standard" + + shutil.unpack_archive(ms_zip, outpath) + + original_ms_path = Path(outpath) / "SB60933.RACS_1727+37.split.ms" + fixed_ms_path = Path(outpath) / "SB60933.RACS_1727+37.split.fixed.ms" + shutil.copytree(original_ms_path, fixed_ms_path) + + data_column = "DATA" + corrected_data_column = "CORRECTED_DATA" + # From OMP - common.target.src1.pol_axis = [pa_fixed, -45] + pol_axis = -45 * u.deg + + # Run the fix + logger.info(f"Running fix_ms_corrs on {fixed_ms_path}") + fix_ms_corrs( + fixed_ms_path, + data_column=data_column, + corrected_data_column=corrected_data_column, + ) + + with table(original_ms_path.as_posix(), readonly=True) as tab: + original_data = tab.getcol(data_column) + + with table(fixed_ms_path.as_posix(), readonly=True) as tab: + fixed_data = tab.getcol(data_column) + fixed_corrected_data = tab.getcol(corrected_data_column) + + logger.debug(f"{fixed_data.shape=}") + + return ExampleData( + original_ms_path=original_ms_path, + fixed_ms_path=fixed_ms_path, + data_column=data_column, + corrected_data_column=corrected_data_column, + pol_axis=pol_axis, + original_data=original_data, + fixed_data=fixed_data, + fixed_corrected_data=fixed_corrected_data, + ) + + +def test_get_pol_axis(ms_standard_example): + # Test that the pol axis is correct + pol_axis_original = get_pol_axis( + ms_standard_example.original_ms_path, col="RECEPTOR_ANGLE" + ) + pol_axis_fixed = get_pol_axis( + ms_standard_example.fixed_ms_path, col="INSTRUMENT_RECEPTOR_ANGLE" + ) + rot_pol_axis_fixed = get_pol_axis( + ms_standard_example.fixed_ms_path, col="RECEPTOR_ANGLE" + ) - # Find first row with good data - with table(self.ms.as_posix(), readonly=True) as tab: - idx = 0 - data = tab.__getattr__(self.data_column).getcell(idx) - cor_data = tab.__getattr__(self.corrected_data_column).getcell(idx) - while (data == 0 + 0j).all(): - idx += 1 - data = tab.__getattr__(self.data_column).getcell(idx) - cor_data = tab.__getattr__(self.corrected_data_column).getcell(idx) - - self.data = data - self.cor_data = cor_data - - # Get the read-only data - with table(self.read_only_ms.as_posix(), readonly=True) as tab: - data = tab.__getattr__(self.data_column).getcell(idx) - self.read_only_data = data - - def test_get_pol_axis(self): - # Test that the pol axis is correct - pol_axis = get_pol_axis(self.ms) - assert pol_axis == self.pol_axis - - def test_column_exists(self): - # Check that CORRECTED_DATA is on disk - with table(self.ms.as_posix()) as tab: - assert ( - self.corrected_data_column in tab.colnames() - ), f"{self.corrected_data_column} not in MS" - - def test_read_only_data(self): - # Check that the read-only data is unchanged - assert np.allclose( - self.read_only_data, self.data - ), f"{self.data_column} changed" - - def test_corrected_data(self): - # Get the receptor angle - ang = get_pol_axis(self.ms) - - # Check the conversion as written to disk - assert np.allclose( - convert_correlations(self.data, ang), self.cor_data - ), "Data write failed" - - def askap_stokes_mat(self): - theta = get_pol_axis(self.ms) + 45 * u.deg - xx, xy, yx, yy = self.data.T - correlations = np.array([xx, xy, yx, yy]) - # Equation D.1 from ASKAP Observation Guide - rot = np.array( + assert np.isclose( + pol_axis_original, ms_standard_example.pol_axis + ), f"Pol axis is incorrect {pol_axis_original=}" + assert np.isclose( + pol_axis_fixed, ms_standard_example.pol_axis + ), f"Pol axis is incorrect {pol_axis_fixed=}" + assert np.isclose( + rot_pol_axis_fixed, 0 * u.deg + ), f"Pol axis is incorrect {rot_pol_axis_fixed=}" + + +def test_column_exists(ms_standard_example): + # Check that CORRECTED_DATA is on disk + with table(ms_standard_example.fixed_ms_path.as_posix()) as tab: + assert ( + ms_standard_example.corrected_data_column in tab.colnames() + ), f"{ms_standard_example.corrected_data_column} not in MS" + + +def test_original_data(ms_standard_example): + # Check that the read-only data is unchanged + assert np.allclose( + ms_standard_example.original_data, ms_standard_example.fixed_data + ), f"{ms_standard_example.data_column} changed" + + +def test_corrected_data(ms_standard_example): + # Get the receptor angle + ang = get_pol_axis(ms_standard_example.original_ms_path) + # Check the conversion as written to disk + assert np.allclose( + convert_correlations(ms_standard_example.original_data, ang), + ms_standard_example.fixed_corrected_data, + ), "Data write failed" + + +def askap_stokes_mat(ms_standard_example): + theta = get_pol_axis(ms_standard_example.original_ms_path) + 45 * u.deg + xx, xy, yx, yy = ms_standard_example.original_data.T + correlations = np.array([xx, xy, yx, yy]) + logger.debug(f"{correlations.shape=}") + # Equation D.1 from ASKAP Observation Guide + rot = np.array( + [ + [1, 0, 0, 1], [ - [1, 0, 0, 1], - [ - np.sin(2 * theta), - np.cos(2 * theta), - np.cos(2 * theta), - -np.sin(2 * theta), - ], - [ - -np.cos(2 * theta), - np.sin(2 * theta), - np.sin(2 * theta), - np.cos(2 * theta), - ], - [0, -1j, 1j, 0], - ] - ) - I, Q, U, V = rot @ correlations - return Mueller(I, Q, U, V) - - def askap_stokes(self): - theta = get_pol_axis(self.ms) + 45 * u.deg - xx, xy, yx, yy = self.data.T - assert theta == 0 * u.deg, "Only works for theta = 0 deg" - I = xx + yy - Q = xy + yx - U = yy - xx - V = 1j * (yx - xy) - - return Mueller(I, Q, U, V) - - def get_wsclean_stokes(self): - # from https://gitlab.com/aroffringa/aocommon/-/blob/master/include/aocommon/polarization.h - # * XX = I + Q ; I = (XX + YY)/2 - # * XY = U + iV ; Q = (XX - YY)/2 - # * YX = U - iV ; U = (XY + YX)/2 - # * YY = I - Q ; V = -i(XY - YX)/2 - xx, xy, yx, yy = self.cor_data.T - I = 0.5 * (xx + yy) - Q = 0.5 * (xx - yy) - U = 0.5 * (xy + yx) - V = -0.5j * (xy - yx) - - return Mueller(I, Q, U, V) - - def test_rotated_data_I(self): - mueller_a = self.askap_stokes() - mueller_a_mat = self.askap_stokes_mat() - assert np.allclose( - mueller_a.I, mueller_a_mat.I, atol=1e-4 - ), "Stokes rotation I failed" - - def test_rotated_data_Q(self): - mueller_a = self.askap_stokes() - mueller_a_mat = self.askap_stokes_mat() - assert np.allclose( - mueller_a.Q, mueller_a_mat.Q, atol=1e-4 - ), "Stokes rotation Q failed" - - def test_rotated_data_U(self): - mueller_a = self.askap_stokes() - mueller_a_mat = self.askap_stokes_mat() - assert np.allclose( - mueller_a.U, mueller_a_mat.U, atol=1e-4 - ), "Stokes rotation U failed" - - def test_rotated_data_V(self): - mueller_a = self.askap_stokes() - mueller_a_mat = self.askap_stokes_mat() - assert np.allclose( - mueller_a.V, mueller_a_mat.V, atol=1e-4 - ), "Stokes rotation V failed" - - def test_stokes_I(self): - mueller_a = self.askap_stokes_mat() - mueller_w = self.get_wsclean_stokes() - assert np.allclose( - mueller_a.I, mueller_w.I, atol=1e-4 - ), "ASKAP and WSClean disagree on Stokes I" - - def test_stokes_Q(self): - mueller_a = self.askap_stokes_mat() - mueller_w = self.get_wsclean_stokes() - assert np.allclose( - mueller_a.Q, mueller_w.Q, atol=1e-2 - ), "ASKAP and WSClean disagree on Stokes Q" - - def test_stokes_U(self): - mueller_a = self.askap_stokes_mat() - mueller_w = self.get_wsclean_stokes() - assert np.allclose( - mueller_a.U, mueller_w.U, atol=1e-4 - ), "ASKAP and WSClean disagree on Stokes U" - - def test_stokes_V(self): - mueller_a = self.askap_stokes_mat() - mueller_w = self.get_wsclean_stokes() - assert np.allclose( - mueller_a.V, mueller_w.V, atol=1e-4 - ), "ASKAP and WSClean disagree on Stokes V" - - def tearDown(self) -> None: - # Remove the temporary MS file - logger.info(f"Removing {self.ms}") - shutil.rmtree(self.ms) + np.sin(2 * theta), + np.cos(2 * theta), + np.cos(2 * theta), + -np.sin(2 * theta), + ], + [ + -np.cos(2 * theta), + np.sin(2 * theta), + np.sin(2 * theta), + np.cos(2 * theta), + ], + [0, -1j, 1j, 0], + ] + ) + logger.debug(f"{rot.shape=}") + # I, Q, U, V = rot @ correlations + I, Q, U, V = np.einsum("ij,j...->i...", rot, correlations) + return Mueller(I, Q, U, V) + + +def askap_stokes(ms_standard_example): + theta = get_pol_axis(ms_standard_example.original_ms_path) + 45 * u.deg + xx, xy, yx, yy = ms_standard_example.original_data.T + assert theta == 0 * u.deg, "Only works for theta = 0 deg" + I = xx + yy + Q = xy + yx + U = yy - xx + V = 1j * (yx - xy) + + return Mueller(I, Q, U, V) + + +def get_wsclean_stokes(ms_standard_example): + # from https://gitlab.com/aroffringa/aocommon/-/blob/master/include/aocommon/polarization.h + # * XX = I + Q ; I = (XX + YY)/2 + # * XY = U + iV ; Q = (XX - YY)/2 + # * YX = U - iV ; U = (XY + YX)/2 + # * YY = I - Q ; V = -i(XY - YX)/2 + xx, xy, yx, yy = ms_standard_example.fixed_corrected_data.T + I = 0.5 * (xx + yy) + Q = 0.5 * (xx - yy) + U = 0.5 * (xy + yx) + V = -0.5j * (xy - yx) + + return Mueller(I, Q, U, V) + + +def test_rotated_data_I(ms_standard_example): + mueller_a = askap_stokes(ms_standard_example) + mueller_a_mat = askap_stokes_mat(ms_standard_example) + assert np.allclose( + mueller_a.stokes_I, mueller_a_mat.stokes_I, atol=1e-4 + ), "Stokes rotation I failed" + + +def test_rotated_data_Q(ms_standard_example): + mueller_a = askap_stokes(ms_standard_example) + mueller_a_mat = askap_stokes_mat(ms_standard_example) + assert np.allclose( + mueller_a.stokes_Q, mueller_a_mat.stokes_Q, atol=1e-4 + ), "Stokes rotation Q failed" + + +def test_rotated_data_U(ms_standard_example): + mueller_a = askap_stokes(ms_standard_example) + mueller_a_mat = askap_stokes_mat(ms_standard_example) + assert np.allclose( + mueller_a.stokes_U, mueller_a_mat.stokes_U, atol=1e-4 + ), "Stokes rotation U failed" + + +def test_rotated_data_V(ms_standard_example): + mueller_a = askap_stokes(ms_standard_example) + mueller_a_mat = askap_stokes_mat(ms_standard_example) + assert np.allclose( + mueller_a.stokes_V, mueller_a_mat.stokes_V, atol=1e-4 + ), "Stokes rotation V failed" + + +def test_stokes_I(ms_standard_example): + mueller_a = askap_stokes_mat(ms_standard_example) + mueller_w = get_wsclean_stokes(ms_standard_example) + assert np.allclose( + mueller_a.stokes_I, mueller_w.stokes_I, atol=1e-4 + ), "ASKAP and WSClean disagree on Stokes I" + + +def test_stokes_Q(ms_standard_example): + mueller_a = askap_stokes_mat(ms_standard_example) + mueller_w = get_wsclean_stokes(ms_standard_example) + assert np.allclose( + mueller_a.stokes_Q, mueller_w.stokes_Q, atol=1e-2 + ), "ASKAP and WSClean disagree on Stokes Q" + + +def test_stokes_U(ms_standard_example): + mueller_a = askap_stokes_mat(ms_standard_example) + mueller_w = get_wsclean_stokes(ms_standard_example) + assert np.allclose( + mueller_a.stokes_U, mueller_w.stokes_U, atol=1e-4 + ), "ASKAP and WSClean disagree on Stokes U" + + +def test_stokes_V(ms_standard_example): + mueller_a = askap_stokes_mat(ms_standard_example) + mueller_w = get_wsclean_stokes(ms_standard_example) + assert np.allclose( + mueller_a.stokes_V, mueller_w.stokes_V, atol=1e-4 + ), "ASKAP and WSClean disagree on Stokes V"