24from astropy.io.votable.tree
import Info
25from astropy.io.votable
import from_table
26from astropy.table
import Column
33 """Select records from source catalog
37 record : `lsst.afw.detect.SourceRecord`
40 'all' to select all records.
'blended parents' to select records
with
41 more than zero children.
'deblended children' to select records
with
42 non-zero parents.
'isolated' to select records that are
not blended,
43 meaning zero parents
and zero children.
44 Values to check
for sel
46 nChildren = record.get('deblend_nChild')
47 parentId = record.getParent()
48 if selection ==
'all':
50 elif selection ==
'blended parents':
51 return (nChildren > 0)
52 elif selection ==
'deblended children':
54 elif selection ==
'isolated':
55 return ((parentId == 0)
and (nChildren == 0))
57 raise RuntimeError(
'invalid selection: {}'.format(selection) +
58 '\nMust be one of "all", "blended parents", ' +
59 '"deblended children", "isolated"')
62def createFootprintsTable(catalog, xy0=None, insertColumn=4):
63 """make a VOTable of SourceData table and footprints
68 Source catalog from which to display footprints.
69 xy0 : tuple
or list
or None
70 Pixel origin to subtract off
from the footprint coordinates.
71 If
None, the value used
is (0,0)
73 Column at which to insert the
"family_id" and "category" columns
77 `astropy.io.votable.voTableFile`
78 VOTable object to upload to Firefly
84 _catalog.extend(catalog, deep=
True)
85 sourceTable = _catalog.asAstropy()
88 for colName
in sourceTable.colnames:
89 if sourceTable[colName].dtype.num == 9:
90 sourceTable[colName].dtype = np.dtype(
'long')
92 inputColumnNames = sourceTable.colnames
103 for record
in catalog:
104 footprint = record.getFootprint()
105 recordId = record.getId()
106 spans = footprint.getSpans()
107 scoords = [(s.getY()-y0, s.getX0()-x0, s.getX1()-x0)
for s
in spans]
108 scoords = np.array(scoords).flatten()
109 scoords = np.ma.MaskedArray(scoords, mask=np.zeros(len(scoords),
111 fpbbox = footprint.getBBox()
112 corners = [(c.getX()-x0, c.getY()-y0)
for c
in fpbbox.getCorners()]
113 fpxll.append(corners[0][0])
114 fpyll.append(corners[0][1])
115 fpxur.append(corners[2][0])
116 fpyur.append(corners[2][1])
117 peaks = footprint.getPeaks()
118 pcoords = [(p.getFx()-x0, p.getFy()-y0)
for p
in peaks]
119 pcoords = np.array(pcoords).flatten()
120 pcoords = np.ma.MaskedArray(pcoords, mask=np.zeros(len(pcoords),
122 fpbbox = footprint.getBBox()
123 parentId = record.getParent()
124 nChild = record.get(
'deblend_nChild')
126 familyList.append(recordId)
129 categoryList.append(
'blended parent')
132 categoryList.append(
'isolated')
135 familyList.append(parentId)
136 categoryList.append(
'deblended child')
137 spanList.append(scoords)
138 peakList.append(pcoords)
140 sourceTable.add_column(Column(np.array(familyList)),
143 sourceTable.add_column(Column(np.array(categoryList)),
145 index=insertColumn+1)
146 sourceTable.add_column(Column(np.array(spanList)), name=
'spans')
147 sourceTable.add_column(Column(np.array(peakList)), name=
'peaks')
148 sourceTable.add_column(Column(np.array(fpxll)), name=
'footprint_corner1_x')
149 sourceTable.add_column(Column(np.array(fpyll)), name=
'footprint_corner1_y')
150 sourceTable.add_column(Column(np.array(fpxur)), name=
'footprint_corner2_x')
151 sourceTable.add_column(Column(np.array(fpyur)), name=
'footprint_corner2_y')
153 outputVO = from_table(sourceTable)
154 outTable = outputVO.get_first_table()
156 outTable.infos.append(Info(name=
'contains_lsst_footprints', value=
'true'))
157 outTable.infos.append(Info(name=
'contains_lsst_measurements', value=
'true'))
158 outTable.infos.append(Info(name=
'FootPrintColumnNames',
159 value=
'id;footprint_corner1_x;footprint_corner1_y;' +
160 'footprint_corner2_x;footprint_corner2_y;spans;peaks'))
161 outTable.infos.append(Info(name=
'pixelsys', value=
'zero-based'))
163 if ((
'slot_Centroid_x' in inputColumnNames)
and
164 (
'slot_Centroid_y' in inputColumnNames)
and
165 np.isfinite(outTable.array[
'slot_Centroid_x']).any()
and
166 np.isfinite(outTable.array[
'slot_Centroid_y']).any()):
167 coord_column_string =
'slot_Centroid_x;slot_Centroid_y;ZERO_BASED'
168 elif ((
'coord_ra' in inputColumnNames)
and
169 (
'coord_dec' in inputColumnNames)
and
170 np.isfinite(outTable.array[
'coord_ra']).any()
and
171 np.isfinite(outTable.array[
'coord_dec']).any()):
172 coord_column_string =
'coord_ra;coord_dec;EQ_J2000'
173 elif ((
'base_SdssCentroid_x' in inputColumnNames)
and
174 (
'base_SdssCentroid_y' in inputColumnNames)
and
175 np.isfinite(outTable.array[
'base_SdssCentroid_x']).any()
and
176 np.isfinite(outTable.array[
'base_SdssCentroid_y']).any()):
177 coord_column_string =
'base_SdssCentroid_x;base_SdssCentroid_y;ZERO_BASED'
178 elif ((
'base_NaiveCentroid_x' in inputColumnNames)
and
179 (
'base_NaiveCentroid_y' in inputColumnNames)
and
180 np.isfinite(outTable.array[
'base_NaiveCentroid_x']).any()
and
181 np.isfinite(outTable.array[
'base_NaiveCentroid_y']).any()):
182 coord_column_string =
'base_NaiveCentroid_x;base_NaiveCentroid_y;ZERO-BASED'
184 raise RuntimeError(
'No valid coordinate columns in catalog')
185 outTable.infos.append(Info(name=
'CatalogCoordColumns',
186 value=coord_column_string))
188 for f
in outTable.fields:
189 if f.datatype ==
'bit':
190 f.datatype =
'boolean'
192 outTable._config[
'version_1_3_or_later'] =
True
193 outputVO.set_all_tables_format(
'binary2')