Skip to content

Commit e6fac40

Browse files
committed
add test coverage
1 parent 18c971d commit e6fac40

File tree

5 files changed

+300
-86
lines changed

5 files changed

+300
-86
lines changed

src/pyuvdata/uvbeam/mwa_beam.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -556,11 +556,6 @@ def _read_fee_jones(
556556

557557
freqs_hz, feed_names, dipole_names, max_length = self._read_metadata(h5filepath)
558558

559-
if [str(feed.lower()) for feed in feed_names] != ["x", "y"]:
560-
raise ValueError(
561-
f"Did not find expected feed names in FEE file {h5filepath}"
562-
)
563-
564559
freqs_inds_use = _get_freq_inds_use(freqs_hz, freq_range=freq_range)
565560
freqs_use = freqs_hz[freqs_inds_use]
566561

@@ -633,15 +628,18 @@ def _read_aee_jones(
633628

634629
theta = np.unique(raw_theta)
635630
phi = np.unique(raw_phi)
631+
636632
n_theta = theta.size
637633
n_phi = phi.size
638-
theta_grid = raw_theta.reshape(n_phi, n_theta).T
639-
phi_grid = raw_phi.reshape(n_phi, n_theta).T
634+
if not n_theta * n_phi == raw_theta.size:
635+
raise ValueError("Data does not appear to be on a grid")
636+
637+
phi_grid, theta_grid = np.meshgrid(phi, theta)
640638

641-
if not np.allclose(theta, theta_grid[:, 0]):
642-
raise ValueError("reshaping theta did not work as expected")
643-
if not np.allclose(phi, phi_grid[0, :]):
644-
raise ValueError("reshaping phi did not work as expected")
639+
if not np.allclose(raw_theta.reshape(n_phi, n_theta).T, theta_grid):
640+
raise ValueError("thetas do not appear to be on expected grid")
641+
if not np.allclose(raw_phi.reshape(n_phi, n_theta).T, phi_grid):
642+
raise ValueError("phis do not appear to be on expected grid")
645643

646644
# convert theta, phi to radians, rename
647645
az_grid = np.deg2rad(phi_grid)
@@ -666,9 +664,9 @@ def _read_aee_jones(
666664
data = jfile[f_ind].data
667665

668666
if not np.allclose(raw_theta, data[:, 0]):
669-
raise ValueError("Inconsistent theta values across frequecies")
667+
raise ValueError("Inconsistent theta values across frequencies")
670668
if not np.allclose(raw_phi, data[:, 1]):
671-
raise ValueError("Inconsistent theta values across frequecies")
669+
raise ValueError("Inconsistent phi values across frequencies")
672670

673671
aee_jones[1, 0, fi_arr] = (
674672
(data[:, 2] + 1j * data[:, 3]).reshape(n_phi, n_theta).T
@@ -734,11 +732,16 @@ def _read_aee_jones(
734732
# ordering in Z matrix is 0-15:Y, 16-31:X
735733
if not len(zf) == freqs_hz.size:
736734
raise ValueError(
737-
"Zmatrix file does not have as the same number of frequencies"
735+
"Zmatrix file does not have as the same number of frequencies "
738736
"as Jmatrix file."
739737
)
740738
for fi_arr, f_ind in enumerate(freqs_inds_use):
741-
if not np.isclose(zf[f_ind].header["freq"], freqs_hz[f_ind]):
739+
if not np.isclose(
740+
zf[f_ind].header["freq"],
741+
freqs_hz[f_ind],
742+
rtol=self._freq_array.tols[0],
743+
atol=self._freq_array.tols[1],
744+
):
742745
raise ValueError(
743746
f"Zmatrix {f_ind}th freq does not match Jmatrix file."
744747
)

src/pyuvdata/uvbeam/uvbeam.py

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5020,35 +5020,40 @@ def _uvbeam_constructor(loader, node):
50205020
if isinstance(values["filename"], str):
50215021
files_use = [values["filename"]]
50225022

5023-
zfiles = None
5023+
zfiles_use = None
50245024
if "mwa_zfile" in values:
5025-
zfiles = values["mwa_zfile"]
5025+
zfiles_use = values["mwa_zfile"]
50265026
if isinstance(values["mwa_zfile"], str):
5027-
zfiles = [values["mwa_zfile"]]
5027+
zfiles_use = [values["mwa_zfile"]]
50285028

50295029
if "path_variable" in values:
50305030
path_var = values.pop("path_variable")
50315031
# first check to see if this is a file on disk
50325032
test_files = [os.path.join(path_var, file) for file in files_use]
5033-
files_exist = np.asarray([os.path.exists(file) for file in test_files])
5033+
if "mwa_zfile" in values:
5034+
test_zfiles = [os.path.join(path_var, file) for file in zfiles_use]
5035+
else:
5036+
test_zfiles = []
5037+
files_exist = np.asarray(
5038+
[os.path.exists(file) for file in (test_files + test_zfiles)]
5039+
)
50345040
if np.any(files_exist):
50355041
files_use = test_files
5042+
zfiles_use = test_zfiles
50365043
if not np.all(files_exist):
5037-
missing_files = (np.asarray(test_files))[np.nonzero(~files_exist)]
5038-
raise FileNotFoundError(f"File(s) {missing_files} do not exist.")
5039-
5040-
if zfiles is not None:
5041-
zfiles = [os.path.join(path_var, file) for file in zfiles]
5042-
zfiles_exist = np.asarray([os.path.exists(file) for file in zfiles])
5043-
if not np.all(zfiles_exist):
5044-
missing_files = (np.asarray(zfiles))[np.nonzero(~zfiles_exist)]
5045-
raise FileNotFoundError(f"File(s) {missing_files} do not exist.")
5044+
missing_files = (np.asarray(test_files + test_zfiles))[
5045+
np.nonzero(~files_exist)
5046+
]
5047+
raise FileNotFoundError(
5048+
f"File(s) {missing_files.tolist()} do not exist."
5049+
)
50465050
else:
50475051
bad_pathvar_message = (
50485052
"If 'path_variable' is specified, it should either be the "
50495053
"directory a file is in or take the form of a module.variable_name "
50505054
"where the variable name can be imported from the module. "
5051-
f"The path_variable is {path_var}. Files {test_files} do not exist "
5055+
f"The path_variable is {path_var}. Files {test_files + test_zfiles} "
5056+
"do not exist "
50525057
)
50535058
path_parts = (path_var).split(".")
50545059
var_name = path_parts[-1]
@@ -5068,18 +5073,22 @@ def _uvbeam_constructor(loader, node):
50685073
) from ie
50695074
path_var = getattr(module, var_name)
50705075
files_use = [os.path.join(path_var, file) for file in files_use]
5071-
files_exist = np.asarray([os.path.exists(file) for file in files_use])
5076+
if "mwa_zfile" in values:
5077+
zfiles_use = [os.path.join(path_var, file) for file in zfiles_use]
5078+
else:
5079+
zfiles_use = []
5080+
5081+
files_exist = np.asarray(
5082+
[os.path.exists(file) for file in (files_use + zfiles_use)]
5083+
)
50725084
if not np.all(files_exist):
5073-
missing_files = (np.asarray(files_use))[np.nonzero(~files_exist)]
5085+
missing_files = (np.asarray(files_use + zfiles_use))[
5086+
np.nonzero(~files_exist)
5087+
]
50745088
raise FileNotFoundError(
5075-
bad_pathvar_message + f"and file(s) {missing_files} do not exist."
5089+
bad_pathvar_message + f"and file(s) {missing_files.tolist()} "
5090+
"do not exist."
50765091
)
5077-
if zfiles is not None:
5078-
zfiles = [os.path.join(path_var, file) for file in zfiles]
5079-
zfiles_exist = np.asarray([os.path.exists(file) for file in zfiles])
5080-
if not np.all(zfiles_exist):
5081-
missing_files = (np.asarray(zfiles))[np.nonzero(~zfiles_exist)]
5082-
raise FileNotFoundError(f"File(s) {missing_files} do not exist.")
50835092

50845093
for i, file in enumerate(files_use):
50855094
# if file does not exist, check pyuvsim cache defined from astropy prescription
@@ -5091,15 +5100,15 @@ def _uvbeam_constructor(loader, node):
50915100
files_use = files_use[0]
50925101
values["filename"] = files_use
50935102

5094-
if zfiles is not None:
5095-
for i, file in enumerate(zfiles):
5103+
if "mwa_zfile" in values:
5104+
for i, file in enumerate(zfiles_use):
50965105
# if file does not exist, check pyuvsim cache defined from astropy
50975106
# prescription treat file as download url to check astropy cache for file
50985107
if not os.path.exists(file) and is_url_in_cache(file, pkgname="pyuvsim"):
5099-
zfiles[i] = cache_contents("pyuvsim")[file]
5100-
if len(zfiles) == 1:
5101-
zfiles = zfiles[0]
5102-
values["mwa_zfile"] = zfiles
5108+
zfiles_use[i] = cache_contents("pyuvsim")[file]
5109+
if len(zfiles_use) == 1:
5110+
zfiles_use = zfiles_use[0]
5111+
values["mwa_zfile"] = zfiles_use
51035112

51045113
beam = UVBeam.from_file(**values)
51055114

tests/uvbeam/conftest.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,3 +372,22 @@ def mwa_aee(mwa_aee_main):
372372

373373
yield beam
374374
del beam
375+
376+
377+
@pytest.fixture(scope="module")
378+
def mwa_aee_noxy_main(mwa_aee_files):
379+
beam = UVBeam()
380+
filename = mwa_aee_files["jfile"]
381+
zfile = mwa_aee_files["zfile"]
382+
beam.read_mwa_beam(filename, zfile=zfile, include_cross_feed_coupling=False)
383+
384+
yield beam
385+
del beam
386+
387+
388+
@pytest.fixture(scope="function")
389+
def mwa_aee_noxy(mwa_aee_noxy_main):
390+
beam = mwa_aee_noxy_main.copy()
391+
392+
yield beam
393+
del beam

0 commit comments

Comments
 (0)