def testCD_PC(self): """Test that we can read a FITS file with both CD and PC keys (like early Suprimecam files)""" md = PropertyList() for k, v in ( ("EQUINOX", 2000.0), ("RADESYS", "ICRS"), ("CRPIX1", 5353.0), ("CRPIX2", -35.0), ("CD1_1", 0.0), ("CD1_2", -5.611E-05), ("CD2_1", -5.611E-05), ("CD2_2", -0.0), ("CRVAL1", 4.5789875), ("CRVAL2", 16.30004444), ("CUNIT1", "deg"), ("CUNIT2", "deg"), ("CTYPE1", "RA---TAN"), ("CTYPE2", "DEC--TAN"), ("CDELT1", -5.611E-05), ("CDELT2", 5.611E-05), ): md.set(k, v) wcs = makeSkyWcs(md, strip=False) pixPos = Point2D(1000, 2000) pred_skyPos = SpherePoint(4.459815023498577 * degrees, 16.544199850984768 * degrees) skyPos = wcs.pixelToSky(pixPos) self.assertSpherePointsAlmostEqual(skyPos, pred_skyPos) for badPC in (False, True): for k, v in ( ("PC001001", 0.0), ("PC001002", -1.0 if badPC else 1.0), ("PC002001", 1.0 if badPC else -1.0), ("PC002002", 0.0), ): md.set(k, v) # Check Greisen and Calabretta A&A 395 1061 (2002), Eq. 3 if not badPC: for i in ( 1, 2, ): for j in ( 1, 2, ): self.assertEqual( md.get("CD%d_%d" % (i, j)), md.get("CDELT%d" % i) * md.get("PC00%d00%d" % (i, j))) wcs2 = makeSkyWcs(md, strip=False) skyPos2 = wcs2.pixelToSky(pixPos) self.assertSpherePointsAlmostEqual(skyPos2, pred_skyPos)
def testSetVisitInfoMetadataMissingValues(self): """If a value is unknown then it should not be written to the metadata""" visitInfo = afwImage.makeVisitInfo() # only rot type is known metadata = PropertyList() afwImage.setVisitInfoMetadata(metadata, visitInfo) self.assertEqual(metadata.get("ROTTYPE"), RotTypeEnumNameDict[afwImage.RotType_UNKNOWN]) self.assertEqual(metadata.nameCount(), 1)
def testNoConflicts(self): """Test combination with valid values and no overlap, except COMMENT and HISTORY, which are combined """ md1 = PropertyList() md1.set("int1", [1, 2]) md1.set("float1", 1.23) md1.set("string1", "md1 string1 value") md1.set("COMMENT", "md1 comment") md1.set("HISTORY", "md1 history") md1Copy = md1.deepCopy() md2 = PropertyList() md2.set("int2", 2) md2.set("float2", [2.34, -3.45]) md2.set("string2", "md2 string2 value") md2.set("COMMENT", "md2 comment") md2.set("HISTORY", "md2 history") md2Copy = md2.deepCopy() result = combineMetadata(md1, md2) self.assertEqual(result.getOrderedNames(), [ "int1", "float1", "string1", "COMMENT", "HISTORY", "int2", "float2", "string2" ]) self.assertEqual(result.get("COMMENT"), ["md1 comment", "md2 comment"]) self.assertEqual(result.get("HISTORY"), ["md1 history", "md2 history"]) for name in md1.getOrderedNames(): if name in ("COMMENT", "HISTORY"): continue self.assertEqual(result.get(name), getLast(md1.get(name))) for name in md2.getOrderedNames(): if name in ("COMMENT", "HISTORY"): continue self.assertEqual(result.get(name), getLast(md2.get(name))) # input should be unchanged self.assertMetadataEqual(md1, md1Copy) self.assertMetadataEqual(md2, md2Copy)
def testReplaceDuplicates(self): """Test that names in `second` override those in `first`, regardless of type """ # names that start with "item" appear in both sets of metadata md1 = PropertyList() md1.set("int1", 5) md1.set("itema", [1, 2]) md1.set("float1", 3.1) md1.set("itemb", 1.23) md1.set("string1", "md1 string1 value") md1.set("itemc", "md1 string value") md1Copy = md1.deepCopy() md2 = PropertyList() md2.set("itemc", 2) md2.set("int2", 2) md2.set("itemb", ["some data", "more data"]) md2.set("float2", 2.34) md2.set("itema", 5.27) md2.set("string2", "md2 string value") md2Names = md2.getOrderedNames() md2Copy = md2.deepCopy() result = combineMetadata(md1, md2) expectedNames = ["int1", "float1", "string1"] + list(md2Names) self.assertEqual(result.getOrderedNames(), expectedNames) md2NameSet = set(md2Names) for name in result.getOrderedNames(): if name in md2NameSet: self.assertEqual(result.get(name), getLast(md2.get(name))) else: self.assertEqual(result.get(name), getLast(md1.get(name))) # input should be unchanged self.assertMetadataEqual(md1, md1Copy) self.assertMetadataEqual(md2, md2Copy)
def testSetVisitInfoMetadata(self): for item in (self.data1, self.data2): visitInfo = afwImage.VisitInfo( item.exposureId, item.exposureTime, item.darkTime, item.date, item.ut1, item.era, item.boresightRaDec, item.boresightAzAlt, item.boresightAirmass, item.boresightRotAngle, item.rotType, item.observatory, item.weather, ) metadata = PropertyList() afwImage.setVisitInfoMetadata(metadata, visitInfo) self.assertEqual(metadata.nameCount(), 20) self.assertEqual(metadata.get("EXPID"), item.exposureId) self.assertEqual(metadata.get("EXPTIME"), item.exposureTime) self.assertEqual(metadata.get("DARKTIME"), item.darkTime) self.assertEqual(metadata.get("DATE-AVG"), item.date.toString(DateTime.TAI)) self.assertEqual(metadata.get("TIMESYS"), "TAI") self.assertEqual(metadata.get("MJD-AVG-UT1"), item.ut1) self.assertEqual(metadata.get("AVG-ERA"), item.era.asDegrees()) self.assertEqual(metadata.get("BORE-RA"), item.boresightRaDec[0].asDegrees()) self.assertEqual(metadata.get("BORE-DEC"), item.boresightRaDec[1].asDegrees()) self.assertEqual(metadata.get("BORE-AZ"), item.boresightAzAlt[0].asDegrees()) self.assertEqual(metadata.get("BORE-ALT"), item.boresightAzAlt[1].asDegrees()) self.assertEqual(metadata.get("BORE-AIRMASS"), item.boresightAirmass) self.assertEqual(metadata.get("BORE-ROTANG"), item.boresightRotAngle.asDegrees()) self.assertEqual(metadata.get("ROTTYPE"), RotTypeEnumNameDict[item.rotType]) self.assertEqual(metadata.get("OBS-LONG"), item.observatory.getLongitude().asDegrees()) self.assertEqual(metadata.get("OBS-LAT"), item.observatory.getLatitude().asDegrees()) self.assertEqual(metadata.get("OBS-ELEV"), item.observatory.getElevation()) self.assertEqual(metadata.get("AIRTEMP"), item.weather.getAirTemperature()) self.assertEqual(metadata.get("AIRPRESS"), item.weather.getAirPressure()) self.assertEqual(metadata.get("HUMIDITY"), item.weather.getHumidity())