ImagePsfMatchTask

class lsst.ip.diffim.ImagePsfMatchTask(*args, **kwargs)

Bases: lsst.ip.diffim.PsfMatchTask

! @anchor ImagePsfMatchTask

@brief Psf-match two MaskedImages or Exposures using the sources in the images

@section ip_diffim_imagepsfmatch_Contents Contents

  • @ref ip_diffim_imagepsfmatch_Purpose
  • @ref ip_diffim_imagepsfmatch_Initialize
  • @ref ip_diffim_imagepsfmatch_IO
  • @ref ip_diffim_imagepsfmatch_Config
  • @ref ip_diffim_imagepsfmatch_Metadata
  • @ref ip_diffim_imagepsfmatch_Debug
  • @ref ip_diffim_imagepsfmatch_Example

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Purpose Description

Build a Psf-matching kernel using two input images, either as MaskedImages (in which case they need
to be astrometrically aligned) or Exposures (in which case astrometric alignment will happen by default but may be turned off). This requires a list of input Sources which may be provided

by the calling Task; if not, the Task will perform a coarse source detection and selection for this purpose. Sources are vetted for signal-to-noise and masked pixels (in both the template and science image), and substamps around each acceptable source are extracted and used to create an instance of KernelCandidate. Each KernelCandidate is then placed within a lsst.afw.math.SpatialCellSet, which is used by an ensemble of lsst.afw.math.CandidateVisitor instances to build the Psf-matching kernel. These visitors include, in the order that they are called: BuildSingleKernelVisitor, KernelSumVisitor, BuildSpatialKernelVisitor, and AssessSpatialKernelVisitor.

Sigma clipping of KernelCandidates is performed as follows:
  • BuildSingleKernelVisitor, using the substamp diffim residuals from the per-source kernel fit,
    if PsfMatchConfig.singleKernelClipping is True
  • KernelSumVisitor, using the mean and standard deviation of the kernel sum from all candidates,
    if PsfMatchConfig.kernelSumClipping is True
  • AssessSpatialKernelVisitor, using the substamp diffim ressiduals from the spatial kernel fit,
    if PsfMatchConfig.spatialKernelClipping is True

The actual solving for the kernel (and differential background model) happens in lsst.ip.diffim.PsfMatchTask._solve. This involves a loop over the SpatialCellSet that first builds the per-candidate matching kernel for the requested number of KernelCandidates per cell (PsfMatchConfig.nStarPerCell). The quality of this initial per-candidate difference image is examined, using moments of the pixel residuals in the difference image normalized by the square root of the variance (i.e. sigma); ideally this should follow a normal (0, 1) distribution, but the rejection thresholds are set by the config (PsfMatchConfig.candidateResidualMeanMax and PsfMatchConfig.candidateResidualStdMax). All candidates that pass this initial build are then examined en masse to find the mean/stdev of the kernel sums across all candidates. Objects that are significantly above or below the mean, typically due to variability or sources that are saturated in one image but not the other, are also rejected. This threshold is defined by PsfMatchConfig.maxKsumSigma. Finally, a spatial model is built using all currently-acceptable candidates, and the spatial model used to derive a second set of (spatial) residuals which are again used to reject bad candidates, using the same thresholds as above.

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Initialize Task initialization

@copydoc __init__

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_IO Invoking the Task

There is no run() method for this Task. Instead there are 4 methods that may be used to invoke the Psf-matching. These are @link lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchMaskedImages matchMaskedImages@endlink, @link lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractMaskedImages subtractMaskedImages@endlink, @link lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchExposures matchExposures@endlink, and @link lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractExposures subtractExposures@endlink.

The methods that operate on lsst.afw.image.MaskedImage require that the images already be astrometrically aligned, and are the same shape. The methods that operate on lsst.afw.image.Exposure allow for the input images to be misregistered and potentially be different sizes; by default a lsst.afw.math.LanczosWarpingKernel is used to perform the astrometric alignment. The methods that “match” images return a Psf-matched image, while the methods that “subtract” images return a Psf-matched and template subtracted image.

See each method’s returned lsst.pipe.base.Struct for more details.

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Config Configuration parameters

See @ref ImagePsfMatchConfig

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Metadata Quantities set in Metadata

See @ref ip_diffim_psfmatch_Metadata “PsfMatchTask”

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Debug Debug variables

The @link lsst.pipe.base.cmdLineTask.CmdLineTask command line task@endlink interface supports a flag @c -d/–debug to import @b debug.py from your @c PYTHONPATH. The relevant contents of debug.py for this Task include:

@code{.py}

import sys import lsstDebug def DebugInfo(name):

di = lsstDebug.getInfo(name) if name == “lsst.ip.diffim.psfMatch”:

