24 Subtasks for creating the reference catalogs used in forced measurement.
31 __all__ = (
"BaseReferencesTask",
"CoaddSrcReferencesTask")
35 removePatchOverlaps = lsst.pex.config.Field(
36 doc=
"Only include reference sources for each patch that lie within the patch's inner bbox",
40 filter = lsst.pex.config.Field(
41 doc=
"Bandpass for reference sources; None indicates chi-squared detections.",
49 Base class for forced photometry subtask that retrieves reference sources.
51 BaseReferencesTask defines the required API for the references task, which includes:
53 - fetchInPatches(butler, tract, filter, patchList)
54 - fetchInBox(self, butler, tract, filter, bbox, wcs)
55 - the removePatchOverlaps config option
57 It also provides the subset() method, which may be of use to derived classes when
58 reimplementing fetchInBox.
61 ConfigClass = BaseReferencesConfig
63 def __init__(self, butler=None, schema=None, **kwargs):
64 """!Initialize the task.
66 BaseReferencesTask and its subclasses take two keyword arguments beyond the usual Task arguments:
67 - schema: the Schema of the reference catalog
68 - butler: a butler that will allow the task to load its Schema from disk.
69 At least one of these arguments must be present; if both are, schema takes precedence.
71 lsst.pipe.base.Task.__init__(self, **kwargs)
75 Return the schema for the reference sources.
77 Must be available even before any data has been processed.
79 raise NotImplementedError(
"BaseReferencesTask is pure abstract, and cannot be used directly.")
83 Return the WCS for reference sources. The given dataRef must include the tract in its dataId.
85 raise NotImplementedError(
"BaseReferencesTask is pure abstract, and cannot be used directly.")
89 Return reference sources that overlap a region defined by a pixel-coordinate bounding box
90 and corresponding Wcs.
92 @param[in] dataRef ButlerDataRef; the implied data ID must contain the 'tract' key.
93 @param[in] bbox a afw.geom.Box2I or Box2D that defines the region in pixel coordinates
94 @param[in] wcs afw.image.Wcs that maps the bbox to sky coordinates
96 @return an iterable of reference sources
98 It is not required that the returned object be a SourceCatalog; it may be any Python iterable
99 containing SourceRecords (including a lazy iterator).
101 The returned set of sources should be complete and close to minimal.
103 raise NotImplementedError(
"BaseReferencesTask is pure abstract, and cannot be used directly.")
107 Return reference sources that overlap a region defined by one or more SkyMap patches.
109 @param[in] dataRef ButlerDataRef; the implied data ID must contain the 'tract' key.
110 @param[in] patchList list of skymap.PatchInfo instances for which to fetch reference sources
112 @return an iterable of reference sources
114 It is not required that the returned object be a SourceCatalog; it may be any Python sequence
115 containing SourceRecords (including a lazy iterator).
117 The returned set of sources should be complete and close to minimal. If
118 config.removePatchOverlaps is True, only sources within each patch's "inner" bounding box
121 raise NotImplementedError(
"BaseReferencesTask is pure abstract, and cannot be used directly.")
125 Filter sources to contain only those within the given box, defined in the coordinate system
126 defined by the given Wcs.
128 @param[in] sources input iterable of SourceRecords
129 @param[in] bbox bounding box with which to filter reference sources (Box2I or Box2D)
130 @param[in] wcs afw.image.Wcs that defines the coordinate system of bbox
132 Instead of filtering sources directly via their positions, we filter based on the positions
133 of parent objects, then include or discard all children based on their parent's status. This
134 is necessary to support ReplaceWithNoise in measurement, which requires all child sources have
135 their parent present.
137 @return an iterable of filtered reference sources
139 This is not a part of the required BaseReferencesTask interface; it's a convenience function
140 used in implementing fetchInBox that may be of use to subclasses.
146 catalog.extend(sources)
150 for parent
in catalog.getChildren(0):
151 pixel = wcs.skyToPixel(parent.getCoord())
152 if boxD.contains(pixel):
154 for child
in catalog.getChildren(parent.getId()):
159 coaddName = lsst.pex.config.Field(
160 doc=
"Coadd name: typically one of deep or goodSeeing.",
166 if (self.
coaddName ==
"chiSquared") != (self.filter
is None):
167 raise lsst.pex.config.FieldValidationError(
168 field=CoaddSrcReferencesConfig.coaddName,
170 msg=
"filter may be None if and only if coaddName is chiSquared"
176 A references task implementation that loads the coadd_datasetSuffix dataset directly from
177 disk using the butler.
180 ConfigClass = CoaddSrcReferencesConfig
181 datasetSuffix =
"src"
183 def __init__(self, butler=None, schema=None, **kwargs):
184 """! Initialize the task.
185 Additional keyword arguments (forwarded to BaseReferencesTask.__init__):
186 - schema: the schema of the detection catalogs used as input to this one
187 - butler: a butler used to read the input schema from disk, if schema is None
188 The task will set its own self.schema attribute to the schema of the output merged catalog.
190 BaseReferencesTask.__init__(self, butler=butler, schema=schema, **kwargs)
192 assert butler
is not None,
"No butler nor schema provided"
198 """Return the WCS for reference sources. The given dataRef must include the tract in its dataId.
200 skyMap = dataRef.get(self.config.coaddName +
"Coadd_skyMap", immediate=
True)
201 return skyMap[dataRef.dataId[
"tract"]].
getWcs()
205 An implementation of BaseReferencesTask.fetchInPatches that loads 'coadd_' + datasetSuffix
206 catalogs using the butler.
208 The given dataRef must include the tract in its dataId.
211 tract = dataRef.dataId[
"tract"]
212 butler = dataRef.butlerSubset.butler
213 for patch
in patchList:
214 dataId = {
'tract': tract,
'patch':
"%d,%d" % patch.getIndex()}
215 if self.config.filter
is not None:
216 dataId[
'filter'] = self.config.filter
218 if not butler.datasetExists(dataset, dataId):
219 raise lsst.pipe.base.TaskError(
"Reference %s doesn't exist" % (dataId,))
220 self.log.info(
"Getting references in %s" % (dataId,))
221 catalog = butler.get(dataset, dataId, immediate=
True)
222 if self.config.removePatchOverlaps:
224 for source
in catalog:
225 if bbox.contains(source.getCentroid()):
228 for source
in catalog:
233 Return reference sources that overlap a region defined by a pixel-coordinate bounding box
234 and corresponding Wcs.
236 @param[in] dataRef ButlerDataRef; the implied data ID must contain the 'tract' key.
237 @param[in] bbox a afw.geom.Box2I or Box2D that defines the region in pixel coordinates
238 @param[in] wcs afw.image.Wcs that maps the bbox to sky coordinates
239 @param[in] pad a buffer to grow the bounding box by after catalogs have been loaded, but
240 before filtering them to include just the given bounding box.
242 @return an iterable of reference sources
244 skyMap = dataRef.get(self.config.coaddName +
"Coadd_skyMap", immediate=
True)
245 tract = skyMap[dataRef.dataId[
"tract"]]
247 self.log.info(
"Getting references in region with corners %s [degrees]" %
248 ", ".join(
"(%s)" % (coord.getPosition(lsst.afw.geom.degrees),)
for coord
in coordList))
249 patchList = tract.findPatchList(coordList)
260 if self.filter
is not None:
261 raise lsst.pex.config.FieldValidationError(
262 field=MultiBandReferencesConfig.filter,
264 msg=
"Filter should not be set for the multiband processing scheme")
266 BaseReferencesTask.ConfigClass.validate(self)
270 """Loads references from the multiband processing scheme"""
271 ConfigClass = MultiBandReferencesConfig
272 datasetSuffix =
"ref"
def getSchema
Return the schema for the reference sources.
def __init__
Initialize the task.
def __init__
Initialize the task.
def getWcs
Return the WCS for reference sources.
Base class for forced photometry subtask that retrieves reference sources.
A references task implementation that loads the coadd_datasetSuffix dataset directly from disk using ...
def subset
Filter sources to contain only those within the given box, defined in the coordinate system defined b...
Custom catalog class for record/table subclasses that are guaranteed to have an ID, and should generally be sorted by that ID.
def fetchInBox
Return reference sources that overlap a region defined by a pixel-coordinate bounding box and corresp...
def fetchInBox
Return reference sources that overlap a region defined by a pixel-coordinate bounding box and corresp...
def fetchInPatches
Return reference sources that overlap a region defined by one or more SkyMap patches.
static Key< RecordId > getParentKey()
Key for the parent ID.
A floating-point coordinate rectangle geometry.
def fetchInPatches
An implementation of BaseReferencesTask.fetchInPatches that loads 'coadd_' + datasetSuffix catalogs u...