23 "CoaddPsfFitConfig",
"CoaddPsfFitSubConfig",
"CoaddPsfFitSubTask",
"CoaddPsfFitTask",
26from .fit_multiband
import CatalogExposure, CatalogExposureConfig
30import lsst.pipe.base.connectionTypes
as cT
32from abc
import ABC, abstractmethod
33from pydantic.dataclasses
import dataclass
36@dataclass(frozen=True, kw_only=True, config=CatalogExposureConfig)
42 bbox = source.getFootprint().getBBox()
43 center = bbox.getCenter()
44 return self.exposure.getPsf().computeKernelImage(center).array
47CoaddPsfFitBaseTemplates = {
49 "name_output_method":
"multiprofit",
54 pipeBase.PipelineTaskConnections,
55 dimensions=(
"tract",
"patch",
"skymap"),
56 defaultTemplates=CoaddPsfFitBaseTemplates,
59 doc=
"Coadd image to fit a PSF model to",
60 name=
"{name_coadd}Coadd_calexp",
61 storageClass=
"ExposureF",
62 dimensions=(
"tract",
"patch",
"band",
"skymap"),
65 doc=
"Deblended single-band source catalog",
66 name=
"{name_coadd}Coadd_meas",
67 storageClass=
"SourceCatalog",
68 dimensions=(
"tract",
"patch",
"band",
"skymap"),
70 cat_output = cT.Output(
71 doc=
"Output PSF fit parameter catalog",
72 name=
"{name_coadd}Coadd_psfs_{name_output_method}",
73 storageClass=
"ArrowTable",
74 dimensions=(
"tract",
"patch",
"band",
"skymap"),
79 """Base config class for the CoaddPsfFitTask.
81 Implementing classes may add any necessary attributes.
85class CoaddPsfFitSubTask(pipeBase.Task, ABC):
86 """Interface for CoaddPsfFitTask subtasks to fit PSFs.
91 Additional arguments to be passed to the `lsst.pipe.base.Task`
94 ConfigClass = CoaddPsfFitSubConfig
101 self, catexp: CatalogExposurePsf
102 ) -> pipeBase.Struct:
103 """Fit PSF images at locations of sources in a single exposure.
107 catexp : `CatalogExposurePsf`
108 An exposure to fit a model PSF at the position of all
109 sources in the corresponding catalog.
113 retStruct : `lsst.pipe.base.Struct`
114 A struct
with a cat_output attribute containing the output
119 Subclasses may have further requirements on the input parameters,
121 - Passing only one catexp per band;
122 - Catalogs containing HeavyFootprints
with deblended images;
123 - Fitting only a subset of the sources.
124 If any requirements are
not met, the subtask should fail
as soon
as
127 raise NotImplementedError()
131 pipeBase.PipelineTaskConfig,
132 pipelineConnections=CoaddPsfFitConnections,
134 """Configure a CoaddPsfFitTask, including a configurable fitting subtask.
136 fit_coadd_psf = pexConfig.ConfigurableField(
137 target=CoaddPsfFitSubTask,
138 doc="Task to fit PSF models for a single coadd",
140 idGenerator = SkyMapIdGeneratorConfig.make_field()
144 """Fit a PSF model at the location of sources in a coadd.
146 This task is intended to fit only a single PSF model at the
147 centroid of all of the sources
in a single coadd exposure.
148 Subtasks may choose to filter which sources they fit,
149 and may output whatever columns they desire
in addition to
152 ConfigClass = CoaddPsfFitConfig
153 _DefaultName = "CoaddPsfFit"
156 super().
__init__(initInputs=initInputs, **kwargs)
157 self.makeSubtask(
"fit_coadd_psf")
160 inputs = butlerQC.get(inputRefs)
161 id_tp = self.config.id_generator.apply(butlerQC.quantum.dataId).catalog_id
162 dataId = inputRefs.cat_meas.dataId
163 for dataRef
in (inputRefs.coadd,):
164 if dataRef.dataId != dataId:
165 raise RuntimeError(f
'{dataRef=}.dataId != {inputRefs.cat_meas.dataId=}')
168 catalog=inputs[
'cat_meas'], exposure=inputs[
'coadd'], dataId=dataId, id_tract_patch=id_tp,
170 outputs = self.
run(catexp=catexp)
171 butlerQC.put(outputs, outputRefs)
173 def run(self, catexp: CatalogExposurePsf) -> pipeBase.Struct:
174 """Fit a PSF model at the location of sources in a coadd.
178 catexp : `typing.List [CatalogExposurePsf]`
179 A list of catalog-exposure pairs in a given band.
183 retStruct : `lsst.pipe.base.Struct`
184 A struct
with a cat_output attribute containing the output
189 Subtasks may have further requirements; see `CoaddPsfFitSubTask.run`.
191 cat_output = self.fit_coadd_psf.run(catexp).output
192 retStruct = pipeBase.Struct(cat_output=cat_output)
def get_psf_image(self, source)
def __init__(self, **kwargs)
def runQuantum(self, butlerQC, inputRefs, outputRefs)
pipeBase.Struct run(self, CatalogExposurePsf catexp)
def __init__(self, initInputs, **kwargs)