LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
Public Member Functions | Static Public Attributes | List of all members
lsst.meas.algorithms.subtractBackground.SubtractBackgroundTask Class Reference

Subtract the background from an exposure. More...

Inheritance diagram for lsst.meas.algorithms.subtractBackground.SubtractBackgroundTask:

Public Member Functions

def run (self, exposure, background=None, stats=True, statsKeys=None)
 Fit and subtract the background of an exposure. More...
 
def fitBackground (self, maskedImage, nx=0, ny=0, algorithm=None)
 Estimate the background of a masked image. More...
 

Static Public Attributes

 ConfigClass = SubtractBackgroundConfig
 

Detailed Description

Subtract the background from an exposure.

@anchor SubtractBackgroundTask_

@section meas_algorithms_subtractBackground_Contents  Contents

 - @ref meas_algorithms_subtractBackground_Purpose
 - @ref meas_algorithms_subtractBackground_Initialize
 - @ref meas_algorithms_subtractBackground_IO
 - @ref meas_algorithms_subtractBackground_Config
 - @ref meas_algorithms_subtractBackground_Metadata
 - @ref meas_algorithms_subtractBackground_Debug
 - @ref meas_algorithms_subtractBackground_Example

@section meas_algorithms_subtractBackground_Purpose  Description

Fit a model of the background of an exposure and subtract it.

@section meas_algorithms_subtractBackground_Initialize  Task initialisation

@copydoc \_\_init\_\_

@section meas_algorithms_subtractBackground_IO  Invoking the Task

Call `run` to fit the background and subtract it.

Call `fitBackground` to fit the background without subtracting it.

@section meas_algorithms_subtractBackground_Config  Configuration parameters

See @ref SubtractBackgroundConfig

@section meas_algorithms_subtractBackground_Metadata  Quantities set in exposure Metadata

The `run` method will optionally set the following items of exposure metadata;
the names may be overridden; the defaults are shown:
<dl>
    <dt>BGMEAN <dd>mean value of background
    <dt>BGVAR  <dd>standard deviation of background
</dl>

@section meas_algorithms_subtractBackground_Debug  Debug variables

The @link lsst.pipe.base.cmdLineTask.CmdLineTask command line task@endlink interface supports a flag
`--debug` to import `debug.py` from your `$PYTHONPATH`; see @ref baseDebug for more about `debug.py`.

SubtractBackgroundTask has a debug dictionary containing three integer keys:
<dl>
<dt>unsubtracted
<dd>If >0: `fitBackground` displays the unsubtracted masked image overlaid with the grid of cells
            used to fit the background in the specified frame
<dt>subtracted
<dd>If >0: `run` displays the background-subtracted exposure is the specified frame
<dt>background
<dd>If >0: `run` displays the background image in the specified frame
</dl>

For example, put something like:
@code{.py}
    import lsstDebug
    def DebugInfo(name):
        di = lsstDebug.getInfo(name)  # N.b. lsstDebug.Info(name) would call us recursively
        if name == "lsst.meas.algorithms.subtractBackground":
            di.display = dict(
                unsubtracted = 1,
                subtracted = 2,
                background = 3,
            )

        return di

    lsstDebug.Info = DebugInfo
@endcode
into your `debug.py` file and run your task with the `--debug` flag.

@section meas_algorithms_subtractBackground_Example   A complete example of using SubtractBackgroundTask

This code is in @link subtractBackgroundExample.py@endlink in the examples directory, and can be run as:
@code
python examples/subtractBackgroundExample.py
@endcode
@dontinclude subtractBackgroundExample.py

