예제 #1
0
    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)
예제 #2
0
    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
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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
예제 #6
0
 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()
예제 #7
0
    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()
예제 #8
0
    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)
예제 #9
0
    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