from abc import ABCMeta, abstractmethod
from collections import defaultdict
from typing import Any, Generic, TypeVar
from pyobs.interfaces import FitsHeaderEntry
IN = TypeVar("IN")
OUT = TypeVar("OUT")
[docs]
class GuidingStatistics(Generic[IN, OUT], metaclass=ABCMeta):
"""Calculates statistics for guiding."""
def __init__(self) -> None:
self._sessions: dict[str, list[Any]] = defaultdict(list)
[docs]
def init_stats(self, client: str, default: Any = None) -> None:
"""
Inits a stat measurement session for a client.
Args:
client: name/id of the client
default: first entry in session
"""
self._sessions[client] = []
if default is not None:
self._sessions[client].append(self._get_session_data(default))
@abstractmethod
def _build_header(self, data: Any) -> dict[str, FitsHeaderEntry]:
raise NotImplementedError
@abstractmethod
def _get_session_data(self, input_data: IN) -> OUT | None:
raise NotImplementedError
[docs]
def add_data(self, input_data: IN) -> None:
"""
Adds data to all client measurement sessions.
Args:
input_data: Image witch metadata
"""
data = self._get_session_data(input_data)
if data is not None:
for k in self._sessions.keys():
self._sessions[k].append(data)