From ae6289f9878dd3247ca2e5104b3c039c500306ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20G=C3=B3mez?= Date: Wed, 17 Jul 2024 14:48:17 -0400 Subject: [PATCH] Change nightevents time object and change visibility redis stored data format --- scheduler/core/calculations/nightevents.py | 16 +++++++++++++--- scheduler/services/visibility/snapshot.py | 17 +++++++++++++++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/scheduler/core/calculations/nightevents.py b/scheduler/core/calculations/nightevents.py index 3d038bee..c023e3e0 100644 --- a/scheduler/core/calculations/nightevents.py +++ b/scheduler/core/calculations/nightevents.py @@ -16,12 +16,16 @@ from lucupy.decorators import immutable from lucupy.minimodel import NightIndex, Site, TimeslotIndex from lucupy.sky.constants import JYEAR, J2000 +from scheduler.services.logger_factory import create_logger +logger = create_logger(__name__) __all__ = [ 'NightEvents', ] +# import pdb +import pandas @final @immutable @@ -71,6 +75,7 @@ class NightEvents: pm_array: List[npt.NDArray[float]] = field(init=False) def __post_init__(self): + logger.info("Calculating night events for site %s." % self.site.name) # Calculate the length of each night at this site, i.e. time between twilights. night_length = TimeDelta((self.twilight_morning_12 - self.twilight_evening_12).to(u.hour)) object.__setattr__(self, 'night_length', night_length) @@ -94,10 +99,15 @@ def __post_init__(self): # Pre-calculate the different times. # We want these as Python lists because the entries will have different lengths. - utc_times = [t.to_datetime(ZoneInfo('UTC')) for t in times] + dt_time_starts = time_starts.to_datetime() + dt_time_ends = time_ends.to_datetime() + utc_times = [pandas.date_range(start, end - self.time_slot_length.to_datetime(), + freq=self.time_slot_length.to_datetime(), tz='UTC') + for start, end in zip(dt_time_starts, dt_time_ends)] + local_times = [dt.tz_convert(self.site.timezone) for dt in utc_times] + utc_times = [dt.to_pydatetime() for dt in utc_times] + local_times = [dt.to_pydatetime() for dt in local_times] object.__setattr__(self, 'utc_times', utc_times) - - local_times = [t.to_datetime(self.site.timezone) for t in times] object.__setattr__(self, 'local_times', local_times) local_sidereal_times = [sky.local_sidereal_time(t, self.site.location) for t in times] diff --git a/scheduler/services/visibility/snapshot.py b/scheduler/services/visibility/snapshot.py index 7dee6e6c..9c85a690 100644 --- a/scheduler/services/visibility/snapshot.py +++ b/scheduler/services/visibility/snapshot.py @@ -9,6 +9,13 @@ from lucupy.decorators import immutable from lucupy.minimodel import SkyBackground +import itertools + +def group_ranges(i): + for a, b in itertools.groupby(enumerate(i), lambda pair: pair[1] - pair[0]): + b = list(b) + yield b[0][1], b[-1][1] + @final @immutable @@ -23,14 +30,20 @@ class VisibilitySnapshot: @staticmethod def from_dict(ti_dict: Dict) -> 'VisibilitySnapshot': - return VisibilitySnapshot(visibility_slot_idx=np.array(ti_dict['visibility_slot_idx'], dtype=int), + try: + slot_list = [list(range(s[0], s[1] + 1)) for s in ti_dict['visibility_slot_idx']] + except Exception as e: + print(e) + print(ti_dict['visibility_slot_idx']) + return VisibilitySnapshot(visibility_slot_idx=np.array([x for xs in slot_list for x in xs], dtype=int), visibility_time=TimeDelta(ti_dict['visibility_time']['value'], format=ti_dict['visibility_time']['format']), ) def to_dict(self) -> Dict: + visibility_ranges = group_ranges(self.visibility_slot_idx.tolist()) return { - 'visibility_slot_idx': self.visibility_slot_idx.tolist(), + 'visibility_slot_idx': [*visibility_ranges], 'visibility_time': { 'value': self.visibility_time.sec, 'format': self.visibility_time.format