From 511ee043d74a97d450379d831c2c057a81ffc116 Mon Sep 17 00:00:00 2001 From: Ekaterina Kuznetsova Date: Mon, 13 Mar 2023 17:28:47 +0300 Subject: [PATCH] first version of arttools python package --- arttools/__init__.py | 7 + arttools/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 174 bytes arttools/__pycache__/arttime.cpython-311.pyc | Bin 0 -> 14470 bytes arttools/arttime.py | 238 ++++++++++++++++++ setup.cfg | 4 +- 5 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 arttools/__init__.py create mode 100644 arttools/__pycache__/__init__.cpython-311.pyc create mode 100644 arttools/__pycache__/arttime.cpython-311.pyc create mode 100755 arttools/arttime.py 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 0000000000000000000000000000000000000000..ecd7a1ae7180e80829fd91d9430d56049e043ed6 GIT binary patch literal 174 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 a*#1Hgm&ZOib?ekJebz&qAOo6K`M&@Ws`Q!w literal 0 HcmV?d00001 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.