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
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())