So I'm interested in knowing how the CDS calculates the J2000 equatorial coordinates from the Gaia DR3 equatorial coordinates (that are given in epoch 2016.0).
For example, for the star HD 308819 = Gaia DR3 5333580380647188736, the Gaia coordinates are (ra, dec) = 174.50345338328, -63.37448911466 (deg, deg) in J2016. The CDS calculates for Vizier the corresponding J2000 coordinates as (RAJ2000, DEJ2000) = 11:38:00.8430618017 -63:22:28.166022064.
I tried to do this in Python by using astropy like so:
import astropy.units as u
from astropy.coordinates import SkyCoord
# Gaia coordinates (ICRS | J2016):
ra = 174.50345338328
dec = -63.37448911466
gaia_coords = SkyCoord(ra = ra*u.deg, dec = dec*u.deg, frame = 'icrs', equinox = 'J2016.0')
# Transform coordinates into J2000
j2000_coords = gaia_coords.transform_to('fk5')
raj2000 = j2000_coords.ra.to_string(unit = u.hourangle, sep = ':', precision = 10, alwayssign = False, pad = True)
dej2000 = j2000_coords.dec.to_string(unit = u.degree, sep = ':', precision = 9, alwayssign = True, pad = True)
print(raj2000+' '+dej2000)
But I get 11:38:46.0096374246 -63:27:47.407336922 instead of the J2000 coordinates calculated by the CDS. There is a difference of almost an arcminute.
Reading carefully, we see that Vizier states that proper motions [are] taken into account. So, I not only have to transform between J2016 and J2000 but also backpropagate the space motion of the star 16 years back. I can do that with Python like so:
import astropy.units as u
from astropy.time import Time
from astropy.coordinates import SkyCoord
# Gaia coordinates and proper motion (ICRS | J2016):
ra = 174.50345338328
dec = -63.37448911466
pmra = -5.987
pmdec = 0.326
gaia_coords = SkyCoord(ra = ra*u.deg, dec = dec*u.deg,
pm_ra_cosdec = pmra*u.mas/u.yr, pm_dec = pmdec*u.mas/u.yr,
frame = 'icrs', equinox = 'J2016.0')
# Transform coordinates into J2000 accounting for proper motion
delta_t = Time('J2000', format = 'jyear_str')-Time('J2016.0', format = 'jyear_str')
j2000_coords = gaia_coords.apply_space_motion(dt = delta_t)
raj2000 = j2000_coords.ra.to_string(unit = u.hourangle, sep = ':', precision = 10, alwayssign = False, pad = True)
dej2000 = j2000_coords.dec.to_string(unit = u.degree, sep = ':', precision = 9, alwayssign = True, pad = True)
print(raj2000+' '+dej2000)
But the result is 11:38:00.8430610377 -63:22:28.166028471, which is way closer the values given by the CDS. But still they differ in the microarcsecond. This might seem stupid but I actually need to understand those extra decimals.
Is it, perhaps, that Python is calculating with larger precision than the CDS (or viceversa)? Is it because the frame shouldn't be FK5? What is the issue here?