lsst.ip.diffim  13.0-28-gf4bc96c+12
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.ip.diffim.snapPsfMatch.SnapPsfMatchTask Class Reference

Image-based Psf-matching of two subsequent snaps from the same visit. More...

Inheritance diagram for lsst.ip.diffim.snapPsfMatch.SnapPsfMatchTask:
lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask lsst.ip.diffim.psfMatch.PsfMatchTask

Public Member Functions

def subtractExposures (self, templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None)
 
def getFwhmPix (self, psf)
 Return the FWHM in pixels of a Psf. More...
 
def matchExposures (self, templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None, doWarping=True, convolveTemplate=True)
 Warp and PSF-match an exposure to the reference. More...
 
def matchMaskedImages (self, templateMaskedImage, scienceMaskedImage, candidateList, templateFwhmPix=None, scienceFwhmPix=None)
 PSF-match a MaskedImage (templateMaskedImage) to a reference MaskedImage (scienceMaskedImage) More...
 
def subtractExposures (self, templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None, doWarping=True, convolveTemplate=True)
 Register, Psf-match and subtract two Exposures. More...
 
def subtractMaskedImages (self, templateMaskedImage, scienceMaskedImage, candidateList, templateFwhmPix=None, scienceFwhmPix=None)
 Psf-match and subtract two MaskedImages. More...
 
def getSelectSources (self, exposure, sigma=None, doSmooth=True, idFactory=None)
 Get sources to use for Psf-matching. More...
 
def makeCandidateList (self, templateExposure, scienceExposure, kernelSize, candidateList=None)
 Make a list of acceptable KernelCandidates. More...
 

Public Attributes

 kConfig
 
 background
 
 selectSchema
 
 selectAlgMetadata
 
 useRegularization
 
 hMat
 

Static Public Attributes

 ConfigClass = SnapPsfMatchConfig
 

Detailed Description

Image-based Psf-matching of two subsequent snaps from the same visit.

Contents

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

Description

SnapPsfMatchTask

This Task differs from ImagePsfMatchTask in that it matches two Exposures assuming that the images have been acquired very closely in time. Under this assumption, the astrometric misalignments and/or relative distortions should be within a pixel, and the Psf-shapes should be very similar. As a consequence, the default configurations for this class assume a very simple solution.

. The spatial variation in the kernel (SnapPsfMatchConfig.spatialKernelOrder) is assumed to be zero

. With no spatial variation, we turn of the spatial clipping loops (SnapPsfMatchConfig.spatialKernelClipping)

. The differential background is not fit for (SnapPsfMatchConfig.fitForBackground)

. The kernel is expected to be appx. a delta function, and has a small size (SnapPsfMatchConfig.kernelSize)

The sub-configurations for the Alard-Lupton (SnapPsfMatchConfigAL) and delta-function (SnapPsfMatchConfigDF) bases also are designed to generate a small, simple kernel.

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

Task initialization

Initialization is the same as base class ImagePsfMatch.__init__, with the difference being that the Task's ConfigClass is SnapPsfMatchConfig.

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

Invoking the Task

The Task is only configured to have a subtractExposures method, which in turn calls ImagePsfMatchTask.subtractExposures.

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

Configuration parameters

See SnapPsfMatchConfig, which uses either SnapPsfMatchConfigDF and SnapPsfMatchConfigAL as its active configuration.

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

Quantities set in Metadata

See PsfMatchTask

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

Debug variables

The command line task interface supports a flag -d/–debug to import debug.py from your PYTHONPATH. The relevant contents of debug.py for this Task include:

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

Note that if you want addional logging info, you may add to your scripts:

import lsst.log.utils as logUtils
logUtils.traceSetAt("ip.diffim", 4)

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

A complete example of using SnapPsfMatchTask

This code is snapPsfMatchTask.py in the examples directory, and can be run as e.g.

