Source code for africanus.rime.transform

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import math

import numpy as np

from africanus.util.numba import jit


@jit(nopython=True, nogil=True, cache=True)
def _nb_transform_sources(lm, parallactic_angles, pointing_errors,
                          antenna_scaling, frequency, coords):
    """
    numba implementation of
    :func:`~africanus.rime.transform_sources`
    """
    _, nsrc, ntime, na, nchan = coords.shape

    for t in range(ntime):
        for a in range(na):
            pa_sin = math.sin(parallactic_angles[t, a])
            pa_cos = math.cos(parallactic_angles[t, a])

            for s in range(nsrc):
                l, m = lm[s]

                # Rotate source coordinate by parallactic angle
                l = l*pa_cos - m*pa_sin  # noqa
                m = l*pa_sin + m*pa_cos

                # Add pointing errors
                l += pointing_errors[t, a, 0]  # noqa
                m += pointing_errors[t, a, 1]

                # Scale by antenna scaling factors
                for c in range(nchan):
                    coords[0, s, t, a, c] = l*antenna_scaling[a, c]
                    coords[1, s, t, a, c] = m*antenna_scaling[a, c]
                    coords[2, s, t, a, c] = frequency[c]

    return coords


[docs]def transform_sources(lm, parallactic_angles, pointing_errors, antenna_scaling, frequency, dtype=None): """ Creates beam sampling coordinates suitable for use in :func:`~africanus.rime.beam_cube_dde` by: 1. Rotating ``lm`` coordinates by the ``parallactic_angles`` 2. Adding ``pointing_errors`` 3. Scaling by ``antenna_scaling`` Parameters ---------- lm : :class:`numpy.ndarray` LM coordinates of shape :code:`(src,2)` in radians offset from the phase centre. parallactic_angles : :class:`numpy.ndarray` parallactic angles of shape :code:`(time, antenna)` in radians. pointing_errors : :class:`numpy.ndarray` LM pointing errors for each antenna at each timestep in radians. Has shape :code:`(time, antenna, 2)` antenna_scaling : :class:`numpy.ndarray` antenna scaling factor for each channel and each antenna. Has shape :code:`(antenna, chan)` frequency : :class:`numpy.ndarray` frequencies for each channel. Has shape :code:`(chan,)` dtype : :class:`numpy.dtype`, optional Numpy dtype of result array. Should be float32 or float64. Defaults to float64 Returns ------- coords : :class:`numpy.ndarray` coordinates of shape :code:`(3, src, time, antenna, chan)` where each coordinate component represents **l**, **m** and **frequency**, respectively. """ ntime, na = parallactic_angles.shape nsrc = lm.shape[0] assert (ntime, na, 2) == pointing_errors.shape nchan = antenna_scaling.shape[1] assert nchan == frequency.shape[0] dtype = np.float64 if dtype is None else dtype coords = np.empty((3, nsrc, ntime, na, nchan), dtype=dtype) return _nb_transform_sources(lm, parallactic_angles, pointing_errors, antenna_scaling, frequency, coords)