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

45 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-12-23 01:44 -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 tractBuilder=self._tractBuilder, 

87 ctrCoord=tractCoord, 

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

89 tractOverlap=tractOverlap, 

90 wcs=wcs, 

91 ) 

92 ) 

93 

94 def __getstate__(self): 

95 """Support pickle. 

96 

97 Returns 

98 ------- 

99 result : `dict` 

100 A dict containing: 

101 - version: a pair of ints 

102 - config: the config 

103 """ 

104 return dict( 

105 version=self._version, 

106 config=self.config, 

107 ) 

108 

109 def __setstate__(self, stateDict): 

110 """Support unpickle 

111 

112 Parameters 

113 ---------- 

114 stateDict : `dict` 

115 - version: a pair of ints 

116 - config: the config 

117 """ 

118 version = stateDict["version"] 

119 if version >= (2, 0): 

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

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

122 

123 def findTract(self, coord): 

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

125 

126 Parameters 

127 ---------- 

128 coord : `lsst.geom.SpherePoint` 

129 ICRS sky coordinate to search for. 

130 

131 Returns 

132 ------- 

133 tractInfo : `TractInfo` 

134 Info for tract whose inner region includes the coord. 

135 """ 

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

137 

138 def getVersion(self): 

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

140 

141 Returns 

142 ------- 

143 version : `tuple` of `int` 

144 Version as a pair of integers. 

145 """ 

146 return self._version 

147 

148 def getWithTractsOnPoles(self): 

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

150 """ 

151 return self._dodecahedron.getWithFacesOnPoles() 

152 

153 def updateSha1(self, sha1): 

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

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