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:
    _discovered_backends.append('astropy')

if have_casa_parangles:
    _discovered_backends.append('casa')


_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)