DynamicDetectionTask

class lsst.meas.algorithms.DynamicDetectionTask(*args, **kwargs)

Bases: SourceDetectionTask

Detection of sources on an image with a dynamic threshold

We first detect sources using a lower threshold than normal (see config parameter prelimThresholdFactor) in order to identify good sky regions (configurable skyObjects). Then we perform forced PSF photometry on those sky regions. Using those PSF flux measurements and estimated errors, we set the threshold so that the stdev of the measurements matches the median estimated error.

Besides the usual initialisation of configurables, we also set up the forced measurement which is deliberately not represented in this Task’s configuration parameters because we’re using it as part of the algorithm and we don’t want to allow it to be modified.

Methods Summary

applyTempLocalBackground(exposure, middle, ...)

Apply a temporary local background subtraction

applyThreshold(middle, bbox[, factor, factorNeg])

Apply thresholds to the convolved image

calculateKernelSize(sigma)

Calculate the size of the smoothing kernel.

calculateThreshold(exposure, seed[, sigma, ...])

Calculate new threshold

clearMask(mask)

Clear the DETECTED and DETECTED_NEGATIVE mask planes.

clearUnwantedResults(mask, results)

Clear unwanted results from the Struct of results

convolveImage(maskedImage, psf[, doSmooth])

Convolve the image with the PSF.

detectFootprints(exposure[, doSmooth, ...])

Detect footprints with a dynamic threshold

display(exposure, results[, convolvedImage])

Display detections if so configured

emptyMetadata()

Empty (clear) the metadata for this Task and all sub-Tasks.

finalizeFootprints(mask, results, sigma[, ...])

Finalize the detected footprints.

getFullMetadata()

Get metadata for all tasks.

getFullName()

Get the task name as a hierarchical name including parent task names.

getName()

Get the name of the task.

getPsf(exposure[, sigma])

Create a single Gaussian PSF for an exposure.

getTaskDict()

Get a dictionary of all tasks as a shallow copy.

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.

makeThreshold(image, thresholdParity[, factor])

Make an afw.detection.Threshold object corresponding to the task's configuration and the statistics of the given image.

reEstimateBackground(maskedImage, backgrounds)

Estimate the background after detection

removeBadPixels(middle)

Set the significance of flagged pixels to zero.

run(table, exposure[, doSmooth, sigma, ...])

Detect sources and return catalog(s) of detections.

setEdgeBits(maskedImage, goodBBox, edgeBitmask)

Set the edgeBitmask bits for all of maskedImage outside goodBBox

setPeakSignificance(exposure, footprints, ...)

Set the significance of each detected peak to the pixel value divided by the appropriate standard-deviation for config.thresholdType.

tempWideBackgroundContext(exposure)

Context manager for removing wide (large-scale) background

timer(name[, logLevel])

Context manager to log performance data for an arbitrary block of code.

tweakBackground(exposure, bgLevel[, bgList])

Modify the background by a constant value

updatePeaks(fpSet, image, threshold)

Update the Peaks in a FootprintSet by detecting new Footprints and Peaks in an image and using the new Peaks instead of the old ones.

Methods Documentation

applyTempLocalBackground(exposure, middle, results)

Apply a temporary local background subtraction

This temporary local background serves to suppress noise fluctuations in the wings of bright objects.

Peaks in the footprints will be updated.

Parameters:
exposurelsst.afw.image.Exposure

Exposure for which to fit local background.

middlelsst.afw.image.MaskedImage

Convolved image on which detection will be performed (typically smaller than exposure because the half-kernel has been removed around the edges).

resultslsst.pipe.base.Struct

Results of the ‘detectFootprints’ method, containing positive and negative footprints (which contain the peak positions that we will plot). This is a Struct with positive and negative elements that are of type lsst.afw.detection.FootprintSet.

applyThreshold(middle, bbox, factor=1.0, factorNeg=None)

Apply thresholds to the convolved image

