Пример #1
0
 def runIsr(self, doCrosstalk):
     """Run DecamCpIsrTask with or without crosstalk correction
     """
     dataRef = self.butler.dataRef('raw', dataId=self.dataId)
     rawExposure = self.butler.get('raw', dataId=self.dataId)
     camera = dataRef.get('camera')
     config = getObsDecamConfig(IsrTask)
     config.doCrosstalk = doCrosstalk
     decamCpIsrTask = IsrTask(config=config)
     isrData = decamCpIsrTask.readIsrData(dataRef, rawExposure)
     isrResult = decamCpIsrTask.run(rawExposure, camera=camera, **isrData.getDict())
     return isrResult
Пример #2
0
class IsrTaskTestCases(lsst.utils.tests.TestCase):
    """Test IsrTask methods with trimmed raw data.
    """
    def setUp(self):
        self.config = IsrTaskConfig()
        self.config.qa = IsrQaConfig()
        self.task = IsrTask(config=self.config)
        self.dataRef = isrMock.DataRefMock()
        self.camera = isrMock.IsrMock().getCamera()

        self.inputExp = isrMock.TrimmedRawMock().run()
        self.amp = self.inputExp.getDetector()[0]
        self.mi = self.inputExp.getMaskedImage()

    def validateIsrData(self, results):
        """results should be a struct with components that are
        not None if included in the configuration file.
        """
        self.assertIsInstance(results, Struct)
        if self.config.doBias is True:
            self.assertIsNotNone(results.bias)
        if self.config.doDark is True:
            self.assertIsNotNone(results.dark)
        if self.config.doFlat is True:
            self.assertIsNotNone(results.flat)
        if self.config.doFringe is True:
            self.assertIsNotNone(results.fringes)
        if self.config.doDefect is True:
            self.assertIsNotNone(results.defects)
        if self.config.doBrighterFatter is True:
            self.assertIsNotNone(results.bfKernel)
        if self.config.doAttachTransmissionCurve is True:
            self.assertIsNotNone(results.opticsTransmission)
            self.assertIsNotNone(results.filterTransmission)
            self.assertIsNotNone(results.sensorTransmission)
            self.assertIsNotNone(results.atmosphereTransmission)

    def test_readIsrData_noTrans(self):
        """Test that all necessary calibration frames are retrieved.
        """
        self.config.doAttachTransmissionCurve = False
        self.task = IsrTask(config=self.config)
        results = self.task.readIsrData(self.dataRef, self.inputExp)
        self.validateIsrData(results)

    def test_readIsrData_withTrans(self):
        """Test that all necessary calibration frames are retrieved.
        """
        self.config.doAttachTransmissionCurve = True
        self.task = IsrTask(config=self.config)
        results = self.task.readIsrData(self.dataRef, self.inputExp)
        self.validateIsrData(results)

    def test_ensureExposure(self):
        """Test that an exposure has a usable instance class.
        """
        self.assertIsInstance(
            self.task.ensureExposure(self.inputExp, self.camera, 0),
            afwImage.Exposure)

    def test_convertItoF(self):
        """Test conversion from integer to floating point pixels.
        """
        result = self.task.convertIntToFloat(self.inputExp)
        self.assertEqual(result.getImage().getArray().dtype,
                         np.dtype("float32"))
        self.assertEqual(result, self.inputExp)

    def test_updateVariance(self):
        """Expect The variance image should have a larger median value after
        this operation.
        """
        statBefore = computeImageMedianAndStd(
            self.inputExp.variance[self.amp.getBBox()])
        self.task.updateVariance(self.inputExp, self.amp)
        statAfter = computeImageMedianAndStd(
            self.inputExp.variance[self.amp.getBBox()])
        self.assertGreater(statAfter[0], statBefore[0])
        self.assertFloatsAlmostEqual(statBefore[0], 0.0, atol=1e-2)
        self.assertFloatsAlmostEqual(statAfter[0], 8170.0195, atol=1e-2)

    def test_darkCorrection(self):
        """Expect the median image value should decrease after this operation.
        """
        darkIm = isrMock.DarkMock().run()

        statBefore = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.task.darkCorrection(self.inputExp, darkIm)
        statAfter = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.assertLess(statAfter[0], statBefore[0])
        self.assertFloatsAlmostEqual(statBefore[0], 8070.0195, atol=1e-2)
        self.assertFloatsAlmostEqual(statAfter[0], 8045.7773, atol=1e-2)

    def test_darkCorrection_noVisitInfo(self):
        """Expect the median image value should decrease after this operation.
        """
        darkIm = isrMock.DarkMock().run()
        darkIm.getInfo().setVisitInfo(None)

        statBefore = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.task.darkCorrection(self.inputExp, darkIm)
        statAfter = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.assertLess(statAfter[0], statBefore[0])
        self.assertFloatsAlmostEqual(statBefore[0], 8070.0195, atol=1e-2)
        self.assertFloatsAlmostEqual(statAfter[0], 8045.7773, atol=1e-2)

    def test_flatCorrection(self):
        """Expect the image median should increase (divide by < 1).
        """
        flatIm = isrMock.FlatMock().run()

        statBefore = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.task.flatCorrection(self.inputExp, flatIm)
        statAfter = computeImageMedianAndStd(
            self.inputExp.image[self.amp.getBBox()])
        self.assertGreater(statAfter[1], statBefore[1])
        self.assertFloatsAlmostEqual(statAfter[1], 147407.02, atol=1e-2)
        self.assertFloatsAlmostEqual(statBefore[1], 147.55304, atol=1e-2)

    def test_saturationDetection(self):
        """Expect the saturation level detection/masking to scale with
        threshold.
        """
        ampB = self.amp.rebuild()
        ampB.setSaturation(9000.0)
        self.task.saturationDetection(self.inputExp, ampB.finish())
        countBefore = countMaskedPixels(self.mi, "SAT")

        ampB.setSaturation(8250.0)
        self.task.saturationDetection(self.inputExp, ampB.finish())
        countAfter = countMaskedPixels(self.mi, "SAT")

        self.assertLessEqual(countBefore, countAfter)
        self.assertEqual(countBefore, 43)
        self.assertEqual(countAfter, 136)

    def test_measureBackground(self):
        """Expect the background measurement runs successfully and to save
        metadata values.
        """
        self.config.qa.flatness.meshX = 20
        self.config.qa.flatness.meshY = 20
        self.task.measureBackground(self.inputExp, self.config.qa)
        self.assertIsNotNone(self.inputExp.getMetadata().getScalar('SKYLEVEL'))

    def test_flatContext(self):
        """Expect the flat context manager runs successfully (applying both
        flat and dark within the context), and results in the same
        image data after completion.
        """
        darkExp = isrMock.DarkMock().run()
        flatExp = isrMock.FlatMock().run()

        mi = self.inputExp.getMaskedImage().clone()
        with self.task.flatContext(self.inputExp, flatExp, darkExp):
            contextStat = computeImageMedianAndStd(
                self.inputExp.getMaskedImage().getImage())
            self.assertFloatsAlmostEqual(contextStat[0], 37165.594, atol=1e-2)

        self.assertMaskedImagesAlmostEqual(mi, self.inputExp.getMaskedImage())