22__all__ = [
'bbox_to_convex_polygon',
'bbox_contains_sky_coords']
25import astropy.units
as units
29def bbox_to_convex_polygon(bbox, wcs, padding=10):
30 """Convert a bounding box and wcs to a convex polygon on the sky, with paddding.
32 The returned polygon has additional padding to ensure that the
33 bounding box is entirely contained within it. The default padding
34 size was chosen to be sufficient
for the most warped detectors at
35 the edges of the HyperSuprimeCam focal plane.
40 Bounding box to convert.
41 wcs : `lsst.afw.image.SkyWcs`
42 WCS associated
with the bounding box.
44 Pixel padding to ensure that bounding box
is entirely contained
45 within the resulting polygon.
50 Will be
None if wcs
is not valid.
55 corners = [wcs.pixelToSky(corner).getVector()
56 for corner
in _bbox.getCorners()]
60def bbox_contains_sky_coords(bbox, wcs, ra, dec, padding=10):
61 """Check if a set of sky positions are in the bounding box.
63 This uses a two-step process: first check that the coordinates are
64 inside a padded version of the bbox projected on the sky, and then
65 project the remaining points onto the bbox, to avoid inverting
66 the WCS outside of the valid region. The default padding
67 size was chosen to be sufficient
for the most warped detectors at
68 the edges of the HyperSuprimeCam focal plane.
73 Pixel bounding box to check sky positions
in.
74 wcs : `lsst.afw.image.SkyWcs`
75 WCS associated
with the bounding box.
76 ra : `astropy.Quantity`, (N,)
77 Array of Right Ascension, angular units.
78 dec : `astropy.Quantity`, (N,)
79 Array of Declination, angular units.
81 Pixel padding to ensure that bounding box
is entirely contained
82 within the resulting polygon.
86 contained : `np.ndarray`, (N,)
87 Boolean array indicating which points are contained
in the
90 poly = bbox_to_convex_polygon(bbox, wcs, padding=padding)
92 _ra = np.atleast_1d(ra.to(units.radian).value).astype(np.float64)
93 _dec = np.atleast_1d(dec.to(units.radian).value).astype(np.float64)
95 radec_contained = poly.contains(_ra, _dec)
97 x_in, y_in = wcs.skyToPixelArray(_ra, _dec, degrees=False)
99 xy_contained = bbox.contains(x_in, y_in)
101 return radec_contained & xy_contained