Import the task (there are some other standard imports; read the file if you're curious)
@skipline import SubtractBackgroundTask

Create the task, run it, and report mean and variance of background.
@skip create the task
@until print

Definition at line 126 of file subtractBackground.py.

Member Function Documentation

◆ fitBackground()

def lsst.meas.algorithms.subtractBackground.SubtractBackgroundTask.fitBackground (   self,
  maskedImage,
  nx = 0,
  ny = 0,
  algorithm = None 
)

Estimate the background of a masked image.

    @param[in] maskedImage  masked image whose background is to be computed
    @param[in] nx  number of x bands; if 0 compute from width and config.binSizeX
    @param[in] ny  number of y bands; if 0 compute from height and config.binSizeY
    @param[in] algorithm  name of interpolation algorithm; if None use self.config.algorithm

    @return fit background as an lsst.afw.math.Background

    @throw RuntimeError if lsst.afw.math.makeBackground returns None,
        which is apparently one way it indicates failure

Definition at line 285 of file subtractBackground.py.

285  def fitBackground(self, maskedImage, nx=0, ny=0, algorithm=None):
286  """!Estimate the background of a masked image
287 
288  @param[in] maskedImage masked image whose background is to be computed
289  @param[in] nx number of x bands; if 0 compute from width and config.binSizeX
290  @param[in] ny number of y bands; if 0 compute from height and config.binSizeY
291  @param[in] algorithm name of interpolation algorithm; if None use self.config.algorithm
292 
293  @return fit background as an lsst.afw.math.Background
294 
295  @throw RuntimeError if lsst.afw.math.makeBackground returns None,
296  which is apparently one way it indicates failure
297  """
298 
299  binSizeX = self.config.binSize if self.config.binSizeX == 0 else self.config.binSizeX
300  binSizeY = self.config.binSize if self.config.binSizeY == 0 else self.config.binSizeY
301 
302  if not nx:
303  nx = maskedImage.getWidth()//binSizeX + 1
304  if not ny:
305  ny = maskedImage.getHeight()//binSizeY + 1
306 
307  unsubFrame = getDebugFrame(self._display, "unsubtracted")
308  if unsubFrame:
309  unsubDisp = afwDisplay.getDisplay(frame=unsubFrame)
310  unsubDisp.mtv(maskedImage, title="unsubtracted")
311  xPosts = numpy.rint(numpy.linspace(0, maskedImage.getWidth() + 1, num=nx, endpoint=True))
312  yPosts = numpy.rint(numpy.linspace(0, maskedImage.getHeight() + 1, num=ny, endpoint=True))
313  with unsubDisp.Buffering():
314  for (xMin, xMax), (yMin, yMax) in itertools.product(zip(xPosts[:-1], xPosts[1:]),
315  zip(yPosts[:-1], yPosts[1:])):
316  unsubDisp.line([(xMin, yMin), (xMin, yMax), (xMax, yMax), (xMax, yMin), (xMin, yMin)])
317 
318  sctrl = afwMath.StatisticsControl()
319  badMask = maskedImage.mask.getPlaneBitMask(self.config.ignoredPixelMask)
320 
321  sctrl.setAndMask(badMask)
322  sctrl.setNanSafe(self.config.isNanSafe)
323 
324  self.log.debug("Ignoring mask planes: %s" % ", ".join(self.config.ignoredPixelMask))
325  if (maskedImage.mask.getArray() & badMask).all():
326  raise pipeBase.TaskError("All pixels masked. Cannot estimate background")
327 
328  if algorithm is None:
329  algorithm = self.config.algorithm
330 
331  # TODO: DM-22814. This call to a deprecated BackgroundControl constructor
332  # is necessary to support the algorithm parameter; it # should be replaced with
333  #
334  # afwMath.BackgroundControl(nx, ny, sctrl, self.config.statisticsProperty)
335  #
336  # when algorithm has been deprecated and removed.
337  with suppress_deprecations():
338  bctrl = afwMath.BackgroundControl(algorithm, nx, ny,
339  self.config.undersampleStyle, sctrl,
340  self.config.statisticsProperty)
341 
342  # TODO: The following check should really be done within lsst.afw.math.
343  # With the current code structure, it would need to be accounted for in the doGetImage()
344  # function in BackgroundMI.cc (which currently only checks against the interpolation settings,
345  # which is not appropriate when useApprox=True)
346  # and/or the makeApproximate() function in afw/Approximate.cc.
347  # See ticket DM-2920: "Clean up code in afw for Approximate background
348  # estimation" (which includes a note to remove the following and the
349  # similar checks in pipe_tasks/matchBackgrounds.py once implemented)
350  #
351  # Check that config setting of approxOrder/binSize make sense
352  # (i.e. ngrid (= shortDimension/binSize) > approxOrderX) and perform
353  # appropriate undersampleStlye behavior.
354  if self.config.useApprox:
355  if self.config.approxOrderY not in (self.config.approxOrderX, -1):
356  raise ValueError("Error: approxOrderY not in (approxOrderX, -1)")
357  order = self.config.approxOrderX
358  minNumberGridPoints = order + 1
359  if min(nx, ny) <= order:
360  self.log.warn("Too few points in grid to constrain fit: min(nx, ny) < approxOrder) "
361  "[min(%d, %d) < %d]" % (nx, ny, order))
362  if self.config.undersampleStyle == "THROW_EXCEPTION":
363  raise ValueError("Too few points in grid (%d, %d) for order (%d) and binSize (%d, %d)" %
364  (nx, ny, order, binSizeX, binSizeY))
365  elif self.config.undersampleStyle == "REDUCE_INTERP_ORDER":
366  if order < 1:
367  raise ValueError("Cannot reduce approxOrder below 0. "
368  "Try using undersampleStyle = \"INCREASE_NXNYSAMPLE\" instead?")
369  order = min(nx, ny) - 1
370  self.log.warn("Reducing approxOrder to %d" % order)
371  elif self.config.undersampleStyle == "INCREASE_NXNYSAMPLE":
372  # Reduce bin size to the largest acceptable square bins
373  newBinSize = min(maskedImage.getWidth(), maskedImage.getHeight())//(minNumberGridPoints-1)
374  if newBinSize < 1:
375  raise ValueError("Binsize must be greater than 0")
376  newNx = maskedImage.getWidth()//newBinSize + 1
377  newNy = maskedImage.getHeight()//newBinSize + 1
378  bctrl.setNxSample(newNx)
379  bctrl.setNySample(newNy)
380  self.log.warn("Decreasing binSize from (%d, %d) to %d for a grid of (%d, %d)" %
381  (binSizeX, binSizeY, newBinSize, newNx, newNy))
382 
383  actrl = afwMath.ApproximateControl(afwMath.ApproximateControl.CHEBYSHEV, order, order,
384  self.config.weighting)
385  bctrl.setApproximateControl(actrl)
386 
387  bg = afwMath.makeBackground(maskedImage, bctrl)
388  if bg is None:
389  raise RuntimeError("lsst.afw.math.makeBackground failed to fit a background model")
390  return bg
int min
Control how to make an approximation.
Definition: Approximate.h:48
Pass parameters to a Background object.
Definition: Background.h:56
Pass parameters to a Statistics object.
Definition: Statistics.h:93
std::shared_ptr< Background > makeBackground(ImageT const &img, BackgroundControl const &bgCtrl)
A convenience function that uses function overloading to make the correct type of Background.
Definition: Background.h:526
bool all(CoordinateExpr< N > const &expr) noexcept
Return true if all elements are true.
def suppress_deprecations(category=FutureWarning)
Definition: deprecated.py:79
def getDebugFrame(debugDisplay, name)
Definition: lsstDebug.py:95

◆ run()

def lsst.meas.algorithms.subtractBackground.SubtractBackgroundTask.run (   self,
  exposure,
  background = None,
  stats = True,
  statsKeys = None 
)

Fit and subtract the background of an exposure.

    @param[in,out] exposure  exposure whose background is to be subtracted
    @param[in,out] background  initial background model already subtracted from exposure
        (an lsst.afw.math.BackgroundList). May be None if no background has been subtracted.
    @param[in] stats  if True then measure the mean and variance of the full background model
                    and record the results in the exposure's metadata
    @param[in] statsKeys  key names used to store the mean and variance of the background
        in the exposure's metadata (a pair of strings); if None then use ("BGMEAN", "BGVAR");
        ignored if stats is false

    @return an lsst.pipe.base.Struct containing:
    - background  full background model (initial model with changes), an lsst.afw.math.BackgroundList

Definition at line 220 of file subtractBackground.py.

220  def run(self, exposure, background=None, stats=True, statsKeys=None):
221  """!Fit and subtract the background of an exposure
222 
223  @param[in,out] exposure exposure whose background is to be subtracted
224  @param[in,out] background initial background model already subtracted from exposure
225  (an lsst.afw.math.BackgroundList). May be None if no background has been subtracted.
226  @param[in] stats if True then measure the mean and variance of the full background model
227  and record the results in the exposure's metadata
228  @param[in] statsKeys key names used to store the mean and variance of the background
229  in the exposure's metadata (a pair of strings); if None then use ("BGMEAN", "BGVAR");
230  ignored if stats is false
231 
232  @return an lsst.pipe.base.Struct containing:
233  - background full background model (initial model with changes), an lsst.afw.math.BackgroundList
234  """
235  if background is None:
236  background = afwMath.BackgroundList()
237 
238  maskedImage = exposure.getMaskedImage()
239  fitBg = self.fitBackground(maskedImage)
240  maskedImage -= fitBg.getImageF(self.config.algorithm, self.config.undersampleStyle)
241 
242  actrl = fitBg.getBackgroundControl().getApproximateControl()
243  background.append((fitBg, getattr(afwMath.Interpolate, self.config.algorithm),
244  fitBg.getAsUsedUndersampleStyle(), actrl.getStyle(),
245  actrl.getOrderX(), actrl.getOrderY(), actrl.getWeighting()))
246 
247  if stats:
248  self._addStats(exposure, background, statsKeys=statsKeys)
249 
250  subFrame = getDebugFrame(self._display, "subtracted")
251  if subFrame:
252  subDisp = afwDisplay.getDisplay(frame=subFrame)
253  subDisp.mtv(exposure, title="subtracted")
254 
255  bgFrame = getDebugFrame(self._display, "background")
256  if bgFrame:
257  bgDisp = afwDisplay.getDisplay(frame=bgFrame)
258  bgImage = background.getImage()
259  bgDisp.mtv(bgImage, title="background")
260 
261  return pipeBase.Struct(
262  background=background,
263  )
264 
def run(self, skyInfo, tempExpRefList, imageScalerList, weightList, altMaskList=None, mask=None, supplementaryData=None)

Member Data Documentation

◆ ConfigClass

lsst.meas.algorithms.subtractBackground.SubtractBackgroundTask.ConfigClass = SubtractBackgroundConfig
static

Definition at line 217 of file subtractBackground.py.


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