Coverage for python / lsst / scarlet / lite / io / source_base.py: 69%
32 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-26 08:40 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-26 08:40 +0000
1from __future__ import annotations
3from abc import ABC, abstractmethod
4from dataclasses import dataclass
5from typing import Any, ClassVar
7import numpy as np
8from numpy.typing import DTypeLike
10from ..observation import Observation
11from ..source import Source
12from .utils import PersistenceError
14__all__ = ["ScarletSourceBaseData"]
17@dataclass(kw_only=True)
18class ScarletSourceBaseData(ABC):
19 """Data for a scarlet source
21 Attributes
22 ----------
23 source_type :
24 The type of source being stored.
25 source_registry :
26 A registry of all known source types used for deserialization.
27 metadata :
28 Metadata associated with the source.
29 If `metadata` contains the `id` key, it is used as the
30 key for the source in a `Blend`'s dictionary of sources.
31 version :
32 The schema version of the exact data class.
33 """
35 source_type: str
36 source_registry: ClassVar[dict[str, type[ScarletSourceBaseData]]] = {}
37 metadata: dict[str, Any] | None = None
38 version: str
40 @classmethod
41 def register(cls) -> None:
42 """Register a new source type"""
43 ScarletSourceBaseData.source_registry[cls.source_type] = cls
45 @abstractmethod
46 def as_dict(self) -> dict:
47 """Return the object encoded into a dict for JSON serialization
49 Returns
50 -------
51 result :
52 The object encoded as a JSON compatible dict
53 """
55 @staticmethod
56 def from_dict(data: dict, dtype: DTypeLike = np.float32) -> ScarletSourceBaseData:
57 """Reconstruct `ScarletSourceData` from JSON compatible
58 dict.
60 Parameters
61 ----------
62 data :
63 Dictionary representation of the object
64 dtype :
65 Datatype of the resulting model.
67 Returns
68 -------
69 result :
70 The reconstructed object
71 """
72 source_type = data.get("source_type", None)
74 # Fix legacy data that did not have a source_type
75 if source_type is None:
76 source_type = "source"
78 cls = ScarletSourceBaseData.source_registry.get(source_type, None)
79 if cls is None:
80 raise PersistenceError(f"Unknown source type: {source_type}")
82 return cls.from_dict(data, dtype=dtype)
84 @abstractmethod
85 def to_source(self, observation: Observation) -> Source:
86 """Convert to a `Source` for use in scarlet
88 Parameters
89 ----------
90 observation:
91 The observation used to render the source.
93 Returns
94 -------
95 source:
96 The `Source` representation of this data.
97 """