di.display = True # enable debug output di.maskTransparency = 80 # ds9 mask transparency di.displayCandidates = True # show all the candidates and residuals di.displayKernelBasis = False # show kernel basis functions di.displayKernelMosaic = True # show kernel realized across the image di.plotKernelSpatialModel = False # show coefficients of spatial model di.showBadCandidates = True # show the bad candidates (red) along with good (green)
elif name == “lsst.ip.diffim.imagePsfMatch”:
di.display = True # enable debug output di.maskTransparency = 30 # ds9 mask transparency di.displayTemplate = True # show full (remapped) template di.displaySciIm = True # show science image to match to di.displaySpatialCells = True # show spatial cells di.displayDiffIm = True # show difference image di.showBadCandidates = True # show the bad candidates (red) along with good (green)
elif name == “lsst.ip.diffim.diaCatalogSourceSelector”:
di.display = False # enable debug output di.maskTransparency = 30 # ds9 mask transparency di.displayExposure = True # show exposure with candidates indicated di.pauseAtEnd = False # pause when done

return di

lsstDebug.Info = DebugInfo lsstDebug.frame = 1

@endcode

Note that if you want addional logging info, you may add to your scripts: @code{.py} import lsst.log.utils as logUtils logUtils.traceSetAt(“ip.diffim”, 4) @endcode

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_imagepsfmatch_Example A complete example of using ImagePsfMatchTask

This code is imagePsfMatchTask.py in the examples directory, and can be run as @em e.g. @code examples/imagePsfMatchTask.py –debug examples/imagePsfMatchTask.py –debug –mode=”matchExposures” examples/imagePsfMatchTask.py –debug –template /path/to/templateExp.fits –science /path/to/scienceExp.fits @endcode

@dontinclude imagePsfMatchTask.py Create a subclass of ImagePsfMatchTask that allows us to either match exposures, or subtract exposures: @skip MyImagePsfMatchTask @until self.subtractExposures

And allow the user the freedom to either run the script in default mode, or point to their own images on disk. Note that these images must be readable as an lsst.afw.image.Exposure: @skip main @until parse_args

We have enabled some minor display debugging in this script via the –debug option. However, if you have an lsstDebug debug.py in your PYTHONPATH you will get additional debugging displays. The following block checks for this script: @skip args.debug @until sys.stderr

@dontinclude imagePsfMatchTask.py Finally, we call a run method that we define below. First set up a Config and modify some of the parameters. E.g. use an “Alard-Lupton” sum-of-Gaussian basis, fit for a differential background, and use low order spatial variation in the kernel and background: @skip run(args) @until spatialBgOrder

Make sure the images (if any) that were sent to the script exist on disk and are readable. If no images are sent, make some fake data up for the sake of this example script (have a look at the code if you want more details on generateFakeImages): @skip requested @until sizeCellY

Create and run the Task: @skip Create @until args.mode

And finally provide some optional debugging displays: @skip args.debug @until result.subtractedExposure #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Methods Summary

getFwhmPix(psf) !Return the FWHM in pixels of a Psf
getSelectSources(exposure[, sigma, …]) !Get sources to use for Psf-matching
makeCandidateList(templateExposure, …[, …]) !Make a list of acceptable KernelCandidates
matchExposures(templateExposure, scienceExposure) !Warp and PSF-match an exposure to the reference
matchMaskedImages(templateMaskedImage, …) !PSF-match a MaskedImage (templateMaskedImage) to a reference MaskedImage (scienceMaskedImage)
subtractExposures(templateExposure, …[, …]) !Register, Psf-match and subtract two Exposures
subtractMaskedImages(templateMaskedImage, …) !Psf-match and subtract two MaskedImages

Methods Documentation

getFwhmPix(psf)

!Return the FWHM in pixels of a Psf

getSelectSources(exposure, sigma=None, doSmooth=True, idFactory=None)

!Get sources to use for Psf-matching

This method runs detection and measurement on an exposure. The returned set of sources will be used as candidates for Psf-matching.

@param exposure: Exposure on which to run detection/measurement @param sigma: Detection threshold @param doSmooth: Whether or not to smooth the Exposure with Psf before detection @param idFactory: Factory for the generation of Source ids

@return source catalog containing candidates for the Psf-matching

makeCandidateList(templateExposure, scienceExposure, kernelSize, candidateList=None)

!Make a list of acceptable KernelCandidates

Accept or generate a list of candidate sources for Psf-matching, and examine the Mask planes in both of the images for indications of bad pixels

@param templateExposure: Exposure that will be convolved @param scienceExposure: Exposure that will be matched-to @param kernelSize: Dimensions of the Psf-matching Kernel, used to grow detection footprints @param candidateList: List of Sources to examine. Elements must be of type afw.table.Source

or a type that wraps a Source and has a getSource() method, such as meas.algorithms.PsfCandidateF.

@return a list of dicts having a “source” and “footprint” field for the Sources deemed to be appropriate for Psf matching

matchExposures(templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None, doWarping=True, convolveTemplate=True)

!Warp and PSF-match an exposure to the reference

Do the following, in order: - Warp templateExposure to match scienceExposure,

if doWarping True and their WCSs do not already match
  • Determine a PSF matching kernel and differential background model
    that matches templateExposure to scienceExposure
  • Convolve templateExposure by PSF matching kernel

@param templateExposure: Exposure to warp and PSF-match to the reference masked image @param scienceExposure: Exposure whose WCS and PSF are to be matched to @param templateFwhmPix: FWHM (in pixels) of the Psf in the template image (image to convolve) @param scienceFwhmPix: FWHM (in pixels) of the Psf in the science image @param candidateList: a list of footprints/maskedImages for kernel candidates;

