def testArrayValues(self): """Check that only the final value is used from an array """ metadata = PropertyList() # work around DM-13232 by setting ABOOL one value at a time for value in [True, True, True, False]: metadata.add("ABOOL", value) dataList = [ ("AFLOAT", [1.2e25, -5.6]), ("ANINT", [-5, 752, 1052]), ("ASTRING1", ["value for string", "more"]), ] for name, value in dataList: metadata.set(name, value) header = makeLimitedFitsHeader(metadata) expectedLines = [ # without padding to 80 chars "ABOOL = F", "AFLOAT = -5.6", "ANINT = 1052", "ASTRING1= 'more'", ] expectedHeader = "".join("%-80s" % val for val in expectedLines) self.assertHeadersEqual(header, expectedHeader) self.checkExcludeNames(metadata, expectedLines)
def testAgainstAstropyWcs(self): skyWcs = makeSkyWcs(self.metadata, strip=False) header = makeLimitedFitsHeader(self.metadata) astropyWcs = astropy.wcs.WCS(header) self.assertSkyWcsAstropyWcsAlmostEqual(skyWcs=skyWcs, astropyWcs=astropyWcs, bbox=self.bbox)
def testBasics(self): """Check basic formatting and skipping bad values """ metadata = PropertyList() dataList = [ ("ABOOL", True), ("AFLOAT", 1.2e25), ("ANINT", -5), ("LONGNAME1", 1), # name is longer than 8 characters; skip it ("LONGSTR", "skip this item because the formatted value " "is too long: longer than 80 characters "), ("ASTRING1", "value for string"), ] for name, value in dataList: metadata.set(name, value) header = makeLimitedFitsHeader(metadata) expectedLines = [ # without padding to 80 chars "ABOOL = 1", "AFLOAT = 1.2E+25", "ANINT = -5", "ASTRING1= 'value for string'", ] expectedHeader = "".join("%-80s" % val for val in expectedLines) self.assertEqual(header, expectedHeader) self.checkExcludeNames(metadata, expectedLines)
def testAgainstAstropyWcs(self): skyWcs = makeSkyWcs(self.metadata, strip=False) header = makeLimitedFitsHeader(self.metadata) astropyWcs = astropy.wcs.WCS(header) bbox = Box2D(Point2D(-1000, -1000), Extent2D(3000, 3000)) self.assertSkyWcsAstropyWcsAlmostEqual(skyWcs=skyWcs, astropyWcs=astropyWcs, bbox=bbox)
def checkExcludeNames(self, metadata, expectedLines): """Check that makeLimitedFitsHeader properly excludes specified names """ names = metadata.names() # skip each name in turn, then skip all names at once excludeNamesList = [set([name]) for name in names] excludeNamesList.append(set(names)) for excludeNames in excludeNamesList: header = makeLimitedFitsHeader(metadata, excludeNames=excludeNames) expectedHeader = "".join("%-80s" % val for val in expectedLines if val[0:8].strip() not in excludeNames) self.assertHeadersEqual(header, expectedHeader)
def testBasics(self): """Check basic formatting and skipping bad values """ metadata = PropertyList() dataList = [ ("ABOOL", True), ("AFLOAT", 1.2e25), ("AFLOAT2", 1.0e30), ("ANINT", -5), ("AFLOATZ", 0.0), # ensure a float stays a float ("INTFLOAT", -5.0), ("LONGFLT", 0.0089626337538440005), ("ANUNDEF", None), ("LONGNAME1", 1), # name is longer than 8 characters; skip it ("LONGSTR", "skip this item because the formatted value " "is too long: longer than 80 characters "), ("ASTRING1", "value for string"), ("ANAN", float("NaN")) ] for name, value in dataList: metadata.set(name, value) header = makeLimitedFitsHeader(metadata) expectedLines = [ # without padding to 80 chars "ABOOL = T", "AFLOAT = 1.2E+25", "AFLOAT2 = 1E+30", "ANINT = -5", "AFLOATZ = 0.0", "INTFLOAT= -5.0", "LONGFLT = 0.0089626337538440005", "ANUNDEF =", "ASTRING1= 'value for string'", "ANAN =", ] expectedHeader = "".join("%-80s" % val for val in expectedLines) self.assertHeadersEqual(header, expectedHeader) self.checkExcludeNames(metadata, expectedLines)
def testSinglePrecision(self): """Check that single precision floats do work""" metadata = PropertyList() # Numeric form of single precision floats need smaller precision metadata.setFloat("SINGLE", 3.14159) metadata.setFloat("SINGLEI", 5.0) metadata.setFloat("SINGLEE", -5.9e20) metadata.setFloat("EXP", -5e10) header = makeLimitedFitsHeader(metadata) expectedLines = [ # without padding to 80 chars "SINGLE = 3.14159", "SINGLEI = 5.0", "SINGLEE = -5.9E+20", "EXP = -5E+10", ] expectedHeader = "".join("%-80s" % val for val in expectedLines) self.assertHeadersEqual(header, expectedHeader, rtol=np.finfo(np.float32).resolution)
def testBasics(self): """Check basic formatting and skipping bad values """ metadata = PropertyList() dataList = [ ("ABOOL", True), ("AFLOAT", 1.2e25), ("AFLOAT2", 1.0e30), ("ANINT", -5), ("AFLOATZ", 0.0), # ensure a float stays a float ("INTFLOAT", -5.0), ("LONGFLT", 0.0089626337538440005), ("ANUNDEF", None), ("LONGNAME1", 1), # name is longer than 8 characters; skip it ("LONGSTR", "skip this item because the formatted value " "is too long: longer than 80 characters "), ("ASTRING1", "value for string"), ] for name, value in dataList: metadata.set(name, value) header = makeLimitedFitsHeader(metadata) expectedLines = [ # without padding to 80 chars "ABOOL = T", "AFLOAT = 1.2E+25", "AFLOAT2 = 1E+30", "ANINT = -5", "AFLOATZ = 0.0", "INTFLOAT= -5.0", "LONGFLT = 0.0089626337538440005", "ANUNDEF =", "ASTRING1= 'value for string'", ] expectedHeader = "".join("%-80s" % val for val in expectedLines) self.assertHeadersEqual(header, expectedHeader) self.checkExcludeNames(metadata, expectedLines)
def testAgainstAstropyWcs(self): bbox = Box2D(Point2D(-1000, -1000), Extent2D(2000, 2000)) for crval, orientation, flipX, projection in itertools.product( self.crvalList, self.orientationList, (False, True), ("TAN", "STG", "CEA", "AIT")): cdMatrix = makeCdMatrix(scale=self.scale, orientation=orientation, flipX=flipX) metadata = makeSimpleWcsMetadata(crpix=self.crpix, crval=crval, cdMatrix=cdMatrix, projection=projection) header = makeLimitedFitsHeader(metadata) astropyWcs = astropy.wcs.WCS(header) skyWcs = makeSkyWcs(crpix=self.crpix, crval=crval, cdMatrix=cdMatrix, projection=projection) # Most projections only seem to agree to within 1e-4 in the round trip test self.assertSkyWcsAstropyWcsAlmostEqual(skyWcs=skyWcs, astropyWcs=astropyWcs, bbox=bbox)