139 def run(self, exposure, defects=None, keepCRs=None):
140 """Repair an Exposure's defects and cosmic rays.
144 exposure : `lsst.afw.image.Exposure`
145 Exposure must have a valid Psf.
147 defects : `lsst.meas.algorithms.DefectListT` or `None`, optional
148 If `None`, do no defect correction.
149 keepCRs : `Unknown` or `None`, optional
150 Don't interpolate over the CR pixels (defer to ``RepairConfig`` if `None`).
155 Raised if any of the following occur:
156 - No exposure provided.
157 - The object provided as exposure evaluates to False.
159 - The Exposure has no associated Psf.
161 assert exposure,
"No exposure provided"
162 psf = exposure.getPsf()
163 assert psf,
"No PSF provided"
165 frame = getDebugFrame(self._display,
"repair.before")
167 afwDisplay.Display(frame).mtv(exposure)
169 if defects
is not None and self.config.doInterpolate:
170 self.interp.run(exposure, defects=defects)
172 if self.config.doCosmicRay:
173 self.
cosmicRay(exposure, keepCRs=keepCRs)
175 frame = getDebugFrame(self._display,
"repair.after")
177 afwDisplay.Display(frame).mtv(exposure)
184 exposure : `lsst.afw.image.Exposure`
186 keepCRs : `Unknown` or `None`, optional
187 Don't interpolate over the CR pixels (defer to ``pex_config`` if `None`).
193 assert exposure,
"No exposure provided"
194 psf = exposure.getPsf()
195 assert psf,
"No psf provided"
199 mask = exposure.getMaskedImage().getMask()
200 crBit = mask.getMaskPlane(
"CR")
201 mask.clearMaskPlane(crBit)
206 binSize = self.config.cosmicray.background.binSize
207 nx, ny = exposure.getWidth()/binSize, exposure.getHeight()/binSize
211 medianBg = afwMath.makeStatistics(exposure.getMaskedImage(), afwMath.MEDIAN).getValue()
217 exposure = exposure.Factory(exposure,
True)
218 subtractBackgroundTask = measAlg.SubtractBackgroundTask(config=self.config.cosmicray.background)
219 modelBg = subtractBackgroundTask.run(exposure).background
223 keepCRs = self.config.cosmicray.keepCRs
226 crs = measAlg.findCosmicRays(
227 exposure.getMaskedImage(),
230 pexConfig.makePropertySet(self.config.cosmicray),
238 img = exposure.getMaskedImage()
239 img += modelBg.getImageF()
242 exposure0.setMaskedImage(exposure.getMaskedImage())
246 afwDisplay.Display().mtv(exposure0, title=
"Failed CR")
251 mask = exposure0.getMaskedImage().getMask()
252 crBit = mask.getPlaneBitMask(
"CR")
253 afwDet.setMaskFromFootprintList(mask, crs, crBit)
256 if display
and displayCR:
257 disp = afwDisplay.Display()
258 disp.incrDefaultFrame()
259 disp.mtv(exposure0, title=
"Post-CR")
261 with disp.Buffering():
263 afwDisplay.utils.drawBBox(cr.getBBox(), borderWidth=0.55)
265 text =
"kept" if keepCRs
else "interpolated over"
266 self.log.info(
"Identified and %s %s cosmic rays.", text, num)
267 self.metadata[
"cosmic_ray_count"] = num