SnapPsfMatchTask¶
-
class
lsst.ip.diffim.
SnapPsfMatchTask
(*args, **kwargs)¶ Bases:
lsst.ip.diffim.ImagePsfMatchTask
! @anchor SnapPsfMatchTask
@brief Image-based Psf-matching of two subsequent snaps from the same visit
@section ip_diffim_snappsfmatch_Contents Contents
- @ref ip_diffim_snappsfmatch_Purpose
- @ref ip_diffim_snappsfmatch_Initialize
- @ref ip_diffim_snappsfmatch_IO
- @ref ip_diffim_snappsfmatch_Config
- @ref ip_diffim_snappsfmatch_Metadata
- @ref ip_diffim_snappsfmatch_Debug
- @ref ip_diffim_snappsfmatch_Example
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_Purpose Description
@copybrief 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.
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_Initialize Task initialization
Initialization is the same as base class ImagePsfMatch.__init__, with the difference being that the Task’s ConfigClass is SnapPsfMatchConfig.
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_IO Invoking the Task
The Task is only configured to have a subtractExposures method, which in turn calls ImagePsfMatchTask.subtractExposures.
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_Config Configuration parameters
See @ref SnapPsfMatchConfig, which uses either @ref SnapPsfMatchConfigDF and @ref SnapPsfMatchConfigAL as its active configuration.
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_Metadata Quantities set in Metadata
See @ref ip_diffim_psfmatch_Metadata “PsfMatchTask”
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@section ip_diffim_snappsfmatch_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_snappsfmatch_Example A complete example of using SnapPsfMatchTask
This code is snapPsfMatchTask.py in the examples directory, and can be run as @em e.g. @code examples/snapPsfMatchTask.py examples/snapPsfMatchTask.py –debug examples/snapPsfMatchTask.py –debug –template /path/to/templateExp.fits –science /path/to/scienceExp.fits @endcode
@dontinclude snapPsfMatchTask.py 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: @skip MySnapPsfMatchTask @until return
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 snapPsfMatchTask.py Finally, we call a run method that we define below. First set up a Config and choose the basis set to use: @skip run(args) @until 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): @skip requested @until sizeCellY
Display the two images if –debug: @skip args.debug @until Science
Create and run the Task: @skip Create @until result
And finally provide optional debugging display of the Psf-matched (via the Psf models) science image: @skip args.debug @until result.subtractedExposure
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Methods Summary
emptyMetadata
()Empty (clear) the metadata for this Task and all sub-Tasks. getAllSchemaCatalogs
()Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict. getFullMetadata
()Get metadata for all tasks. getFullName
()Get the task name as a hierarchical name including parent task names. getFwhmPix
(psf)!Return the FWHM in pixels of a Psf getName
()Get the name of the task. getSchemaCatalogs
()Get the schemas generated by this task. getSelectSources
(exposure[, sigma, …])!Get sources to use for Psf-matching getTaskDict
()Get a dictionary of all tasks as a shallow copy. makeCandidateList
(templateExposure, …[, …])!Make a list of acceptable KernelCandidates makeField
(doc)Make a lsst.pex.config.ConfigurableField
for this task.makeSubtask
(name, **keyArgs)Create a subtask as a new instance as the name
attribute of this task.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 timer
(name[, logLevel])Context manager to log performance data for an arbitrary block of code. Methods Documentation
-
emptyMetadata
()¶ Empty (clear) the metadata for this Task and all sub-Tasks.
-
getAllSchemaCatalogs
()¶ Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict.
Returns: - schemacatalogs :
dict
Keys are butler dataset type, values are a empty catalog (an instance of the appropriate lsst.afw.table Catalog type) for all tasks in the hierarchy, from the top-level task down through all subtasks.
Notes
This method may be called on any task in the hierarchy; it will return the same answer, regardless.
The default implementation should always suffice. If your subtask uses schemas the override
Task.getSchemaCatalogs
, not this method.- schemacatalogs :
-
getFullMetadata
()¶ Get metadata for all tasks.
Returns: - metadata :
lsst.daf.base.PropertySet
The
PropertySet
keys are the full task name. Values are metadata for the top-level task and all subtasks, sub-subtasks, etc..
Notes
The returned metadata includes timing information (if
@timer.timeMethod
is used) and any metadata set by the task. The name of each item consists of the full task name with.
replaced by:
, followed by.
and the name of the item, e.g.:topLevelTaskName:subtaskName:subsubtaskName.itemName
using
:
in the full task name disambiguates the rare situation that a task has a subtask and a metadata item with the same name.- metadata :
-
getFullName
()¶ Get the task name as a hierarchical name including parent task names.
Returns: - fullName :
str
The full name consists of the name of the parent task and each subtask separated by periods. For example:
- The full name of top-level task “top” is simply “top”.
- The full name of subtask “sub” of top-level task “top” is “top.sub”.
- The full name of subtask “sub2” of subtask “sub” of top-level task “top” is “top.sub.sub2”.
- fullName :
-
getFwhmPix
(psf)¶ !Return the FWHM in pixels of a Psf
-
getSchemaCatalogs
()¶ Get the schemas generated by this task.
Returns: - schemaCatalogs :
dict
Keys are butler dataset type, values are an empty catalog (an instance of the appropriate
lsst.afw.table
Catalog type) for this task.
See also
Task.getAllSchemaCatalogs
Notes
Warning
Subclasses that use schemas must override this method. The default implemenation returns an empty dict.
This method may be called at any time after the Task is constructed, which means that all task schemas should be computed at construction time, not when data is actually processed. This reflects the philosophy that the schema should not depend on the data.
Returning catalogs rather than just schemas allows us to save e.g. slots for SourceCatalog as well.
- schemaCatalogs :
-
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
-
getTaskDict
()¶ Get a dictionary of all tasks as a shallow copy.
Returns: - taskDict :
dict
Dictionary containing full task name: task object for the top-level task and all subtasks, sub-subtasks, etc..
- taskDict :
-
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
-
classmethod
makeField
(doc)¶ Make a
lsst.pex.config.ConfigurableField
for this task.Parameters: - doc :
str
Help text for the field.
Returns: - configurableField :
lsst.pex.config.ConfigurableField
A
ConfigurableField
for this task.
Examples
Provides a convenient way to specify this task is a subtask of another task.
Here is an example of use:
class OtherTaskConfig(lsst.pex.config.Config) aSubtask = ATaskClass.makeField("a brief description of what this task does")
- doc :
-
makeSubtask
(name, **keyArgs)¶ Create a subtask as a new instance as the
name
attribute of this task.Parameters: - name :
str
Brief name of the subtask.
- keyArgs
Extra keyword arguments used to construct the task. The following arguments are automatically provided and cannot be overridden:
- “config”.
- “parentTask”.
Notes
The subtask must be defined by
Task.config.name
, an instance of pex_config ConfigurableField or RegistryField.- name :
-
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)¶ !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
-
timer
(name, logLevel=10000)¶ Context manager to log performance data for an arbitrary block of code.
Parameters: - name :
str
Name of code being timed; data will be logged using item name:
Start
andEnd
.- logLevel
A
lsst.log
level constant.
See also
timer.logInfo
Examples
Creating a timer context:
with self.timer("someCodeToTime"): pass # code to time
- name :