def testRenamedMasking(self): """Test that masking works using some other mask name instead of the default """ AltMaskName = "BAD" # pick something that exists for simplicity isrConfig = ipIsr.IsrTask.ConfigClass() isrConfig.suspectMaskName = AltMaskName isrTask = ipIsr.IsrTask(config=isrConfig) maxVal = 32000 fracSuspect = 0.3 suspectLevel = maxVal * (1 - fracSuspect) bbox = self.ampInfo.getRawBBox() self.ampInfo.setSuspectLevel(suspectLevel) maskedImage = makeRampMaskedImage(bbox, 0, maxVal) imArr = maskedImage.getImage().getArray() desSetArr = imArr >= suspectLevel exposure = afwImage.ExposureF(maskedImage) inMaskedImage = maskedImage.Factory(maskedImage, True) # deep copy isrTask.suspectDetection(exposure, self.ampInfo) maskArr = maskedImage.getMask().getArray() suspectMask = maskedImage.getMask().getPlaneBitMask(AltMaskName) measSetArr = maskArr == suspectMask self.assertImagesEqual(desSetArr, measSetArr) self.assertMaskedImagesAlmostEqual(inMaskedImage, maskedImage, doMask=False)
def testDarkWithDarktimeNan(self): darkTime = 128.0 nan = float("NAN") exp = afwImage.ExposureF(1, 1) exp.getMaskedImage().getImage().set(1.0) exp.getMaskedImage().getMask().set(0) exp.getMaskedImage().getVariance().set(1.0) dark = afwImage.ExposureF(1, 1) dark.getMaskedImage().getImage().set(1.0/darkTime) dark.getMaskedImage().getMask().set(0) dark.getMaskedImage().getVariance().set(0.0) dark.getInfo().setVisitInfo(afwImage.VisitInfo()) task = ipIsr.IsrTask() # scale with darkScale=1 if the dark has darkTime=NaN. exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=darkTime)) dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan)) task.darkCorrection(exp, dark) self.assertEqual(exp.image[0, 0, afwImage.LOCAL], 0.0) self.assertEqual(exp.mask[0, 0, afwImage.LOCAL], 0) self.assertEqual(exp.variance[0, 0, afwImage.LOCAL], 1.0) self.assertEqual(exp.getInfo().getVisitInfo().getDarkTime(), darkTime) # Hasn't been modified
def checkOverscanCorrectionX(self, **kwargs): bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Point2I(12, 9)) maskedImage = afwImage.MaskedImageF(bbox) maskedImage.set(10, 0x0, 1) dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) dataImage = afwImage.MaskedImageF(maskedImage, dataBox) # these should be functionally equivalent bbox = lsst.geom.Box2I(lsst.geom.Point2I(10, 0), lsst.geom.Point2I(12, 9)) biassec = '[11:13,1:10]' overscan = afwImage.MaskedImageF(maskedImage, bbox) overscan.set(2, 0x0, 1) exposure = afwImage.ExposureF(maskedImage, None) metadata = exposure.getMetadata() metadata.setString(self.overscanKeyword, biassec) config = ipIsr.IsrTask.ConfigClass() self.updateConfigFromKwargs(config, **kwargs) isrTask = ipIsr.IsrTask(config=config) isrTask.overscan.run(dataImage, overscan.getImage()) height = maskedImage.getHeight() width = maskedImage.getWidth() for j in range(height): for i in range(width): if i >= 10: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0) else: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 8)
def checkPolyOverscanCorrectionX(self, **kwargs): bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Point2I(12, 9)) maskedImage = afwImage.MaskedImageF(bbox) maskedImage.set(10, 0x0, 1) dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) dataImage = afwImage.MaskedImageF(maskedImage, dataBox) # these should be functionally equivalent bbox = lsst.geom.Box2I(lsst.geom.Point2I(10, 0), lsst.geom.Point2I(12, 9)) overscan = afwImage.MaskedImageF(maskedImage, bbox) overscan.set(2, 0x0, 1) for i in range(bbox.getDimensions()[1]): for j, off in enumerate([-0.5, 0.0, 0.5]): overscan.image[j, i, afwImage.LOCAL] = 2+i+off config = ipIsr.IsrTask.ConfigClass() self.updateConfigFromKwargs(config, **kwargs) isrTask = ipIsr.IsrTask(config=config) isrTask.overscan.run(dataImage, overscan.getImage()) height = maskedImage.getHeight() width = maskedImage.getWidth() for j in range(height): for i in range(width): if i == 10: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], -0.5) elif i == 11: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0) elif i == 12: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0.5) else: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 10 - 2 - j)
def setUpClass(cls): """Setup butler, and generate an ISR processed exposure. Notes ----- DMTN-101 4.1: Process an independent bias frame through the ISR including overscan correction and bias subtraction """ repoDir = os.path.join("DATA/") butler = dafButler.Butler( repoDir, collections=['LATISS/raw/all', 'LATISS/calib', 'calib/v00']) config = ipIsr.IsrTaskConfig() config.doSaturation = True config.doSuspect = True config.doSetBadRegions = True config.doOverscan = True config.doBias = True config.doVariance = True config.doLinearize = False config.doCrosstalk = False config.doWidenSaturationTrails = False config.doBrighterFatter = False config.doDefect = False config.doSaturationInterpolation = False config.doDark = False config.doStrayLight = False config.doFlat = False config.doApplyGains = False config.doFringe = False config.doMeasureBackground = False config.doVignette = False config.doAttachTransmissionCurve = False config.doUseOpticsTransmission = False config.doUseFilterTransmission = False config.doUseSensorTransmission = False config.doUseAtmosphereTransmission = False isrTask = ipIsr.IsrTask(config=config) rawDataId = { 'detector': 0, 'exposure': 2020012800007, 'instrument': 'LATISS' } # TODO: DM-26396 # This is not an independent frame. cls.raw = butler.get('raw', dataId=rawDataId) cls.bias = butler.get('bias', rawDataId) cls.camera = butler.get('camera', rawDataId) results = isrTask.run(cls.raw, camera=cls.camera, bias=cls.bias) cls.exposure = results.outputExposure
def setUp(self): ampInfoShema = afwTable.AmpInfoTable.makeMinimalSchema() ampInfoCat = afwTable.AmpInfoCatalog(ampInfoShema) ampInfo = ampInfoCat.addNew() ampInfo.setRawBBox( afwGeom.Box2I(afwGeom.Point2I(-5, 7), afwGeom.Extent2I(53, 104))) ampInfo.setSuspectLevel(25000) self.ampInfo = ampInfo self.isrTask = ipIsr.IsrTask()
def setUp(self): ampInfo = cameraGeom.Amplifier.Builder() ampInfo.setRawBBox( lsst.geom.Box2I(lsst.geom.Point2I(-5, 7), lsst.geom.Extent2I(53, 104))) ampInfo.setSuspectLevel(25000) self.ampInfo = ampInfo self.isrTask = ipIsr.IsrTask()
def testBrighterFatterInterface(self): """Test brighter fatter correction interface using a delta function kernel on a flat image""" image = afwImage.ImageF(100, 100) image.set(100) ref_image = afwImage.ImageF(image, True) mi = afwImage.makeMaskedImage(image) exp = afwImage.makeExposure(mi) isrTask = ipIsr.IsrTask() with open(self.filename, 'rb') as f: bfKernel = pickle.load(f) isrTask.brighterFatterCorrection(exp, bfKernel, 5, 100, False) self.assertImagesEqual(ref_image, image)
def checkOverscanCorrectionY(self, **kwargs): bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Point2I(9, 12)) maskedImage = afwImage.MaskedImageF(bbox) maskedImage.set(10, 0x0, 1) dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) dataImage = afwImage.MaskedImageF(maskedImage, dataBox) # these should be functionally equivalent bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 10), lsst.geom.Point2I(9, 12)) biassec = '[1:10,11:13]' overscan = afwImage.MaskedImageF(maskedImage, bbox) overscan.set(2, 0x0, 1) exposure = afwImage.ExposureF(maskedImage, None) metadata = exposure.getMetadata() metadata.setString(self.overscanKeyword, biassec) config = ipIsr.IsrTask.ConfigClass() self.updateConfigFromKwargs(config, **kwargs) if kwargs['fitType'] == "MEDIAN_PER_ROW": # Add a bad point to test outlier rejection. overscan.getImage().getArray()[0, 0] = 12345 # Shrink the sigma clipping limit to handle the fact that the # bad point is not be rejected at higher thresholds (2/0.74). config.overscan.numSigmaClip = 2.7 isrTask = ipIsr.IsrTask(config=config) isrTask.overscan.run(dataImage.getImage(), overscan.getImage()) height = maskedImage.getHeight() width = maskedImage.getWidth() for j in range(height): for i in range(width): if j == 10 and i == 0 and kwargs['fitType'] == "MEDIAN_PER_ROW": self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 12343) elif j >= 10: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0) else: self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 8)
def testDarkWithDarktime(self): darkTime = 128.0 nan = float("NAN") exp = afwImage.ExposureF(1, 1) exp.getMaskedImage().getImage().set(1.0) exp.getMaskedImage().getMask().set(0) exp.getMaskedImage().getVariance().set(1.0) dark = afwImage.ExposureF(1, 1) dark.getMaskedImage().getImage().set(1.0 / darkTime) dark.getMaskedImage().getMask().set(0) dark.getMaskedImage().getVariance().set(0.0) dark.getInfo().setVisitInfo(afwImage.VisitInfo()) task = ipIsr.IsrTask() # No darktime set in at least one of the inputs exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan)) dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan)) with self.assertRaises(RuntimeError): task.darkCorrection(exp, dark) exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan)) dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=1.0)) with self.assertRaises(RuntimeError): task.darkCorrection(exp, dark) exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=1.0)) dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan)) with self.assertRaises(RuntimeError): task.darkCorrection(exp, dark) # With darktime set exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=darkTime)) dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=1.0)) task.darkCorrection(exp, dark) self.assertEqual(exp.getMaskedImage().getImage().get(0, 0), 0.0) self.assertEqual(exp.getMaskedImage().getMask().get(0, 0), 0) self.assertEqual(exp.getMaskedImage().getVariance().get(0, 0), 1.0) self.assertEqual(exp.getInfo().getVisitInfo().getDarkTime(), darkTime) # Hasn't been modified