LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
exposureUtils.py
Go to the documentation of this file.
1# This file is part of afw.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22__all__ = ['bbox_to_convex_polygon', 'bbox_contains_sky_coords']
23
24import numpy as np
25import astropy.units as units
26import lsst.geom
27
28
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.
31
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.
36
37 Parameters
38 ----------
39 bbox : `lsst.geom.Box2I`
40 Bounding box to convert.
41 wcs : `lsst.afw.image.SkyWcs`
42 WCS associated with the bounding box.
43 padding : `int`
44 Pixel padding to ensure that bounding box is entirely contained
45 within the resulting polygon.
46
47 Returns
48 -------
49 convex_polygon : `lsst.sphgeom.ConvexPolygon`
50 Will be None if wcs is not valid.
51 """
52 # Convert Box2I to Box2D, without modifying original.
53 _bbox = lsst.geom.Box2D(bbox)
54 _bbox.grow(padding)
55 corners = [wcs.pixelToSky(corner).getVector()
56 for corner in _bbox.getCorners()]
57 return lsst.sphgeom.ConvexPolygon(corners)
58
59
60def bbox_contains_sky_coords(bbox, wcs, ra, dec, padding=10):
61 """Check if a set of sky positions are in the bounding box.
62
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.
69
70 Parameters
71 ----------
72 bbox : `lsst.geom.Box2I`
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.
80 padding : `int`
81 Pixel padding to ensure that bounding box is entirely contained
82 within the resulting polygon.
83
84 Returns
85 -------
86 contained : `np.ndarray`, (N,)
87 Boolean array indicating which points are contained in the
88 bounding box.
89 """
90 poly = bbox_to_convex_polygon(bbox, wcs, padding=padding)
91
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)
94
95 radec_contained = poly.contains(_ra, _dec)
96
97 contained = np.zeros_like(radec_contained, dtype=bool)
98
99 x_in, y_in = wcs.skyToPixelArray(_ra[radec_contained], _dec[radec_contained], degrees=False)
100 xy_contained = bbox.contains(x_in, y_in)
101
102 # contained[not radec_contained] is already false
103 contained[radec_contained] = xy_contained
104 return contained
A floating-point coordinate rectangle geometry.
Definition Box.h:413
ConvexPolygon is a closed convex polygon on the unit sphere.
bbox_contains_sky_coords(bbox, wcs, ra, dec, padding=10)
bbox_to_convex_polygon(bbox, wcs, padding=10)