LSST Applications g013ef56533+63812263fb,g083dd6704c+a047e97985,g199a45376c+0ba108daf9,g1fd858c14a+fde7a7a78c,g210f2d0738+db0c280453,g262e1987ae+abed931625,g29ae962dfc+058d1915d8,g2cef7863aa+aef1011c0b,g35bb328faa+8c5ae1fdc5,g3fd5ace14f+64337f1634,g47891489e3+f459a6810c,g53246c7159+8c5ae1fdc5,g54cd7ddccb+890c8e1e5d,g5a60e81ecd+d9e514a434,g64539dfbff+db0c280453,g67b6fd64d1+f459a6810c,g6ebf1fc0d4+8c5ae1fdc5,g7382096ae9+36d16ea71a,g74acd417e5+c70e70fbf6,g786e29fd12+668abc6043,g87389fa792+8856018cbb,g89139ef638+f459a6810c,g8d7436a09f+1b779678e3,g8ea07a8fe4+81eaaadc04,g90f42f885a+34c0557caf,g97be763408+9583a964dd,g98a1a72a9c+028271c396,g98df359435+530b675b85,gb8cb2b794d+4e54f68785,gbf99507273+8c5ae1fdc5,gc2a301910b+db0c280453,gca7fc764a6+f459a6810c,gd7ef33dd92+f459a6810c,gdab6d2f7ff+c70e70fbf6,ge410e46f29+f459a6810c,ge41e95a9f2+db0c280453,geaed405ab2+e3b4b2a692,gf9a733ac38+8c5ae1fdc5,w.2025.43
LSST Data Management Base Package
Loading...
Searching...
No Matches
source_base.py
Go to the documentation of this file.
1from __future__ import annotations
2
3from abc import ABC, abstractmethod
4from dataclasses import dataclass
5from typing import Any, ClassVar
6
7import numpy as np
8from numpy.typing import DTypeLike
9
10from ..observation import Observation
11from ..source import Source
12from .utils import PersistenceError
13
14__all__ = ["ScarletSourceBaseData"]
15
16
17@dataclass(kw_only=True)
19 """Data for a scarlet source
20
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 """
34
35 source_type: str
36 source_registry: ClassVar[dict[str, type[ScarletSourceBaseData]]] = {}
37 metadata: dict[str, Any] | None = None
38 version: str
39
40 @classmethod
41 def register(cls) -> None:
42 """Register a new source type"""
43 ScarletSourceBaseData.source_registry[cls.source_type] = cls
44
45 @abstractmethod
46 def as_dict(self) -> dict:
47 """Return the object encoded into a dict for JSON serialization
48
49 Returns
50 -------
51 result :
52 The object encoded as a JSON compatible dict
53 """
54
55 @staticmethod
56 def from_dict(data: dict, dtype: DTypeLike = np.float32) -> ScarletSourceBaseData:
57 """Reconstruct `ScarletSourceData` from JSON compatible
58 dict.
59
60 Parameters
61 ----------
62 data :
63 Dictionary representation of the object
64 dtype :
65 Datatype of the resulting model.
66
67 Returns
68 -------
69 result :
70 The reconstructed object
71 """
72 source_type = data.get("source_type", None)
73
74 # Fix legacy data that did not have a source_type
75 if source_type is None:
76 source_type = "source"
77
78 cls = ScarletSourceBaseData.source_registry.get(source_type, None)
79 if cls is None:
80 raise PersistenceError(f"Unknown source type: {source_type}")
81
82 return cls.from_dict(data, dtype=dtype)
83
84 @abstractmethod
85 def to_source(self, observation: Observation) -> Source:
86 """Convert to a `Source` for use in scarlet
87
88 Parameters
89 ----------
90 observation:
91 The observation used to render the source.
92
93 Returns
94 -------
95 source:
96 The `Source` representation of this data.
97 """
Source to_source(self, Observation observation)
ScarletSourceBaseData from_dict(dict data, DTypeLike dtype=np.float32)