lsst.ip.diffim  13.0-22-g3839dbb+2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Public Member Functions | Public Attributes | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask Class Reference

Psf-match two MaskedImages or Exposures using the sources in the images. More...

Inheritance diagram for lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask:

Public Member Functions

def __init__
 Create the ImagePsfMatchTask. More...
 
def getFwhmPix
 Return the FWHM in pixels of a Psf. More...
 
def matchExposures
 Warp and PSF-match an exposure to the reference. More...
 
def matchMaskedImages
 PSF-match a MaskedImage (templateMaskedImage) to a reference MaskedImage (scienceMaskedImage) More...
 
def subtractExposures
 Register, Psf-match and subtract two Exposures. More...
 
def subtractMaskedImages
 Psf-match and subtract two MaskedImages. More...
 
def getSelectSources
 Get sources to use for Psf-matching. More...
 
def makeCandidateList
 Make a list of acceptable KernelCandidates. More...
 

Public Attributes

 kConfig
 
 background
 
 selectSchema
 
 selectAlgMetadata
 

Static Public Attributes

 ConfigClass = ImagePsfMatchConfig
 

Private Member Functions

def _adaptCellSize
 NOT IMPLEMENTED YET. More...
 
def _buildCellSet
 Build a SpatialCellSet for use with the solve method. More...
 
def _validateSize
 Return True if two image-like objects are the same size. More...
 
def _validateWcs
 Return True if the WCS of the two Exposures have the same origin and extent. More...
 

Private Attributes

 _warper
 

Detailed Description

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

Contents

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

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:

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.

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

Task initialization

Create the ImagePsfMatchTask.

Parameters
*argsarguments to be passed to lsst.ip.diffim.PsfMatchTask.__init__
**kwargskeyword arguments to be passed to lsst.ip.diffim.PsfMatchTask.__init__

Upon initialization, the kernel configuration is defined by self.config.kernel.active. The task creates an lsst.afw.math.Warper from the subConfig self.config.kernel.active.warpingConfig. A schema for the selection and measurement of candidate lsst.ip.diffim.KernelCandidates is defined, and used to initize subTasks selectDetection (for candidate detection) and selectMeasurement (for candidate measurement).

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

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 matchMaskedImages, subtractMaskedImages, matchExposures, and subtractExposures.

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.

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

Configuration parameters

See ImagePsfMatchConfig

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

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:

1 import sys
2 import lsstDebug
3 def DebugInfo(name):
4  di = lsstDebug.getInfo(name)
5  if name == "lsst.ip.diffim.psfMatch":
6  di.display = True # enable debug output
7  di.maskTransparency = 80 # ds9 mask transparency
8  di.displayCandidates = True # show all the candidates and residuals
9  di.displayKernelBasis = False # show kernel basis functions
10  di.displayKernelMosaic = True # show kernel realized across the image
11  di.plotKernelSpatialModel = False # show coefficients of spatial model
12  di.showBadCandidates = True # show the bad candidates (red) along with good (green)
13  elif name == "lsst.ip.diffim.imagePsfMatch":
14  di.display = True # enable debug output
15  di.maskTransparency = 30 # ds9 mask transparency
16  di.displayTemplate = True # show full (remapped) template
17  di.displaySciIm = True # show science image to match to
18  di.displaySpatialCells = True # show spatial cells
19  di.displayDiffIm = True # show difference image
20  di.showBadCandidates = True # show the bad candidates (red) along with good (green)
21  elif name == "lsst.ip.diffim.diaCatalogSourceSelector":
22  di.display = False # enable debug output
23  di.maskTransparency = 30 # ds9 mask transparency
24  di.displayExposure = True # show exposure with candidates indicated
25  di.pauseAtEnd = False # pause when done
26  return di
27 lsstDebug.Info = DebugInfo
28 lsstDebug.frame = 1

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

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

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

A complete example of using ImagePsfMatchTask

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

1 examples/imagePsfMatchTask.py --debug
2 examples/imagePsfMatchTask.py --debug --mode="matchExposures"
3 examples/imagePsfMatchTask.py --debug --template /path/to/templateExp.fits --science /path/to/scienceExp.fits
Create a subclass of ImagePsfMatchTask that allows us to either match exposures, or subtract exposures:
1 class MyImagePsfMatchTask(ImagePsfMatchTask):
2  """An override for ImagePsfMatchTask"""
3 
4  def __init__(self, *args, **kwargs):
5  ImagePsfMatchTask.__init__(self, *args, **kwargs)
6 
7  def run(self, templateExp, scienceExp, mode):
8  if mode == "matchExposures":
9  return self.matchExposures(templateExp, scienceExp)
10  elif mode == "subtractExposures":
11  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:

1 if __name__ == "__main__":
2  import argparse
3  parser = argparse.ArgumentParser(description="Demonstrate the use of ImagePsfMatchTask")
4 
5  parser.add_argument("--debug", "-d", action="store_true", help="Load debug.py?", default=False)
6  parser.add_argument("--template", "-t", help="Template Exposure to use", default=None)
7  parser.add_argument("--science", "-s", help="Science Exposure to use", default=None)
8  parser.add_argument("--mode", choices=["matchExposures", "subtractExposures"],
9  default="subtractExposures", help="Which method of ImagePsfMatchTask to invoke")
10 
11  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:

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

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:
1 def run(args):
2  #
3  # Create the Config and use sum of gaussian basis
4  #
5  config = ImagePsfMatchTask.ConfigClass()
6  config.kernel.name = "AL"
7  config.kernel.active.fitForBackground = True
8  config.kernel.active.spatialKernelOrder = 1
9  config.kernel.active.spatialBgOrder = 0

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):

