def maskAndInterpDefect(self, ccdExposure, defectBaseList): """Mask defects and edges, interpolate over defects in place Mask defect pixels using mask plane BAD and interpolate over them. Mask the potentially problematic glowing edges as SUSPECT. Parameters ---------- ccdExposure : `lsst.afw.image.Exposure` exposure to process defectBaseList : `list` a list of defects to mask and interpolate Returns ------- ccdExposure : `lsst.afw.image.Exposure` exposure corrected in place """ IsrTask.maskAndInterpDefect(self, ccdExposure, defectBaseList) maskedImage = ccdExposure.getMaskedImage() goodBBox = maskedImage.getBBox() # This makes a bbox numEdgeSuspect pixels smaller than the image on each side goodBBox.grow(-self.config.numEdgeSuspect) # Mask pixels outside goodBBox as SUSPECT SourceDetectionTask.setEdgeBits( maskedImage, goodBBox, maskedImage.getMask().getPlaneBitMask("SUSPECT"))
def flatCorrection(self, exposure, flatExposure): """Apply flat correction in place DECam flat products have been trimmed and are smaller than the raw exposure. The size of edge trim is computed based on the dimensions of the input data. Only process the inner part of the raw exposure, and mask the outer pixels as EDGE. @param[in,out] exposure: exposure to process @param[in] flatExposure: flatfield exposure """ nEdge = _computeEdgeSize(exposure, flatExposure) if nEdge > 0: rawMaskedImage = exposure.getMaskedImage()[nEdge:-nEdge, nEdge:-nEdge] else: rawMaskedImage = exposure.getMaskedImage() flatCorrection( rawMaskedImage, flatExposure.getMaskedImage(), self.config.flatScalingType, self.config.flatUserScale ) # Mask the unprocessed edge pixels as EDGE SourceDetectionTask.setEdgeBits( exposure.getMaskedImage(), rawMaskedImage.getBBox(), exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE"), )
def maskAndInterpDefect(self, ccdExposure, defectBaseList): """Mask defects and edges, interpolate over defects in place Mask defect pixels using mask plane BAD and interpolate over them. Mask the potentially problematic glowing edges as SUSPECT. @param[in,out] ccdExposure: exposure to process @param[in] defectBaseList: a list of defects to mask and interpolate """ IsrTask.maskAndInterpDefect(self, ccdExposure, defectBaseList) maskedImage = ccdExposure.getMaskedImage() goodBBox = maskedImage.getBBox() # This makes a bbox numEdgeSuspect pixels smaller than the image on each side goodBBox.grow(-self.config.numEdgeSuspect) # Mask pixels outside goodBBox as SUSPECT SourceDetectionTask.setEdgeBits(maskedImage, goodBBox, maskedImage.getMask().getPlaneBitMask("SUSPECT"))
def trimToMatchCalibBBox(rawMaskedImage, calibMaskedImage): """Compute number of edge trim pixels to match the calibration data. Use the dimension difference between the raw exposure and the calibration exposure to compute the edge trim pixels. This trim is applied symmetrically, with the same number of pixels masked on each side. Parameters ---------- rawMaskedImage : `lsst.afw.image.MaskedImage` Image to trim. calibMaskedImage : `lsst.afw.image.MaskedImage` Calibration image to draw new bounding box from. Returns ------- replacementMaskedImage : `lsst.afw.image.MaskedImage` ``rawMaskedImage`` trimmed to the appropriate size Raises ------ RuntimeError Rasied if ``rawMaskedImage`` cannot be symmetrically trimmed to match ``calibMaskedImage``. """ nx, ny = rawMaskedImage.getBBox().getDimensions( ) - calibMaskedImage.getBBox().getDimensions() if nx != ny: raise RuntimeError( "Raw and calib maskedImages are trimmed differently in X and Y.") if nx % 2 != 0: raise RuntimeError("Calibration maskedImage is trimmed unevenly in X.") if nx < 0: raise RuntimeError("Calibration maskedImage is larger than raw data.") nEdge = nx // 2 if nEdge > 0: replacementMaskedImage = rawMaskedImage[nEdge:-nEdge, nEdge:-nEdge, afwImage.LOCAL] SourceDetectionTask.setEdgeBits( rawMaskedImage, replacementMaskedImage.getBBox(), rawMaskedImage.getMask().getPlaneBitMask("EDGE")) else: replacementMaskedImage = rawMaskedImage return replacementMaskedImage
def trimToMatchCalibBBox(rawMaskedImage, calibMaskedImage): """Compute number of edge trim pixels to match the calibration data. Use the dimension difference between the raw exposure and the calibration exposure to compute the edge trim pixels. This trim is applied symmetrically, with the same number of pixels masked on each side. Parameters ---------- rawMaskedImage : `lsst.afw.image.MaskedImage` Image to trim. calibMaskedImage : `lsst.afw.image.MaskedImage` Calibration image to draw new bounding box from. Returns ------- replacementMaskedImage : `lsst.afw.image.MaskedImage` ``rawMaskedImage`` trimmed to the appropriate size Raises ------ RuntimeError Rasied if ``rawMaskedImage`` cannot be symmetrically trimmed to match ``calibMaskedImage``. """ nx, ny = rawMaskedImage.getBBox().getDimensions() - calibMaskedImage.getBBox().getDimensions() if nx != ny: raise RuntimeError("Raw and calib maskedImages are trimmed differently in X and Y.") if nx % 2 != 0: raise RuntimeError("Calibration maskedImage is trimmed unevenly in X.") if nx < 0: raise RuntimeError("Calibration maskedImage is larger than raw data.") nEdge = nx//2 if nEdge > 0: replacementMaskedImage = rawMaskedImage[nEdge:-nEdge, nEdge:-nEdge, afwImage.LOCAL] SourceDetectionTask.setEdgeBits( rawMaskedImage, replacementMaskedImage.getBBox(), rawMaskedImage.getMask().getPlaneBitMask("EDGE") ) else: replacementMaskedImage = rawMaskedImage return replacementMaskedImage
def biasCorrection(self, exposure, biasExposure): """Apply bias correction in place DECam bias products have been trimmed and are smaller than the raw exposure. The size of edge trim is computed based on the dimensions of the input data. Only process the inner part of the raw exposure, and mask the outer pixels as EDGE. @param[in,out] exposure: exposure to process @param[in] biasExposure: bias exposure """ nEdge = _computeEdgeSize(exposure, biasExposure) if nEdge > 0: rawMaskedImage = exposure.getMaskedImage()[nEdge:-nEdge, nEdge:-nEdge] else: rawMaskedImage = exposure.getMaskedImage() biasCorrection(rawMaskedImage, biasExposure.getMaskedImage()) # Mask the unprocessed edge pixels as EDGE SourceDetectionTask.setEdgeBits( exposure.getMaskedImage(), rawMaskedImage.getBBox(), exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE"))
def flatCorrection(self, exposure, flatExposure): """Apply flat correction in place DECam flat products have been trimmed and are smaller than the raw exposure. The size of edge trim is computed based on the dimensions of the input data. Only process the inner part of the raw exposure, and mask the outer pixels as EDGE. @param[in,out] exposure: exposure to process @param[in] flatExposure: flatfield exposure """ nEdge = _computeEdgeSize(exposure, flatExposure) if nEdge > 0: rawMaskedImage = exposure.getMaskedImage()[nEdge:-nEdge, nEdge:-nEdge] else: rawMaskedImage = exposure.getMaskedImage() flatCorrection(rawMaskedImage, flatExposure.getMaskedImage(), self.config.flatScalingType, self.config.flatUserScale) # Mask the unprocessed edge pixels as EDGE SourceDetectionTask.setEdgeBits( exposure.getMaskedImage(), rawMaskedImage.getBBox(), exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE"))
def biasCorrection(self, exposure, biasExposure): """Apply bias correction in place DECam bias products have been trimmed and are smaller than the raw exposure. The size of edge trim is computed based on the dimensions of the input data. Only process the inner part of the raw exposure, and mask the outer pixels as EDGE. @param[in,out] exposure: exposure to process @param[in] biasExposure: bias exposure """ nEdge = _computeEdgeSize(exposure, biasExposure) if nEdge > 0: rawMaskedImage = exposure.getMaskedImage()[nEdge:-nEdge, nEdge:-nEdge] else: rawMaskedImage = exposure.getMaskedImage() biasCorrection(rawMaskedImage, biasExposure.getMaskedImage()) # Mask the unprocessed edge pixels as EDGE SourceDetectionTask.setEdgeBits( exposure.getMaskedImage(), rawMaskedImage.getBBox(), exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE"), )