287 lines
8.4 KiB
Python
Executable File
287 lines
8.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf8 -*-
|
|
|
|
from datetime import datetime
|
|
import sys
|
|
import argparse
|
|
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, missiontime):
|
|
self._missiontime = missiontime
|
|
|
|
def get(self):
|
|
return self._missiontime
|
|
|
|
def __str__(self):
|
|
return str(self._missiontime)
|
|
|
|
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._missiontime / ARTDAYLEN
|
|
|
|
def to_mjd(self):
|
|
mjd_value = MJDREF.mjd + Time(self._missiontime / erfa.DAYSEC, format='mjd').mjd
|
|
return Time(mjd_value, format='mjd')
|
|
|
|
|
|
class ArtDay(object):
|
|
|
|
def __init__(self, artday):
|
|
self._artday = artday
|
|
|
|
def get(self):
|
|
return self._artday
|
|
|
|
def __str__(self):
|
|
return str(self._artday)
|
|
|
|
def to_mission(self):
|
|
ARTDAYLEN = erfa.DAYSEC
|
|
return self._artday * 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._artday, 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, artday=None, missiontime=None, mjd=None, datetime_utc=None, datetime_msk=None):
|
|
|
|
self._has_value = 0
|
|
self._try_aday(artday)
|
|
self._try_mtime(missiontime)
|
|
self._try_mjd(mjd)
|
|
self._try_dtime_utc(datetime_utc)
|
|
self._try_dtime_msk(datetime_msk)
|
|
self
|
|
|
|
if self._has_value > 1:
|
|
print('Error: ArtTime needs only one argument')
|
|
exit()
|
|
|
|
if self._has_value == 0:
|
|
datetime_utc = datetime.utcnow()
|
|
self._try_dtime_utc(datetime_utc.isoformat())
|
|
|
|
def _try_mtime(self, missiontime):
|
|
if missiontime is None:
|
|
return
|
|
|
|
self._has_value = self._has_value+1
|
|
|
|
self._missiontime = MissionTime(missiontime)
|
|
self._artday = ArtDay(self._missiontime.to_artday())
|
|
self._mjd = MjdDay(self._missiontime.to_mjd())
|
|
self._datetime_utc = Dtime(dtime=str(self._missiontime.to_datetime(tzone=TZ_UTC)))
|
|
self._datetime_msk = Dtime(dtime=str(self._missiontime.to_datetime(tzone=TZ_MSK)))
|
|
return
|
|
|
|
def _try_aday(self, artday):
|
|
if artday is None:
|
|
return
|
|
|
|
self._has_value = self._has_value+1
|
|
|
|
self._artday = ArtDay(artday)
|
|
self._missiontime = MissionTime(self._artday.to_mission())
|
|
self._mjd = MjdDay(self._artday.to_mjd())
|
|
self._datetime_utc = Dtime(dtime=str(self._artday.to_datetime(tzone=TZ_UTC)))
|
|
self._datetime_msk = Dtime(dtime=str(self._artday.to_datetime(tzone=TZ_MSK)))
|
|
|
|
def _try_mjd(self, mjd):
|
|
if mjd is None:
|
|
return
|
|
|
|
self._has_value = self._has_value+1
|
|
|
|
self._mjd = MjdDay(mjd)
|
|
self._artday = ArtDay(self._mjd.to_artday())
|
|
self._missiontime = MissionTime(self._mjd.to_mission())
|
|
self._datetime_utc = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_UTC)))
|
|
self._datetime_msk = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_MSK)))
|
|
|
|
def _try_dtime_utc(self, datetime_utc):
|
|
if datetime_utc is None:
|
|
return
|
|
|
|
self._has_value = self._has_value+1
|
|
|
|
self._datetime_utc = Dtime(datetime_utc, tzone=TZ_UTC)
|
|
self._datetime_msk = Dtime(str(self._datetime_utc.to_msk()))
|
|
self._missiontime = MissionTime(self._datetime_utc.to_mission())
|
|
self._artday = ArtDay(self._datetime_utc.to_artday())
|
|
self._mjd = MjdDay(self._datetime_utc.to_mjd())
|
|
|
|
def _try_dtime_msk(self, datetime_msk):
|
|
if datetime_msk is None:
|
|
return
|
|
|
|
self._has_value = self._has_value+1
|
|
|
|
self._datetime_msk = Dtime(datetime_msk, tzone=TZ_MSK)
|
|
self._datetime_utc = Dtime(str(self._datetime_msk.to_utc()))
|
|
self._missiontime = MissionTime(self._datetime_msk.to_mission())
|
|
self._artday = ArtDay(self._datetime_msk.to_artday())
|
|
self._mjd = MjdDay(self._datetime_msk.to_mjd())
|
|
|
|
@property
|
|
def missiontime(self):
|
|
return self._missiontime
|
|
|
|
@property
|
|
def artday(self):
|
|
return self._artday
|
|
|
|
@property
|
|
def mjd(self):
|
|
return self._mjd
|
|
|
|
@property
|
|
def datetime_utc(self):
|
|
return self._datetime_utc
|
|
|
|
@property
|
|
def datetime_msk(self):
|
|
return self._datetime_msk
|
|
|
|
def __str__(self):
|
|
aday_str = 'Artday --> '+str(self._artday)+'\n'
|
|
mtime_str = 'Mission time --> '+str(self._missiontime)+'\n'
|
|
mjd_str = 'MJD --> '+str(self._mjd)+'\n'
|
|
date_msk_str = 'Date MSK --> '+str(self._datetime_msk)+'\n'
|
|
date_utc_str = 'Date UTC --> '+str(self._datetime_utc)+'\n'
|
|
|
|
return str(aday_str+mtime_str+mjd_str+date_msk_str+date_utc_str)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description=("The arttime tool converts artdays, mission time, MSK and UTC date time"
|
|
" and MJD to each other. Calling arttime without parameters will use the current "
|
|
"local time as input.")
|
|
)
|
|
parser.add_argument(
|
|
"--artday", "--aday", type=float,
|
|
help=("ART-XC days."
|
|
"Example: arttime --artday=8000")
|
|
)
|
|
parser.add_argument(
|
|
"--missiontime", "--mtime", type=float,
|
|
help=("Onboard ART-XC seconds. "
|
|
"Example: arttime --missiontime=691200000")
|
|
)
|
|
parser.add_argument(
|
|
"--mjd", type=float,
|
|
help=("MJD. "
|
|
"Example: arttime --mjd=59543.875")
|
|
)
|
|
parser.add_argument(
|
|
"--datetime_utc", "--dt_utc", type=str,
|
|
help=("Date time based on UTC time zone. \n"
|
|
"Example: arttime --datetime_utc=2021-11-25T21:00:00")
|
|
)
|
|
parser.add_argument(
|
|
"--datetime_msk", "--dt_msk", type=str,
|
|
help=("Date time based on Moscow time zone (UTC+3). "
|
|
"Example: arttime --datetime_msk=2021-11-26T00:00:00'")
|
|
)
|
|
args = parser.parse_args()
|
|
if args.artday is not None:
|
|
print(ArtTime(artday=args.artday))
|
|
|
|
if args.missiontime is not None:
|
|
print(ArtTime(missiontime=args.missiontime))
|
|
|
|
if args.mjd is not None:
|
|
print(ArtTime(mjd=args.mjd))
|
|
|
|
if args.datetime_utc is not None:
|
|
print(ArtTime(datetime_utc=args.datetime_utc))
|
|
|
|
if args.datetime_msk is not None:
|
|
print(ArtTime(datetime_msk=args.datetime_msk))
|
|
|
|
if len(sys.argv) <= 1:
|
|
datetime_utc = datetime.utcnow()
|
|
print('Convertation for the current local time')
|
|
print(ArtTime(datetime_utc=datetime_utc.isoformat()))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main() |