diff --git a/arttools/__init__.py b/arttools/__init__.py new file mode 100644 index 0000000..960521a --- /dev/null +++ b/arttools/__init__.py @@ -0,0 +1,7 @@ +# from pkg_resources import get_distribution, DistributionNotFound +# try: +# __version__ = get_distribution(__name__).version +# except DistributionNotFound: +# pass # package is not installed + +__version__ = '1.0' diff --git a/arttools/__pycache__/__init__.cpython-311.pyc b/arttools/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..ecd7a1a Binary files /dev/null and b/arttools/__pycache__/__init__.cpython-311.pyc differ diff --git a/arttools/__pycache__/arttime.cpython-311.pyc b/arttools/__pycache__/arttime.cpython-311.pyc new file mode 100644 index 0000000..e677acb Binary files /dev/null and b/arttools/__pycache__/arttime.cpython-311.pyc differ diff --git a/arttools/arttime.py b/arttools/arttime.py new file mode 100755 index 0000000..d9e7b5b --- /dev/null +++ b/arttools/arttime.py @@ -0,0 +1,238 @@ +#!/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()) + + + @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): + aday_str = 'Artday --> '+str(self._aday)+'\n' + mtime_str = 'Mission time --> '+str(self._mtime)+'\n' + mjd_str = 'MJD --> '+str(self._mjd)+'\n' + date_msk_str = 'Date MSK --> '+str(self._dtime_msk)+'\n' + date_utc_str = 'Date UTC --> '+str(self._dtime_utc)+'\n' + + return str(aday_str+mtime_str+mjd_str+date_msk_str+date_utc_str) + + + +def main(): + + 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() diff --git a/setup.cfg b/setup.cfg index d33f7e7..344d7ab 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] -name = arttime -description = ART-XC time converter +name = arttools +description = ART-XC package version = 1.0 long_description = file: README.rst author = Kuznetsova E., Shtykovsky A.