Coverage for python/lsst/skymap/dodecaSkyMap.py: 41%

45 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-02-05 17:57 -0800

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010 LSST Corporation. 

4# 

5# This product includes software developed by the 

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

7# 

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 LSST License Statement and 

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

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

22# 

23 

24"""Consider tweaking pixel scale so the average scale is as specified, rather 

25than the scale at the center. 

26""" 

27 

28__all__ = ['DodecaSkyMapConfig', 'DodecaSkyMap'] 

29 

30import struct 

31 

32import lsst.pex.config as pexConfig 

33import lsst.geom as geom 

34from . import detail 

35from .baseSkyMap import BaseSkyMap 

36from .tractInfo import TractInfo 

37 

38 

39class DodecaSkyMapConfig(BaseSkyMap.ConfigClass): 

40 withTractsOnPoles = pexConfig.Field( 

41 doc="if True center a tract on each pole, else put a vertex on each pole", 

42 dtype=bool, 

43 default=False, 

44 ) 

45 

46 def setDefaults(self): 

47 self.tractOverlap = 3.5 

48 self.patchBorder = 250 

49 self.pixelScale = 10.0 / 50.0 # LSST plate scale is 50 um/arcsec and pixel size is 10 um 

50 self.patchInnerDimensions = (4000, 4000) 

51 self.projection = "STG" 

52 

53 

54class DodecaSkyMap(BaseSkyMap): 

55 """Dodecahedron-based sky map pixelization. 

56 

57 DodecaSkyMap divides the sky into 12 overlapping Tracts arranged as the 

58 faces of a dodecahedron. 

59 

60 Parameters 

61 ---------- 

62 config : `lsst.skymap.BaseSkyMapConfig` (optional) 

63 The configuration for this SkyMap; if None use the default config. 

64 """ 

65 ConfigClass = DodecaSkyMapConfig 

66 _version = (1, 0) # for pickle 

67 

68 def __init__(self, config=None): 

69 BaseSkyMap.__init__(self, config) 

70 self._dodecahedron = detail.Dodecahedron(withFacesOnPoles=self.config.withTractsOnPoles) 

71 

72 tractOverlap = geom.Angle(self.config.tractOverlap, geom.degrees) 

73 

74 for id in range(12): 

75 tractVec = self._dodecahedron.getFaceCtr(id) 

76 tractCoord = detail.coordFromVec(tractVec, defRA=geom.Angle(0)) 

77 tractRA = tractCoord.getLongitude() 

78 vertexVecList = self._dodecahedron.getVertices(id) 

79 

80 # make initial WCS; don't worry about crPixPos because TractInfo will shift it as required 

81 wcs = self._wcsFactory.makeWcs(crPixPos=geom.Point2D(0, 0), crValCoord=tractCoord) 

82 

83 self._tractInfoList.append( 

84 TractInfo( 

85 id=id, 

86 patchInnerDimensions=self.config.patchInnerDimensions, 

87 patchBorder=self.config.patchBorder, 

88 ctrCoord=tractCoord, 

89 vertexCoordList=[detail.coordFromVec(vec, defRA=tractRA) for vec in vertexVecList], 

90 tractOverlap=tractOverlap, 

91 wcs=wcs, 

92 ) 

93 ) 

94 

95 def __getstate__(self): 

96 """Support pickle. 

97 

98 Returns 

99 ------- 

100 result : `dict` 

101 A dict containing: 

102 - version: a pair of ints 

103 - config: the config 

104 """ 

105 return dict( 

106 version=self._version, 

107 config=self.config, 

108 ) 

109 

110 def __setstate__(self, stateDict): 

111 """Support unpickle 

112 

113 Parameters 

114 ---------- 

115 stateDict : `dict` 

116 - version: a pair of ints 

117 - config: the config 

118 """ 

119 version = stateDict["version"] 

120 if version >= (2, 0): 

121 raise RuntimeError("Version = %s >= (2,0); cannot unpickle" % (version,)) 

122 self.__init__(stateDict["config"]) 

123 

124 def findTract(self, coord): 

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

126 

127 Parameters 

128 ---------- 

129 coord : `lsst.geom.SpherePoint` 

130 ICRS sky coordinate to search for. 

131 

132 Returns 

133 ------- 

134 tractInfo : `TractInfo` 

135 Info for tract whose inner region includes the coord. 

136 """ 

137 return self[self._dodecahedron.getFaceInd(coord.getVector())] 

138 

139 def getVersion(self): 

140 """Return version (e.g. for pickle). 

141 

142 Returns 

143 ------- 

144 version : `tuple` of `int` 

145 Version as a pair of integers. 

146 """ 

147 return self._version 

148 

149 def getWithTractsOnPoles(self): 

150 """Return True if there are tracts centered on the poles. 

151 """ 

152 return self._dodecahedron.getWithFacesOnPoles() 

153 

154 def updateSha1(self, sha1): 

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

156 sha1.update(struct.pack("<?", self.config.withTractsOnPoles))