Coverage for python/lsst/ip/diffim/getTemplate.py : 17%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# # LSST Data Management System # Copyright 2016 LSST Corporation. # # This product includes software developed by the # LSST Project (http://www.lsst.org/). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the LSST License Statement and # the GNU General Public License along with this program. If not, # see <http://www.lsstcorp.org/LegalNotices/>. #
"GetCalexpAsTemplateTask", "GetCalexpAsTemplateConfig"]
dtype=int, default=10, doc="Number of pixels to grow the requested template image to account for warping" ) doc="coadd name: typically one of 'deep', 'goodSeeing', or 'dcr'", dtype=str, default="deep", ) doc="Number of subfilters in the DcrCoadd, used only if ``coaddName``='dcr'", dtype=int, default=3, ) doc="Warp type of the coadd template: one of 'direct' or 'psfMatched'", dtype=str, default="direct", )
"""Subtask to retrieve coadd for use as an image difference template.
This is the default getTemplate Task to be run as a subtask by ``pipe.tasks.ImageDifferenceTask``. The main method is ``run()``. It assumes that coadds reside in the repository given by sensorRef. """
"""Retrieve and mosaic a template coadd exposure that overlaps the exposure
Parameters ---------- exposure: `lsst.afw.image.Exposure` an exposure for which to generate an overlapping template sensorRef : TYPE a Butler data reference that can be used to obtain coadd data templateIdList : TYPE, optional list of data ids (unused)
Returns ------- result : `struct` return a pipeBase.Struct:
- ``exposure`` : a template coadd exposure assembled out of patches - ``sources`` : None for this subtask """ skyMap = sensorRef.get(datasetType=self.config.coaddName + "Coadd_skyMap") expWcs = exposure.getWcs() expBoxD = afwGeom.Box2D(exposure.getBBox()) expBoxD.grow(self.config.templateBorderSize) ctrSkyPos = expWcs.pixelToSky(expBoxD.getCenter()) tractInfo = skyMap.findTract(ctrSkyPos) self.log.info("Using skyMap tract %s" % (tractInfo.getId(),)) skyCorners = [expWcs.pixelToSky(pixPos) for pixPos in expBoxD.getCorners()] patchList = tractInfo.findPatchList(skyCorners)
if not patchList: raise RuntimeError("No suitable tract found") self.log.info("Assembling %s coadd patches" % (len(patchList),))
# compute coadd bbox coaddWcs = tractInfo.getWcs() coaddBBox = afwGeom.Box2D() for skyPos in skyCorners: coaddBBox.include(coaddWcs.skyToPixel(skyPos)) coaddBBox = afwGeom.Box2I(coaddBBox) self.log.info("exposure dimensions=%s; coadd dimensions=%s" % (exposure.getDimensions(), coaddBBox.getDimensions()))
# assemble coadd exposure from subregions of patches coaddExposure = afwImage.ExposureF(coaddBBox, coaddWcs) coaddExposure.maskedImage.set(np.nan, afwImage.Mask.getPlaneBitMask("NO_DATA"), np.nan) nPatchesFound = 0 coaddFilter = None coaddPsf = None for patchInfo in patchList: patchSubBBox = patchInfo.getOuterBBox() patchSubBBox.clip(coaddBBox) patchArgDict = dict( datasetType=self.getCoaddDatasetName() + "_sub", bbox=patchSubBBox, tract=tractInfo.getId(), patch="%s,%s" % (patchInfo.getIndex()[0], patchInfo.getIndex()[1]), numSubfilters=self.config.numSubfilters, ) if patchSubBBox.isEmpty(): self.log.info("skip tract=%(tract)s, patch=%(patch)s; no overlapping pixels" % patchArgDict) continue
if self.config.coaddName == 'dcr': if not sensorRef.datasetExists(subfilter=0, **patchArgDict): self.log.warn("%(datasetType)s, tract=%(tract)s, patch=%(patch)s," " numSubfilters=%(numSubfilters)s, subfilter=0 does not exist" % patchArgDict) continue self.log.info("Constructing DCR-matched template for patch %s" % patchArgDict) dcrModel = DcrModel.fromDataRef(sensorRef, **patchArgDict) # The edge pixels of the DcrCoadd may contain artifacts due to missing data. # Each patch has significant overlap, and the contaminated edge pixels in # a new patch will overwrite good pixels in the overlap region from # previous patches. # Shrink the BBox to remove the contaminated pixels, # but make sure it is only the overlap region that is reduced. patchInnerBBox = patchInfo.getInnerBBox() patchInnerBBox.clip(coaddBBox) dcrBBox = afwGeom.Box2I(patchSubBBox) dcrBBox.grow(-self.config.templateBorderSize) dcrBBox.include(patchInnerBBox) coaddPatch = dcrModel.buildMatchedExposure(bbox=dcrBBox, wcs=coaddWcs, visitInfo=exposure.getInfo().getVisitInfo()) else: if not sensorRef.datasetExists(**patchArgDict): self.log.warn("%(datasetType)s, tract=%(tract)s, patch=%(patch)s does not exist" % patchArgDict) continue self.log.info("Reading patch %s" % patchArgDict) coaddPatch = sensorRef.get(**patchArgDict) nPatchesFound += 1 coaddExposure.maskedImage.assign(coaddPatch.maskedImage, coaddPatch.getBBox()) if coaddFilter is None: coaddFilter = coaddPatch.getFilter()
# Retrieve the PSF for this coadd tract, if not already retrieved if coaddPsf is None and coaddPatch.hasPsf(): coaddPsf = coaddPatch.getPsf()
if nPatchesFound == 0: raise RuntimeError("No patches found!")
if coaddPsf is None: raise RuntimeError("No coadd Psf found!")
coaddExposure.setPsf(coaddPsf) coaddExposure.setFilter(coaddFilter) return pipeBase.Struct(exposure=coaddExposure, sources=None)
"""Return coadd name for given task config
Returns ------- CoaddDatasetName : `string`
TODO: This nearly duplicates a method in CoaddBaseTask (DM-11985) """ warpType = self.config.warpType suffix = "" if warpType == "direct" else warpType[0].upper() + warpType[1:] return self.config.coaddName + "Coadd" + suffix
dtype=bool, default=True, doc="Add background to calexp before processing it." )
"""Subtask to retrieve calexp of the same ccd number as the science image SensorRef for use as an image difference template.
To be run as a subtask by pipe.tasks.ImageDifferenceTask. Intended for use with simulations and surveys that repeatedly visit the same pointing. This code was originally part of Winter2013ImageDifferenceTask. """
"""Return a calexp exposure with based on input sensorRef.
Construct a dataId based on the sensorRef.dataId combined with the specifications from the first dataId in templateIdList
Parameters ---------- exposure : `lsst.afw.image.Exposure` exposure (unused) sensorRef : TYPE a Butler data reference templateIdList : TYPE list of data ids, which should contain a single item. If there are multiple items, only the first is used.
Returns ------- result : `struct`
return a pipeBase.Struct:
- ``exposure`` : a template calexp - ``sources`` : source catalog measured on the template """
if len(templateIdList) == 0: raise RuntimeError("No template data reference supplied.") if len(templateIdList) > 1: self.log.warn("Multiple template data references supplied. Using the first one only.")
templateId = sensorRef.dataId.copy() templateId.update(templateIdList[0])
self.log.info("Fetching calexp (%s) as template." % (templateId))
butler = sensorRef.getButler() template = butler.get(datasetType="calexp", dataId=templateId) if self.config.doAddCalexpBackground: templateBg = butler.get(datasetType="calexpBackground", dataId=templateId) mi = template.getMaskedImage() mi += templateBg.getImage()
if not template.hasPsf(): raise pipeBase.TaskError("Template has no psf")
templateSources = butler.get(datasetType="src", dataId=templateId) return pipeBase.Struct(exposure=template, sources=templateSources) |