Coverage for python/lsst/afw/image/exposure/exposureUtils.py: 32%

17 statements  

« prev     ^ index     » next       coverage.py v6.4, created at 2022-05-24 02:38 -0700

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 x_in, y_in = wcs.skyToPixelArray(_ra, _dec, degrees=False) 

98 

99 xy_contained = bbox.contains(x_in, y_in) 

100 

101 return radec_contained & xy_contained