LSST Applications 30.0.7,g0e76e35be5+e8e946ae08,g19811a7679+138f7293ba,g199a45376c+5e234f8357,g1fd858c14a+2f48dbc4c4,g262e1987ae+fb36cac54d,g29ae962dfc+d9108a0941,g2c21b0017a+4f59a27f16,g31e44d4a5c+b0138be388,g33ac35c1f1+28b9f72785,g35bb328faa+b0138be388,g40c9b15c53+823ad735c1,g47891489e3+bcc48a0b46,g53246c7159+b0138be388,g64539dfbff+e8e946ae08,g67b6fd64d1+bcc48a0b46,g74acd417e5+422380537a,g76965917b2+a5ca99c4d9,g786e29fd12+796b79145d,g7aefaa3e3d+dc0c200193,g86b635cae8+734fe384f0,g87389fa792+d8b5378923,g89139ef638+bcc48a0b46,g8bbb235e95+3f4f7f9447,g8ea07a8fe4+78a4c88802,g9290983e33+ffdc83c6f7,g92c671f44c+e8e946ae08,gaa753fd333+03f406da14,gbf99507273+b0138be388,gc49b57b85e+8df26ee1f0,gca7fc764a6+bcc48a0b46,gd7ef33dd92+bcc48a0b46,gdab6d2f7ff+422380537a,ge1c02a5578+b0138be388,ge410e46f29+bcc48a0b46,ge80df9fc40+e6db5413d1,geaed405ab2+1de65a85c6,gf5dcc679e7+35a0ce2edd,gf5f1c85443+e8e946ae08
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)