22__all__ = [
"CatalogExposure",
"CatalogExposureConfig", ]
24from functools
import cached_property
25from pydantic
import Field
26from pydantic.dataclasses
import dataclass
30import lsst.daf.butler
as dafButler
34 arbitrary_types_allowed =
True
37@dataclass(frozen=True, kw_only=True, config=CatalogExposureConfig)
39 """A class to store a catalog, exposure, and metadata for a given dataId.
41 The intent is to store an exposure
and an associated measurement catalog.
42 Users may omit one but
not both (e.g.
if the intent
is just to attach
43 a dataId
and metadata to a catalog
or exposure).
46 def band(self) -> str:
50 def calib(self) -> afwImage.PhotoCalib | None:
53 dataId: dafButler.DataCoordinate | dict = Field(
54 title=
"A DataCoordinate or dict containing a 'band' item")
55 catalog: afwTable.SourceCatalog |
None = Field(
None, title=
"The measurement catalog, if any")
56 exposure: afwImage.Exposure |
None = Field(
None, title=
"The exposure, if any")
57 id_tract_patch: int = Field(0, title=
"A unique ID for this tract-patch pair")
58 metadata: dict = Field(default_factory=dict, title=
"Arbitrary metadata")
62 raise ValueError(
"Must specify at least one of catalog/exposure")
63 if 'band' not in self.
dataId:
64 raise ValueError(f
"dataId={self.dataId} must have a band")