Coverage for python/lsst/afw/image/_exposure/_exposureContinued.py: 66%

61 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-03-23 03:25 -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__ = ["Exposure"] 

23 

24import numpy as np 

25 

26from lsst.utils import TemplateMeta 

27 

28from .._image._slicing import supportSlicing 

29from .._image._disableArithmetic import disableImageArithmetic 

30from .._image._fitsIoWithOptions import imageReadFitsWithOptions, exposureWriteFitsWithOptions 

31from ._exposure import ExposureI, ExposureF, ExposureD, ExposureU, ExposureL 

32from ..exposure.exposureUtils import bbox_to_convex_polygon, bbox_contains_sky_coords 

33 

34 

35class Exposure(metaclass=TemplateMeta): 

36 

37 def _set(self, index, value, origin): 

38 """Set the pixel at the given index to a triple (value, mask, variance). 

39 

40 Parameters 

41 ---------- 

42 index : `geom.Point2I` 

43 Position of the pixel to assign to. 

44 value : `tuple` 

45 A tuple of (value, mask, variance) scalars. 

46 origin : `ImageOrigin` 

47 Coordinate system of ``index`` (`PARENT` or `LOCAL`). 

48 """ 

49 self.maskedImage._set(index, value=value, origin=origin) 

50 

51 def _get(self, index, origin): 

52 """Return a triple (value, mask, variance) at the given index. 

53 

54 Parameters 

55 ---------- 

56 index : `geom.Point2I` 

57 Position of the pixel to assign to. 

58 origin : `ImageOrigin` 

59 Coordinate system of ``index`` (`PARENT` or `LOCAL`). 

60 """ 

61 return self.maskedImage._get(index, origin=origin) 

62 

63 def __reduce__(self): 

64 from lsst.afw.fits import reduceToFits 

65 return reduceToFits(self) 

66 

67 def __deepcopy__(self, memo=None): 

68 return self.clone() 

69 

70 def convertF(self): 

71 return ExposureF(self, deep=True) 

72 

73 def convertD(self): 

74 return ExposureD(self, deep=True) 

75 

76 def getImage(self): 

77 return self.maskedImage.image 

78 

79 def setImage(self, image): 

80 self.maskedImage.image = image 

81 

82 image = property(getImage, setImage) 

83 

84 def getMask(self): 

85 return self.maskedImage.mask 

86 

87 def setMask(self, mask): 

88 self.maskedImage.mask = mask 

89 

90 mask = property(getMask, setMask) 

91 

92 def getVariance(self): 

93 return self.maskedImage.variance 

94 

95 def setVariance(self, variance): 

96 self.maskedImage.variance = variance 

97 

98 variance = property(getVariance, setVariance) 

99 

100 def getConvexPolygon(self, padding=10): 

101 """Get the convex polygon associated with the bounding box corners. 

102 

103 The returned polygon has additional padding to ensure that the 

104 bounding box is entirely contained within it. To ensure a set 

105 of coordinates are entirely contained within an exposure, run 

106 ``exposure.containsSkyCoords()``. The default padding 

107 size was chosen to be sufficient for the most warped detectors at 

108 the edges of the HyperSuprimeCam focal plane. 

109 

110 Parameters 

111 ---------- 

112 padding : `int` 

113 Pixel padding to ensure that bounding box is entirely contained 

114 within the resulting polygon. 

115 

116 Returns 

117 ------- 

118 convexPolygon : `lsst.sphgeom.ConvexPolygon` 

119 Returns `None` if exposure does not have a valid WCS. 

120 """ 

121 if self.wcs is None: 

122 return None 

123 

124 return bbox_to_convex_polygon(self.getBBox(), self.wcs, padding=padding) 

125 

126 convex_polygon = property(getConvexPolygon) 

127 

128 def containsSkyCoords(self, ra, dec, padding=10): 

129 """Check if a set of sky positions is in the pixel bounding box. 

130 

131 The default padding size was chosen to be sufficient for the 

132 most warped detectors at the edges of the HyperSuprimeCam focal plane. 

133 

134 Parameters 

135 ---------- 

136 ra : `astropy.Quantity`, (N,) 

137 Array of Right Ascension, angular units. 

138 dec : `astropy.Quantity`, (N,) 

139 Array of Declination, angular units. 

140 padding : `int`, optional 

141 Pixel padding to ensure that bounding box is entirely contained 

142 within the sky polygon (see ``getConvexPolygon()``). 

143 

144 Returns 

145 ------- 

146 contained : `np.ndarray`, (N,) 

147 Boolean array indicating which points are contained in the 

148 bounding box. 

149 

150 Raises 

151 ------ 

152 ValueError if exposure does not have a valid wcs. 

153 """ 

154 if self.wcs is None: 

155 raise ValueError("Exposure does not have a valid WCS.") 

156 

157 return bbox_contains_sky_coords( 

158 self.getBBox(), 

159 self.wcs, 

160 ra, 

161 dec, 

162 padding=padding) 

163 

164 readFitsWithOptions = classmethod(imageReadFitsWithOptions) 

165 

166 writeFitsWithOptions = exposureWriteFitsWithOptions 

167 

168 

169Exposure.register(np.int32, ExposureI) 

170Exposure.register(np.float32, ExposureF) 

171Exposure.register(np.float64, ExposureD) 

172Exposure.register(np.uint16, ExposureU) 

173Exposure.register(np.uint64, ExposureL) 

174Exposure.alias("I", ExposureI) 

175Exposure.alias("F", ExposureF) 

176Exposure.alias("D", ExposureD) 

177Exposure.alias("U", ExposureU) 

178Exposure.alias("L", ExposureL) 

179 

180for cls in set(Exposure.values()): 

181 supportSlicing(cls) 

182 disableImageArithmetic(cls)