111 def run(self, exposure, defects=None, keepCRs=None):
112 """Repair an Exposure's defects and cosmic rays.
116 exposure : `lsst.afw.image.Exposure`
117 Exposure must have a valid Psf.
119 defects : `lsst.meas.algorithms.DefectListT` or `None`, optional
120 If `None`, do no defect correction.
121 keepCRs : `Unknown` or `None`, optional
122 Don't interpolate over the CR pixels (defer to ``RepairConfig`` if `None`).
127 Raised if any of the following occur:
128 - No exposure provided.
129 - The object provided as exposure evaluates to False.
131 - The Exposure has no associated Psf.
133 assert exposure,
"No exposure provided"
134 psf = exposure.getPsf()
135 assert psf,
"No PSF provided"
137 frame = getDebugFrame(self._display,
"repair.before")
139 afwDisplay.Display(frame).mtv(exposure)
141 if defects
is not None and self.config.doInterpolate:
142 self.interp.run(exposure, defects=defects)
144 if self.config.doCosmicRay:
145 self.
cosmicRay(exposure, keepCRs=keepCRs)
147 frame = getDebugFrame(self._display,
"repair.after")
149 afwDisplay.Display(frame).mtv(exposure)
156 exposure : `lsst.afw.image.Exposure`
158 keepCRs : `Unknown` or `None`, optional
159 Don't interpolate over the CR pixels (defer to ``pex_config`` if `None`).
165 assert exposure,
"No exposure provided"
166 psf = exposure.getPsf()
167 assert psf,
"No psf provided"
171 mask = exposure.getMaskedImage().getMask()
172 crBit = mask.getMaskPlane(
"CR")
173 mask.clearMaskPlane(crBit)
178 binSize = self.config.cosmicray.background.binSize
179 nx, ny = exposure.getWidth()/binSize, exposure.getHeight()/binSize
183 medianBg = afwMath.makeStatistics(exposure.getMaskedImage(), afwMath.MEDIAN).getValue()
189 exposure = exposure.Factory(exposure,
True)
190 subtractBackgroundTask = measAlg.SubtractBackgroundTask(config=self.config.cosmicray.background)
191 modelBg = subtractBackgroundTask.run(exposure).background
195 keepCRs = self.config.cosmicray.keepCRs
197 crs = measAlg.findCosmicRays(exposure.getMaskedImage(), psf, medianBg,
198 pexConfig.makePropertySet(self.config.cosmicray), keepCRs)
201 img = exposure.getMaskedImage()
202 img += modelBg.getImageF()
205 exposure0.setMaskedImage(exposure.getMaskedImage())
209 afwDisplay.Display().mtv(exposure0, title=
"Failed CR")
214 mask = exposure0.getMaskedImage().getMask()
215 crBit = mask.getPlaneBitMask(
"CR")
216 afwDet.setMaskFromFootprintList(mask, crs, crBit)
219 if display
and displayCR:
220 disp = afwDisplay.Display()
221 disp.incrDefaultFrame()
222 disp.mtv(exposure0, title=
"Post-CR")
224 with disp.Buffering():
226 afwDisplay.utils.drawBBox(cr.getBBox(), borderWidth=0.55)
228 self.log.info(
"Identified %s cosmic rays.", num)