Identifies Footprints, both positive and negative. The threshold can be modified by the provided multiplication factor.

Parameters:
middlelsst.afw.image.MaskedImage

Convolved image to threshold.

bboxlsst.geom.Box2I

Bounding box of unconvolved image.

factorfloat

Multiplier for the configured threshold.

factorNegfloat or None

Multiplier for the configured threshold for negative detection polarity. If None, will be set equal to factor (i.e. equal to the factor used for positive detection polarity).

Returns:
resultslsst.pipe.base.Struct

The Struct contains:

positive

Positive detection footprints, if configured. (lsst.afw.detection.FootprintSet or None)

negative

Negative detection footprints, if configured. (lsst.afw.detection.FootprintSet or None)

factor

Multiplier for the configured threshold. (float)

factorNeg

Multiplier for the configured threshold for negative detection polarity. (float)

calculateKernelSize(sigma)

Calculate the size of the smoothing kernel.

Uses the nSigmaForKernel configuration parameter. Note that that is the full width of the kernel bounding box (so a value of 7 means 3.5 sigma on either side of center). The value will be rounded up to the nearest odd integer.

Parameters:
sigmafloat

Gaussian sigma of smoothing kernel.

Returns:
sizeint

Size of the smoothing kernel.

calculateThreshold(exposure, seed, sigma=None, minFractionSourcesFactor=1.0, isBgTweak=False)

Calculate new threshold

This is the main functional addition to the vanilla SourceDetectionTask.

We identify sky objects and perform forced PSF photometry on them. Using those PSF flux measurements and estimated errors, we set the threshold so that the stdev of the measurements matches the median estimated error.

Parameters:
exposurelsst.afw.image.Exposure

Exposure on which we’re detecting sources.

seedint

RNG seed to use for finding sky objects.

sigmafloat, optional

Gaussian sigma of smoothing kernel; if not provided, will be deduced from the exposure’s PSF.

minFractionSourcesFactorfloat

Change the fraction of required sky sources from that set in self.config.minFractionSources by this factor. NOTE: this is intended for use in the background tweak pass (the detection threshold is much lower there, so many more pixels end up marked as DETECTED or DETECTED_NEGATIVE, leaving less room for sky object placement).

isBgTweakbool

Set to True for the background tweak pass (for more helpful log messages).

Returns:
resultlsst.pipe.base.Struct

Result struct with components:

multiplicative

Multiplicative factor to be applied to the configured detection threshold (float).

additive

Additive factor to be applied to the background level (float).

Raises:
NoWorkFound

Raised if the number of good sky sources found is less than the minimum fraction (self.config.minFractionSources``*``minFractionSourcesFactor) of the number requested (self.skyObjects.config.nSources).

clearMask(mask)

Clear the DETECTED and DETECTED_NEGATIVE mask planes.

Removes any previous detection mask in preparation for a new detection pass.

Parameters:
masklsst.afw.image.Mask

Mask to be cleared.

clearUnwantedResults(mask, results)

Clear unwanted results from the Struct of results

If we specifically want only positive or only negative detections, drop the ones we don’t want, and its associated mask plane.

Parameters:
masklsst.afw.image.Mask

Mask image.

resultslsst.pipe.base.Struct

Detection results, with positive and negative elements; modified.

convolveImage(maskedImage, psf, doSmooth=True)

Convolve the image with the PSF.

We convolve the image with a Gaussian approximation to the PSF, because this is separable and therefore fast. It’s technically a correlation rather than a convolution, but since we use a symmetric Gaussian there’s no difference.

The convolution can be disabled with doSmooth=False. If we do convolve, we mask the edges as EDGE and return the convolved image with the edges removed. This is because we can’t convolve the edges because the kernel would extend off the image.

Parameters:
maskedImagelsst.afw.image.MaskedImage

Image to convolve.

psflsst.afw.detection.Psf

PSF to convolve with (actually with a Gaussian approximation to it).

doSmoothbool

