Skip to content

Commit da74973

Browse files
bhazeltonmkolopanis
authored andcommitted
Add handling and testing for reading in multiple feed_pols at once
1 parent a0eb9d8 commit da74973

File tree

3 files changed

+61
-13
lines changed

3 files changed

+61
-13
lines changed

docs/uvbeam_tutorial.rst

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,20 +166,20 @@ c) Reading a FEKO beam file (Power & E-field)
166166
>>> feko_filename_y = os.path.join(DATA_PATH, feko_folder, filename_y)
167167
168168
>>> pbeam_feko = UVBeam.from_file(
169-
... feko_filename_x, beam_type='power', feed_pol='x', telescope_name='LWA',
170-
... feed_name='LWA', feed_version='1', feed_angle=np.pi/2,
169+
... [feko_filename_x, feko_filename_y], beam_type='power', feed_pol=['x', 'y'],
170+
... feed_angle=[np.pi/2, 0.0], telescope_name='LWA',feed_name='LWA', feed_version='1',
171171
... model_name='FEKO_MROsoil_test', model_version='1.0', mount_type="fixed"
172172
... )
173173
>>> print(np.shape(pbeam_feko.data_array))
174-
(1, 1, 3, 181, 181)
174+
(1, 2, 3, 181, 181)
175175
176176
>>> ebeam_feko = UVBeam.from_file(
177-
... feko_filename_x, beam_type='efield', feed_pol='x', telescope_name='LWA',
178-
... feed_name='LWA', feed_version='1', feed_angle=np.pi/2,
179-
... model_name='FEKO_MROsoil_updatedheight', model_version='1.0', mount_type="fixed"
177+
... [feko_filename_x, feko_filename_y], beam_type='efield', feed_pol=['x', 'y'],
178+
... feed_angle=[np.pi/2, 0.0], telescope_name='LWA',feed_name='LWA', feed_version='1',
179+
... model_name='FEKO_MROsoil_test', model_version='1.0', mount_type="fixed"
180180
... )
181181
>>> print(np.shape(ebeam_feko.data_array))
182-
(2, 1, 3, 181, 181)
182+
(2, 2, 3, 181, 181)
183183
184184
d) Reading in the MWA full embedded element beam
185185
************************************************

src/pyuvdata/uvbeam/uvbeam.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4524,7 +4524,7 @@ def read(
45244524
----
45254525
beam_type : str
45264526
What beam_type to read in ('power' or 'efield').
4527-
feed_pol : str
4527+
feed_pol : str or list of str
45284528
The feed polarization that the files corresponds to, e.g. x, y, r or l.
45294529
Defaults to 'x'.
45304530
feed_angle : str or array-like of float
@@ -4614,6 +4614,21 @@ def read(
46144614
file_type = "cst"
46154615
elif extension == ".ffe":
46164616
file_type = "feko"
4617+
if multi:
4618+
feed_pol = utils.tools._get_iterable(feed_pol)
4619+
if len(feed_pol) != len(filename):
4620+
raise ValueError(
4621+
"If multiple FEKO files are passed, the feed_pol must "
4622+
"be a list or array of the same length giving the "
4623+
"feed_pol for each file."
4624+
)
4625+
feed_angle = utils.tools._get_iterable(feed_angle)
4626+
if len(feed_angle) != len(filename):
4627+
raise ValueError(
4628+
"If multiple FEKO files are passed, the feed_angle must "
4629+
"be a list or array of the same length giving the "
4630+
"feed_angle for each file."
4631+
)
46174632

46184633
if file_type is None:
46194634
raise ValueError(
@@ -4654,6 +4669,12 @@ def read(
46544669
file_num = 0
46554670
file_warnings = ""
46564671
unread = True
4672+
if file_type == "feko":
4673+
feed_pol_use = feed_pol[file_num]
4674+
feed_angle_use = feed_angle[file_num]
4675+
else:
4676+
feed_pol_use = feed_pol
4677+
feed_angle_use = feed_angle
46574678

46584679
while unread and file_num < len(filename):
46594680
try:
@@ -4676,9 +4697,9 @@ def read(
46764697
# leave these in case we restructure the multi
46774698
# reading later
46784699
beam_type=beam_type,
4679-
feed_pol=feed_pol,
4700+
feed_pol=feed_pol_use,
46804701
feed_array=feed_array,
4681-
feed_angle=feed_angle,
4702+
feed_angle=feed_angle_use,
46824703
rotate_pol=rotate_pol,
46834704
mount_type=mount_type,
46844705
frequency=frequency,
@@ -4710,6 +4731,12 @@ def read(
47104731
if len(filename) >= file_num + 1:
47114732
for fname in filename[file_num + 1 :]:
47124733
beam2 = UVBeam()
4734+
if file_type == "feko":
4735+
feed_pol_use = feed_pol[file_num + 1]
4736+
feed_angle_use = feed_angle[file_num + 1]
4737+
else:
4738+
feed_pol_use = feed_pol
4739+
feed_angle_use = feed_angle
47134740
try:
47144741
beam2.read(
47154742
fname,
@@ -4730,9 +4757,9 @@ def read(
47304757
# leave these in case we restructure the multi
47314758
# reading later
47324759
beam_type=beam_type,
4733-
feed_pol=feed_pol,
4760+
feed_pol=feed_pol_use,
47344761
feed_array=feed_array,
4735-
feed_angle=feed_angle,
4762+
feed_angle=feed_angle_use,
47364763
rotate_pol=rotate_pol,
47374764
mount_type=mount_type,
47384765
frequency=frequency,
@@ -4761,6 +4788,7 @@ def read(
47614788
continue
47624789
else:
47634790
raise
4791+
file_num += 1
47644792
if unread is True:
47654793
warnings.warn(
47664794
"########################################################\n"

tests/uvbeam/test_feko_beam.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_read_feko(btype):
3636
model_name="FEKO_MROsoil",
3737
model_version="1.0",
3838
mount_type="fixed",
39-
feed_angle=90.0, # E/W
39+
feed_angle=np.pi / 2, # E/W
4040
reference_impedance=reference_impedance,
4141
extra_keywords=extra_keywords,
4242
)
@@ -79,6 +79,26 @@ def test_read_feko(btype):
7979
assert len(beam_feko1.freq_array) == len(beam_feko2.freq_array)
8080
assert np.all(beam_feko1.bandpass_array) == 1
8181

82+
feko_beam_multi = beam_feko1 + beam_feko2
83+
84+
feko_beam_multi2 = UVBeam.from_file(
85+
[feko_filename_x, feko_filename_y],
86+
beam_type=btype,
87+
frequency=[10e6],
88+
feed_pol=["x", "y"],
89+
feed_angle=[np.pi / 2, 0.0],
90+
telescope_name="LWA",
91+
feed_name="LWA",
92+
feed_version="1",
93+
model_name="FEKO_MROsoil",
94+
model_version="1.0",
95+
mount_type="fixed",
96+
reference_impedance=reference_impedance,
97+
extra_keywords=extra_keywords,
98+
)
99+
100+
assert feko_beam_multi == feko_beam_multi2
101+
82102

83103
@pytest.mark.parametrize(
84104
("feedpol", "msg"),

0 commit comments

Comments
 (0)