if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
@param doWarping: what to do if templateExposure’s and scienceExposure’s WCSs do not match:
  • if True then warp templateExposure to match scienceExposure
  • if False then raise an Exception
@param convolveTemplate: convolve the template image or the science image
  • if True, templateExposure is warped if doWarping, templateExposure is convolved
  • if False, templateExposure is warped if doWarping, scienceExposure is convolved

@return a pipeBase.Struct containing these fields: - matchedImage: the PSF-matched exposure =

warped templateExposure convolved by psfMatchingKernel. This has: - the same parent bbox, Wcs and Calib as scienceExposure - the same filter as templateExposure - no Psf (because the PSF-matching process does not compute one)
  • psfMatchingKernel: the PSF matching kernel
  • backgroundModel: differential background model
  • kernelCellSet: SpatialCellSet used to solve for the PSF matching kernel
Raise a RuntimeError if doWarping is False and templateExposure’s and scienceExposure’s
WCSs do not match
matchMaskedImages(templateMaskedImage, scienceMaskedImage, candidateList, templateFwhmPix=None, scienceFwhmPix=None)

!PSF-match a MaskedImage (templateMaskedImage) to a reference MaskedImage (scienceMaskedImage)

Do the following, in order: - Determine a PSF matching kernel and differential background model

that matches templateMaskedImage to scienceMaskedImage
  • Convolve templateMaskedImage by the PSF matching kernel
@param templateMaskedImage: masked image to PSF-match to the reference masked image;
must be warped to match the reference masked image

@param scienceMaskedImage: maskedImage whose PSF is to be matched to @param templateFwhmPix: FWHM (in pixels) of the Psf in the template image (image to convolve) @param scienceFwhmPix: FWHM (in pixels) of the Psf in the science image @param candidateList: a list of footprints/maskedImages for kernel candidates;

if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF

@return a pipeBase.Struct containing these fields: - psfMatchedMaskedImage: the PSF-matched masked image =

templateMaskedImage convolved with psfMatchingKernel. This has the same xy0, dimensions and wcs as scienceMaskedImage.
  • psfMatchingKernel: the PSF matching kernel
  • backgroundModel: differential background model
  • kernelCellSet: SpatialCellSet used to solve for the PSF matching kernel

Raise a RuntimeError if input images have different dimensions

subtractExposures(templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None, doWarping=True, convolveTemplate=True)

!Register, Psf-match and subtract two Exposures

Do the following, in order: - Warp templateExposure to match scienceExposure, if their WCSs do not already match - Determine a PSF matching kernel and differential background model

that matches templateExposure to scienceExposure
  • PSF-match templateExposure to scienceExposure
  • Compute subtracted exposure (see return values for equation).

@param templateExposure: exposure to PSF-match to scienceExposure @param scienceExposure: reference Exposure @param templateFwhmPix: FWHM (in pixels) of the Psf in the template image (image to convolve) @param scienceFwhmPix: FWHM (in pixels) of the Psf in the science image @param candidateList: a list of footprints/maskedImages for kernel candidates;

if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
@param doWarping: what to do if templateExposure’s and scienceExposure’s WCSs do not match:
  • if True then warp templateExposure to match scienceExposure
  • if False then raise an Exception
@param convolveTemplate: convolve the template image or the science image
  • if True, templateExposure is warped if doWarping, templateExposure is convolved
  • if False, templateExposure is warped if doWarping, scienceExposure is convolved

@return a pipeBase.Struct containing these fields: - subtractedExposure: subtracted Exposure = scienceExposure - (matchedImage + backgroundModel) - matchedImage: templateExposure after warping to match templateExposure (if doWarping true),

and convolving with psfMatchingKernel
  • psfMatchingKernel: PSF matching kernel
  • backgroundModel: differential background model
  • kernelCellSet: SpatialCellSet used to determine PSF matching kernel
subtractMaskedImages(templateMaskedImage, scienceMaskedImage, candidateList, templateFwhmPix=None, scienceFwhmPix=None)

!Psf-match and subtract two MaskedImages

Do the following, in order: - PSF-match templateMaskedImage to scienceMaskedImage - Determine the differential background - Return the difference: scienceMaskedImage -

((warped templateMaskedImage convolved with psfMatchingKernel) + backgroundModel)

@param templateMaskedImage: MaskedImage to PSF-match to scienceMaskedImage @param scienceMaskedImage: reference MaskedImage @param templateFwhmPix: FWHM (in pixels) of the Psf in the template image (image to convolve) @param scienceFwhmPix: FWHM (in pixels) of the Psf in the science image @param candidateList: a list of footprints/maskedImages for kernel candidates;

if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF

@return a pipeBase.Struct containing these fields: - subtractedMaskedImage = scienceMaskedImage - (matchedImage + backgroundModel) - matchedImage: templateMaskedImage convolved with psfMatchingKernel - psfMatchingKernel: PSF matching kernel - backgroundModel: differential background model - kernelCellSet: SpatialCellSet used to determine PSF matching kernel