Actually do the convolution? Set to False when running on e.g. a pre-convolved image, or a mask plane.

Returns:
resultslsst.pipe.base.Struct

The Struct contains:

middle

Convolved image, without the edges. (lsst.afw.image.MaskedImage)

sigma

Gaussian sigma used for the convolution. (float)

detectFootprints(exposure, doSmooth=True, sigma=None, clearMask=True, expId=None, background=None)

Detect footprints with a dynamic threshold

This varies from the vanilla detectFootprints method because we do detection three times: first with a high threshold to detect “bright” (both positive and negative, the latter to identify very over-subtracted regions) sources for which we grow the DETECTED and DETECTED_NEGATIVE masks significantly to account for wings. Second, with a low threshold to mask all non-empty regions of the image. These two masks are combined and used to identify regions of sky uncontaminated by objects. A final round of detection is then done with the new calculated threshold.

Parameters:
exposurelsst.afw.image.Exposure

Exposure to process; DETECTED{,_NEGATIVE} mask plane will be set in-place.

doSmoothbool, optional

If True, smooth the image before detection using a Gaussian of width sigma.

sigmafloat, optional

Gaussian Sigma of PSF (pixels); used for smoothing and to grow detections; if None then measure the sigma of the PSF of the exposure.

clearMaskbool, optional

Clear both DETECTED and DETECTED_NEGATIVE planes before running detection.

expIdint, optional

Exposure identifier, used as a seed for the random number generator. If absent, the seed will be the sum of the image.

backgroundlsst.afw.math.BackgroundList, optional

Background that was already subtracted from the exposure; will be modified in-place if reEstimateBackground=True.

Returns:
resutlslsst.pipe.base.Struct

The results Struct contains:

positive

Positive polarity footprints. (lsst.afw.detection.FootprintSet or None)

negative

Negative polarity footprints. (lsst.afw.detection.FootprintSet or None)

numPos

Number of footprints in positive or 0 if detection polarity was negative. (int)

numNeg

Number of footprints in negative or 0 if detection polarity was positive. (int)

background

Re-estimated background. None or the input background if reEstimateBackground==False. (lsst.afw.math.BackgroundList)

factor

Multiplication factor applied to the configured detection threshold. (float)

prelim

Results from preliminary detection pass. (lsst.pipe.base.Struct)

display(exposure, results, convolvedImage=None)

Display detections if so configured

Displays the exposure in frame 0, overlays the detection peaks.

Requires that lsstDebug has been set up correctly, so that lsstDebug.Info("lsst.meas.algorithms.detection") evaluates True.

If the convolvedImage is non-None and lsstDebug.Info("lsst.meas.algorithms.detection") > 1, the convolvedImage will be displayed in frame 1.

Parameters:
exposurelsst.afw.image.Exposure

Exposure to display, on which will be plotted the detections.

resultslsst.pipe.base.Struct

Results of the ‘detectFootprints’ method, containing positive and negative footprints (which contain the peak positions that we will plot). This is a Struct with positive and negative elements that are of type lsst.afw.detection.FootprintSet.

convolvedImagelsst.afw.image.Image, optional

Convolved image used for thresholding.

emptyMetadata() None

Empty (clear) the metadata for this Task and all sub-Tasks.

finalizeFootprints(mask, results, sigma, factor=1.0, factorNeg=None)

Finalize the detected footprints.

Grow the footprints, set the DETECTED and DETECTED_NEGATIVE mask planes, and log the results.

numPos (number of positive footprints), numPosPeaks (number of positive peaks), numNeg (number of negative footprints), numNegPeaks (number of negative peaks) entries are added to the results struct.

Parameters:
masklsst.afw.image.Mask

Mask image on which to flag detected pixels.

resultslsst.pipe.base.Struct

Struct of detection results, including positive and negative entries; modified.

sigmafloat

Gaussian sigma of PSF.

factorfloat

