def testTractSeparation(self): """Confirm that each sky tract has the proper distance to other tracts """ for numTracts in (2, 4, 25): for minDec in (-45, -2.5, 32): for deltaDec in (2, 17): maxDec = minDec + deltaDec config = EquatSkyMap.ConfigClass() config.numTracts = numTracts config.decRange = (minDec, maxDec) skyMap = EquatSkyMap(config) predDeltaRa = 360.0 / numTracts for tractId, tractInfo in enumerate(skyMap): self.assertEqual(tractInfo.getId(), tractId) prevTract, nextTract = self.getNeighborTracts( skyMap, tractId) deltaRa = tractInfo.getCtrCoord().getRa( ) - prevTract.getCtrCoord().getRa() deltaRa = deltaRa.asDegrees() raError = abs(deltaRa - predDeltaRa) % 180.0 self.assertAlmostEquals(raError, 0.0) deltaRa = nextTract.getCtrCoord().getRa( ) - tractInfo.getCtrCoord().getRa() deltaRa = deltaRa.asDegrees() raError = abs(deltaRa - predDeltaRa) % 180.0 self.assertAlmostEquals(raError, 0.0)
def testSymmetry(self): """Verify that the projection is symmetrical about the equator """ for minDec in (-5.0, -1.0, 0.5): maxDec = minDec + 2.0 config = EquatSkyMap.ConfigClass() config.decRange = minDec, maxDec skyMap = EquatSkyMap(config) for tractInfo in skyMap[0:1]: numPatches = tractInfo.getNumPatches() midXIndex = numPatches[0]//2 minPixelPosList = [] maxPixelPosList = [] maxYInd = numPatches[1] - 1 for xInd in (0, midXIndex, numPatches[0] - 1): minDecPatchInfo = tractInfo.getPatchInfo((xInd, 0)) minDecPosBox = geom.Box2D(minDecPatchInfo.getOuterBBox()) minPixelPosList += [ minDecPosBox.getMin(), geom.Point2D(minDecPosBox.getMaxX(), minDecPosBox.getMinY()), ] maxDecPatchInfo = tractInfo.getPatchInfo((xInd, maxYInd)) maxDecPosBox = geom.Box2D(maxDecPatchInfo.getOuterBBox()) maxPixelPosList += [ maxDecPosBox.getMax(), geom.Point2D(maxDecPosBox.getMinX(), maxDecPosBox.getMaxY()), ] wcs = tractInfo.getWcs() minDecList = [wcs.pixelToSky(pos).getPosition(geom.degrees)[1] for pos in minPixelPosList] maxDecList = [wcs.pixelToSky(pos).getPosition(geom.degrees)[1] for pos in maxPixelPosList] self.assertTrue(numpy.allclose(minDecList, minDecList[0])) self.assertTrue(numpy.allclose(maxDecList, maxDecList[0])) self.assertTrue(minDecList[0] <= minDec) self.assertTrue(maxDecList[0] >= maxDec)
def testFindTract(self): """Test the SkyMap.findTract method """ for numTracts in (2, 4): config = EquatSkyMap.ConfigClass() config.numTracts = numTracts skyMap = EquatSkyMap(config) decRange = skyMap.config.decRange decList = ( (decRange[0] * 0.999) + (decRange[1] * 0.901), (decRange[0] * 0.500) + (decRange[1] * 0.500), (decRange[0] * 0.091) + (decRange[1] * 0.999), ) for tractInfo0 in skyMap: tractId0 = tractInfo0.getId() ctrCoord0 = tractInfo0.getCtrCoord() for tractInfo1 in self.getNeighborTracts(skyMap, tractId0): tractId1 = tractInfo1.getId() ctrCoord1 = tractInfo1.getCtrCoord() for deltaFrac in (-0.001, 0.001): v0 = ctrCoord0.getVector() * (0.5 + deltaFrac) v1 = ctrCoord1.getVector() * (0.5 - deltaFrac) testVec = v0 + v1 testRa = geom.SpherePoint(testVec).getRa() if deltaFrac > 0.0: expectedTractId = tractId0 else: expectedTractId = tractId1 for testDecDeg in decList: testDec = geom.Angle(testDecDeg, geom.degrees) testCoord = geom.SpherePoint(testRa, testDec) nearestTractInfo = skyMap.findTract(testCoord) nearestTractId = nearestTractInfo.getId() self.assertEqual(nearestTractId, expectedTractId) patchInfo = nearestTractInfo.findPatch(testCoord) pixelInd = geom.Point2I(nearestTractInfo.getWcs().skyToPixel(testCoord)) self.assertTrue(patchInfo.getInnerBBox().contains(pixelInd)) # find a point outside the tract and make sure it fails tractInfo = tractInfo0 wcs = tractInfo.getWcs() bbox = geom.Box2D(tractInfo.getBBox()) outerPixPosList = [ bbox.getMin() - geom.Extent2D(1, 1), geom.Point2D(bbox.getMaxX(), bbox.getMinY()) - geom.Extent2D(1, 1), bbox.getMax() + geom.Extent2D(1, 1), geom.Point2D(bbox.getMinX(), bbox.getMaxY()) + geom.Extent2D(1, 1), ] for outerPixPos in outerPixPosList: testCoord = wcs.pixelToSky(outerPixPos) self.assertRaises(LookupError, tractInfo.findPatch, testCoord)
def testMoreBasicAttributes(self): """Confirm that constructor attributes are available. """ defaultSkyMap = self.getSkyMap() for numTracts in (1, 2, 4, 25): config = EquatSkyMap.ConfigClass() config.numTracts = numTracts skyMap = EquatSkyMap(config) self.assertEqual(len(skyMap), numTracts) if numTracts == defaultSkyMap.config.numTracts: self.assertEqual(skyMap, defaultSkyMap) else: self.assertNotEqual(skyMap, defaultSkyMap) for decRange in ([-1.3, 0.5], [6.1, 6.8]): config = EquatSkyMap.ConfigClass() config.decRange = decRange skyMap = EquatSkyMap(config) self.assertNotEqual(skyMap, defaultSkyMap)
def testBasicAttributes(self): """Confirm that constructor attributes are available """ for numTracts in (1, 2, 4, 25): config = EquatSkyMap.ConfigClass() config.numTracts = numTracts skyMap = EquatSkyMap(config) self.assertEqual(len(skyMap), numTracts) for tractOverlap in (0.0, 0.01, 0.1): # degrees config = EquatSkyMap.ConfigClass() config.tractOverlap = tractOverlap skyMap = EquatSkyMap(config) for tractInfo in skyMap: self.assertAlmostEqual(tractInfo.getTractOverlap().asDegrees(), tractOverlap) self.assertEqual(len(skyMap), skyMap.config.numTracts) for patchBorder in (0, 101): config = EquatSkyMap.ConfigClass() config.patchBorder = patchBorder skyMap = EquatSkyMap(config) for tractInfo in skyMap: self.assertEqual(tractInfo.getPatchBorder(), patchBorder) self.assertEqual(len(skyMap), skyMap.config.numTracts) skyMapClass = skyMapRegistry["equat"] for xInnerDim in (1005, 5062): for yInnerDim in (2032, 5431): config = skyMapClass.ConfigClass() config.patchInnerDimensions = (xInnerDim, yInnerDim) skyMap = EquatSkyMap(config) for tractInfo in skyMap: self.assertEqual( tuple(tractInfo.getPatchInnerDimensions()), (xInnerDim, yInnerDim)) self.assertEqual(len(skyMap), skyMap.config.numTracts)
def test_gettingPatchInfo(self): skyMap = EquatSkyMap(EquatSkyMap.ConfigClass()) tract = skyMap[0] # Look up patchInfo with a coordinate pair patchIndex = (3, 5) pairPatchInfo = tract.getPatchInfo(patchIndex) # Fetch the sequential index sequentialPatchIndex = tract.getSequentialPatchIndex(pairPatchInfo) # Turn the sequential index back into a pair returnedPatchIndex = tract.getPatchIndexPair(sequentialPatchIndex) # Test that the different indexes match self.assertEqual(patchIndex, returnedPatchIndex) # verify patch info can be retrieved with both indexes sequentialPatchInfo = tract.getPatchInfo(sequentialPatchIndex) self.assertEqual(pairPatchInfo, sequentialPatchInfo)
def testDefaults(self): """Test important default values """ config = EquatSkyMap.ConfigClass() skyMap = EquatSkyMap(config) self.assertEqual(skyMap.config.projection, "CEA")
def testFindTract(self): """Test the findTract method """ for numTracts in (2, 4): config = EquatSkyMap.ConfigClass() config.numTracts = numTracts skyMap = EquatSkyMap(config) decRange = skyMap.config.decRange decList = ( (decRange[0] * 0.999) + (decRange[1] * 0.901), (decRange[0] * 0.500) + (decRange[1] * 0.500), (decRange[0] * 0.091) + (decRange[1] * 0.999), ) for tractInfo0 in skyMap: tractId0 = tractInfo0.getId() ctrCoord0 = tractInfo0.getCtrCoord() vector0 = numpy.array(ctrCoord0.getVector()) for tractInfo1 in self.getNeighborTracts(skyMap, tractId0): tractId1 = tractInfo1.getId() ctrCoord1 = tractInfo1.getCtrCoord() vector1 = numpy.array(ctrCoord1.getVector()) for deltaFrac in (-0.001, 0.001): # this fuss is because Point3D does not support * float v0 = [ v * (0.5 + deltaFrac) for v in ctrCoord0.getVector() ] v1 = [ v * (0.5 - deltaFrac) for v in ctrCoord1.getVector() ] testVec = afwGeom.Point3D(*(v0[i] + v1[i] for i in range(3))) testRa = afwCoord.IcrsCoord(testVec).getRa() if deltaFrac > 0.0: expectedTractId = tractId0 else: expectedTractId = tractId1 for testDecDeg in decList: testDec = afwGeom.Angle(testDecDeg, afwGeom.degrees) testCoord = afwCoord.IcrsCoord(testRa, testDec) nearestTractInfo = skyMap.findTract(testCoord) nearestTractId = nearestTractInfo.getId() self.assertEqual(nearestTractId, expectedTractId) patchInfo = nearestTractInfo.findPatch(testCoord) pixelInd = afwGeom.Point2I( nearestTractInfo.getWcs().skyToPixel( testCoord.toIcrs())) self.assertTrue( patchInfo.getInnerBBox().contains(pixelInd)) # find a point outside the tract and make sure it fails tractInfo = tractInfo0 wcs = tractInfo.getWcs() bbox = afwGeom.Box2D(tractInfo.getBBox()) outerPixPosList = [ bbox.getMin() - afwGeom.Extent2D(1, 1), afwGeom.Point2D(bbox.getMaxX(), bbox.getMinY()) - afwGeom.Extent2D(1, 1), bbox.getMax() + afwGeom.Extent2D(1, 1), afwGeom.Point2D(bbox.getMinX(), bbox.getMaxY()) + afwGeom.Extent2D(1, 1), ] for outerPixPos in outerPixPosList: testCoord = wcs.pixelToSky(outerPixPos) self.assertRaises(LookupError, tractInfo.findPatch, testCoord)