A.3. Velocities in the Milky Way

\label{sec-mwvel}

Observed velocities are typically reported as proper motions on the sky, for the part of the motion that is in the plane of the sky, and the line of sight velocity, the velocity towards or away from us. Proper motions are measured by comparing the position of a star on the sky at two different epochs, typically spaced by at least a few years and up to decades (although astrometric satellites like Gaia measure the sky positions of celestial sources at a much higher cadence and thus have better time resolution than this). Line-of-sight velocities can be measured using the Doppler shifts of spectral lines in a spectrum taken of the light of the source. Proper motions are therefore angular velocities, typically reported in mas/yr, while line-of-sight velocities are measured as Doppler shifts, which are fractions of the speed of light and the velocity in km/s can therefore be determined. To determine the full physical velocity, the angular proper motions must be multiplied with the distance. Note that to avoid confusion with the radial velocity in the cylindrical Galactocentric frame, we will attempt to always refer to the Doppler-shifted velocity as the line-of-sight velocity, but in the literature this is also commonly known as the radial velocity.

Just like the positions of celestial sources are typically reported as RA and Dec in the equatorial system, proper motions are typically reported as proper motions \(\mu_{\alpha,*}\) and \(\mu_\delta\) in \(\alpha=\)RA and \(\delta=\)Dec, respectively. These are defined based on displacement \(\Delta \alpha\) and \(\Delta \delta\) in RA and Dec, respectively, over a period of time \(T\) as \begin{align} \mu_{\alpha,*} & = \Delta \alpha \,\cos\delta\,/\,T\,;\quad \mu_\delta = \Delta \delta\,/\,T\,. \end{align} We have added an asterisk in the subscript for \(\mu_{\alpha,*}\) because of the \(\cos \delta\) factor that is present. This factor is necessary to transform the observed coordinate displacement in RA into a physical displacement. Virtually all proper-motion catalogs report \(\mu_{\alpha,*}\) even though they often will not include the asterisk. Make sure that you are sure whether or not the \(\cos \delta\) factor is included before making use of any proper motions! If you want to use proper motions to compute the present-day celestial coordinate position in RA and Dec from its position at, say, the year 2000, make sure to divide out the \(\cos\delta\) factor before applying the displacement, that is, you want the coordinate displacement \(\Delta \alpha = \mu_{\alpha,*}\,T/\cos\delta\).

Velocities can be transformed from the equatorial to the Galactic coordinate frame by applying a few simple rotation matrices. This is rather cumbersome, but explained in detail in the Appendix of Bovy (2011) if you are interested in the specifics (see above). Because the Galactic frame is simply a rotation of the equatorial frame, proper motions can be transformed between the two without involving the line-of-sight velocity. astropy can also transform velocities.

For example, to transform the proper motion, do

[12]:
import astropy.units as u
import astropy.coordinates as apycoords
ra= 120.*u.deg
dec= 30.*u.deg
pmra= 5.*u.mas/u.yr
pmdec= -3.*u.mas/u.yr
distance= 1.2*u.kpc
c= apycoords.SkyCoord(ra=ra,dec=dec,distance=distance,
                      pm_ra_cosdec=pmra,
                      pm_dec=pmdec,
                      frame='icrs')
print(c.galactic)
<SkyCoord (Galactic): (l, b, distance) in (deg, deg, kpc)
    (191.27460843, 27.07427141, 1.2)
 (pm_l_cosb, pm_b) in mas / yr
    (4.34640069, 3.88700412)>

As already discussed above, the velocities in the Cartesian Galactic coordinate frame as commonly known as \((U,V,W)\).

These can be calculated using astropy as

[13]:
ra= 120.*u.deg
dec= 30.*u.deg
distance= 1.2*u.kpc
pmra= 5.*u.mas/u.yr
pmdec= -3.*u.mas/u.yr
vlos= 55.*u.km/u.s
c= apycoords.SkyCoord(ra=ra,dec=dec,distance=distance,
                      pm_ra_cosdec=pmra,
                      pm_dec=pmdec,
                      radial_velocity=vlos,
                      frame='icrs')
cg= c.transform_to(apycoords.Galactic())
cg.representation_type= 'cartesian'
print(cg)
<SkyCoord (Galactic): (u, v, w) in kpc
    (-1.04788016, -0.20890423, 0.54617413)
 (U, V, W) in km / s
    (-33.32415106, -31.85479021, 44.72141953)>

As for positions in the Galactic coordinate frame, these velocities in the Galactic coordinate frame are only useful when studying the kinematics of the solar neighborhood. For example, studies of the local velocity distribution (e.g., Bovy et al. 2009) will report the distribution of the \((U,V,W)\) components. However, to study the dynamics of the Milky Way on a global scale, it is necessary to go to the Galactocentric frame again. For this transformation we require the Sun’s three-dimensional velocity with respect to the Galactic center. There are many subtleties in how this velocity is determined and it remains a poorly measured quantity, especially the component in the direction of Galactic rotation, but it is approximately \((v_x,v_y,v_z) = (-11.1,245,7.25)\,\mathrm{km\,s}^{-1}\) in the left-handed Galactocentric frame (\(v_x = 11.1\,\mathrm{km\,s}^{-1}\) in the right-handed frame; to specify \(v_x\) when using astropy we have to use the right-handed frame). See Chapter 10.3.1 for more discussion on the determination of the Sun’s motion in the Galaxy.

We can then transform velocities all the way to Galactocentric coordinates as

[14]:
ra= 120.*u.deg
dec= 30.*u.deg
distance= 1.2*u.kpc
pmra= 5.*u.mas/u.yr
pmdec= -3.*u.mas/u.yr
vlos= 55.*u.km/u.s
c= apycoords.SkyCoord(ra=ra,dec=dec,distance=distance,
                      pm_ra_cosdec=pmra,
                      pm_dec=pmdec,
                      radial_velocity=vlos,
                      frame='icrs')# Define GC frame
v_sun = apycoords.CartesianDifferential([11.1,245.,7.25]*u.km/u.s)
gc_frame= apycoords.Galactocentric(galcen_distance=8.1*u.kpc,
                                   z_sun=25.*u.pc,
                                   galcen_v_sun=v_sun)
cg= c.transform_to(gc_frame)
cg.representation_type= 'cartesian'
print("Cartesian velocity (v_x,v_y,v_z) in km/s")
print("\t",
      cg.v_x.to(u.km/u.s).value,
      cg.v_y.to(u.km/u.s).value,
      cg.v_z.to(u.km/u.s).value)
cg.representation_type= 'cylindrical'
print("Cylindrical velocity (v_r,v_phi,v_z) in km/s=")
print("\t",
      cg.d_rho.to(u.km/u.s).value,
      (cg.d_phi*cg.rho).to(u.km/u.s,
        equivalencies=u.dimensionless_angles()).value,
      cg.d_z.to(u.km/u.s).value)
Cartesian velocity (v_x,v_y,v_z) in km/s
         -22.086057200219138 213.14517509751525 52.07396464050416
Cylindrical velocity (v_r,v_phi,v_z) in km/s=
         17.21319323757294 -213.5939268063766 52.07396464050416

Note again that the sign of \(v_x\) is flipped with respect to what it would be in the left-handed coordinate frame. Similarly, in the cylindrical representation the sign of \(v_\phi\) is flipped.