1  # Run the requested method of the Task
2  if args.template is not None and args.science is not None:
3  if not os.path.isfile(args.template):
4  raise Exception("Template image %s does not exist" % (args.template))
5  if not os.path.isfile(args.science):
6  raise Exception("Science image %s does not exist" % (args.science))
7 
8  try:
9  templateExp = afwImage.ExposureF(args.template)
10  except pexExcept.LsstCppException as e:
11  raise Exception("Cannot read template image %s" % (args.template))
12  try:
13  scienceExp = afwImage.ExposureF(args.science)
14  except pexExcept.LsstCppException as e:
15  raise Exception("Cannot read science image %s" % (args.science))
16  else:
17  templateExp, scienceExp = generateFakeImages()
18  config.kernel.active.sizeCellX = 128
19  config.kernel.active.sizeCellY = 128

Create and run the Task:

1  # Create the Task
2  psfMatchTask = MyImagePsfMatchTask(config=config)
3 
4  # Run the Task
5  result = psfMatchTask.run(templateExp, scienceExp, args.mode)

And finally provide some optional debugging displays:

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

Definition at line 84 of file imagePsfMatch.py.

Constructor & Destructor Documentation

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.__init__ (   self,
  args,
  kwargs 
)

Create the ImagePsfMatchTask.

Parameters
*argsarguments to be passed to lsst.ip.diffim.PsfMatchTask.__init__
**kwargskeyword arguments to be passed to lsst.ip.diffim.PsfMatchTask.__init__

Upon initialization, the kernel configuration is defined by self.config.kernel.active. The task creates an lsst.afw.math.Warper from the subConfig self.config.kernel.active.warpingConfig. A schema for the selection and measurement of candidate lsst.ip.diffim.KernelCandidates is defined, and used to initize subTasks selectDetection (for candidate detection) and selectMeasurement (for candidate measurement).

Definition at line 272 of file imagePsfMatch.py.

Member Function Documentation

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask._adaptCellSize (   self,
  candidateList 
)
private

NOT IMPLEMENTED YET.

Definition at line 715 of file imagePsfMatch.py.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask._buildCellSet (   self,
  templateMaskedImage,
  scienceMaskedImage,
  candidateList 
)
private

Build a SpatialCellSet for use with the solve method.

Parameters
templateMaskedImage,:MaskedImage to PSF-matched to scienceMaskedImage
scienceMaskedImage,:reference MaskedImage
candidateList,:a list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
Returns
kernelCellSet: a SpatialCellSet for use with self._solve

Definition at line 719 of file imagePsfMatch.py.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask._validateSize (   self,
  templateMaskedImage,
  scienceMaskedImage 
)
private

Return True if two image-like objects are the same size.

Definition at line 753 of file imagePsfMatch.py.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask._validateWcs (   self,
  templateExposure,
  scienceExposure 
)
private

Return True if the WCS of the two Exposures have the same origin and extent.

Definition at line 758 of file imagePsfMatch.py.

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

Return the FWHM in pixels of a Psf.

Definition at line 296 of file imagePsfMatch.py.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.getSelectSources (   self,
  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.

Parameters
exposure,:Exposure on which to run detection/measurement
sigma,:Detection threshold
doSmooth,:Whether or not to smooth the Exposure with Psf before detection
idFactory,:Factory for the generation of Source ids
Returns
source catalog containing candidates for the Psf-matching

Definition at line 620 of file imagePsfMatch.py.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.makeCandidateList (   self,
  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

Parameters
templateExposure,:Exposure that will be convolved
scienceExposure,:Exposure that will be matched-to
kernelSize,:Dimensions of the Psf-matching Kernel, used to grow detection footprints
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.
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.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchExposures (   self,
  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
Parameters
templateExposure,:Exposure to warp and PSF-match to the reference masked image
scienceExposure,:Exposure whose WCS and PSF are to be matched to
templateFwhmPix,:FWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPix,:FWHM (in pixels) of the Psf in the science image
candidateList,:a list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
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
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
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.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.matchMaskedImages (   self,
  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
Parameters
templateMaskedImage,:masked image to PSF-match to the reference masked image; must be warped to match the reference masked image
scienceMaskedImage,:maskedImage whose PSF is to be matched to
templateFwhmPix,:FWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPix,:FWHM (in pixels) of the Psf in the science image
candidateList,:a 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.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractExposures (   self,
  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).
Parameters
templateExposure,:exposure to PSF-match to scienceExposure
scienceExposure,:reference Exposure
templateFwhmPix,:FWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPix,:FWHM (in pixels) of the Psf in the science image
candidateList,:a list of footprints/maskedImages for kernel candidates; if None then source detection is run.
  • Currently supported: list of Footprints or measAlg.PsfCandidateF
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
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
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.

def lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.subtractMaskedImages (   self,
  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)
Parameters
templateMaskedImage,:MaskedImage to PSF-match to scienceMaskedImage
scienceMaskedImage,:reference MaskedImage
templateFwhmPix,:FWHM (in pixels) of the Psf in the template image (image to convolve)
scienceFwhmPix,:FWHM (in pixels) of the Psf in the science image
candidateList,:a 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

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask._warper
private

Definition at line 286 of file imagePsfMatch.py.

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.background

Definition at line 289 of file imagePsfMatch.py.

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.ConfigClass = ImagePsfMatchConfig
static

Definition at line 270 of file imagePsfMatch.py.

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.kConfig

Definition at line 285 of file imagePsfMatch.py.

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.selectAlgMetadata

Definition at line 292 of file imagePsfMatch.py.

lsst.ip.diffim.imagePsfMatch.ImagePsfMatchTask.selectSchema

Definition at line 291 of file imagePsfMatch.py.


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