22 from lsst.pipe.base import (Struct, PipelineTask, InitInputDatasetField, InitOutputDatasetField,
23 InputDatasetField, OutputDatasetField, PipelineTaskConfig)
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=
"SourceCatalog" 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",
"AbstractFilter",
"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",
"AbstractFilter",
"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",
"AbstractFilter",
"SkyMap")
79 outputSchema = InitOutputDatasetField(
80 doc=
"Output of the schema used in deblending task",
81 nameTemplate=
"{outputCoaddName}Coadd_deblendedFlux_schema",
82 storageClass=
"SourceCatalog" 87 multibandDeblend = ConfigurableField(
88 target=MultibandDeblendTask,
89 doc=
"Task to deblend an images in multiple bands" 91 coadds = InputDatasetField(
92 doc=
"Exposure on which to run deblending",
93 nameTemplate=
"{inputCoaddName}Coadd_calexp",
94 storageClass=
"ExposureF",
95 dimensions=(
"Tract",
"Patch",
"AbstractFilter",
"SkyMap")
97 outputSchema = InitOutputDatasetField(
98 doc=
"Output of the schema used in deblending task",
99 nameTemplate=
"{outputCoaddName}Coadd_deblendedModel_schema",
100 storageClass=
"SourceCatalog" 102 fluxCatalogs = OutputDatasetField(
103 doc=
"Flux catalogs produced by multiband deblending, not written " 104 "if conserve flux is turned off",
105 nameTemplate=
"{outputCoaddName}Coadd_deblendedFlux",
106 storageClass=
"SourceCatalog",
107 dimensions=(
"Tract",
"Patch",
"AbstractFilter",
"SkyMap")
109 templateCatalogs = OutputDatasetField(
110 doc=
"Template catalogs produced by multiband deblending",
111 nameTemplate=
"{outputCoaddName}Coadd_deblendedModel",
112 storageClass=
"SourceCatalog",
113 dimensions=(
"Tract",
"Patch",
"AbstractFilter",
"SkyMap")
118 self.quantum.dimensions = (
"Tract",
"Patch",
"SkyMap")
123 super().
__init__(initInputs=initInputs, **kwargs)
124 schema = initInputs[
"inputSchema"].schema
131 return {
"outputSchema": afwTable.SourceCatalog(self.
schema)}
135 inputData[
"idFactory"] = afwTable.IdFactory.makeSimple()
136 return self.run(**inputData)
138 def _makeSourceCatalog(self, mergedDetections, idFactory):
141 table = afwTable.SourceTable.make(self.
schema, idFactory)
142 sources = afwTable.SourceCatalog(table)
148 ConfigClass = DeblendCoaddSourcesSingleConfig
149 _DefaultName =
"deblendCoaddSourcesSingle" 152 super().
__init__(initInputs=initInputs, **kwargs)
153 self.makeSubtask(
"singleBandDeblend", schema=self.
schema, peakSchema=self.
peakSchema)
155 def run(self, coadd, mergedDetections, idFactory):
157 self.singleBandDeblend.
run(coadd, sources)
158 return Struct(measureCatalog=sources)
162 ConfigClass = DeblendCoaddSourcesMultiConfig
163 _DefaultName =
"deblendCoaddSourcesMulti" 166 super().
__init__(initInputs=initInputs, **kwargs)
167 self.makeSubtask(
"multibandDeblend", schema=self.
schema, peakSchema=self.
peakSchema)
173 if not config.multibandDeblend.conserveFlux:
174 outputTypeDict.pop(
"fluxCatalogs",
None)
175 return outputTypeDict
178 inputData[
"filters"] = [dId[
"abstract_filter"]
for dId
in inputDataIds[
"coadds"]]
179 return super().
adaptArgsAndRun(inputData, inputDataIds, outputDataIds, butler)
181 def run(self, coadds, filters, mergedDetections, idFactory):
183 multiExposure = afwImage.MultibandExposure.fromExposures(filters, coadds)
184 fluxCatalogs, templateCatalogs = self.multibandDeblend.
run(multiExposure, sources)
185 retStruct = Struct(templateCatalogs)
186 if self.config.multibandDeblend.conserveFlux:
187 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)