Multiplier for the configured threshold. Note that this is only used here for logging purposes.

factorNegfloat or None

Multiplier used for the negative detection polarity threshold. If None, a factor equal to factor (i.e. equal to the one used for positive detection polarity) is assumed. Note that this is only used here for logging purposes.

getFullMetadata() TaskMetadata

Get metadata for all tasks.

Returns:
metadataTaskMetadata

The 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.

getFullName() str

Get the task name as a hierarchical name including parent task names.

Returns:
fullNamestr

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”.

getName() str

Get the name of the task.

Returns:
taskNamestr

Name of the task.

See also

getFullName
getPsf(exposure, sigma=None)

Create a single Gaussian PSF for an exposure.

If sigma is provided, we make a GaussianPsf with that, otherwise use the sigma from the psf of the exposure to make the GaussianPsf.

Parameters:
exposurelsst.afw.image.Exposure

Exposure from which to retrieve the PSF.

sigmafloat, optional

Gaussian sigma to use if provided.

Returns:
psflsst.afw.detection.GaussianPsf

PSF to use for detection.

Raises:
RuntimeError

Raised if sigma is not provided and exposure does not contain a Psf object.

getTaskDict() dict[str, weakref.ReferenceType[lsst.pipe.base.task.Task]]

Get a dictionary of all tasks as a shallow copy.

Returns:
taskDictdict

Dictionary containing full task name: task object for the top-level task and all subtasks, sub-subtasks, etc.

classmethod makeField(doc: str) ConfigurableField

Make a lsst.pex.config.ConfigurableField for this task.

Parameters:
docstr

Help text for the field.

Returns:
configurableFieldlsst.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("brief description of task")
makeSubtask(name: str, **keyArgs: Any) None

Create a subtask as a new instance as the name attribute of this task.

Parameters:
namestr

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 ConfigurableField or RegistryField.

makeThreshold(image, thresholdParity, factor=1.0)

Make an afw.detection.Threshold object corresponding to the task’s configuration and the statistics of the given image.

Parameters:
imageafw.image.MaskedImage

Image to measure noise statistics from if needed.

thresholdParity: `str`

One of “positive” or “negative”, to set the kind of fluctuations the Threshold will detect.

factorfloat

Factor by which to multiply the configured detection threshold. This is useful for tweaking the detection threshold slightly.

Returns:
thresholdlsst.afw.detection.Threshold

Detection threshold.

reEstimateBackground(maskedImage, backgrounds)

Estimate the background after detection

Parameters:
maskedImagelsst.afw.image.MaskedImage

Image on which to estimate the background.

backgroundslsst.afw.math.BackgroundList

List of backgrounds; modified.

Returns:
bglsst.afw.math.backgroundMI

Empirical background model.

removeBadPixels(middle)

Set the significance of flagged pixels to zero.

Parameters:
middlelsst.afw.image.ExposureF

Score or maximum likelihood difference image. The image plane will be modified in place.

run(table, exposure, doSmooth=True, sigma=None, clearMask=True, expId=None, background=None)

Detect sources and return catalog(s) of detections.

Parameters:
tablelsst.afw.table.SourceTable

Table object that will be used to create the SourceCatalog.

exposurelsst.afw.image.Exposure

Exposure to process; DETECTED mask plane will be set in-place.

doSmoothbool, optional

If True, smooth the image before detection using a Gaussian of width sigma, or the measured PSF width. Set to False when running on e.g. a pre-convolved image, or a mask plane.

sigmafloat, optional

Sigma of PSF (pixels); used for smoothing and to grow detections; if None then measure the sigma of the PSF of the exposure

clearMaskbool, optional

Clear DETECTED{,_NEGATIVE} planes before running detection.

expIdint, optional

Exposure identifier; unused by this implementation, but used for RNG seed by subclasses.

backgroundlsst.afw.math.BackgroundList, optional

Background that was already subtracted from the exposure; will be modified in-place if reEstimateBackground=True.

