LSSTApplications  11.0-13-gbb96280,12.1+18,12.1+7,12.1-1-g14f38d3+72,12.1-1-g16c0db7+5,12.1-1-g5961e7a+84,12.1-1-ge22e12b+23,12.1-11-g06625e2+4,12.1-11-g0d7f63b+4,12.1-19-gd507bfc,12.1-2-g7dda0ab+38,12.1-2-gc0bc6ab+81,12.1-21-g6ffe579+2,12.1-21-gbdb6c2a+4,12.1-24-g941c398+5,12.1-3-g57f6835+7,12.1-3-gf0736f3,12.1-37-g3ddd237,12.1-4-gf46015e+5,12.1-5-g06c326c+20,12.1-5-g648ee80+3,12.1-5-gc2189d7+4,12.1-6-ga608fc0+1,12.1-7-g3349e2a+5,12.1-7-gfd75620+9,12.1-9-g577b946+5,12.1-9-gc4df26a+10
LSSTDataManagementBasePackage
isr.py
Go to the documentation of this file.
1 from __future__ import print_function
2 from builtins import input
3 from builtins import range
4 #
5 # LSST Data Management System
6 # Copyright 2008, 2009, 2010 LSST Corporation.
7 #
8 # This product includes software developed by the
9 # LSST Project (http://www.lsst.org/).
10 #
11 # This program is free software: you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation, either version 3 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the LSST License Statement and
22 # the GNU General Public License along with this program. If not,
23 # see <http://www.lsstcorp.org/LegalNotices/>.
24 #
25 import math
26 
27 import numpy
28 
29 import lsst.afw.geom as afwGeom
30 import lsst.afw.image as afwImage
31 import lsst.afw.detection as afwDetection
32 import lsst.afw.math as afwMath
33 import lsst.meas.algorithms as measAlg
34 import lsst.pex.exceptions as pexExcept
35 
36 
37 def createPsf(fwhm):
38  """Make a double Gaussian PSF
39 
40  @param[in] fwhm FWHM of double Gaussian smoothing kernel
41  @return measAlg.DoubleGaussianPsf
42  """
43  ksize = 4*int(fwhm) + 1
44  return measAlg.DoubleGaussianPsf(ksize, ksize, fwhm/(2*math.sqrt(2*math.log(2))))
45 
46 
47 def calcEffectiveGain(maskedImage):
48  """Calculate effective gain
49 
50  @param[in] maskedImage afw.image.MaskedImage to process
51  @return (median gain, mean gain) in e-/ADU
52  """
53  im = afwImage.ImageF(maskedImage.getImage(), True)
54  var = maskedImage.getVariance()
55  im /= var
56  medgain = afwMath.makeStatistics(im, afwMath.MEDIAN).getValue()
57  meangain = afwMath.makeStatistics(im, afwMath.MEANCLIP).getValue()
58  return medgain, meangain
59 
60 
61 def transposeMaskedImage(maskedImage):
62  """Make a transposed copy of a masked image
63 
64  @param[in] maskedImage afw.image.MaskedImage to process
65  @return transposed masked image
66  """
67  transposed = maskedImage.Factory(afwGeom.Extent2I(maskedImage.getHeight(), maskedImage.getWidth()))
68  transposed.getImage().getArray()[:] = maskedImage.getImage().getArray().T
69  transposed.getMask().getArray()[:] = maskedImage.getMask().getArray().T
70  transposed.getVariance().getArray()[:] = maskedImage.getVariance().getArray().T
71  return transposed
72 
73 
74 def interpolateDefectList(maskedImage, defectList, fwhm, fallbackValue=None):
75  """Interpolate over defects specified in a defect list
76 
77  @param[in,out] maskedImage masked image to process
78  @param[in] defectList defect list
79  @param[in] fwhm FWHM of double Gaussian smoothing kernel
80  @param[in] fallbackValue fallback value if an interpolated value cannot be determined;
81  if None then use clipped mean image value
82  """
83  psf = createPsf(fwhm)
84  if fallbackValue is None:
85  fallbackValue = afwMath.makeStatistics(maskedImage.getImage(), afwMath.MEANCLIP).getValue()
86  if 'INTRP' not in maskedImage.getMask().getMaskPlaneDict():
87  maskedImage.getMask.addMaskPlane('INTRP')
88  measAlg.interpolateOverDefects(maskedImage, psf, defectList, fallbackValue, True)
89 
90 
91 def defectListFromFootprintList(fpList, growFootprints=1):
92  """Compute a defect list from a footprint list, optionally growing the footprints
93 
94  @param[in] fpList footprint list
95  @param[in] growFootprints amount by which to grow footprints of detected regions
96  @return meas.algorithms.DefectListT
97  """
98  defectList = measAlg.DefectListT()
99  for fp in fpList:
100  if growFootprints > 0:
101  # if "True", growing requires a convolution
102  # if "False", its faster
103  fpGrow = afwDetection.growFootprint(fp, growFootprints, False)
104  else:
105  fpGrow = fp
106  for bbox in afwDetection.footprintToBBoxList(fpGrow):
107  defect = measAlg.Defect(bbox)
108  defectList.push_back(defect)
109  return defectList
110 
111 
112 def transposeDefectList(defectList):
113  """Make a transposed copy of a defect list
114 
115  @param[in] defectList defect list
116  @return meas.algorithms.DefectListT with transposed defects
117  """
118  retDefectList = measAlg.DefectListT()
119  for defect in defectList:
120  bbox = defect.getBBox()
121  nbbox = afwGeom.Box2I(afwGeom.Point2I(bbox.getMinY(), bbox.getMinX()),
122  afwGeom.Extent2I(bbox.getDimensions()[1], bbox.getDimensions()[0]))
123  retDefectList.push_back(measAlg.Defect(nbbox))
124  return retDefectList
125 
126 
127 def maskPixelsFromDefectList(maskedImage, defectList, maskName='BAD'):
128  """Set mask plane based on a defect list
129 
130  @param[in,out] maskedImage afw.image.MaskedImage to process; mask plane is updated
131  @param[in] defectList meas.algorithms.DefectListT
132  @param[in] maskName mask plane name
133  """
134  # mask bad pixels
135  mask = maskedImage.getMask()
136  bitmask = mask.getPlaneBitMask(maskName)
137  for defect in defectList:
138  bbox = defect.getBBox()
140 
141 
142 def getDefectListFromMask(maskedImage, maskName, growFootprints=1):
143  """Compute a defect list from a specified mask plane
144 
145  @param[in] maskedImage masked image to process
146  @param[in] maskName mask plane name, or list of names
147  @param[in] growFootprints amount by which to grow footprints of detected regions
148  @return meas.algrithms.DefectListT of regions in mask
149  """
150  mask = maskedImage.getMask()
151  thresh = afwDetection.Threshold(mask.getPlaneBitMask(maskName), afwDetection.Threshold.BITMASK)
152  fpList = afwDetection.FootprintSet(mask, thresh).getFootprints()
153  return defectListFromFootprintList(fpList, growFootprints)
154 
155 
156 def makeThresholdMask(maskedImage, threshold, growFootprints=1, maskName='SAT'):
157  """Mask pixels based on threshold detection
158 
159  @param[in,out] maskedImage afw.image.MaskedImage to process; the mask is altered
160  @param[in] threshold detection threshold
161  @param[in] growFootprints amount by which to grow footprints of detected regions
162  @param[in] maskName mask plane name
163  @return meas.algorihtms.DefectListT of regions set in the mask.
164  """
165  # find saturated regions
166  thresh = afwDetection.Threshold(threshold)
167  fs = afwDetection.FootprintSet(maskedImage, thresh)
168 
169  if growFootprints > 0:
170  fs = afwDetection.FootprintSet(fs, growFootprints)
171 
172  fpList = fs.getFootprints()
173  # set mask
174  mask = maskedImage.getMask()
175  bitmask = mask.getPlaneBitMask(maskName)
176  afwDetection.setMaskFromFootprintList(mask, fpList, bitmask)
177 
178  return defectListFromFootprintList(fpList, growFootprints=0)
179 
180 
181 def interpolateFromMask(maskedImage, fwhm, growFootprints=1, maskName='SAT', fallbackValue=None):
182  """Interpolate over defects identified by a particular mask plane
183 
184  @param[in,out] maskedImage afw.image.MaskedImage to process
185  @param[in] fwhm FWHM of double Gaussian smoothing kernel
186  @param[in] growFootprints amount by which to grow footprints of detected regions
187  @param[in] maskName mask plane name
188  @param[in] fallbackValue value of last resort for interpolation
189  """
190  defectList = getDefectListFromMask(maskedImage, maskName, growFootprints)
191  interpolateDefectList(maskedImage, defectList, fwhm, fallbackValue=fallbackValue)
192 
193 
194 def saturationCorrection(maskedImage, saturation, fwhm, growFootprints=1, interpolate=True, maskName='SAT',
195  fallbackValue=None):
196  """Mark saturated pixels and optionally interpolate over them
197 
198  @param[in,out] maskedImage afw.image.MaskedImage to process
199  @param[in] saturation saturation level (used as a detection threshold)
200  @param[in] fwhm FWHM of double Gaussian smoothing kernel
201  @param[in] growFootprints amount by which to grow footprints of detected regions
202  @param[in] interpolate interpolate over saturated pixels?
203  @param[in] maskName mask plane name
204  @param[in] fallbackValue value of last resort for interpolation
205  """
206  defectList = makeThresholdMask(
207  maskedImage=maskedImage,
208  threshold=saturation,
209  growFootprints=growFootprints,
210  maskName=maskName,
211  )
212  if interpolate:
213  interpolateDefectList(maskedImage, defectList, fwhm, fallbackValue=fallbackValue)
214 
215 
216 def biasCorrection(maskedImage, biasMaskedImage):
217  """Apply bias correction in place
218 
219  @param[in,out] maskedImage masked image to correct
220  @param[in] biasMaskedImage bias, as a masked image
221  """
222  if maskedImage.getBBox(afwImage.LOCAL) != biasMaskedImage.getBBox(afwImage.LOCAL):
223  raise RuntimeError("maskedImage bbox %s != biasMaskedImage bbox %s" %
224  (maskedImage.getBBox(afwImage.LOCAL), biasMaskedImage.getBBox(afwImage.LOCAL)))
225  maskedImage -= biasMaskedImage
226 
227 
228 def darkCorrection(maskedImage, darkMaskedImage, expScale, darkScale):
229  """Apply dark correction in place
230 
231  maskedImage -= dark * expScaling / darkScaling
232 
233  @param[in,out] maskedImage afw.image.MaskedImage to correct
234  @param[in] darkMaskedImage dark afw.image.MaskedImage
235  @param[in] expScale exposure scale
236  @param[in] darkScale dark scale
237  """
238  if maskedImage.getBBox(afwImage.LOCAL) != darkMaskedImage.getBBox(afwImage.LOCAL):
239  raise RuntimeError("maskedImage bbox %s != darkMaskedImage bbox %s" %
240  (maskedImage.getBBox(afwImage.LOCAL), darkMaskedImage.getBBox(afwImage.LOCAL)))
241 
242  scale = expScale / darkScale
243  maskedImage.scaledMinus(scale, darkMaskedImage)
244 
245 
246 def updateVariance(maskedImage, gain, readNoise):
247  """Set the variance plane based on the image plane
248 
249  @param[in,out] maskedImage afw.image.MaskedImage; image plane is read and variance plane is written
250  @param[in] gain amplifier gain (e-/ADU)
251  @param[in] readNoise amplifier read noise (ADU/pixel)
252  """
253  var = maskedImage.getVariance()
254  var[:] = maskedImage.getImage()
255  var /= gain
256  var += readNoise**2
257 
258 
259 def flatCorrection(maskedImage, flatMaskedImage, scalingType, userScale=1.0):
260  """Apply flat correction in place
261 
262  @param[in,out] maskedImage afw.image.MaskedImage to correct
263  @param[in] flatMaskedImage flat field afw.image.MaskedImage
264  @param[in] scalingType how to compute flat scale; one of 'MEAN', 'MEDIAN' or 'USER'
265  @param[in] userScale scale to use if scalingType is 'USER', else ignored
266  """
267  if maskedImage.getBBox(afwImage.LOCAL) != flatMaskedImage.getBBox(afwImage.LOCAL):
268  raise RuntimeError("maskedImage bbox %s != flatMaskedImage bbox %s" %
269  (maskedImage.getBBox(afwImage.LOCAL), flatMaskedImage.getBBox(afwImage.LOCAL)))
270 
271  # Figure out scale from the data
272  # Ideally the flats are normalized by the calibration product pipelin, but this allows some flexibility
273  # in the case that the flat is created by some other mechanism.
274  if scalingType == 'MEAN':
275  flatScale = afwMath.makeStatistics(flatMaskedImage.getImage(), afwMath.MEAN).getValue(afwMath.MEAN)
276  elif scalingType == 'MEDIAN':
277  flatScale = afwMath.makeStatistics(flatMaskedImage.getImage(),
278  afwMath.MEDIAN).getValue(afwMath.MEDIAN)
279  elif scalingType == 'USER':
280  flatScale = userScale
281  else:
282  raise pexExcept.Exception('%s : %s not implemented' % ("flatCorrection", scalingType))
283 
284  maskedImage.scaledDivides(1.0/flatScale, flatMaskedImage)
285 
286 
287 def illuminationCorrection(maskedImage, illumMaskedImage, illumScale):
288  """Apply illumination correction in place
289 
290  @param[in,out] maskedImage afw.image.MaskedImage to correct
291  @param[in] illumMaskedImage illumination correction masked image
292  @param[in] illumScale scale value for illumination correction
293  """
294  if maskedImage.getBBox(afwImage.LOCAL) != illumMaskedImage.getBBox(afwImage.LOCAL):
295  raise RuntimeError("maskedImage bbox %s != illumMaskedImage bbox %s" %
296  (maskedImage.getBBox(afwImage.LOCAL), illumMaskedImage.getBBox(afwImage.LOCAL)))
297 
298  maskedImage.scaledDivides(1./illumScale, illumMaskedImage)
299 
300 
301 def overscanCorrection(ampMaskedImage, overscanImage, fitType='MEDIAN', order=1, collapseRej=3.0,
302  statControl=None):
303  """Apply overscan correction in place
304 
305  @param[in,out] ampMaskedImage masked image to correct
306  @param[in] overscanImage overscan data as an afw.image.Image or afw.image.MaskedImage.
307  If a masked image is passed in the mask plane will be used
308  to constrain the fit of the bias level.
309  @param[in] fitType type of fit for overscan correction; one of:
310  - 'MEAN'
311  - 'MEDIAN'
312  - 'POLY' (ordinary polynomial)
313  - 'CHEB' (Chebyshev polynomial)
314  - 'LEG' (Legendre polynomial)
315  - 'NATURAL_SPLINE', 'CUBIC_SPLINE', 'AKIMA_SPLINE' (splines)
316  @param[in] order polynomial order or spline knots (ignored unless fitType
317  indicates a polynomial or spline)
318  @param[in] collapseRej Rejection threshold (sigma) for collapsing dimension of overscan
319  @param[in] statControl Statistics control object
320  """
321  ampImage = ampMaskedImage.getImage()
322  if statControl is None:
323  statControl = afwMath.StatisticsControl()
324  if fitType == 'MEAN':
325  offImage = afwMath.makeStatistics(overscanImage, afwMath.MEAN, statControl).getValue(afwMath.MEAN)
326  elif fitType == 'MEDIAN':
327  offImage = afwMath.makeStatistics(overscanImage, afwMath.MEDIAN, statControl).getValue(afwMath.MEDIAN)
328  elif fitType in ('POLY', 'CHEB', 'LEG', 'NATURAL_SPLINE', 'CUBIC_SPLINE', 'AKIMA_SPLINE'):
329  if hasattr(overscanImage, "getImage"):
330  biasArray = overscanImage.getImage().getArray()
331  biasArray = numpy.ma.masked_where(overscanImage.getMask().getArray() & statControl.getAndMask(),
332  biasArray)
333  else:
334  biasArray = overscanImage.getArray()
335  # Fit along the long axis, so collapse along each short row and fit the resulting array
336  shortInd = numpy.argmin(biasArray.shape)
337  if shortInd == 0:
338  # Convert to some 'standard' representation to make things easier
339  biasArray = numpy.transpose(biasArray)
340 
341  # Do a single round of clipping to weed out CR hits and signal leaking into the overscan
342  percentiles = numpy.percentile(biasArray, [25.0, 50.0, 75.0], axis=1)
343  medianBiasArr = percentiles[1]
344  stdevBiasArr = 0.74*(percentiles[2] - percentiles[0]) # robust stdev
345  diff = numpy.abs(biasArray - medianBiasArr[:, numpy.newaxis])
346  biasMaskedArr = numpy.ma.masked_where(diff > collapseRej*stdevBiasArr[:, numpy.newaxis], biasArray)
347  collapsed = numpy.mean(biasMaskedArr, axis=1)
348  if collapsed.mask.sum() > 0:
349  collapsed.data[collapsed.mask] = numpy.mean(biasArray.data[collapsed.mask], axis=1)
350  del biasArray, percentiles, stdevBiasArr, diff, biasMaskedArr
351 
352  if shortInd == 0:
353  collapsed = numpy.transpose(collapsed)
354 
355  num = len(collapsed)
356  indices = 2.0*numpy.arange(num)/float(num) - 1.0
357 
358  if fitType in ('POLY', 'CHEB', 'LEG'):
359  # A numpy polynomial
360  poly = numpy.polynomial
361  fitter, evaler = {"POLY": (poly.polynomial.polyfit, poly.polynomial.polyval),
362  "CHEB": (poly.chebyshev.chebfit, poly.chebyshev.chebval),
363  "LEG": (poly.legendre.legfit, poly.legendre.legval),
364  }[fitType]
365 
366  coeffs = fitter(indices, collapsed, order)
367  fitBiasArr = evaler(indices, coeffs)
368  elif 'SPLINE' in fitType:
369  # An afw interpolation
370  numBins = order
371  #
372  # numpy.histogram needs a real array for the mask, but numpy.ma "optimises" the case
373  # no-values-are-masked by replacing the mask array by a scalar, numpy.ma.nomask
374  #
375  # Issue DM-415
376  #
377  collapsedMask = collapsed.mask
378  try:
379  if collapsedMask == numpy.ma.nomask:
380  collapsedMask = numpy.array(len(collapsed)*[numpy.ma.nomask])
381  except ValueError: # If collapsedMask is an array the test fails [needs .all()]
382  pass
383 
384  numPerBin, binEdges = numpy.histogram(indices, bins=numBins,
385  weights=1-collapsedMask.astype(int))
386  # Binning is just a histogram, with weights equal to the values.
387  # Use a similar trick to get the bin centers (this deals with different numbers per bin).
388  values = numpy.histogram(indices, bins=numBins,
389  weights=collapsed.data*~collapsedMask)[0]/numPerBin
390  binCenters = numpy.histogram(indices, bins=numBins,
391  weights=indices*~collapsedMask)[0]/numPerBin
392  interp = afwMath.makeInterpolate(binCenters.astype(float)[numPerBin > 0],
393  values.astype(float)[numPerBin > 0],
395  fitBiasArr = numpy.array([interp.interpolate(i) for i in indices])
396 
397  import lsstDebug
398  if lsstDebug.Info(__name__).display:
399  import matplotlib.pyplot as plot
400  figure = plot.figure(1)
401  figure.clear()
402  axes = figure.add_axes((0.1, 0.1, 0.8, 0.8))
403  axes.plot(indices[~collapsedMask], collapsed[~collapsedMask], 'k+')
404  if collapsedMask.sum() > 0:
405  axes.plot(indices[collapsedMask], collapsed.data[collapsedMask], 'b+')
406  axes.plot(indices, fitBiasArr, 'r-')
407  figure.show()
408  prompt = "Press Enter or c to continue [chp]... "
409  while True:
410  ans = input(prompt).lower()
411  if ans in ("", "c",):
412  break
413  if ans in ("p",):
414  import pdb
415  pdb.set_trace()
416  elif ans in ("h", ):
417  print("h[elp] c[ontinue] p[db]")
418  figure.close()
419 
420  offImage = ampImage.Factory(ampImage.getDimensions())
421  offArray = offImage.getArray()
422  if shortInd == 1:
423  offArray[:, :] = fitBiasArr[:, numpy.newaxis]
424  else:
425  offArray[:, :] = fitBiasArr[numpy.newaxis, :]
426 
427  # We don't trust any extrapolation: mask those pixels as SUSPECT
428  # This will occur when the top and or bottom edges of the overscan
429  # contain saturated values. The values will be extrapolated from
430  # the surrounding pixels, but we cannot entirely trust the value of
431  # the extrapolation, and will mark the image mask plane to flag the
432  # image as such.
433  mask = ampMaskedImage.getMask()
434  maskArray = mask.getArray() if shortInd == 1 else mask.getArray().transpose()
435  suspect = mask.getPlaneBitMask("SUSPECT")
436  try:
437  if collapsed.mask == numpy.ma.nomask:
438  # There is no mask, so the whole array is fine
439  pass
440  except ValueError: # If collapsed.mask is an array the test fails [needs .all()]
441  for low in range(num):
442  if not collapsed.mask[low]:
443  break
444  if low > 0:
445  maskArray[:low, :] |= suspect
446  for high in range(1, num):
447  if not collapsed.mask[-high]:
448  break
449  if high > 1:
450  maskArray[-high:, :] |= suspect
451 
452  else:
453  raise pexExcept.Exception('%s : %s an invalid overscan type' % \
454  ("overscanCorrection", fitType))
455  ampImage -= offImage
Interpolate::Style stringToInterpStyle(std::string const &style)
Conversion function to switch a string to an Interpolate::Style.
Definition: Interpolate.cc:263
def updateVariance
Definition: isr.py:246
boost::shared_ptr< Footprint > growFootprint(Footprint const &foot, int nGrow, bool left, bool right, bool up, bool down)
Grow a Footprint in at least one of the cardinal directions, returning a new Footprint.
def flatCorrection
Definition: isr.py:259
A Threshold is used to pass a threshold value to detection algorithms.
Definition: Threshold.h:44
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations...
def transposeDefectList
Definition: isr.py:112
boost::shared_ptr< Interpolate > makeInterpolate(ndarray::Array< double const, 1 > const &x, ndarray::Array< double const, 1 > const &y, Interpolate::Style const style)
Definition: Interpolate.cc:388
An integer coordinate rectangle.
Definition: Box.h:53
def maskPixelsFromDefectList
Definition: isr.py:127
def saturationCorrection
Definition: isr.py:195
Represent a Psf as a circularly symmetrical double Gaussian.
def interpolateDefectList
Definition: isr.py:74
Pass parameters to a Statistics objectA class to pass parameters which control how the stats are calc...
Definition: Statistics.h:92
def illuminationCorrection
Definition: isr.py:287
def calcEffectiveGain
Definition: isr.py:47
def createPsf
Definition: isr.py:37
def makeThresholdMask
Definition: isr.py:156
A set of pixels in an Image.
Definition: Footprint.h:62
def getDefectListFromMask
Definition: isr.py:142
def transposeMaskedImage
Definition: isr.py:61
def overscanCorrection
Definition: isr.py:302
std::vector< lsst::afw::geom::Box2I > footprintToBBoxList(Footprint const &foot)
Return a list of BBoxs, whose union contains exactly the pixels in foot, neither more nor less...
A set of Footprints, associated with a MaskedImage.
Definition: FootprintSet.h:55
MaskT setMaskFromFootprint(lsst::afw::image::Mask< MaskT > *mask, Footprint const &footprint, MaskT const bitmask)
OR bitmask into all the Mask&#39;s pixels that are in the Footprint.
def interpolateFromMask
Definition: isr.py:181
Statistics makeStatistics(afwImage::Mask< afwImage::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl)
Specialization to handle Masks.
Definition: Statistics.cc:1107
metadata input
MaskT setMaskFromFootprintList(lsst::afw::image::Mask< MaskT > *mask, boost::shared_ptr< std::vector< boost::shared_ptr< Footprint >> const > const &footprints, MaskT const bitmask)
OR bitmask into all the Mask&#39;s pixels which are in the set of Footprints.
def darkCorrection
Definition: isr.py:228
void interpolateOverDefects(MaskedImageT &mimage, lsst::afw::detection::Psf const &, std::vector< Defect::Ptr > &_badList, double fallbackValue, bool useFallbackValueAtEdge)
Process a set of known bad pixels in an image.
Definition: Interp.cc:2057
Encapsulate information about a bad portion of a detector.
Definition: Interp.h:70
def biasCorrection
Definition: isr.py:216
def defectListFromFootprintList
Definition: isr.py:91