Source code for PyFHD.gridding.filters

import numpy as np
from numpy.typing import NDArray
from PyFHD.pyfhd_tools.pyfhd_utils import weight_invert
import PyFHD.gridding.gridding_utils as gridding_utils
from logging import Logger


[docs] def filter_uv_uniform( image_uv: NDArray[np.complex128], vis_count: NDArray[np.float64] | None, obs: dict | None = None, params: dict | None = None, pyfhd_config: dict | None = None, logger: Logger | None = None, weights: NDArray[np.float64] | None = None, fi_use: NDArray[np.integer] | None = None, bi_use: NDArray[np.integer] | None = None, mask_mirror_indices: bool = False, ) -> tuple[NDArray[np.complex128], NDArray[np.float64]]: """ Perform uniform weighting in {u,v} space. Parameters ---------- image_uv : NDArray[np.complex128] A 2D {u,v} gridded plane to be filtered vis_count : NDArray[np.float64] | None 2D array of number of contributing visibilities per pixel on the {u,v} grid obs : dict | None, optional Observation metadata dictionary, by default None params : dict | None, optional Visibility metadata dictionary, by default None pyfhd_config : dict | None, optional Run option dictionary, by default None logger : Logger | None, optional PyFHD's logger, by default None weights : NDArray[np.float64] | None, optional The weights array (aka vis_weights), by default None fi_use : NDArray[np.integer] | None, optional Frequency index array for gridding, i.e. gridding all frequencies for continuum images, by default None bi_use : NDArray[np.integer] | None, optional Baseline index array for gridding, i.e even vs odd time stamps, by default None mask_mirror_indices : bool, optional Exclude baselines mirrored along the v-axis, by default False Returns ------- image_uv_filtered : NDArray[np.complex128] The filtered 2D {u,v} plane filter_use : NDArray[np.float64] The filter used Raises ------ TypeError In the case obs or params is None and vis_count is also None """ # If you need the name, grab it from pyfhd_config where needed # This does not make use of fine-grained flagging, but relies on coarse flags from the obs structure # (i.e. a list of tiles completely flagged, and of frequencies completely flagged) if vis_count is None: if obs is not None or params is not None: vis_count = gridding_utils.visibility_count( obs, params, weights, pyfhd_config, logger, fi_use, bi_use, mask_mirror_indices, ) elif weights is not None and np.size(weights) == np.size(image_uv): if np.max(weights) == 0: vis_count = weights else: vis_count = np.abs(weights) / np.min(np.abs(weights[weights > 0])) else: raise TypeError("obs and params must not be None when vis_count is None") # Get the parts of the filter we're using filter_use = weight_invert(vis_count, threshold=1) # Get the weights index as well if weights is not None and np.size(weights) == np.size(image_uv): wts_i = np.nonzero(weights) else: wts_i = np.nonzero(filter_use) # Apply a mean normalization if np.size(wts_i) > 0: filter_use /= np.mean(filter_use[wts_i]) else: filter_use /= np.mean(filter_use) # Return the filtered return image_uv * filter_use, filter_use