22 from lsst.pipe.base import (Struct, PipelineTask, InitInputDatasetField, InitOutputDatasetField,
23 InputDatasetField, OutputDatasetField, PipelineTaskConfig)
25 from lsst.pex.config
import ConfigurableField
31 __all__ = (
"DeblendCoaddSourcesSingleConfig",
"DeblendCoaddSourcesSingleTask",
32 "DeblendCoaddSourcesMultiConfig",
"DeblendCoaddSourcesMultiTask")
36 inputSchema = InitInputDatasetField(
37 doc=
"Input schema to use in the deblend catalog",
38 nameTemplate=
"{inputCoaddName}Coadd_mergeDet_schema",
39 storageClass=
"SourceCatalog" 41 peakSchema = InitInputDatasetField(
42 doc=
"Schema of the footprint peak catalogs",
43 nameTemplate=
"{inputCoaddName}Coadd_peak_schema",
44 storageClass=
"PeakCatalog" 46 mergedDetections = InputDatasetField(
47 doc=
"Detection catalog merged across bands",
48 nameTemplate=
"{inputCoaddName}Coadd_mergeDet",
49 storageClass=
"SourceCatalog",
51 dimensions=(
"tract",
"patch",
"skymap")
56 self.quantum.dimensions = (
"tract",
"patch",
"abstract_filter",
"skymap")
57 self.formatTemplateNames({
"inputCoaddName":
"deep",
"outputCoaddName":
"deep"})
61 singleBandDeblend = ConfigurableField(
62 target=SourceDeblendTask,
63 doc=
"Task to deblend an image in one band" 65 coadd = InputDatasetField(
66 doc=
"Exposure on which to run deblending",
67 nameTemplate=
"{inputCoaddName}Coadd_calexp",
68 storageClass=
"ExposureF",
70 dimensions=(
"tract",
"patch",
"abstract_filter",
"skymap")
72 measureCatalog = OutputDatasetField(
73 doc=
"The output measurement catalog of deblended sources",
74 nameTemplate=
"{outputCoaddName}Coadd_deblendedFlux",
76 storageClass=
"SourceCatalog",
77 dimensions=(
"tract",
"patch",
"abstract_filter",
"skymap")
79 outputSchema = InitOutputDatasetField(
80 doc=
"Output of the schema used in deblending task",
81 nameTemplate=
"{outputCoaddName}Coadd_deblendedFlux_schema",
82 storageClass=
"SourceCatalog" 91 multibandDeblend = ConfigurableField(
92 target=MultibandDeblendTask,
93 doc=
"Task to deblend an images in multiple bands" 95 coadds = InputDatasetField(
96 doc=
"Exposure on which to run deblending",
97 nameTemplate=
"{inputCoaddName}Coadd_calexp",
98 storageClass=
"ExposureF",
99 dimensions=(
"tract",
"patch",
"abstract_filter",
"skymap")
101 outputSchema = InitOutputDatasetField(
102 doc=
"Output of the schema used in deblending task",
103 nameTemplate=
"{outputCoaddName}Coadd_deblendedModel_schema",
104 storageClass=
"SourceCatalog" 106 fluxCatalogs = OutputDatasetField(
107 doc=
"Flux catalogs produced by multiband deblending, not written " 108 "if conserve flux is turned off",
109 nameTemplate=
"{outputCoaddName}Coadd_deblendedFlux",
110 storageClass=
"SourceCatalog",
111 dimensions=(
"tract",
"patch",
"abstract_filter",
"skymap")
113 templateCatalogs = OutputDatasetField(
114 doc=
"Template catalogs produced by multiband deblending",
115 nameTemplate=
"{outputCoaddName}Coadd_deblendedModel",
116 storageClass=
"SourceCatalog",
117 dimensions=(
"tract",
"patch",
"abstract_filter",
"skymap")
122 self.quantum.dimensions = (
"tract",
"patch",
"skymap")
127 super().
__init__(initInputs=initInputs, **kwargs)
128 schema = initInputs[
"inputSchema"].schema
135 return {
"outputSchema": afwTable.SourceCatalog(self.
schema)}
138 packedId, maxBits = butler.registry.packDataId(
"tract_patch", inputDataIds[
"mergedDetections"],
140 inputData[
"idFactory"] = afwTable.IdFactory.makeSource(packedId, 64 - maxBits)
141 return self.run(**inputData)
143 def _makeSourceCatalog(self, mergedDetections, idFactory):
144 table = afwTable.SourceTable.make(self.
schema, idFactory)
145 sources = afwTable.SourceCatalog(table)
151 ConfigClass = DeblendCoaddSourcesSingleConfig
152 _DefaultName =
"deblendCoaddSourcesSingle" 155 super().
__init__(initInputs=initInputs, **kwargs)
156 self.makeSubtask(
"singleBandDeblend", schema=self.
schema, peakSchema=self.
peakSchema)
158 def run(self, coadd, mergedDetections, idFactory):
160 self.singleBandDeblend.
run(coadd, sources)
161 return Struct(measureCatalog=sources)
165 ConfigClass = DeblendCoaddSourcesMultiConfig
166 _DefaultName =
"deblendCoaddSourcesMulti" 169 super().
__init__(initInputs=initInputs, **kwargs)
170 self.makeSubtask(
"multibandDeblend", schema=self.
schema, peakSchema=self.
peakSchema)
176 if not config.multibandDeblend.conserveFlux:
177 outputTypeDict.pop(
"fluxCatalogs",
None)
178 return outputTypeDict
181 inputData[
"filters"] = [dId[
"abstract_filter"]
for dId
in inputDataIds[
"coadds"]]
182 return super().
adaptArgsAndRun(inputData, inputDataIds, outputDataIds, butler)
184 def run(self, coadds, filters, mergedDetections, idFactory):
186 multiExposure = afwImage.MultibandExposure.fromExposures(filters, coadds)
187 fluxCatalogs, templateCatalogs = self.multibandDeblend.
run(multiExposure, sources)
188 retStruct = Struct(templateCatalogs)
189 if self.config.multibandDeblend.conserveFlux:
190 retStruct.fluxCatalogs = fluxCatalogs
def _makeSourceCatalog(self, mergedDetections, idFactory)
def __init__(self, initInputs, kwargs)
def run(self, coadds, filters, mergedDetections, idFactory)
def __init__(self, initInputs, kwargs)
def run(self, coadd, mergedDetections, idFactory)
def __init__(self, initInputs, kwargs)
def adaptArgsAndRun(self, inputData, inputDataIds, outputDataIds, butler)
def adaptArgsAndRun(self, inputData, inputDataIds, outputDataIds, butler)
def getInitOutputDatasets(self)
def getOutputDatasetTypes(cls, config)