LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
dcrMultiBand.py
Go to the documentation of this file.
1#!/usr/bin/env python
2# This file is part of pipe_tasks.
3#
4# LSST Data Management System
5# This product includes software developed by the
6# LSST Project (http://www.lsst.org/).
7# See COPYRIGHT file at the top of the source tree.
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 LSST License Statement and
20# the GNU General Public License along with this program. If not,
21# see <https://www.lsstcorp.org/LegalNotices/>.
22#
23
24from lsst.coadd.utils.coaddDataIdContainer import ExistingCoaddDataIdContainer
25from lsst.pipe.base import ArgumentParser
26from lsst.pipe.tasks.multiBand import DeblendCoaddSourcesTask
27from lsst.pipe.tasks.multiBand import DetectCoaddSourcesTask
28from lsst.pipe.tasks.multiBand import MergeSourcesRunner
29from lsst.pipe.tasks.multiBand import MeasureMergedCoaddSourcesTask
30from lsst.pipe.tasks.multiBand import MergeDetectionsTask
31from lsst.pipe.tasks.multiBand import MergeMeasurementsTask
32
33__all__ = ["DetectDcrCoaddSources", "DeblendDcrCoaddSourcesTask", "MergeDcrDetectionsTask",
34 "MeasureMergedDcrCoaddSourcesTask", "MergeDcrMeasurementsTask"]
35
36"""Measure sources and their sub-filter spectrum from a DCR model."""
37
38
39class MergeDcrSourcesRunner(MergeSourcesRunner):
40 """Task runner for the MergeSourcesTask.
41
42 Required because the run method requires a list of dataRefs
43 rather than a single dataRef.
44 """
45
46 @staticmethod
47 def buildRefDict(parsedCmd):
48 """Build a hierarchical dictionary of patch references
49
50 The filter references within the list will have different subfilters.
51
52 Parameters
53 ----------
54 parsedCmd : `dict`
55 The parsed command
56 **kwargs
57 Key word arguments (unused)
58
59 Returns
60 -------
61 refDict: dict
62 A reference dictionary of the form {patch: {tract: {filter: {subfilter: dataRef}}}}
63
64 Raises
65 ------
66 RuntimeError
67 Thrown when multiple references are provided for the same combination of
68 tract, patch, filter, and subfilter
69 """
70 refDict = {} # Will index this as refDict[tract][patch][filter][subfilter] = ref
71 for ref in parsedCmd.id.refList:
72 tract = ref.dataId["tract"]
73 patch = ref.dataId["patch"]
74 filter = ref.dataId["filter"]
75 subfilter = ref.dataId["subfilter"]
76 if tract not in refDict:
77 refDict[tract] = {}
78 if patch not in refDict[tract]:
79 refDict[tract][patch] = {}
80 if filter not in refDict[tract][patch]:
81 refDict[tract][patch][filter] = {}
82 if subfilter in refDict[tract][patch][filter]:
83 raise RuntimeError("Multiple versions of %s" % (ref.dataId,))
84 refDict[tract][patch][filter][subfilter] = ref
85 return refDict
86
87 @staticmethod
88 def getTargetList(parsedCmd, **kwargs):
89 """Provide a list of patch references for each patch, tract, filter combo.
90
91 Parameters
92 ----------
93 parsedCmd:
94 The parsed command
95 kwargs:
96 Keyword arguments passed to the task
97
98 Returns
99 -------
100 targetList: list
101 List of tuples, where each tuple is a (dataRef, kwargs) pair.
102 """
103 refDict = MergeDcrSourcesRunner.buildRefDict(parsedCmd)
104 return [(list(f.values()), kwargs)
105 for t in list(refDict.values())
106 for p in list(t.values())
107 for f in list(p.values())]
108
109
110class DetectDcrCoaddSources(DetectCoaddSourcesTask):
111 """Detect sources on a DCR coadd."""
112
113 @classmethod
114 def _makeArgumentParser(cls):
115 parser = ArgumentParser(name=cls._DefaultName)
116 parser.add_id_argument(name="--id",
117 datasetType="dcrCoadd",
118 help="data ID, e.g. --id tract=12345 patch=1,2 filter=g, subfilter=0",
119 ContainerClass=ExistingCoaddDataIdContainer)
120 return parser
121
122
124 """Task runner for the `MergeSourcesTask`.
125
126 Required because the run method requires a list of
127 dataRefs rather than a single dataRef.
128 """
129
130 @staticmethod
131 def getTargetList(parsedCmd, **kwargs):
132 """Provide a list of patch references for each patch, tract, filter combo.
133
134 Parameters
135 ----------
136 parsedCmd:
137 The parsed command
138 kwargs:
139 Keyword arguments passed to the task
140
141 Returns
142 -------
143 targetList: list
144 List of tuples, where each tuple is a (dataRef, kwargs) pair.
145 """
146 refDict = MergeDcrSourcesRunner.buildRefDict(parsedCmd)
147 kwargs["psfCache"] = parsedCmd.psfCache
148 return [(list(f.values()), kwargs)
149 for t in list(refDict.values())
150 for p in list(t.values())
151 for f in list(p.values())]
152
153
154class DeblendDcrCoaddSourcesTask(DeblendCoaddSourcesTask):
155 """Deblend the sources in a merged catalog."""
156
157 RunnerClass = DeblendDcrCoaddSourcesRunner
158
159 @classmethod
160 def _makeArgumentParser(cls):
161 parser = ArgumentParser(name=cls._DefaultName)
162 parser.add_id_argument(name="--id",
163 datasetType="dcrCoadd_calexp",
164 help="data ID, e.g. --id tract=12345 patch=1,2 filter=g, subfilter=0",
165 ContainerClass=ExistingCoaddDataIdContainer)
166 parser.add_argument("--psfCache", type=int, default=100, help="Size of CoaddPsf cache")
167 return parser
168
169
170class MergeDcrDetectionsTask(MergeDetectionsTask):
171 """Merge dcrCoadd detections from multiple subfilters."""
172
173 RunnerClass = MergeDcrSourcesRunner
174
175 @classmethod
176 def _makeArgumentParser(cls):
177 """Create a suitable ArgumentParser.
178
179 We will use the ArgumentParser to get a provide a list of data
180 references for patches; the RunnerClass will sort them into lists
181 of data references for the same patch
182 """
183 parser = ArgumentParser(name=cls._DefaultName)
184 parser.add_id_argument(name="--id",
185 datasetType="dcrCoadd_" + cls.inputDataset,
186 ContainerClass=ExistingCoaddDataIdContainer,
187 help="data ID, e.g. --id tract=12345 patch=1,2 filter=g, subfilter=0^1^2")
188 return parser
189
190
191class MeasureMergedDcrCoaddSourcesTask(MeasureMergedCoaddSourcesTask):
192 """Deblend sources from master catalog in each coadd seperately and measure."""
193
194 @classmethod
195 def _makeArgumentParser(cls):
196 parser = ArgumentParser(name=cls._DefaultName)
197 parser.add_id_argument(name="--id",
198 datasetType="dcrCoadd_calexp",
199 help="data ID, e.g. --id tract=12345 patch=1,2 filter=g, subfilter=0",
200 ContainerClass=ExistingCoaddDataIdContainer)
201 parser.add_argument("--psfCache", type=int, default=100, help="Size of CoaddPsf cache")
202 return parser
203
204
205class MergeDcrMeasurementsTask(MergeMeasurementsTask):
206 """Merge measurements from multiple subfilters."""
207
208 RunnerClass = MergeDcrSourcesRunner
209
210 @classmethod
211 def _makeArgumentParser(cls):
212 """Create a suitable ArgumentParser.
213
214 We will use the ArgumentParser to get a provide a list of data
215 references for patches; the RunnerClass will sort them into lists
216 of data references for the same patch
217 """
218 parser = ArgumentParser(name=cls._DefaultName)
219 parser.add_id_argument(name="--id",
220 datasetType="dcrCoadd_" + cls.inputDataset,
221 ContainerClass=ExistingCoaddDataIdContainer,
222 help="data ID, e.g. --id tract=12345 patch=1,2 filter=g, subfilter=0^1^2")
223 return parser
daf::base::PropertyList * list
Definition: fits.cc:913