# AstropyDeprecationWarning when making a coordinate transformation that includes a frame

**URL:** <https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343>\
**Category:** Astropy\
**Tags:** astropy\
**Created:** [April 23, 2022, 11:07am UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343 "2022-04-23T11:07:53Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [April 23, 2022, 11:07am UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/1 "2022-04-23T11:07:53Z")

</div>

Hello,  
I have the following piece of code where I transform coordinates from ICRS to galactocentric:

```auto
# Transformation to galactocentric coordinates
    sky_coord = coord.ICRS(ra=alpha*u.degree, dec=delta*u.degree,
                           distance=distance*u.kpc,
                           pm_ra_cosdec=mu_alpha*np.cos(delta*u.degree)*u.mas/u.yr,
                           pm_dec=mu_delta*u.mas/u.yr,
                           radial_velocity=v_los*u.km/u.s)
    galcen_distance = r_sun*u.kpc
    v_sun = coord.CartesianDifferential([11.1, v_circ_sun+12.24, 7.25]*u.km/u.s)
    z_sun = 0.0*u.kpc
    frame = coord.Galactocentric(galcen_distance=galcen_distance, galcen_v_sun=v_sun, z_sun=z_sun)
    galac_coord = sky_coord.transform_to(frame)

```

When running I obtain the following warning:

```auto
WARNING: AstropyDeprecationWarning: Transforming a frame instance to a frame class (as opposed to another frame instance) will not be supported in the future. Either explicitly instantiate the target frame, or first convert the source frame instance to a `astropy.coordinates.SkyCoord` and use its `transform_to()` method. [astropy.coordinates.baseframe]

```

I can’t undertand the explanation. I would like to know which modifications should I make to my piece of code in order to solve that warning.  
Thank you very much in advance.

---

<div class="post-metadata">

**Author:** ![ayshih](https://dub1.discourse-cdn.com/flex005/user_avatar/community.openastronomy.org/ayshih/32/84_2.png) [@ayshih](https://community.openastronomy.org/u/ayshih)\
**Post date:** [April 24, 2022, 4:57am UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/2 "2022-04-24T04:57:54Z")

</div>

Can you double-check that this code exactly as you have shared is emitting this warning? The normal way to see this warning is if you had instead typed:

```python
galac_coord = sky_coord.transform_to(coord.Galactocentric)

```

That is, the warning would be because you were trying to transform to a frame class (`coord.Galactocentric`) rather than to a frame instance (`coord.Galactocentric(...)`). In the code you have shared, you are correctly transforming to a frame instance, so that warning shouldn’t be emitted, and on my machine it doesn’t emit that warning.

I’ll also point out that your `sky_coord` is not actually an instance of the `SkyCoord` class. This warning only appears when you are directly working with frame classes instead of using `SkyCoord`. Had `sky_coord` been a `SkyCoord` instance, this warning would never appear.

---

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [April 27, 2022, 8:10pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/3 "2022-04-27T20:10:09Z")

</div>

Thank you very much for your help. As you say, the warning arises in this two situations:

```auto
Iba_coord_ICRS = Iba_coord_GD1.transform_to(coord.ICRS)
Iba_coord_GD1 = Iba_coord_ICRS.transform_to(GD1_class.GD1Koposov10)

```

How could I previously instantiate each of them? The GD1\_class is here:

```auto
class GD1Koposov10(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 GD-1's orbit.
    phi2 : angle_like, optional, must be keyword
        The latitude-like angle corresponding to GD-1'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 GD-1 stream's orbit.
    pm_phi2 : :class:`~astropy.units.Quantity`, optional, must be keyword
        The proper motion in the latitude-like direction perpendicular to the
        GD-1 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):
        """Init."""
        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):
        """Represent as."""
        r = super().represent_as(base, s=s, in_frame_units=in_frame_units)
        r.lon.wrap_angle = self._default_wrap_angle
        return r

# Rotation matrix as defined in the Appendix of Koposov et al. (2010)
R = np.array([[-0.4776303088, -0.1738432154, 0.8611897727],
              [0.510844589, -0.8524449229, 0.111245042],
              [0.7147776536, 0.4930681392, 0.4959603976]])

@frame_transform_graph.transform(coord.StaticMatrixTransform, coord.ICRS,
                                 GD1Koposov10)
def icrs_to_gd1():
    """Compute the transformation from Galactic spherical to heliocentric GD1 coordinates."""
    return R

@frame_transform_graph.transform(coord.StaticMatrixTransform, GD1Koposov10,
                                 coord.ICRS)
def gd1_to_icrs():
    """Compute the transformation from heliocentric GD1 coordinates to spherical Galactic."""
    return matrix_transpose(icrs_to_gd1())

# TODO: remove this in next version
class GD1(GD1Koposov10):
    """GD-1 class."""

    def __init__ (self, *args, **kwargs):
        """Init GD-1 class."""
        import warnings
        warnings.warn("This frame is deprecated. Use GD1Koposov10 instead.",
                      DeprecationWarning)
        super(). __init__ (*args, **kwargs)

trans = frame_transform_graph.get_transform(GD1Koposov10,
                                            coord.ICRS).transforms[0]
frame_transform_graph.add_transform(GD1, coord.ICRS, trans)
trans = frame_transform_graph.get_transform(coord.ICRS,
                                            GD1Koposov10).transforms[0]
frame_transform_graph.add_transform(coord.ICRS, GD1, trans)

```

When I did :

```auto
sky_coord = coord.ICRS(ra=alpha*u.degree, dec=delta*u.degree,
                           distance=distance*u.kpc,
                           pm_ra_cosdec=mu_alpha*np.cos(delta*u.degree)*u.mas/u.yr,
                           pm_dec=mu_delta*u.mas/u.yr,
                           radial_velocity=v_los*u.km/u.s)

```

did I instantiate the coord.ICRS class?

How would my example be using SkyCoord ?  
Thank you very much @ayshih !

---

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [April 27, 2022, 8:38pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/4 "2022-04-27T20:38:34Z")

</div>

Thanks @ayshih, I made a long answer to your question with further questions and my post was removed by Akismet. I will wait the system to bring it back. Otherwise I will write again.

---

<div class="post-metadata">

**Author:** ![nabobalis](https://dub1.discourse-cdn.com/flex005/user_avatar/community.openastronomy.org/nabobalis/32/14_2.png) [@nabobalis](https://community.openastronomy.org/u/nabobalis)\
**Post date:** [April 27, 2022, 8:53pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/5 "2022-04-27T20:53:21Z")

</div>

I restored the message. Sorry for the trouble!

---

<div class="post-metadata">

**Author:** ![ayshih](https://dub1.discourse-cdn.com/flex005/user_avatar/community.openastronomy.org/ayshih/32/84_2.png) [@ayshih](https://community.openastronomy.org/u/ayshih)\
**Post date:** [April 28, 2022, 3:49am UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/6 "2022-04-28T03:49:14Z")

</div>

> [@mmestre](#):
>
> Thank you very much for your help. As you say, the warning arises in this two situations:
> 
> ```auto
> Iba_coord_ICRS = Iba_coord_GD1.transform_to(coord.ICRS)
> Iba_coord_GD1 = Iba_coord_ICRS.transform_to(GD1_class.GD1Koposov10)
> 
> ```
> 
> How could I previously instantiate each of them?

In the case of `ICRS`, and your `GD1Koposov10`, all you need to instantiate them is to add empty parentheses, e.g.:

```auto
Iba_coord_ICRS = Iba_coord_GD1.transform_to(coord.ICRS())
Iba_coord_GD1 = Iba_coord_ICRS.transform_to(GD1_class.GD1Koposov10())

```

The need to pass in an instance rather than a class may appear silly for these two classes in particular, but that’s because they do not have any frame attributes (e.g., `obstime`). When a frame has frame attributes, the `transform_to()` call wants the target frame to be a frame instance so that those frame attributes have actual values (which could be default values).

> [@mmestre](#):
>
> When I did :
> 
> ```auto
> sky_coord = coord.ICRS(ra=alpha*u.degree, dec=delta*u.degree,
> distance=distance*u.kpc,
> pm_ra_cosdec=mu_alpha*np.cos(delta*u.degree)*u.mas/u.yr,
> pm_dec=mu_delta*u.mas/u.yr,
> radial_velocity=v_los*u.km/u.s)
> 
> ```
> 
> did I instantiate the coord.ICRS class?

Yup

> [@mmestre](#):
>
> How would my example be using SkyCoord ?

There are several ways to create the `SkyCoord` instance. You could create it much like you create the frame instance:

```auto
sky_coord = coord.SkyCoord(ra=..., ..., frame=coord.ICRS)

```

or if you already have the frame instance, you can feed that directly into the `SkyCoord` constructor:

```auto
sky_coord = coord.SkyCoord(sky_coord)

```

In your problematic lines, if `Iba_coord_GD1` and `Iba_coord_ICRS` are `SkyCoord` instances, then the two lines will not emit a warning, even without the parentheses. That’s because `SkyCoord.transform_to()` makes assumptions for the values of frame attributes for the target frame if only a frame class is provided. In contrast, `BaseCoordinateFrame.transform_to()` wants the user to be explicit because it is intended as a lower-level call.

If you want to read a little more about when/why this was changed, see here: [https://github.com/astropy/astropy/pull/10475](https://github.com/astropy/astropy/pull/10475)

---

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [April 28, 2022, 7:51pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/7 "2022-04-28T19:51:45Z")

</div>

Thank you very much for the patience and detailed explanation!  
I will read the reference.  
All the best.

---

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [April 29, 2022, 12:23pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/8 "2022-04-29T12:23:48Z")

</div>

Hi @ayshih, sorry for more related questions.

1- I would like to know if there exist a frame class or a frame is only a particular instantiation of a coordinate class (e.g. coord.galactocentric) where no coordinates are given ?

2- Could you tell me how to define a frame using SkyCoord class ?

3- The objects instantiated using coord.ICRS(…) or SkCoord(…,frame=coord.ICRS) are exactly the same or have different properties?

4- Do you recomend to use SkyCoord or plain coord.ICRS ?

Thank you very much in advance.

---

<div class="post-metadata">

**Author:** ![ayshih](https://dub1.discourse-cdn.com/flex005/user_avatar/community.openastronomy.org/ayshih/32/84_2.png) [@ayshih](https://community.openastronomy.org/u/ayshih)\
**Post date:** [May 2, 2022, 2:58am UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/9 "2022-05-02T02:58:37Z")

</div>

> [@mmestre](#):
>
> Hi @ayshih, sorry for more related questions.
> 
> 1- I would like to know if there exist a frame class or a frame is only a particular instantiation of a coordinate class (e.g. coord.galactocentric) where no coordinates are given ?

I use the terms “frame class”/“frame instance” regardless of whether coordinate data is included. That is, `ICRS()` is a frame instance without coordinate data, and `ICRS(1*u.deg, 2*u.deg)` is a frame instance with coordinate data. Note that the target of a `transform_to()` call can be a frame instance with coordinate data; the coordinate data is simply ignored in that case.

> [@mmestre](#):
>
> 2- Could you tell me how to define a frame using SkyCoord class ?

I’m not clear what you mean by “define a frame”. If you mean create a `SkyCoord` instance for a particular frame and coordinate data, I already gave you examples above. If you mean create a `SkyCoord` instance without any coordinate data, that’s not possible; unlike the frame classes, a `SkyCoord` instance must have coordinate data. If you mean define a frame class, that’s not what the `SkyCoord` class is for. Your `GF1Koposov10` class looks to be defined fine, as a subclass of `BaseCoordinateFrame`.

> [@mmestre](#):
>
> 3- The objects instantiated using coord.ICRS(…) or SkCoord(…,frame=coord.ICRS) are exactly the same or have different properties?

They do not instantiate the same object. The `SkyCoord` instance has more functionality than the `ICRS` instance. I’ll point out that if you have a `SkyCoord` instance, you can “downgrade” it to a frame instance by accessing the `.frame` property.

> [@mmestre](#):
>
> 4- Do you recomend to use SkyCoord or plain coord.ICRS ?
> 
> Thank you very much in advance.

You should use `SkyCoord` unless you have some reason to intentionally avoid some of the additional logic that `SkyCoord` provides. `SkyCoord` is the higher-level interface to using the frame classes directly.

---

<div class="post-metadata">

**Author:** ![mmestre](https://avatars.discourse-cdn.com/v4/letter/m/46a35a/32.png) [@mmestre](https://community.openastronomy.org/u/mmestre)\
**Post date:** [May 2, 2022, 7:13pm UTC](https://community.openastronomy.org/t/astropydeprecationwarning-when-making-a-coordinate-transformation-that-includes-a-frame/343/10 "2022-05-02T19:13:58Z")

</div>

Thank you very much @ayshih ! Now everything clear. I had misunderstood some concepts. Cheers!