examples/snapPsfMatchTask.py
examples/snapPsfMatchTask.py --debug
examples/snapPsfMatchTask.py --debug --template /path/to/templateExp.fits --science /path/to/scienceExp.fits
First, create a subclass of SnapPsfMatchTask that accepts two exposures. Ideally these exposures would have been taken back-to-back, such that the pointing/background/Psf does not vary substantially between the two:
class MySnapPsfMatchTask(SnapPsfMatchTask):
"""An override for SnapPsfMatchTask"""
def __init__(self, *args, **kwargs):
SnapPsfMatchTask.__init__(self, *args, **kwargs)
def run(self, templateExp, scienceExp):
return self.subtractExposures(templateExp, scienceExp)

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:

if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Demonstrate the use of ImagePsfMatchTask")
parser.add_argument("--debug", "-d", action="store_true", help="Load debug.py?", default=False)
parser.add_argument("--template", "-t", help="Template Exposure to use", default=None)
parser.add_argument("--science", "-s", help="Science Exposure to use", default=None)
args = parser.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:

if args.debug:
try:
import debug
# Since I am displaying 2 images here, set the starting frame number for the LSST debug LSST
debug.lsstDebug.frame = 3
except ImportError as e:
print(e, file=sys.stderr)

Finally, we call a run method that we define below. First set up a Config and choose the basis set to use:
def run(args):
#
# Create the Config and use sum of gaussian basis
#
config = SnapPsfMatchTask.ConfigClass()
config.doWarping = True
config.kernel.name = "AL"

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; as a detail of how the fake images were made, you do have to fit for a differential background):

# Run the requested method of the Task
if args.template is not None and args.science is not None:
if not os.path.isfile(args.template):
raise Exception("Template image %s does not exist" % (args.template))
if not os.path.isfile(args.science):
raise Exception("Science image %s does not exist" % (args.science))
try:
templateExp = afwImage.ExposureF(args.template)
except pexExcept.LsstCppException as e:
raise Exception("Cannot read template image %s" % (args.template))
try:
scienceExp = afwImage.ExposureF(args.science)
except pexExcept.LsstCppException as e:
raise Exception("Cannot read science image %s" % (args.science))
else:
templateExp, scienceExp = generateFakeImages()
config.kernel.active.fitForBackground = True
config.kernel.active.spatialBgOrder = 0
config.kernel.active.sizeCellX = 128
config.kernel.active.sizeCellY = 128

Display the two images if –debug:

if args.debug:
ds9.mtv(templateExp, frame=1, title="Example script: Input Template")
ds9.mtv(scienceExp, frame=2, title="Example script: Input Science Image")

Create and run the Task:

# Create the Task
psfMatchTask = MySnapPsfMatchTask(config=config)
# Run the Task
result = psfMatchTask.run(templateExp, scienceExp)

And finally provide optional debugging display of the Psf-matched (via the Psf models) science image:

if args.debug:
# See if the LSST debug has incremented the frame number; if not start with frame 3
try:
frame = debug.lsstDebug.frame + 1
except Exception:
frame = 3
ds9.mtv(result.matchedExposure, frame=frame, title="Example script: Matched Template Image")
if "subtractedExposure" in result.getDict():
ds9.mtv(result.subtractedExposure, frame=frame+1, title="Example script: Subtracted Image")

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

Definition at line 95 of file snapPsfMatch.py.

Member Function Documentation

◆ getFwhmPix()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.getFwhmPix (   self,
  psf 
)
inherited

Return the FWHM in pixels of a Psf.

Definition at line 296 of file imagePsfMatch.py.

◆ getSelectSources()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.getSelectSources (   self,
  exposure,
  sigma = None,
  doSmooth = True,
  idFactory = None 
)
inherited

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.

Parameters
exposureExposure on which to run detection/measurement
sigmaDetection threshold
doSmoothWhether or not to smooth the Exposure with Psf before detection
idFactoryFactory for the generation of Source ids
Returns
source catalog containing candidates for the Psf-matching

Definition at line 620 of file imagePsfMatch.py.

◆ makeCandidateList()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.makeCandidateList (   self,
  templateExposure,
  scienceExposure,
  kernelSize,
  candidateList = None 
)
inherited

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

