Source code for precession
import numpy as np
import erfa
import palpy
from typing import Tuple
[docs]
def RTS_Precess_LST_Lat_to_J2000(lst_current : float, latitude_current : float,
mjd : float) -> Tuple[float, float]:
"""
Convert the current local sidereal time and latitude to the J2000 mean system.
Parameters
------------
lst_current : float
The current local sidereal time in radians.
latitude_current : float
The current latitude in radians.
mjd : float
The current modified Julian date.
Returns
------------
lst_J2000, latitude_J2000 : Tuple[float, float]
A tuple containing the local sidereal time and latitude in the J2000 mean system, both in radians.
"""
# Calculate a rotation matrix that accounts for precession and nutation
# between the current modified julian date (mjd) and J2000
# palPrenut calls:
# - palPrec( 2000.0, palEpj(mjd), rmatp ); // form precession matrix: v_mean(mjd epoch) = rmatp * v_mean(J2000)
# - palNut( mjd, rmatn ); // form nutation matrix: v_true(mjd epoch) = rmatn * v_mean(mjd epoch)
# - palDmxm( rmatn, rmatp, rmatpn ); // Combine the matrices: pn = n x p
rmatpn = palpy.prenut(2000, mjd)
J2000_transformation = np.transpose(rmatpn)
# /**
# ****************************************************************************
# * Change the various coordinates to the J2000 mean system
# ****************************************************************************
# * palDcs2c - convert the apparent direction to direction cosines
# * palDmxv - perform the 3-d forward unitary transformation: v2 = tmatpn * v1
# * palDcc2s - convert cartesian coordinates back to spherical coordinates (i.e. zenith in the J2000 mean system).
# * palDranrm - normalize into range 0-2 pi.
# */
# // Change the coordinates of the initial zenith
v1 = palpy.dcs2c(lst_current, latitude_current)
v2 = palpy.dmxv(J2000_transformation, v1)
lst_J2000, latitude_J2000 = palpy.dcc2s(v2)
lst_J2000 = palpy.dranrm(lst_J2000)
return lst_J2000, latitude_J2000