def testCopyDetector(self): """Test copyDetector() method """ # # Make a copy without any modifications # detector = DetectorWrapper().detector ndetector = cameraGeom.copyDetector(detector) self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) self.assertEqual(detector.getPhysicalType(), ndetector.getPhysicalType()) for amp, namp in zip(detector, ndetector): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) # # Now make a copy with a hacked-up set of amps # ampInfoCatalog = detector.getAmpInfoCatalog().copy(deep=True) for i, amp in enumerate(ampInfoCatalog, 1): amp.setRawXYOffset(i*lsst.geom.ExtentI(1, 1)) ndetector = cameraGeom.copyDetector( detector, ampInfoCatalog=ampInfoCatalog) self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) for i, (amp, namp) in enumerate(zip(detector, ndetector), 1): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertNotEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) self.assertEqual(namp.getRawXYOffset()[0], i)
def testCopyDetector(self): """Test copyDetector() method """ # # Make a copy without any modifications # detector = DetectorWrapper().detector ndetector = cameraGeom.copyDetector(detector) self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) for amp, namp in zip(detector, ndetector): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) # # Now make a copy with a hacked-up set of amps # ampInfoCatalog = detector.getAmpInfoCatalog().copy(deep=True) for i, amp in enumerate(ampInfoCatalog, 1): amp.setRawXYOffset(i * lsst.geom.ExtentI(1, 1)) ndetector = cameraGeom.copyDetector(detector, ampInfoCatalog=ampInfoCatalog) self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) for i, (amp, namp) in enumerate(zip(detector, ndetector), 1): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertNotEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) self.assertEqual(namp.getRawXYOffset()[0], i)
def testDetectorRebuild(self): """Test Detector.rebuild() method """ # # Make a copy without any modifications # detector = DetectorWrapper().detector ndetector = detector.rebuild().finish() self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) self.assertEqual(detector.getPhysicalType(), ndetector.getPhysicalType()) for amp, namp in zip(detector, ndetector): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) # # Now make a copy with a hacked-up set of amps # builder = detector.rebuild() for i, amp in enumerate(builder, 1): amp.setRawXYOffset(i * lsst.geom.ExtentI(1, 1)) ndetector = builder.finish() self.assertEqual(detector.getName(), ndetector.getName()) self.assertEqual(detector.getBBox(), ndetector.getBBox()) for i, (amp, namp) in enumerate(zip(detector, ndetector), 1): self.assertEqual(amp.getBBox(), namp.getBBox()) self.assertNotEqual(amp.getRawXYOffset(), namp.getRawXYOffset()) self.assertEqual(namp.getRawXYOffset()[0], i)
def testGainAndReadnoise(self): isrTask = IsrTask() detector = DetectorWrapper().detector raw = afwImage.ExposureF(detector.getBBox()) level = 10 readNoise = 1.5 raw.image.set(level) amp = detector[0] for gain in [-1, 0, 0.1, 1, np.NaN]: # Because amplifiers are immutable, we can't change the gain or # read noise in-place. Instead, we clone, and update the clone. testAmp = Amplifier.Builder() testAmp.assign(amp) testAmp.setReadNoise(readNoise) testAmp.setGain(gain) testAmp.finish() isrTask.updateVariance(raw, testAmp) if gain <= 0: # behave the same way as amp.setGain gain = 1 if math.isnan(gain): gain = 1 self.assertEqual(raw.variance[0, 0, afwImage.LOCAL], level / gain + readNoise**2)
def testGainAndReadnoise(self): import lsst.afw.image as afwImage from lsst.afw.cameraGeom.testUtils import DetectorWrapper from lsst.ip.isr import IsrTask isrTask = IsrTask() detector = DetectorWrapper().detector raw = afwImage.ExposureF(detector.getBBox()) level = 10 readNoise = 1 raw.image.set(level) amp = detector[0] amp.setReadNoise(readNoise) for gain in [-1, 0, 0.1, 1]: amp.setGain(gain) isrTask.updateVariance(raw, amp) if gain <= 0: gain = 1 self.assertEqual(raw.variance[0, 0, afwImage.LOCAL], level / gain + readNoise**2)
def testSetPolygonIntersect(self): # Create a detector detector = DetectorWrapper().detector numPolygonPoints = 50 # Create an exposure with bounding box defined by detector exposure = afwImage.ExposureF(detector.getBBox()) exposure.setDetector(detector) pixelSizeMm = exposure.getDetector().getPixelSize()[0] pixX0 = exposure.getX0() pixY0 = exposure.getY0() pixX1 = pixX0 + exposure.getWidth() - 1 pixY1 = pixY0 + exposure.getHeight() - 1 fpCenter = exposure.getDetector().getCenter(FOCAL_PLANE) fpCenterX = fpCenter[0] fpCenterY = fpCenter[1] pixCenter = exposure.getDetector().getCenter(PIXELS) # Create an instance of IsrTask task = IsrTask() # Make a polygon that encompases entire ccd (radius of 2*max of width/height) fpRadius = 2.0*max(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeCircularPolygon(fpCenterX, fpCenterY, fpRadius, numPolygonPoints) # Set the polygon that is the intersection of fpPolygon and ccd task.setValidPolygonIntersect(exposure, fpPolygon) # Since the ccd is fully contained in the fpPolygon, the intersection should be the ccdPolygon itself ccdPolygonPix = afwGeom.Polygon(exposure.getDetector().getCorners(PIXELS)) self.assertEqual(exposure.getInfo().getValidPolygon(), ccdPolygonPix) # Make a polygon that is entirely within, but smaller than, the ccd # (radius of 0.2*min of width/height) fpRadius = 0.2*min(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeCircularPolygon(fpCenterX, fpCenterY, fpRadius, numPolygonPoints) # Set the polygon that is the intersection of fpPolygon and ccd task.setValidPolygonIntersect(exposure, fpPolygon) # all vertices of polygon should be contained within the ccd for x in exposure.getInfo().getValidPolygon(): self.assertTrue(ccdPolygonPix.contains(lsst.geom.Point2D(x))) # intersection is smaller than the ccd self.assertNotEqual(exposure.getInfo().getValidPolygon(), ccdPolygonPix) # make a simple square polygon that partly intersects the ccd, centered at ccd center fpPolygonSize = max(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeSquarePolygon(fpCenterX, fpCenterY, fpPolygonSize) task.setValidPolygonIntersect(exposure, fpPolygon) # Check that the polygon contains the central pixel (offset by one to actually be "contained") pixCenterPlusOne = lsst.geom.Point2D(pixCenter[0] + 1, pixCenter[1] + 1) self.assertTrue(exposure.getInfo().getValidPolygon().contains(lsst.geom.Point2D(pixCenterPlusOne))) # Check that the polygon contains the upper right ccd edge self.assertTrue(exposure.getInfo().getValidPolygon().contains(lsst.geom.Point2D(pixX1, pixY1)))
def testSetPolygonIntersect(self): # Create a detector detector = DetectorWrapper().detector numPolygonPoints = 50 # Create an exposure with bounding box defined by detector exposure = afwImage.ExposureF(detector.getBBox()) exposure.setDetector(detector) pixelSizeMm = exposure.getDetector().getPixelSize()[0] pixX0 = exposure.getX0() pixY0 = exposure.getY0() pixX1 = pixX0 + exposure.getWidth() - 1 pixY1 = pixY0 + exposure.getHeight() - 1 fpCenter = exposure.getDetector().getCenter(FOCAL_PLANE) fpCenterX = fpCenter[0] fpCenterY = fpCenter[1] pixCenter = exposure.getDetector().getCenter(PIXELS) # Create an instance of IsrTask task = IsrTask() # Make a polygon that encompases entire ccd (radius of 2*max of width/height) fpRadius = 2.0*max(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeCircularPolygon(fpCenterX, fpCenterY, fpRadius, numPolygonPoints) # Set the polygon that is the intersection of fpPolygon and ccd task.setValidPolygonIntersect(exposure, fpPolygon) # Since the ccd is fully contained in the fpPolygon, the intersection should be the ccdPolygon itself ccdPolygonPix = afwGeom.Polygon(exposure.getDetector().getCorners(PIXELS)) self.assertEqual(exposure.getInfo().getValidPolygon(), ccdPolygonPix) # Make a polygon that is entirely within, but smaller than, the ccd # (radius of 0.2*min of width/height) fpRadius = 0.2*min(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeCircularPolygon(fpCenterX, fpCenterY, fpRadius, numPolygonPoints) # Set the polygon that is the intersection of fpPolygon and ccd task.setValidPolygonIntersect(exposure, fpPolygon) # all vertices of polygon should be contained within the ccd for x in exposure.getInfo().getValidPolygon(): self.assertTrue(ccdPolygonPix.contains(afwGeom.Point2D(x))) # intersection is smaller than the ccd self.assertNotEqual(exposure.getInfo().getValidPolygon(), ccdPolygonPix) # make a simple square polygon that partly intersects the ccd, centered at ccd center fpPolygonSize = max(exposure.getWidth()*pixelSizeMm, exposure.getHeight()*pixelSizeMm) fpPolygon = makeSquarePolygon(fpCenterX, fpCenterY, fpPolygonSize) task.setValidPolygonIntersect(exposure, fpPolygon) # Check that the polygon contains the central pixel (offset by one to actually be "contained") pixCenterPlusOne = afwGeom.Point2D(pixCenter[0] + 1, pixCenter[1] + 1) self.assertTrue(exposure.getInfo().getValidPolygon().contains(afwGeom.Point2D(pixCenterPlusOne))) # Check that the polygon contains the upper right ccd edge self.assertTrue(exposure.getInfo().getValidPolygon().contains(afwGeom.Point2D(pixX1, pixY1)))
def testGainAndReadnoise(self): import lsst.afw.image as afwImage from lsst.afw.cameraGeom.testUtils import DetectorWrapper from lsst.ip.isr import IsrTask isrTask = IsrTask() detector = DetectorWrapper().detector raw = afwImage.ExposureF(detector.getBBox()) level = 10 readNoise = 1 raw.image.set(level) amp = detector[0] amp.setReadNoise(readNoise) for gain in [-1, 0, 0.1, 1]: amp.setGain(gain) isrTask.updateVariance(raw, amp) if gain <= 0: gain = 1 self.assertEqual(raw.variance[0, 0, afwImage.LOCAL], level/gain + readNoise**2)