Source code for pyobs.robotic.scheduler.merits.timewindow

from __future__ import annotations
from typing import TYPE_CHECKING
from astropy.time import Time
from astropydantic import AstroPydanticTime  # type: ignore
from pydantic import Field

from pyobs.utils.serialization import BaseModel
from .merit import Merit

if TYPE_CHECKING:
    from pyobs.robotic import Task
    from ..dataprovider import DataProvider


class TimeWindow(BaseModel):
    start: AstroPydanticTime = Field(default_factory=Time.now)
    end: AstroPydanticTime = Field(default_factory=Time.now)


[docs] class TimeWindowMerit(Merit): """Merit function that uses time windows.""" windows: list[TimeWindow] inverse: bool = False async def __call__(self, time: Time, task: Task, data: DataProvider) -> float: # is time in any of the windows? in_window = False for window in self.windows: if window.start <= time <= window.end: in_window = True # invert? if not self.inverse: return 1.0 if in_window else 0.0 else: return 0.0 if in_window else 1.0
__all__ = ["TimeWindowMerit", "TimeWindow"]