Coverage for convertToFitsTable.py: 0%

48 statements  

« prev     ^ index     » next       coverage.py v7.2.5, created at 2023-05-03 03:20 -0700

1#!/usr/bin/env python 

2"""Script to convert meas/astrom test data files to the new table paradigm. 

3 

4The original files are text files with id, x, y, ra, dec, psfFlux, flags columns. 

5 

6The new files are FITS binary tables that can be loaded into afw.table.SourceCatalog 

7objects, and contain roughly equivalent fields that mimic those produced by common 

8measurement algorithms in meas/alg. 

9""" 

10 

11import lsst.afw.table 

12 

13oldFlags = { 

14 "EDGE": 0x000001, 

15 "SHAPE_SHIFT": 0x000002, 

16 "SHAPE_MAXITER": 0x000004, 

17 "SHAPE_UNWEIGHTED": 0x000008, 

18 "SHAPE_UNWEIGHTED_PSF": 0x000010, 

19 "SHAPE_UNWEIGHTED_BAD": 0x000020, 

20 "PEAKCENTER": 0x000040, 

21 "BINNED1": 0x000080, 

22 "INTERP": 0x000100, 

23 "INTERP_CENTER": 0x000200, 

24 "SATUR": 0x000400, 

25 "SATUR_CENTER": 0x000800, 

26 "DETECT_NEGATIVE": 0x001000, 

27 "STAR": 0x002000, 

28 "PSFSTAR": 0x004000, 

29 "PHOTOM_NO_PSF": 0x008000, 

30 "PHOTOM_NO_PEAK": 0x010000, 

31 "PHOTOM_NO_SOURCE": 0x020000, 

32 "PHOTOM_NO_FOOTPRINT": 0x040000, 

33} 

34 

35flagMapping = { 

36 "EDGE": "flags.pixel.edge", 

37 "SHAPE_SHIFT": "shape.sdss.flags.shift", 

38 "SHAPE_MAXITER": "shape.sdss.flags.maxiter", 

39 "SHAPE_UNWEIGHTED": "shape.sdss.flags.unweighted", 

40 "SHAPE_UNWEIGHTED_BAD": "shape.sdss.flags.unweightedbad", 

41 "PEAKCENTER": "flags.badcentroid", 

42 "INTERP": "flags.pixel.interpolated.any", 

43 "INTERP_CENTER": "flags.pixel.interpolated.center", 

44 "SATUR": "flags.pixel.saturated.any", 

45 "SATUR_CENTER": "flags.pixel.saturated.center", 

46} 

47 

48 

49def main(inputName, outputName): 

50 schema = lsst.afw.table.SourceTable.makeMinimalSchema() 

51 centroidKey = schema.addField("centroid", type=lsst.afw.geom.Point2D) 

52 schema.addField("centroid.flags", type="Flag") 

53 schema.addField("centroid.err", type="CovPointF") 

54 psfFluxKey = schema.addField("flux.psf", type=float) 

55 schema.addField("flux.psf.flags", type="Flag") 

56 schema.addField("flux.psf.err", type=float) 

57 for name in ("edge", "interpolated.any", "interpolated.center", "saturated.any", "saturated.center"): 

58 schema.addField("flags.pixel." + name, type="Flag") 

59 for name in ("unweightedbad", "unweighted", "shift", "maxiter"): 

60 schema.addField("shape.sdss.flags." + name, type="Flag") 

61 schema.addField("flags.badcentroid", type="Flag") 

62 outputCat = lsst.afw.table.SourceCatalog(schema) 

63 outputCat.table.defineCentroid("centroid") 

64 outputCat.table.definePsfFlux("flux.psf") 

65 with open(inputName, 'r') as inputFile: 

66 lineno = 0 

67 for line in inputFile: 

68 lineno += 1 

69 try: 

70 id, x, y, ra, dec, cts, flags = line.split() 

71 except Exception as e: 

72 print("Line %d: %s: %s" % (lineno, e, line), end=' ') 

73 record = outputCat.addNew() 

74 record.setId(int(id)) 

75 record.setRa(float(ra) * lsst.afw.geom.degrees) 

76 record.setDec(float(dec) * lsst.afw.geom.degrees) 

77 record.set(centroidKey.getX(), float(x)) 

78 record.set(centroidKey.getY(), float(y)) 

79 record.set(psfFluxKey, float(cts)) 

80 flags = int(flags) 

81 for oldName, mask in oldFlags.items(): 

82 if oldName == "BINNED1": 

83 continue 

84 if mask & flags: 

85 newName = flagMapping.get(oldName, None) 

86 if newName is None: 

87 print("Ignoring flag bit '%s'" % oldName) 

88 else: 

89 record.set(newName, True) 

90 outputCat.writeFits(outputName) 

91 

92 

93if __name__ == "__main__": 

94 import sys 

95 main(*sys.argv[1:])