LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
deblendCoaddSourcesPipeline.py
Go to the documentation of this file.
1 # This file is part of pipe_tasks.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (https://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <https://www.gnu.org/licenses/>.
21 
22 from lsst.pipe.base import (Struct, PipelineTask, PipelineTaskConfig, PipelineTaskConnections)
24 
25 from lsst.pex.config import ConfigurableField
26 from lsst.meas.deblender import SourceDeblendTask
27 from lsst.meas.extensions.scarlet import ScarletDeblendTask
28 from lsst.obs.base import ExposureIdInfo
29 
30 import lsst.afw.image as afwImage
31 import lsst.afw.table as afwTable
32 
33 __all__ = ("DeblendCoaddSourcesSingleConfig", "DeblendCoaddSourcesSingleTask",
34  "DeblendCoaddSourcesMultiConfig", "DeblendCoaddSourcesMultiTask")
35 
36 
37 deblendBaseTemplates = {"inputCoaddName": "deep", "outputCoaddName": "deep"}
38 
39 
41  dimensions=("tract", "patch", "band", "skymap"),
42  defaultTemplates=deblendBaseTemplates):
43  inputSchema = cT.InitInput(
44  doc="Input schema to use in the deblend catalog",
45  name="{inputCoaddName}Coadd_mergeDet_schema",
46  storageClass="SourceCatalog"
47  )
48  peakSchema = cT.InitInput(
49  doc="Schema of the footprint peak catalogs",
50  name="{inputCoaddName}Coadd_peak_schema",
51  storageClass="PeakCatalog"
52  )
53  mergedDetections = cT.Input(
54  doc="Detection catalog merged across bands",
55  name="{inputCoaddName}Coadd_mergeDet",
56  storageClass="SourceCatalog",
57  dimensions=("tract", "patch", "skymap")
58  )
59  coadd = cT.Input(
60  doc="Exposure on which to run deblending",
61  name="{inputCoaddName}Coadd_calexp",
62  storageClass="ExposureF",
63  dimensions=("tract", "patch", "band", "skymap")
64  )
65  measureCatalog = cT.Output(
66  doc="The output measurement catalog of deblended sources",
67  name="{outputCoaddName}Coadd_deblendedFlux",
68  storageClass="SourceCatalog",
69  dimensions=("tract", "patch", "band", "skymap")
70  )
71  outputSchema = cT.InitOutput(
72  doc="Output of the schema used in deblending task",
73  name="{outputCoaddName}Coadd_deblendedFlux_schema",
74  storageClass="SourceCatalog"
75  )
76 
77  def setDefaults(self):
78  super().setDefaults()
79  self.singleBandDeblend.propagateAllPeaks = True
80 
81 
83  pipelineConnections=DeblendCoaddSourceSingleConnections):
84  singleBandDeblend = ConfigurableField(
85  target=SourceDeblendTask,
86  doc="Task to deblend an image in one band"
87  )
88 
89 
91  dimensions=("tract", "patch", "skymap"),
92  defaultTemplates=deblendBaseTemplates):
93  inputSchema = cT.InitInput(
94  doc="Input schema to use in the deblend catalog",
95  name="{inputCoaddName}Coadd_mergeDet_schema",
96  storageClass="SourceCatalog"
97  )
98  peakSchema = cT.InitInput(
99  doc="Schema of the footprint peak catalogs",
100  name="{inputCoaddName}Coadd_peak_schema",
101  storageClass="PeakCatalog"
102  )
103  mergedDetections = cT.Input(
104  doc="Detection catalog merged across bands",
105  name="{inputCoaddName}Coadd_mergeDet",
106  storageClass="SourceCatalog",
107  dimensions=("tract", "patch", "skymap")
108  )
109  coadds = cT.Input(
110  doc="Exposure on which to run deblending",
111  name="{inputCoaddName}Coadd_calexp",
112  storageClass="ExposureF",
113  multiple=True,
114  dimensions=("tract", "patch", "band", "skymap")
115  )
116  outputSchema = cT.InitOutput(
117  doc="Output of the schema used in deblending task",
118  name="{outputCoaddName}Coadd_deblendedFlux_schema",
119  storageClass="SourceCatalog"
120  )
121  templateCatalogs = cT.Output(
122  doc="Template catalogs produced by multiband deblending",
123  name="{outputCoaddName}Coadd_deblendedFlux",
124  storageClass="SourceCatalog",
125  dimensions=("tract", "patch", "band", "skymap"),
126  multiple=True
127  )
128 
129 
131  pipelineConnections=DeblendCoaddSourcesMultiConnections):
132  multibandDeblend = ConfigurableField(
133  target=ScarletDeblendTask,
134  doc="Task to deblend an images in multiple bands"
135  )
136 
137 
139  def __init__(self, initInputs, **kwargs):
140  super().__init__(initInputs=initInputs, **kwargs)
141  schema = initInputs["inputSchema"].schema
142  self.peakSchemapeakSchema = initInputs["peakSchema"].schema
143  self.schemaMapperschemaMapper = afwTable.SchemaMapper(schema)
144  self.schemaMapperschemaMapper.addMinimalSchema(schema)
145  self.schemaschema = self.schemaMapperschemaMapper.getOutputSchema()
146 
147  def runQuantum(self, butlerQC, inputRefs, outputRefs):
148  inputs = butlerQC.get(inputRefs)
149  inputs["idFactory"] = ExposureIdInfo.fromDataId(
150  butlerQC.quantum.dataId,
151  "tract_patch"
152  ).makeSourceIdFactory()
153  outputs = self.runrun(**inputs)
154  butlerQC.put(outputs, outputRefs)
155 
156  def _makeSourceCatalog(self, mergedDetections, idFactory):
157  table = afwTable.SourceTable.make(self.schemaschema, idFactory)
158  sources = afwTable.SourceCatalog(table)
159  sources.extend(mergedDetections, self.schemaMapperschemaMapper)
160  return sources
161 
162 
164  ConfigClass = DeblendCoaddSourcesSingleConfig
165  _DefaultName = "deblendCoaddSourcesSingle"
166 
167  def __init__(self, initInputs, **kwargs):
168  super().__init__(initInputs=initInputs, **kwargs)
169  self.makeSubtaskmakeSubtask("singleBandDeblend", schema=self.schemaschema, peakSchema=self.peakSchemapeakSchema)
170  self.outputSchemaoutputSchema = afwTable.SourceCatalog(self.schemaschema)
171 
172  def run(self, coadd, mergedDetections, idFactory):
173  sources = self._makeSourceCatalog_makeSourceCatalog(mergedDetections, idFactory)
174  self.singleBandDeblend.run(coadd, sources)
175  if not sources.isContiguous():
176  sources = sources.copy(deep=True)
177  return Struct(measureCatalog=sources)
178 
179 
181  ConfigClass = DeblendCoaddSourcesMultiConfig
182  _DefaultName = "deblendCoaddSourcesMulti"
183 
184  def __init__(self, initInputs, **kwargs):
185  super().__init__(initInputs=initInputs, **kwargs)
186  self.makeSubtaskmakeSubtask("multibandDeblend", schema=self.schemaschema, peakSchema=self.peakSchemapeakSchema)
187  self.outputSchemaoutputSchema = afwTable.SourceCatalog(self.schemaschema)
188 
189  def runQuantum(self, butlerQC, inputRefs, outputRefs):
190  inputs = butlerQC.get(inputRefs)
191  exposureIdInfo = ExposureIdInfo.fromDataId(butlerQC.quantum.dataId, "tract_patch")
192  inputs["idFactory"] = exposureIdInfo.makeSourceIdFactory()
193  inputs["filters"] = [dRef.dataId["band"] for dRef in inputRefs.coadds]
194  outputs = self.runrunrun(**inputs)
195  sortedTemplateCatalogs = []
196  for outRef in outputRefs.templateCatalogs:
197  band = outRef.dataId['band']
198  sortedTemplateCatalogs.append(outputs.templateCatalogs[band])
199  outputs.templateCatalogs = sortedTemplateCatalogs
200  butlerQC.put(outputs, outputRefs)
201 
202  def run(self, coadds, filters, mergedDetections, idFactory):
203  sources = self._makeSourceCatalog_makeSourceCatalog(mergedDetections, idFactory)
204  multiExposure = afwImage.MultibandExposure.fromExposures(filters, coadds)
205  templateCatalogs = self.multibandDeblend.run(multiExposure, sources)
206  retStruct = Struct(templateCatalogs=templateCatalogs)
207  return retStruct
A mapping between the keys of two Schemas, used to copy data between them.
Definition: SchemaMapper.h:21
def makeSubtask(self, name, **keyArgs)
Definition: task.py:299
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.