Coverage for python/lsst/skymap/healpixSkyMap.py: 55%

46 statements  

« prev     ^ index     » next       coverage.py v6.4, created at 2022-05-24 10:43 +0000

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010, 2012 LSST Corporation. 

4# 

5# This product includes software developed by the 

6# LSST Project (http://www.lsst.org/). 

7# 

8# This program is free software: you can redistribute it and/or modify 

9# it under the terms of the GNU General Public License as published by 

10# the Free Software Foundation, either version 3 of the License, or 

11# (at your option) any later version. 

12# 

13# This program is distributed in the hope that it will be useful, 

14# but WITHOUT ANY WARRANTY; without even the implied warranty of 

15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

16# GNU General Public License for more details. 

17# 

18# You should have received a copy of the LSST License Statement and 

19# the GNU General Public License along with this program. If not, 

20# see <http://www.lsstcorp.org/LegalNotices/>. 

21# 

22 

23__all__ = ['HealpixSkyMapConfig', 'HealpixSkyMap'] 

24 

25import struct 

26import numpy 

27 

28# We want to register the HealpixSkyMap, but want "healpy" to be an 

29# optional dependency. However, the HealpixSkyMap requires the use 

30# of healpy. Therefore, we'll only raise an exception on the healpy 

31# import when it comes time to using it. 

32try: 

33 import healpy 

34except Exception as e: 

35 class DummyHealpy: 

36 """An object which blows up when we try to read it""" 

37 

38 def __getattr__(self, name, e=e): 

39 raise RuntimeError("Was unable to import healpy: %s" % e) 

40 healpy = DummyHealpy() 

41 

42from lsst.pex.config import Field 

43import lsst.geom as geom 

44from .cachingSkyMap import CachingSkyMap 

45from .tractInfo import TractInfo 

46 

47 

48def angToCoord(thetaphi): 

49 """Convert healpy's ang to an lsst.geom.SpherePoint 

50 

51 The ang is provided as a single object, thetaphi, so the output 

52 of healpy functions can be directed to this function without 

53 additional translation. 

54 """ 

55 return geom.SpherePoint(float(thetaphi[1]), float(thetaphi[0] - 0.5*numpy.pi), geom.radians) 

56 

57 

58def coordToAng(coord): 

59 """Convert an lsst.geom.SpherePoint to a healpy ang (theta, phi) 

60 

61 The Healpix convention is that 0 <= theta <= pi, 0 <= phi < 2pi. 

62 """ 

63 return (coord.getLatitude().asRadians() + 0.5*numpy.pi, coord.getLongitude().asRadians()) 

64 

65 

66class HealpixTractInfo(TractInfo): 

67 """Tract for the HealpixSkyMap""" 

68 

69 def __init__(self, nSide, ident, nest, tractBuilder, ctrCoord, tractOverlap, wcs): 

70 """Set vertices from nside, ident, nest""" 

71 theta, phi = healpy.vec2ang(numpy.transpose(healpy.boundaries(nSide, ident, nest=nest))) 

72 vertexList = [angToCoord(thetaphi) for thetaphi in zip(theta, phi)] 

73 super(HealpixTractInfo, self).__init__(ident, tractBuilder, ctrCoord, 

74 vertexList, tractOverlap, wcs) 

75 

76 

77class HealpixSkyMapConfig(CachingSkyMap.ConfigClass): 

78 """Configuration for the HealpixSkyMap""" 

79 log2NSide = Field(dtype=int, default=0, doc="Number of sides, expressed in powers of 2") 

80 nest = Field(dtype=bool, default=False, doc="Use NEST ordering instead of RING?") 

81 

82 def setDefaults(self): 

83 self.rotation = 45 # HEALPixels are oriented at 45 degrees 

84 

85 

86class HealpixSkyMap(CachingSkyMap): 

87 """HEALPix-based sky map pixelization. 

88 

89 We put a Tract at the position of each HEALPixel. 

90 

91 

92 Parameters 

93 ---------- 

94 config : `lsst.skymap.BaseSkyMapConfig` 

95 The configuration for this SkyMap. 

96 version : `int` or `tuple` of `int` (optional) 

97 Software version of this class, to retain compatibility with old 

98 instances. 

99 """ 

100 ConfigClass = HealpixSkyMapConfig 

101 _version = (1, 0) # for pickle 

102 numAngles = 4 # Number of angles for vertices 

103 

104 def __init__(self, config, version=0): 

105 self._nside = 1 << config.log2NSide 

106 numTracts = healpy.nside2npix(self._nside) 

107 super(HealpixSkyMap, self).__init__(numTracts, config, version) 

108 

109 def findTract(self, coord): 

110 """Find the tract whose inner region includes the coord. 

111 

112 Parameters 

113 ---------- 

114 coord : `lsst.geom.SpherePoint` 

115 ICRS sky coordinate to search for. 

116 

117 Returns 

118 ------- 

119 tractInfo : `TractInfo` 

120 Info for tract whose inner region includes the coord. 

121 """ 

122 theta, phi = coordToAng(coord) 

123 index = healpy.ang2pix(self._nside, theta, phi, nest=self.config.nest) 

124 return self[index] 

125 

126 def generateTract(self, index): 

127 """Generate TractInfo for the specified tract index.""" 

128 center = angToCoord(healpy.pix2ang(self._nside, index, nest=self.config.nest)) 

129 wcs = self._wcsFactory.makeWcs(crPixPos=geom.Point2D(0, 0), crValCoord=center) 

130 return HealpixTractInfo(self._nside, index, self.config.nest, self._tractBuilder, 

131 center, self.config.tractOverlap*geom.degrees, 

132 wcs) 

133 

134 def updateSha1(self, sha1): 

135 """Add subclass-specific state or configuration options to the SHA1.""" 

136 sha1.update(struct.pack("<i?", self.config.log2NSide, self.config.nest))