Source code for gala.coordinates.magellanic_stream

""" Astropy coordinate class for the Magellanic Stream coordinate system """

from astropy.coordinates.matrix_utilities import rotation_matrix
from astropy.coordinates.baseframe import (
    frame_transform_graph,
    BaseCoordinateFrame,
    RepresentationMapping,
)
from astropy.coordinates.transformations import StaticMatrixTransform
from astropy.coordinates import representation as r
from astropy.coordinates import Galactic

import astropy.units as u

__all__ = ["MagellanicStreamNidever08"]


[docs] class MagellanicStreamNidever08(BaseCoordinateFrame): """ A coordinate or frame aligned with the Magellanic Stream, as defined by Nidever et al. (2008, see: `<http://adsabs.harvard.edu/abs/2008ApJ...679..432N>`_). For more information about this class, see the Astropy documentation on coordinate frames in :mod:`~astropy.coordinates`. Examples -------- Converting the coordinates of the Large Magellanic Cloud: >>> from astropy import coordinates as coord >>> from astropy import units as u >>> from gala.coordinates import MagellanicStreamNidever08 >>> c = coord.Galactic(l=280.4652*u.deg, b=-32.8884*u.deg) >>> ms = c.transform_to(MagellanicStreamNidever08()) >>> print(ms) <MagellanicStreamNidever08 Coordinate: (L, B) in deg (-0.13686116, 2.42583948)> """ frame_specific_representation_info = { r.SphericalRepresentation: [ RepresentationMapping("lon", "L"), RepresentationMapping("lat", "B"), ] } default_representation = r.SphericalRepresentation default_differential = r.SphericalCosLatDifferential _ngp = Galactic(l=188.5 * u.deg, b=-7.5 * u.deg) _lon0 = Galactic(l=280.47 * u.deg, b=-32.75 * u.deg) _default_wrap_angle = 180 * u.deg def __init__(self, *args, **kwargs): wrap = kwargs.pop("wrap_longitude", True) super().__init__(*args, **kwargs) if wrap and isinstance( self._data, (r.UnitSphericalRepresentation, r.SphericalRepresentation) ): self._data.lon.wrap_angle = self._default_wrap_angle # TODO: remove this. This is a hack required as of astropy v3.1 in order # to have the longitude components wrap at the desired angle
[docs] def represent_as(self, base, s="base", in_frame_units=False): r = super().represent_as(base, s=s, in_frame_units=in_frame_units) if hasattr(r, "lon"): r.lon.wrap_angle = self._default_wrap_angle return r
represent_as.__doc__ = BaseCoordinateFrame.represent_as.__doc__
@frame_transform_graph.transform( StaticMatrixTransform, Galactic, MagellanicStreamNidever08 ) def gal_to_mag(): mat1 = rotation_matrix(57.275785782128686 * u.deg, "z") mat2 = rotation_matrix(90 * u.deg - MagellanicStreamNidever08._ngp.b, "y") mat3 = rotation_matrix(MagellanicStreamNidever08._ngp.l, "z") return mat1 @ mat2 @ mat3 @frame_transform_graph.transform( StaticMatrixTransform, MagellanicStreamNidever08, Galactic ) def mag_to_gal(): return gal_to_mag().T