Skip to content

Commit f63fa35

Browse files
authored
Add zero beam handling (#70)
1 parent f6f19d0 commit f63fa35

File tree

3 files changed

+34
-47
lines changed

3 files changed

+34
-47
lines changed

racs_tools/beamcon_2D.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
from tqdm import tqdm
2222

2323
from racs_tools.convolve_uv import (
24+
NAN_BEAM,
25+
ZERO_BEAM,
2426
get_convolving_beam,
2527
get_nyquist_beam,
2628
my_ceil,
@@ -37,8 +39,6 @@
3739
)
3840
from racs_tools.parallel import get_executor
3941

40-
# logger = setup_logger()
41-
4242

4343
#############################################
4444
#### ADAPTED FROM SCRIPT BY T. VERNSTROM ####
@@ -188,6 +188,9 @@ def savefile(
188188
"""
189189
logger.info(f"Saving to {outfile.absolute()}")
190190
beam = new_beam
191+
if np.isnan(beam):
192+
logger.warning("Beam is NaN, setting to 0 in header")
193+
beam = ZERO_BEAM
191194
header = beam.attach_to_header(header)
192195
fits.writeto(
193196
outfile.absolute(), newimage.astype(np.float32), header=header, overwrite=True
@@ -312,26 +315,23 @@ def get_common_beam(
312315
beam = Beam.from_fits_header(header)
313316
beams_list.append(beam)
314317

315-
beams = Beams(
316-
[beam.major.to(u.deg).value for beam in beams_list] * u.deg,
317-
[beam.minor.to(u.deg).value for beam in beams_list] * u.deg,
318-
[beam.pa.to(u.deg).value for beam in beams_list] * u.deg,
319-
)
318+
beams = Beams(beams=beams_list)
319+
320+
# Init flags - False is good, True is bad
321+
flags = np.array([False for beam in beams])
322+
323+
# Flag zero beams
324+
flags = np.array([beam == ZERO_BEAM for beam in beams]) | flags
325+
320326
if cutoff is not None:
321-
flags = beams.major > cutoff * u.arcsec
327+
flags = beams.major > cutoff * u.arcsec | flags
322328
if np.all(flags):
323329
logger.critical(
324330
"All beams are larger than cutoff. All outputs will be blanked!"
325331
)
326-
nan_beam = Beam(np.nan * u.deg, np.nan * u.deg, np.nan * u.deg)
327-
nan_beams = Beams(
328-
[np.nan for beam in beams_list] * u.deg,
329-
[np.nan for beam in beams_list] * u.deg,
330-
[np.nan for beam in beams_list] * u.deg,
331-
)
332-
return nan_beam, nan_beams
333-
else:
334-
flags = np.array([False for beam in beams])
332+
333+
nan_beams = Beams(beams=[NAN_BEAM for beam in beams_list])
334+
return NAN_BEAM, nan_beams
335335

336336
if target_beam is None:
337337
# Find the common beam

racs_tools/beamcon_3D.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
from racs_tools import au2
2828
from racs_tools.beamcon_2D import my_ceil, round_up
29-
from racs_tools.convolve_uv import parse_conv_mode, smooth
29+
from racs_tools.convolve_uv import NAN_BEAM, ZERO_BEAM, parse_conv_mode, smooth
3030
from racs_tools.logging import (
3131
init_worker,
3232
log_listener,
@@ -194,7 +194,7 @@ def getfacs(
194194
"""
195195
facs_list = []
196196
for conbm, old_beam in zip(convbeams, beams):
197-
if conbm == Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg):
197+
if conbm == ZERO_BEAM:
198198
fac = 1.0
199199
else:
200200
fac, _, _, _, _ = au2.gauss_factor(
@@ -393,9 +393,7 @@ def commonbeamer(
393393
total=nchans,
394394
):
395395
if all(np.isnan(beams)):
396-
commonbeam = Beam(
397-
major=np.nan * u.deg, minor=np.nan * u.deg, pa=np.nan * u.deg
398-
)
396+
commonbeam = NAN_BEAM
399397
else:
400398
try:
401399
commonbeam = beams[~np.isnan(beams)].common_beam(
@@ -585,9 +583,7 @@ def commonbeamer(
585583
masks = cube_data.mask
586584
for commonbeam, old_beam, mask in zip(commonbeams, old_beams, masks):
587585
if mask:
588-
convbeam = Beam(
589-
major=np.nan * u.deg, minor=np.nan * u.deg, pa=np.nan * u.deg
590-
)
586+
convbeam = NAN_BEAM
591587
else:
592588
old_beam_check = Beam(
593589
major=my_ceil(old_beam.major.to(u.arcsec).value, precision=1)
@@ -597,12 +593,8 @@ def commonbeamer(
597593
pa=round_up(old_beam.pa.to(u.deg), decimals=2),
598594
)
599595
if commonbeam == old_beam_check:
600-
convbeam = Beam(
601-
major=0 * u.deg,
602-
minor=0 * u.deg,
603-
pa=0 * u.deg,
604-
)
605-
logger.warn(
596+
convbeam = ZERO_BEAM
597+
logger.warning(
606598
f"New beam {commonbeam!r} and old beam {old_beam_check!r} are the same. Won't attempt convolution."
607599
)
608600

@@ -682,7 +674,7 @@ def masking(
682674
list[CubeData]: list of masked cube data.
683675
"""
684676
# Check for pipeline masking
685-
nullbeam = Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg)
677+
nullbeam = ZERO_BEAM
686678
tiny = np.finfo(np.float32).tiny # Smallest positive number - used to mask
687679
smallbeam = Beam(major=tiny * u.deg, minor=tiny * u.deg, pa=tiny * u.deg)
688680
masked_cube_data_list: list[CubeData] = []
@@ -775,7 +767,7 @@ def initfiles(
775767
)
776768
):
777769
logger.warning("Reference PSF is NaN - replacing with 0 in the header")
778-
ref_psf = Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg)
770+
ref_psf = ZERO_BEAM
779771
header["COMMENT"] = "Reference PSF is NaN"
780772
header["COMMENT"] = "- This is likely because the reference channel is masked."
781773
header["COMMENT"] = "- It has been replaced with 0 to keep FITS happy."

racs_tools/convolve_uv.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
from racs_tools import au2
2121
from racs_tools.logging import logger
2222

23+
ZERO_BEAM = Beam(0 * u.deg)
24+
NAN_BEAM = Beam(np.nan * u.deg)
25+
2326

2427
class ConvolutionResult(NamedTuple):
2528
"""Result of convolution"""
@@ -170,7 +173,7 @@ def convolve(
170173
return ConvolutionResult(image * np.nan, sfactor)
171174
if np.isnan(image).all():
172175
return ConvolutionResult(image, sfactor)
173-
if conbeam == Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg) and sfactor == 1:
176+
if conbeam == ZERO_BEAM and sfactor == 1:
174177
return ConvolutionResult(image, sfactor)
175178
###
176179

@@ -278,7 +281,7 @@ def convolve_scipy(
278281
return ConvolutionResult(image * np.nan, sfactor)
279282
if np.isnan(image).all():
280283
return ConvolutionResult(image, sfactor)
281-
if conbeam == Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg) and sfactor == 1:
284+
if conbeam == ZERO_BEAM and sfactor == 1:
282285
return ConvolutionResult(image, sfactor)
283286

284287
gauss_kern = conbeam.as_kernel(dy)
@@ -326,7 +329,7 @@ def convolve_astropy(
326329
return ConvolutionResult(image * np.nan, sfactor)
327330
if np.isnan(image).all():
328331
return ConvolutionResult(image, sfactor)
329-
if conbeam == Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg) and sfactor == 1:
332+
if conbeam == ZERO_BEAM and sfactor == 1:
330333
return ConvolutionResult(image, sfactor)
331334
gauss_kern = conbeam.as_kernel(dy)
332335
conbm1 = gauss_kern.array / gauss_kern.array.max()
@@ -377,7 +380,7 @@ def convolve_astropy_fft(
377380
return ConvolutionResult(image * np.nan, sfactor)
378381
if np.isnan(image).all():
379382
return ConvolutionResult(image, sfactor)
380-
if conbeam == Beam(major=0 * u.deg, minor=0 * u.deg, pa=0 * u.deg) and sfactor == 1:
383+
if conbeam == ZERO_BEAM and sfactor == 1:
381384
return ConvolutionResult(image, sfactor)
382385
gauss_kern = conbeam.as_kernel(dy)
383386
conbm1 = gauss_kern.array / gauss_kern.array.max()
@@ -453,20 +456,12 @@ def get_convolving_beam(
453456

454457
if cutoff is not None and old_beam.major.to(u.arcsec) > cutoff * u.arcsec:
455458
return (
456-
Beam(
457-
major=np.nan * u.deg,
458-
minor=np.nan * u.deg,
459-
pa=np.nan * u.deg,
460-
),
459+
NAN_BEAM,
461460
np.nan,
462461
)
463462

464463
if new_beam == old_beam:
465-
conbm = Beam(
466-
major=0 * u.deg,
467-
minor=0 * u.deg,
468-
pa=0 * u.deg,
469-
)
464+
conbm = ZERO_BEAM
470465
fac = 1.0
471466
logger.warning(
472467
f"New beam {new_beam!r} and old beam {old_beam!r} are the same. Won't attempt convolution."

0 commit comments

Comments
 (0)