Source code for africanus.rime.parangles

# -*- coding: utf-8 -*-

import warnings

from .parangles_astropy import have_astropy_parangles, astropy_parallactic_angles
from .parangles_casa import have_casa_parangles, casa_parallactic_angles

_discovered_backends = []

if have_astropy_parangles:

if have_casa_parangles:

_standard_backends = set(["casa", "astropy", "test"])

[docs] def parallactic_angles(times, antenna_positions, field_centre, backend="casa"): """ Computes parallactic angles per timestep for the given reference antenna position and field centre. Parameters ---------- times : :class:`numpy.ndarray` Array of Mean Julian Date times in *seconds* with shape :code:`(time,)`, antenna_positions : :class:`numpy.ndarray` Antenna positions of shape :code:`(ant, 3)` in *metres* in the *ITRF* frame. field_centre : :class:`numpy.ndarray` Field centre of shape :code:`(2,)` in *radians* backend : {'casa', 'test'}, optional Backend to use for calculating the parallactic angles. * ``casa`` defers to an implementation depending on ``python-casacore``. This backend should be used by default. * ``test`` creates parallactic angles by multiplying the ``times`` and ``antenna_position`` arrays. It exist solely for testing. Returns ------- parallactic_angles : :class:`numpy.ndarray` Parallactic angles of shape :code:`(time,ant)` """ if backend not in _standard_backends: raise ValueError( "'%s' is not one of the " "standard backends '%s'" % (backend, _standard_backends) ) if not field_centre.shape == (2,): raise ValueError("Invalid field_centre shape %s" % (field_centre.shape,)) if backend == "astropy": warnings.warn("astropy backend currently returns the incorrect values") return astropy_parallactic_angles(times, antenna_positions, field_centre) elif backend == "casa": return casa_parallactic_angles(times, antenna_positions, field_centre) elif backend == "test": return times[:, None] * (antenna_positions.sum(axis=1)[None, :]) else: raise ValueError("Invalid backend %s" % backend)