Parameters
templateExposureExposure that will be convolved
scienceExposureExposure that will be matched-to
kernelSizeDimensions of the Psf-matching Kernel, used to grow detection footprints
candidateListList 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.
Returns
a list of dicts having a "source" and "footprint" field for the Sources deemed to be appropriate for Psf matching

Definition at line 668 of file imagePsfMatch.py.

◆ matchExposures()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchExposures (   self,
  templateExposure,
  scienceExposure,
  templateFwhmPix = None,
  scienceFwhmPix = None,
  candidateList = None,
  doWarping = True,
  convolveTemplate = True 
)
inherited

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
Parameters
templateExposureExposure to warp and PSF-match to the reference masked image
scienceExposureExposure whose WCS and PSF are to be matched to
templateFwhmPixFWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPixFWHM (in pixels) of the Psf in the science image
candidateLista list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
doWarpingwhat 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
convolveTemplateconvolve 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
Returns
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

Definition at line 304 of file imagePsfMatch.py.

◆ matchMaskedImages()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchMaskedImages (   self,
  templateMaskedImage,
  scienceMaskedImage,
  candidateList,
  templateFwhmPix = None,
  scienceFwhmPix = None 
)
inherited

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
Parameters
templateMaskedImagemasked image to PSF-match to the reference masked image; must be warped to match the reference masked image
scienceMaskedImagemaskedImage whose PSF is to be matched to
templateFwhmPixFWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPixFWHM (in pixels) of the Psf in the science image
candidateLista list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
Returns
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

Definition at line 388 of file imagePsfMatch.py.

◆ subtractExposures() [1/2]

def lsst.ip.diffim.snapPsfMatch.SnapPsfMatchTask.subtractExposures (   self,
  templateExposure,
  scienceExposure,
  templateFwhmPix = None,
  scienceFwhmPix = None,
  candidateList = None 
)

Definition at line 265 of file snapPsfMatch.py.

◆ subtractExposures() [2/2]

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractExposures (   self,
  templateExposure,
  scienceExposure,
  templateFwhmPix = None,
  scienceFwhmPix = None,
  candidateList = None,
  doWarping = True,
  convolveTemplate = True 
)
inherited

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).
Parameters
templateExposureexposure to PSF-match to scienceExposure
scienceExposurereference Exposure
templateFwhmPixFWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPixFWHM (in pixels) of the Psf in the science image
candidateLista list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
doWarpingwhat 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
convolveTemplateconvolve 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
Returns
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

Definition at line 483 of file imagePsfMatch.py.

◆ subtractMaskedImages()

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractMaskedImages (   self,
  templateMaskedImage,
  scienceMaskedImage,
  candidateList,
  templateFwhmPix = None,
  scienceFwhmPix = None 
)
inherited

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)
Parameters
templateMaskedImageMaskedImage to PSF-match to scienceMaskedImage
scienceMaskedImagereference MaskedImage
templateFwhmPixFWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPixFWHM (in pixels) of the Psf in the science image
candidateLista list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
Returns
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

Definition at line 566 of file imagePsfMatch.py.

Member Data Documentation

◆ background

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.background
inherited

Definition at line 289 of file imagePsfMatch.py.

◆ ConfigClass

lsst.ip.diffim.snapPsfMatch.SnapPsfMatchTask.ConfigClass = SnapPsfMatchConfig
static

Definition at line 260 of file snapPsfMatch.py.

◆ hMat

lsst.ip.diffim.psfMatch.PsfMatchTask.hMat
inherited

Definition at line 701 of file psfMatch.py.

◆ kConfig

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.kConfig
inherited

Definition at line 285 of file imagePsfMatch.py.

◆ selectAlgMetadata

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.selectAlgMetadata
inherited

Definition at line 292 of file imagePsfMatch.py.

◆ selectSchema

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.selectSchema
inherited

Definition at line 291 of file imagePsfMatch.py.

◆ useRegularization

lsst.ip.diffim.psfMatch.PsfMatchTask.useRegularization
inherited

Definition at line 696 of file psfMatch.py.


The documentation for this class was generated from the following file: