class OphiuchusPriceWhelan16(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Ophiuchus stream, as described in Price-Whelan et al. 2016 (see: `<https://arxiv.org/abs/1601.06790>`_). For more information about this class, see the Astropy documentation on coordinate frames in :mod:`~astropy.coordinates`. Parameters ---------- representation : :class:`~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) phi1 : angle_like, optional, must be keyword The longitude-like angle corresponding to Ophiuchus's orbit. phi2 : angle_like, optional, must be keyword The latitude-like angle corresponding to Ophiuchus's orbit. distance : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_phi1_cosphi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the longitude-like direction corresponding to the Ophiuchus stream's orbit. pm_phi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the latitude-like direction perpendicular to the Ophiuchus stream's orbit. radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ] } _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, (coord.UnitSphericalRepresentation, coord.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 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__ = coord.BaseCoordinateFrame.represent_as.__doc__
class Sagittarius(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Sagittarius dwarf galaxy, as described in http://adsabs.harvard.edu/abs/2003ApJ...599.1082M and further explained in http://www.stsci.edu/~dlaw/Sgr/. Parameters ---------- representation : `BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) Lambda : `Angle`, optional, must be keyword The longitude-like angle corresponding to Sagittarius' orbit. Beta : `Angle`, optional, must be keyword The latitude-like angle corresponding to Sagittarius' orbit. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation frame_specific_representation_info = { 'spherical': [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance') ], 'unitspherical': [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta') ] }
class GD1(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the GD1 stream, as described in Koposov et al. 2010 (see: `<http://arxiv.org/abs/0907.1085>`_). For more information about this class, see the Astropy documentation on coordinate frames in :mod:`~astropy.coordinates`. Parameters ---------- representation : :class:`~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) phi1 : angle_like, optional, must be keyword The longitude-like angle corresponding to Orphan's orbit. phi2 : angle_like, optional, must be keyword The latitude-like angle corresponding to Orphan's orbit. distance : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation frame_specific_representation_info = { 'spherical': [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ], 'unitspherical': [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2') ] }
class SagittariusLaw10(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Sagittarius dwarf galaxy, as described in http://adsabs.harvard.edu/abs/2003ApJ...599.1082M and further explained in http://www.stsci.edu/~dlaw/Sgr/. Parameters ---------- representation : `BaseRepresentation` or None A representation object or None to have no data (or use the other keywords). Lambda : `Angle`, optional, must be keyword The longitude-like angle corresponding to Sagittarius' orbit. Beta : `Angle`, optional, must be keyword The latitude-like angle corresponding to Sagittarius' orbit. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_Lambda_cosBeta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion along the stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_Beta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The radial velocity of this object. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance') ] } _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, (coord.UnitSphericalRepresentation, coord.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 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__ = coord.BaseCoordinateFrame.represent_as.__doc__
class Sagittarius(coord.BaseCoordinateFrame): default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance')] }
class ArbitraryPoleFrame(coord.BaseCoordinateFrame): default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ], coord.SphericalCosLatDifferential: [ coord.RepresentationMapping('d_lon_coslat', 'pm_phi1_cosphi2'), coord.RepresentationMapping('d_lat', 'pm_phi2'), coord.RepresentationMapping('d_distance', 'radial_velocity') ], coord.SphericalDifferential: [ coord.RepresentationMapping('d_lon', 'pm_phi1'), coord.RepresentationMapping('d_lat', 'pm_phi2'), coord.RepresentationMapping('d_distance', 'radial_velocity') ] } pole = coord.CoordinateAttribute(frame=coord.ICRS) roll = coord.QuantityAttribute(default=0 * u.degree)
class GD1(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the GD1 stream, as described in Koposov et al. 2010 (see: `<http://arxiv.org/abs/0907.1085>`_). For more information about this class, see the Astropy documentation on coordinate frames in :mod:`~astropy.coordinates`. Parameters ---------- representation : :class:`~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) phi1 : angle_like, optional, must be keyword The longitude-like angle corresponding to Orphan's orbit. phi2 : angle_like, optional, must be keyword The latitude-like angle corresponding to Orphan's orbit. distance : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_phi1_cosphi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the longitude-like direction corresponding to the Orphan stream's orbit. pm_phi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the latitude-like direction perpendicular to the Orphan stream's orbit. radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ], coord.SphericalCosLatDifferential: [ coord.RepresentationMapping('d_lon_coslat', 'pm_phi1_cosphi2'), coord.RepresentationMapping('d_lat', 'pm_phi2'), coord.RepresentationMapping('d_distance', 'radial_velocity') ], coord.SphericalDifferential: [ coord.RepresentationMapping('d_lon', 'pm_phi1'), coord.RepresentationMapping('d_lat', 'pm_phi2'), coord.RepresentationMapping('d_distance', 'radial_velocity') ] } frame_specific_representation_info[coord.UnitSphericalRepresentation] = \ frame_specific_representation_info[coord.SphericalRepresentation] frame_specific_representation_info[coord.UnitSphericalCosLatDifferential] = \ frame_specific_representation_info[coord.SphericalCosLatDifferential] frame_specific_representation_info[coord.UnitSphericalDifferential] = \ frame_specific_representation_info[coord.SphericalDifferential]
class NewbergOrphan(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Orphan stream, as described in Newberg et al. 2010 (see: `<http://arxiv.org/abs/1001.0576>`_). Note: to be consistent with other stream classes, we refer to the longitude and latitude as ``phi1`` and ``phi2`` instead of ``Lambda`` and ``Beta``. For more information about this class, see the Astropy documentation on coordinate frames in :mod:`~astropy.coordinates`. Parameters ---------- representation : :class:`~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) phi1 : angle_like, optional, must be keyword The longitude-like angle corresponding to Orphan's orbit. phi2 : angle_like, optional, must be keyword The latitude-like angle corresponding to Orphan's orbit. distance : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_phi1_cosphi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the longitude-like direction corresponding to the Orphan stream's orbit. pm_phi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in the latitude-like direction perpendicular to the Orphan stream's orbit. radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ] } _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, (coord.UnitSphericalRepresentation, coord.SphericalRepresentation)): self._data.lon.wrap_angle = self._default_wrap_angle
class Sagittarius(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Sagittarius dwarf galaxy, as described in http://adsabs.harvard.edu/abs/2003ApJ...599.1082M and further explained in http://www.stsci.edu/~dlaw/Sgr/. Parameters ---------- representation : `BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) Lambda : `Angle`, optional, must be keyword The longitude-like angle corresponding to Sagittarius' orbit. Beta : `Angle`, optional, must be keyword The latitude-like angle corresponding to Sagittarius' orbit. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_Lambda_cosBeta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion along the stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_Beta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The radial velocity of this object. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance') ], coord.SphericalCosLatDifferential: [ coord.RepresentationMapping('d_lon_coslat', 'pm_Lambda_cosBeta'), coord.RepresentationMapping('d_lat', 'pm_Beta'), coord.RepresentationMapping('d_distance', 'radial_velocity') ], coord.SphericalDifferential: [ coord.RepresentationMapping('d_lon', 'pm_Lambda'), coord.RepresentationMapping('d_lat', 'pm_Beta'), coord.RepresentationMapping('d_distance', 'radial_velocity') ] } frame_specific_representation_info[coord.UnitSphericalRepresentation] = \ frame_specific_representation_info[coord.SphericalRepresentation] frame_specific_representation_info[coord.UnitSphericalCosLatDifferential] = \ frame_specific_representation_info[coord.SphericalCosLatDifferential] frame_specific_representation_info[coord.UnitSphericalDifferential] = \ frame_specific_representation_info[coord.SphericalDifferential]
class RotatedFrame(coord.BaseCoordinateFrame): """Example Rotated frame. Implemented from an Astropy [astropy]_ SkyOffset Frame. Parameters ---------- representation : `~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) phi1 : `~astropy.coordinates.Angle`, optional, must be keyword The longitude-like angle corresponding to Sagittarius' orbit. phi2 : `~astropy.coordinates.Angle`, optional, must be keyword The latitude-like angle corresponding to Sagittarius' orbit. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_phi1_cosphi2 : :class:`~astropy.units.Quantity`, optional, keyword The proper motion along the stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_phi2 : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, keyword The radial velocity of this object. References ---------- .. [astropy] Astropy Collaboration, Robitaille, T., Tollerud, E., Greenfield, P., Droettboom, M., Bray, E., Aldcroft, T., Davis, M., Ginsburg, A., Price-Whelan, A., Kerzendorf, W., Conley, A., Crighton, N., Barbary, K., Muna, D., Ferguson, H., Grollier, F., Parikh, M., Nair, P., Unther, H., Deil, C., Woillez, J., Conseil, S., Kramer, R., Turner, J., Singer, L., Fox, R., Weaver, B., Zabalza, V., Edwards, Z., Azalee Bostroem, K., Burke, D., Casey, A., Crawford, S., Dencheva, N., Ely, J., Jenness, T., Labrie, K., Lim, P., Pierfederici, F., Pontzen, A., Ptak, A., Refsdal, B., Servillat, M., & Streicher, O. (2013). Astropy: A community Python package for astronomy. Astronomy and Astrophysics, 558, A33. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping("lon", "phi1"), coord.RepresentationMapping("lat", "phi2"), coord.RepresentationMapping("distance", "distance"), ], }
class GreatCircleICRSFrame(coord.BaseCoordinateFrame): """A frame rotated into great circle coordinates with the pole and longitude specified as frame attributes. ``GreatCircleICRSFrame``s always have component names for spherical coordinates of ``phi1``/``phi2``. """ pole = CoordinateAttribute(default=None, frame=coord.ICRS) ra0 = QuantityAttribute(default=np.nan * u.deg, unit=u.deg) rotation = QuantityAttribute(default=0, unit=u.deg) frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ] } default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential _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, (coord.UnitSphericalRepresentation, coord.SphericalRepresentation)): self._data.lon.wrap_angle = self._default_wrap_angle @classmethod def from_endpoints(cls, coord1, coord2, ra0=None, rotation=None): """TODO """ pole = pole_from_endpoints(coord1, coord2) kw = dict(pole=pole) if ra0 is not None: kw['ra0'] = ra0 if rotation is not None: kw['rotation'] = rotation if ra0 is None and rotation is None: midpt = sph_midpoint(coord1, coord2) kw['ra0'] = midpt.ra return cls(**kw)
class LocalSheet(coord.BaseCoordinateFrame): """ Local Sheet Coordinates (see McCall 2014, <http://adsabs.harvard.edu/abs/2014MNRAS.440..405M>, and references therein). """ frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'lsl'), coord.RepresentationMapping('lat', 'lsb') ], coord.CartesianRepresentation: [ coord.RepresentationMapping('x', 'lsx'), coord.RepresentationMapping('y', 'lsy'), coord.RepresentationMapping('z', 'lsz') ], coord.CartesianDifferential: [ coord.RepresentationMapping('d_x', 'v_x', u.km/u.s), coord.RepresentationMapping('d_y', 'v_y', u.km/u.s), coord.RepresentationMapping('d_z', 'v_z', u.km/u.s) ], } default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential # North supergalactic pole in Galactic coordinates. # Needed for transformations to/from Galactic coordinates. n_sgal = coord.SkyCoord(sgl=241.74*u.degree, sgb=82.05*u.degree, frame="supergalactic") _nlsp_gal = n_sgal.galactic
class SDSSMuNu(ac.BaseCoordinateFrame): """SDSS Great Circle Coordinates Attributes ---------- stripe SDSS `Stripe Number`_ . node Node of the great circle with respect to the celestial equator. In SDSS, this is almost always RA = 95.0 degrees. incl Inclination of the great circle with respect to the celestial equator. phi Counter-clockwise position angle w.r.t. north for an arc in the +nu direction. Parameters ---------- mu : :class:`~astropy.coordinates.Angle` Angle corresponding to longitude measured along a stripe. nu : :class:`~astropy.coordinates.Angle` Angle corresponding to latitude measured perpendicular to a stripe. Notes ----- https://www.sdss.org/dr14/algorithms/surveycoords/ .. _`Stripe Number`: https://www.sdss.org/dr14/help/glossary/#stripe """ default_representation = ac.SphericalRepresentation frame_specific_representation_info = { 'spherical': [ ac.RepresentationMapping(reprname='lon', framename='mu', defaultunit=u.deg), ac.RepresentationMapping(reprname='lat', framename='nu', defaultunit=u.deg) ] } frame_specific_representation_info['unitspherical'] = ( frame_specific_representation_info['spherical']) stripe = ac.Attribute(default=0) node = ac.QuantityAttribute(default=ac.Angle(95.0, unit=u.deg), unit=u.deg) # phi = ac.QuantityFrameAttribute(default=None, unit=u.deg) @property def incl(self): return ac.Angle(stripe_to_incl(self.stripe), unit=u.deg)
class stream_coord(coord.BaseCoordinateFrame): """ Based on the Sgr example in the Astropy docs, this creates a new coordinate system for the stream model Parameters ---------- representation : `~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) Lambda : `~astropy.coordinates.Angle`, optional, must be keyword The longitude-like angle corresponding to the direction along Phoenix. Beta : `~astropy.coordinates.Angle`, optional, must be keyword The latitude-like angle corresponding to the direction perpendicular to Phoenix. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_Lambda_cosBeta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion along the stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_Beta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The radial velocity of this object. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance')] } _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, (coord.UnitSphericalRepresentation, coord.SphericalRepresentation)): self._data.lon.wrap_angle = self._default_wrap_angle def represent_as(self, base, s='base', in_frame_units=False): r = super().represent_as(base, s=s, in_frame_units=in_frame_units) r.lon.wrap_angle = self._default_wrap_angle return r
class OrphanKoposov19(coord.BaseCoordinateFrame): """A coordinate frame for the Orphan stream defined by Sergey Koposov. Parameters ---------- phi1 : `~astropy.units.Quantity` Longitude component. phi2 : `~astropy.units.Quantity` Latitude component. distance : `~astropy.units.Quantity` Distance. pm_phi1_cosphi2 : `~astropy.units.Quantity` Proper motion in longitude. pm_phi2 : `~astropy.units.Quantity` Proper motion in latitude. radial_velocity : `~astropy.units.Quantity` Line-of-sight or radial velocity. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ] } _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, (coord.UnitSphericalRepresentation, coord.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 def represent_as(self, base, s='base', in_frame_units=False): r = super().represent_as(base, s=s, in_frame_units=in_frame_units) r.lon.wrap_angle = self._default_wrap_angle return r represent_as.__doc__ = coord.BaseCoordinateFrame.represent_as.__doc__
class MagellanicStream(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the Magellanic Stream Parameters ---------- representation : `BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) MSLongitude : `Angle`, optional, must be keyword The longitude-like angle corresponding to the Magellanic Stream. MSLatitude : `Angle`, optional, must be keyword The latitude-like angle corresponding to the Magellanic Stream. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_Lambda_cosBeta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion along the Stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_Beta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The radial velocity of this object. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'MSLongitude'), coord.RepresentationMapping('lat', 'MSLatitude'), coord.RepresentationMapping('distance', 'distance') ], coord.SphericalCosLatDifferential: [ coord.RepresentationMapping('d_lon_coslat', 'pm_lon_coslat'), coord.RepresentationMapping('d_lat', 'pm_lat'), coord.RepresentationMapping('d_distance', 'radial_velocity') ], coord.SphericalDifferential: [ coord.RepresentationMapping('d_lon', 'pm_lon'), coord.RepresentationMapping('d_lat', 'pm_lat'), coord.RepresentationMapping('d_distance', 'radial_velocity') ] } frame_specific_representation_info[coord.UnitSphericalRepresentation] = \ frame_specific_representation_info[coord.SphericalRepresentation] frame_specific_representation_info[coord.UnitSphericalCosLatDifferential] = \ frame_specific_representation_info[coord.SphericalCosLatDifferential] frame_specific_representation_info[coord.UnitSphericalDifferential] = \ frame_specific_representation_info[coord.SphericalDifferential]
class RotY45(coord.BaseCoordinateFrame): ''' This class rotates a vector 45 degrees around the y-axis. (0,0,1) in (x,y,z) or (0,90) in long, lat should yield (-0.707, 0, 0.707) or (180, 45) Parameters: longitude-like angle latitude-like angle ''' default_representation = UnitSphericalRepresentation frame_specific_representation_info = { UnitSphericalRepresentation: [ coord.RepresentationMapping('lon', 'lon'), coord.RepresentationMapping('lat', 'lat')] }
class StreamFrame(coord.BaseCoordinateFrame): """StreamFrame. A Heliocentric spherical coordinate system defined to linearize a stream about a point, using the angular momentum at that point. http://docs.astropy.org/en/stable/generated/examples/coordinates/ plot_sgr-coordinate-frame.html #sphx-glr-generated-examples-coordinates-plot-sgr-coordinate-frame-py """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping("lon", "phi1"), coord.RepresentationMapping("lat", "phi2"), coord.RepresentationMapping("distance", "distance"), ], coord.SphericalCosLatDifferential: [ coord.RepresentationMapping("d_lon_coslat", "pm_phi1_cosphi2"), coord.RepresentationMapping("d_lat", "pm_phi2"), coord.RepresentationMapping("d_distance", "radial_velocity"), ], coord.SphericalDifferential: [ coord.RepresentationMapping("d_lon", "pm_phi1"), coord.RepresentationMapping("d_lat", "pm_phi2"), coord.RepresentationMapping("d_distance", "radial_velocity"), ], } frame_specific_representation_info[ coord. UnitSphericalRepresentation] = frame_specific_representation_info[ coord.SphericalRepresentation] frame_specific_representation_info[ coord. UnitSphericalCosLatDifferential] = frame_specific_representation_info[ coord.SphericalCosLatDifferential] frame_specific_representation_info[ coord.UnitSphericalDifferential] = frame_specific_representation_info[ coord.SphericalDifferential]
class MarsNAlign(coord.BaseCoordinateFrame): ''' A unit spherical representation frame that aligns J2000 (RA,DEC) frame to Mars's rotation frame: Mars's rotational axis in J2000 should point due north (0,0,1) in Cartesian or (0,90) in long, lat. Note: This new frame is a simple realignment or rotation of the J2000 frame to match that of Mars's rotations axis. This doesn't take into consideration the location of Mars's prime meridian. To fix this, an additional perimeter for the longitude needs to be addressed. Parameters: longitude-like angle using ra-like as label to maintain consistency latitude-like angle using dec-like label to maintain consistency ''' default_representation = UnitSphericalRepresentation frame_specific_representation_info = { UnitSphericalRepresentation: [ coord.RepresentationMapping('lon', 'ra'), # ('lon', 'lon') coord.RepresentationMapping('lat', 'dec')] # ('lon', 'lon') }
class Phoenix(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Phoenix stream, as described in Balbinot et al. 2016 Parameters ---------- representation : `~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) Lambda : `~astropy.coordinates.Angle`, optional, must be keyword The longitude-like angle corresponding to the direction along Phoenix. Beta : `~astropy.coordinates.Angle`, optional, must be keyword The latitude-like angle corresponding to the direction perpendicular to Phoenix. distance : `Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. pm_Lambda_cosBeta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion along the stream in ``Lambda`` (including the ``cos(Beta)`` factor) for this object (``pm_Beta`` must also be given). pm_Beta : :class:`~astropy.units.Quantity`, optional, must be keyword The proper motion in Declination for this object (``pm_ra_cosdec`` must also be given). radial_velocity : :class:`~astropy.units.Quantity`, optional, must be keyword The radial velocity of this object. """ default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance') ] }
class Sagittarius(coord.BaseCoordinateFrame): """ A Heliocentric spherical coordinate system defined by the orbit of the Sagittarius dwarf galaxy, as described in Majewski et al. 2003 (see: `<http://adsabs.harvard.edu/abs/2003ApJ...599.1082M>`_) and further explained at `this website <http://www.astro.virginia.edu/~srm4n/Sgr/>`_. For more information about this class, see the Astropy documentation on `Coordinate Frames <http://docs.astropy.org/en/latest/coordinates/frames.html>`_. Parameters ---------- representation : :class:`~astropy.coordinates.BaseRepresentation` or None A representation object or None to have no data (or use the other keywords) Lambda : angle_like, optional, must be keyword The longitude-like angle corresponding to Sagittarius' orbit. Beta : angle_like, optional, must be keyword The latitude-like angle corresponding to Sagittarius' orbit. distance : :class:`~astropy.units.Quantity`, optional, must be keyword The Distance for this object along the line-of-sight. """ default_representation = coord.SphericalRepresentation frame_specific_representation_info = { 'spherical': [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta'), coord.RepresentationMapping('distance', 'distance') ], 'unitspherical': [ coord.RepresentationMapping('lon', 'Lambda'), coord.RepresentationMapping('lat', 'Beta') ] }
class GreatCircleICRSFrame(coord.BaseCoordinateFrame): """A frame rotated into great circle coordinates with the pole and longitude specified as frame attributes. ``GreatCircleICRSFrame``s always have component names for spherical coordinates of ``phi1``/``phi2``. """ pole = CoordinateAttribute(default=None, frame=coord.ICRS) center = CoordinateAttribute(default=None, frame=coord.ICRS) ra0 = QuantityAttribute(default=np.nan * u.deg, unit=u.deg) rotation = QuantityAttribute(default=0, unit=u.deg) frame_specific_representation_info = { coord.SphericalRepresentation: [ coord.RepresentationMapping('lon', 'phi1'), coord.RepresentationMapping('lat', 'phi2'), coord.RepresentationMapping('distance', 'distance') ] } default_representation = coord.SphericalRepresentation default_differential = coord.SphericalCosLatDifferential _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, (coord.UnitSphericalRepresentation, coord.SphericalRepresentation)): self._data.lon.wrap_angle = self._default_wrap_angle if self.center is not None and np.isfinite(self.ra0): raise ValueError( "Both `center` and `ra0` were specified for this " "{} object: you can only specify one or the other.".format( self.__class__.__name__)) # 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 def represent_as(self, base, s='base', in_frame_units=False): r = super().represent_as(base, s=s, in_frame_units=in_frame_units) r.lon.wrap_angle = self._default_wrap_angle return r represent_as.__doc__ = coord.BaseCoordinateFrame.represent_as.__doc__ @classmethod def from_endpoints(cls, coord1, coord2, ra0=None, rotation=None): """Compute the great circle frame from two endpoints of an arc on the unit sphere. Parameters ---------- coord1 : `~astropy.coordinates.SkyCoord` One endpoint of the great circle arc. coord2 : `~astropy.coordinates.SkyCoord` The other endpoint of the great circle arc. ra0 : `~astropy.units.Quantity`, `~astropy.coordinates.Angle` (optional) If specified, an additional transformation will be applied to make this right ascension the longitude zero-point of the resulting coordinate frame. rotation : `~astropy.units.Quantity`, `~astropy.coordinates.Angle` (optional) If specified, a final rotation about the pole (i.e. the resulting z axis) applied. """ pole = pole_from_endpoints(coord1, coord2) kw = dict(pole=pole) if ra0 is not None: kw['ra0'] = ra0 if rotation is not None: kw['rotation'] = rotation if ra0 is None and rotation is None: midpt = sph_midpoint(coord1, coord2) kw['ra0'] = midpt.ra return cls(**kw) @classmethod def from_xyz(cls, xnew=None, ynew=None, znew=None): """Compute the great circle frame from a specification of the coordinate axes in the new system. Parameters ---------- xnew : astropy ``Representation`` object The x-axis in the new system. ynew : astropy ``Representation`` object The y-axis in the new system. znew : astropy ``Representation`` object The z-axis in the new system. """ is_none = [xnew is None, ynew is None, znew is None] if np.sum(is_none) > 1: raise ValueError("At least 2 axes must be specified.") if xnew is not None: xnew = xnew.to_cartesian() if ynew is not None: ynew = ynew.to_cartesian() if znew is not None: znew = znew.to_cartesian() if znew is None: znew = xnew.cross(ynew) if ynew is None: ynew = -xnew.cross(znew) if xnew is None: xnew = ynew.cross(znew) pole = coord.SkyCoord(znew, frame='icrs') center = coord.SkyCoord(xnew, frame='icrs') return cls(pole=pole, center=center)