Skip to content

Commit 5d25b8b

Browse files
Merge pull request #53 from lsst/tickets/DM-53086
DM-53086: Persist the number of vertices along with the polygon corners
2 parents fa10a6f + dfc53b7 commit 5d25b8b

2 files changed

Lines changed: 38 additions & 7 deletions

File tree

python/lsst/cell_coadds/_fits.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,16 @@
114114
from ._uniform_grid import UniformGrid
115115
from .typing_helpers import SingleCellCoaddApCorrMap
116116

117-
FILE_FORMAT_VERSION = "0.6"
117+
FILE_FORMAT_VERSION = "0.7"
118118
"""Version number for the file format as persisted, presented as a string of
119119
the form M.m, where M is the major version, m is the minor version.
120120
"""
121121

122+
MAX_POLYGON_VERTICES = 6
123+
"""Maximum number of vertices the overlap polygon region between a per-detector
124+
warp and the patch bounding box can have."""
125+
# 3 vertices from the detector, 3 vertices from the patch bounding box.
126+
122127
logger = logging.getLogger(__name__)
123128

124129

@@ -328,8 +333,12 @@ def readAsMultipleCellCoadd(self) -> MultipleCellCoadd:
328333
day_obs=visit_dict[visit].day_obs,
329334
physical_filter=visit_dict[visit].physical_filter,
330335
)
336+
if written_version >= version.parse("0.7"):
337+
num_vertices = row["num_vertices"]
338+
else:
339+
num_vertices = None # li[:None] returns the entire list.
331340
visit_polygons[obs_id] = afwGeom.Polygon(
332-
[Point2D(vertex) for vertex in row["polygon_vertices"]]
341+
[Point2D(vertex) for vertex in row["polygon_vertices"][:num_vertices]]
333342
)
334343

335344
for link_row in link_table:
@@ -669,20 +678,40 @@ def writeMultipleCellCoaddAsFits(
669678
format="I",
670679
array=[obs_id.detector for obs_id in multiple_cell_coadd.common.visit_polygons],
671680
)
681+
number_of_vertices = []
672682
polygon_vertices_array = []
673-
for poly in multiple_cell_coadd.common.visit_polygons.values():
683+
for obs_id, poly in multiple_cell_coadd.common.visit_polygons.items():
684+
if num_vertices := len(poly.getVertices()) > MAX_POLYGON_VERTICES:
685+
logger.warning(
686+
"Visit %d, detector %d has a polygon with %d vertices. "
687+
"This geometry should be impossible for two intersecting "
688+
"convex quadrilaterals. Only the first %d will be stored in "
689+
"the FITS file.",
690+
obs_id.visit,
691+
obs_id.detector,
692+
num_vertices,
693+
MAX_POLYGON_VERTICES,
694+
)
695+
number_of_vertices.append(num_vertices)
674696
vertices = poly.getVertices() + poly.getVertices()
675-
vertices = vertices[:6]
697+
vertices = vertices[:MAX_POLYGON_VERTICES]
676698
polygon_vertices_array.append(np.array(vertices))
677699
polygon_column = fits.Column(
678700
name="polygon_vertices",
679-
format="12E",
680-
dim="(2,6)",
701+
format=f"{2 * MAX_POLYGON_VERTICES}E",
702+
dim=f"(2,{MAX_POLYGON_VERTICES})",
681703
array=polygon_vertices_array,
682704
)
705+
number_of_vertices_column = fits.Column(
706+
name="num_vertices",
707+
format="I",
708+
array=number_of_vertices,
709+
)
683710
visit_summary_hdu = fits.BinTableHDU.from_columns(
684-
[visit_column, detector_column, polygon_column], name="VISIT_SUMMARY"
711+
[visit_column, detector_column, number_of_vertices_column, polygon_column],
712+
name="VISIT_SUMMARY",
685713
)
714+
visit_summary_hdu.header["POLYVERT"] = MAX_POLYGON_VERTICES
686715

687716
visit_recarray = np.rec.fromrecords(
688717
recList=sorted(set(visit_records), key=lambda x: x[0]), # Sort by visit.

tests/test_coadds.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ def test_fits(self):
377377
# By transititve property of equality, mcc1 == mcc2.
378378

379379
self.assertEqual(self.multiple_cell_coadd.band, self.multiple_cell_coadd.common.band)
380+
for poly in self.multiple_cell_coadd.common.visit_polygons.values():
381+
self.assertEqual(len(poly), 4)
380382
self.assertEqual(
381383
wcs.getFitsMetadata().toString(), self.multiple_cell_coadd.wcs.getFitsMetadata().toString()
382384
)

0 commit comments

Comments
 (0)