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
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 
24 from lsst.coadd.utils.coaddDataIdContainer import ExistingCoaddDataIdContainer
25 from lsst.pipe.base import ArgumentParser
26 from lsst.pipe.tasks.multiBand import DeblendCoaddSourcesTask
27 from lsst.pipe.tasks.multiBand import DetectCoaddSourcesTask
28 from lsst.pipe.tasks.multiBand import MergeSourcesRunner
29 from lsst.pipe.tasks.multiBand import MeasureMergedCoaddSourcesTask
30 from lsst.pipe.tasks.multiBand import MergeDetectionsTask
31 from 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 
39 class 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 
110 class 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 
154 class 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 
170 class 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 
191 class 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 
205 class 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