Returns:
resultlsst.pipe.base.Struct

The Struct contains:

sources

Detected sources on the exposure. (lsst.afw.table.SourceCatalog)

positive

Positive polarity footprints. (lsst.afw.detection.FootprintSet or None)

negative

Negative polarity footprints. (lsst.afw.detection.FootprintSet or None)

numPos

Number of footprints in positive or 0 if detection polarity was negative. (int)

numNeg

Number of footprints in negative or 0 if detection polarity was positive. (int)

background

Re-estimated background. None if reEstimateBackground==False. (lsst.afw.math.BackgroundList)

factor

Multiplication factor applied to the configured detection threshold. (float)

Raises:
ValueError

Raised if flags.negative is needed, but isn’t in table’s schema.

lsst.pipe.base.TaskError

Raised if sigma=None, doSmooth=True and the exposure has no PSF.

Notes

If you want to avoid dealing with Sources and Tables, you can use detectFootprints() to just get the FootprintSets.

static setEdgeBits(maskedImage, goodBBox, edgeBitmask)

Set the edgeBitmask bits for all of maskedImage outside goodBBox

Parameters:
maskedImagelsst.afw.image.MaskedImage

Image on which to set edge bits in the mask.

goodBBoxlsst.geom.Box2I

Bounding box of good pixels, in LOCAL coordinates.

edgeBitmasklsst.afw.image.MaskPixel

Bit mask to OR with the existing mask bits in the region outside goodBBox.

setPeakSignificance(exposure, footprints, threshold, negative=False)

Set the significance of each detected peak to the pixel value divided by the appropriate standard-deviation for config.thresholdType.

Only sets significance for “stdev” and “pixel_stdev” thresholdTypes; we leave it undefined for “value” and “variance” as it does not have a well-defined meaning in those cases.

Parameters:
exposurelsst.afw.image.Exposure

Exposure that footprints were detected on, likely the convolved, local background-subtracted image.

footprintslsst.afw.detection.FootprintSet

Footprints detected on the image.

thresholdlsst.afw.detection.Threshold

Threshold used to find footprints.

negativebool, optional

Are we calculating for negative sources?

tempWideBackgroundContext(exposure)

Context manager for removing wide (large-scale) background

Removing a wide (large-scale) background helps to suppress the detection of large footprints that may overwhelm the deblender. It does, however, set a limit on the maximum scale of objects.

The background that we remove will be restored upon exit from the context manager.

Parameters:
exposurelsst.afw.image.Exposure

Exposure on which to remove large-scale background.

Returns:
contextcontext manager

Context manager that will ensure the temporary wide background is restored.

timer(name: str, logLevel: int = 10) Iterator[None]

Context manager to log performance data for an arbitrary block of code.

Parameters:
namestr

Name of code being timed; data will be logged using item name: Start and End.

logLevel

A logging level constant.

Examples

Creating a timer context:

with self.timer("someCodeToTime"):
    pass  # code to time
tweakBackground(exposure, bgLevel, bgList=None)

Modify the background by a constant value

Parameters:
exposurelsst.afw.image.Exposure

Exposure for which to tweak background.

bgLevelfloat

Background level to remove

bgListlsst.afw.math.BackgroundList, optional

List of backgrounds to append to.

Returns:
bglsst.afw.math.BackgroundMI

Constant background model.

updatePeaks(fpSet, image, threshold)

Update the Peaks in a FootprintSet by detecting new Footprints and Peaks in an image and using the new Peaks instead of the old ones.

Parameters:
fpSetafw.detection.FootprintSet

Set of Footprints whose Peaks should be updated.

imageafw.image.MaskedImage

Image to detect new Footprints and Peak in.

thresholdafw.detection.Threshold

Threshold object for detection.

Input Footprints with fewer Peaks than self.config.nPeaksMaxSimple
are not modified, and if no new Peaks are detected in an input
Footprint, the brightest original Peak in that Footprint is kept.