From 8b0d2c06096c69c238146d767544fde51c8404fb Mon Sep 17 00:00:00 2001 From: Ekaterina Kuznetsova Date: Mon, 13 Mar 2023 13:30:08 +0300 Subject: [PATCH] first version of the ART_XC time converter --- arttime.py | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100755 arttime.py diff --git a/arttime.py b/arttime.py new file mode 100755 index 0000000..2f2c4b7 --- /dev/null +++ b/arttime.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +# -*- coding: utf8 -*- + +from datetime import datetime + +import astropy.units as u +from astropy.time.formats import erfa +from astropy.time import Time +from astropy.time import TimezoneInfo + +MJDREF = Time(51543.875, format='mjd') #corresponds to date 01.01.2000 00:00:00 (UTC+3) +TZ_UTC = TimezoneInfo(utc_offset=0*u.hour) #UTC time zone +TZ_MSK = TimezoneInfo(utc_offset=3*u.hour) #UTC+3 (Moscow) time zone + + +class MissionTime(object): + + def __init__(self, mtime): + self._mtime = mtime + + def get(self): + return self._mtime + + def __str__(self): + return str(self._mtime) + + def to_datetime(self, tzone=TZ_UTC): + days = self.to_mjd() + return days.to_datetime(timezone=tzone) + + def to_artday(self): + ARTDAYLEN = erfa.DAYSEC + return self._mtime / ARTDAYLEN + + def to_mjd(self): + mjd_value = MJDREF.mjd + Time(self._mtime / erfa.DAYSEC, format='mjd').mjd + return Time(mjd_value, format='mjd') + + +class ArtDay(object): + + def __init__(self, aday): + self._aday = aday + + def get(self): + return self._aday + + def __str__(self): + return str(self._aday) + + def to_mission(self): + ARTDAYLEN = erfa.DAYSEC + return self._aday * ARTDAYLEN + + def to_datetime(self, tzone=TZ_UTC): + days = self.to_mjd() + return days.to_datetime(timezone=tzone) + + def to_mjd(self): + mjd_value = MJDREF.mjd + Time(self._aday, format='mjd').mjd + return Time(mjd_value, format='mjd') + + +class MjdDay(object): + + def __init__(self, mjd): + self._mjd = Time(mjd, format='mjd') + + def get(self): + return self._mjd + + def __str__(self): + return str(self._mjd) + + def to_mission(self): + ARTDAYLEN = erfa.DAYSEC + return (self._mjd.mjd - MJDREF.mjd) * ARTDAYLEN + + def to_artday(self): + return self._mjd.mjd - MJDREF.mjd + + def to_datetime(self, tzone=TZ_UTC): + return Time(self._mjd, format='mjd').to_datetime(timezone=tzone) + + +class Dtime(object): + + def __init__(self, dtime, tzone=None): + dtime = datetime.fromisoformat(dtime) + if tzone is None: + self._dtime = dtime + else: + self._dtime = dtime.replace(tzinfo=tzone) + self._tzone = tzone + + def get(self): + return self._dtime + + def __str__(self): + return str(self._dtime) + + def to_mjd(self): + days = Time(self._dtime) + return days + + def to_artday(self): + return self.to_mjd().mjd - MJDREF.mjd + + def to_mission(self): + ARTDAYLEN = erfa.DAYSEC + return self.to_artday() * ARTDAYLEN + + def to_msk(self): + dtime_utc = Time(self._dtime) + return dtime_utc.to_datetime(timezone=TZ_MSK) + + def to_utc(self): + dtime_msk = Time(self._dtime) + return dtime_msk.to_datetime(timezone=TZ_UTC) + + +class ArtTime(object): + + def __init__(self, aday=None, mjd=None, mtime=None, dtime_utc=None, dtime_msk=None): + + self._has_value = False + self._try_mtime(mtime) + self._try_aday(aday) + self._try_mjd(mjd) + self._try_dtime_utc(dtime_utc) + self._try_dtime_msk(dtime_msk) + + def _try_mtime(self, mtime): + if mtime is None: + return + + self._has_value = True + + self._mtime = MissionTime(mtime) + self._aday = ArtDay(self._mtime.to_artday()) + self._mjd = MjdDay(self._mtime.to_mjd()) + self._dtime_utc = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_UTC))) + self._dtime_msk = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_MSK))) + + def _try_aday(self, aday): + if aday is None: + return + + self._has_value = True + + self._aday = ArtDay(aday) + self._mtime = MissionTime(self._aday.to_mission()) + self._mjd = MjdDay(self._aday.to_mjd()) + self._dtime_utc = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_UTC))) + self._dtime_msk = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_MSK))) + + def _try_mjd(self, mjd): + if mjd is None: + return + + self._has_value = True + + self._mjd = MjdDay(mjd) + self._aday = ArtDay(self._mjd.to_artday()) + self._mtime = MissionTime(self._mjd.to_mission()) + self._dtime_utc = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_UTC))) + self._dtime_msk = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_MSK))) + + def _try_dtime_utc(self, dtime_utc): + if dtime_utc is None: + return + + self._has_value = True + + self._dtime_utc = Dtime(dtime_utc, tzone=TZ_UTC) + self._dtime_msk = Dtime(str(self._dtime_utc.to_msk())) + self._mtime = MissionTime(self._dtime_utc.to_mission()) + self._aday = ArtDay(self._dtime_utc.to_artday()) + self._mjd = MjdDay(self._dtime_utc.to_mjd()) + + def _try_dtime_msk(self, dtime_msk): + if dtime_msk is None: + return + + self._has_value = True + + self._dtime_msk = Dtime(dtime_msk, tzone=TZ_MSK) + self._dtime_utc = Dtime(str(self._dtime_msk.to_utc())) + self._mtime = MissionTime(self._dtime_msk.to_mission()) + self._aday = ArtDay(self._dtime_msk.to_artday()) + self._mjd = MjdDay(self._dtime_msk.to_mjd()) + + # def valid(self): + # return self._has_value + + @property + def mission(self): + return self._mtime + + @property + def artday(self): + return self._aday + + @property + def mjd(self): + return self._mjd + + @property + def date_utc(self): + return self._dtime_utc + + @property + def date_msk(self): + return self._dtime_msk + + def __str__(self): + print('Artday --> ', self._aday) + print('Mission time --> ', self._mtime) + print('MJD --> ', self._mjd) + print('Date MSK --> ', self._dtime_msk) + print('Date UTC --> ', self._dtime_utc) + + + return str(self._mtime) + + + +def main(): + mtime = 692659102.9999999 + aday = 8016.887708333336 + utc = 1639322302.999999 + dtime = '2021-12-12T18:18:23' + mjd = 59560.762708333335 + + + # 692582400.0 + # 8016 + # 2021-12-11 21:00:00+00:00 + # 2021-12-12 00:00:00+03:00 + # 59559.875 + + + # Parameters: dtime_msk, dtime_utc, mtime, aday, mjd. + # ArtTime converts the given parameter into all others. + + atime = ArtTime(dtime_msk='2021-12-12T00:00:00') + print(atime) + print(atime.mission) + print(atime.artday) + print(atime.date_utc) + print(atime.date_msk) + print(atime.mjd) + + + +if __name__ == '__main__': + main()