Source code for ska_sdp_wflow_pointing_offset.calibration.gt_solve

"""
Contains the following gain calibration (G-terms) functions:

1. Solves for the complex un-normalised antenna gains (G-terms)

2. Optionally calculates model visibility when fitting beams to
   the gain amplitudes
"""

import numpy
from ska_sdp_datamodels.sky_model import SkyComponent
from ska_sdp_func_python.calibration import solve_gaintable
from ska_sdp_func_python.imaging import dft_skycomponent_visibility


def _get_modelvis(source, vis):
    """
    Get model visibility.

    :param source: Target SkyCoord
    :param vis: Visibility object

    :return: Visibility object
    """
    model_vis = vis.copy(deep=True, zero=True)
    flux = numpy.zeros(
        [len(model_vis.frequency.data), model_vis.visibility_acc.npol]
    )
    flux[:, 0] = 1.0

    original_components = [
        SkyComponent(
            direction=source,
            flux=flux,
            polarisation_frame=model_vis.visibility_acc.polarisation_frame,
            frequency=model_vis.frequency.data,
        )
    ]
    return dft_skycomponent_visibility(model_vis, original_components)


[docs] def compute_gains(vis, source=None): """ Solves for the antenna gains for the parallel-hands only. :param vis: The list of observed Visibility :source: Target SkyCoord :return: GainTable containing solutions """ gt_list = [] for visibility in vis: if source is not None: modelvis = _get_modelvis(source, visibility) else: modelvis = None gt_list.append( solve_gaintable( vis=visibility, modelvis=modelvis, gain_table=None, phase_only=False, niter=200, tol=1e-06, crosspol=False, normalise_gains=None, solver="gain_substitution", jones_type="G", timeslice=None, refant=0, ) ) return gt_list
[docs] def extract_parallel_hand_gains(gaintable): """ Extracts the parallel-hands polarisation gain solutions :param gaintable: The gain solutions for each scan with dimensions (time, antenna, frequency, receptor1, receptor2) :return: Gain amplitudes and weights for each scan """ gt_amp = numpy.abs(gaintable.gain.data) gt_amp = numpy.dstack((gt_amp[:, :, :, 0, 0], gt_amp[:, :, :, 1, 1])) gt_weights = gaintable.weight.data gt_weights = numpy.dstack( ( gt_weights[:, :, :, 0, 0], gt_weights[:, :, :, 1, 1], ) ) return gt_amp, gt_weights