Coverage for convertToFitsTable.py: 0%
48 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-12-02 02:52 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2022-12-02 02:52 +0000
1#!/usr/bin/env python
2"""Script to convert meas/astrom test data files to the new table paradigm.
4The original files are text files with id, x, y, ra, dec, psfFlux, flags columns.
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"""
11import lsst.afw.table
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}
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}
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)
93if __name__ == "__main__":
94 import sys
95 main(*sys.argv[1:])