def __getCIPandCIOlocator(self,epoch: datetime.datetime): """ Gets Celestial Intermediate Pole at epoch :param epoch: :return: X , Y of CIP """ # Gets x,y coords of Celestial Intermediate Pole (CIP) and CIO locator s # CIO = Celestial Intermediate Origin # Both in GCRS mjd = pySat.pySatTime.UTC2MJD(epoch) Xcio, Ycio, Scio = erfa.xys06a(2400000.5, mjd) return Xcio, Ycio, Scio
def gcrs2irts_matrix_b(t, eop): """ Ref: http://www.iausofa.org/sofa_pn_c.pdf Purpose: This function calculates the cartesian transformation matrix for transforming GCRS to ITRS or vice versa :param eop: eop is a dataframe containing the Earth Orientation Parameters as per IAU definitions :param t: t is a datetime object or a list of datetime objects with the UTC times for the transformation matrix to be calculated for :return: matrix is a [3,3] numpy array or list of arrays used for transforming GCRS to ITRS or vice versa at the specified times; ITRS = matrix @ GCRS """ if not (isinstance(t, Iterable)): t = [t] matrix = [] for ti in t: year = ti.year month = ti.month day = ti.day hour = ti.hour minute = ti.minute second = ti.second # TT (MJD). */ djmjd0, date = erfa.cal2jd(iy=year, im=month, id=day) # jd = djmjd0 + date day_frac = (60.0 * (60.0 * hour + minute) + second) / DAYSEC utc = date + day_frac Dat = erfa.dat(year, month, day, day_frac) tai = utc + Dat / DAYSEC tt = tai + 32.184 / DAYSEC # UT1. */ dut1 = eop["UT1-UTC"][date] * ( 1 - day_frac) + eop["UT1-UTC"][date + 1] * day_frac tut = day_frac + dut1 / DAYSEC # ut1 = date + tut # CIP and CIO, IAU 2006/2000A. */ x, y, s = erfa.xys06a(djmjd0, tt) # X, Y offsets dx06 = (eop["dX"][date] * (1 - day_frac) + eop["dX"][date + 1] * day_frac) * DAS2R dy06 = (eop["dY"][date] * (1 - day_frac) + eop["dY"][date + 1] * day_frac) * DAS2R # Add CIP corrections. */ x = x + dx06 y = y + dy06 # GCRS to CIRS matrix. */ rc2i = erfa.c2ixys(x, y, s) # Earth rotation angle. */ era = erfa.era00(djmjd0 + date, tut) # Form celestial-terrestrial matrix (no polar motion yet). */ rc2ti = erfa.cr(rc2i) rc2ti = eraRZ(era, rc2ti) #rc2ti = erfa.rz(era, rc2ti) # Polar motion matrix (TIRS->ITRS, IERS 2003). */ xp = (eop["x"][date] * (1 - day_frac) + eop["x"][date + 1] * day_frac) * DAS2R yp = (eop["y"][date] * (1 - day_frac) + eop["y"][date + 1] * day_frac) * DAS2R rpom = erfa.pom00(xp, yp, erfa.sp00(djmjd0, tt)) # Form celestial-terrestrial matrix (including polar motion). */ rc2it = erfa.rxr(rpom, rc2ti) matrix.append(rc2it) if len(matrix) == 1: matrix = matrix[0] return matrix