Coverage for python/lsst/pipe/tasks/makeSkyMap.py: 67%

Shortcuts on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

61 statements  

1# 

2# LSST Data Management System 

3# Copyright 2008-2015 AURA/LSST. 

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 <https://www.lsstcorp.org/LegalNotices/>. 

21# 

22import sys 

23import traceback 

24 

25import lsst.geom as geom 

26import lsst.pex.config as pexConfig 

27import lsst.pipe.base as pipeBase 

28from lsst.skymap import skyMapRegistry 

29from lsst.utils.timer import timeMethod 

30 

31 

32class MakeSkyMapConfig(pexConfig.Config): 

33 """Config for MakeSkyMapTask 

34 """ 

35 coaddName = pexConfig.Field( 

36 doc="coadd name, e.g. deep, goodSeeing, chiSquared", 

37 dtype=str, 

38 default="deep", 

39 ) 

40 skyMap = skyMapRegistry.makeField( 

41 doc="type of skyMap", 

42 default="dodeca", 

43 ) 

44 doWrite = pexConfig.Field( 

45 doc="persist the skyMap? If False then run generates the sky map and returns it, " 

46 "but does not save it to the data repository", 

47 dtype=bool, 

48 default=True, 

49 ) 

50 

51 

52class MakeSkyMapRunner(pipeBase.TaskRunner): 

53 """Only need a single butler instance to run on.""" 

54 @staticmethod 

55 def getTargetList(parsedCmd): 

56 return [parsedCmd.butler] 

57 

58 def __call__(self, butler): 

59 task = self.TaskClass(config=self.config, log=self.log) 

60 results = None # in case the task fails 

61 exitStatus = 0 # exit status for shell 

62 if self.doRaise: 

63 results = task.runDataRef(butler) 

64 else: 

65 try: 

66 results = task.runDataRef(butler) 

67 except Exception as e: 

68 task.log.fatal("Failed: %s", e) 

69 exitStatus = 1 

70 if not isinstance(e, pipeBase.TaskError): 

71 traceback.print_exc(file=sys.stderr) 

72 task.writeMetadata(butler) 

73 if self.doReturnResults: 

74 return pipeBase.Struct( 

75 exitStatus=exitStatus, 

76 result=results, 

77 ) 

78 else: 

79 return pipeBase.Struct( 

80 exitStatus=exitStatus, 

81 ) 

82 

83 

84class MakeSkyMapTask(pipeBase.CmdLineTask): 

85 """!Make a sky map in a repository 

86 

87 Making a sky map in a repository is a prerequisite for making a coadd, 

88 since the sky map is used as the pixelization for the coadd. 

89 """ 

90 ConfigClass = MakeSkyMapConfig 

91 _DefaultName = "makeSkyMap" 

92 RunnerClass = MakeSkyMapRunner 

93 

94 def __init__(self, **kwargs): 

95 pipeBase.CmdLineTask.__init__(self, **kwargs) 

96 

97 @timeMethod 

98 def runDataRef(self, butler): 

99 """!Make a skymap, persist it (optionally) and log some information about it 

100 

101 @param[in] butler data butler 

102 @return a pipeBase Struct containing: 

103 - skyMap: the constructed SkyMap 

104 """ 

105 skyMap = self.config.skyMap.apply() 

106 self.logSkyMapInfo(skyMap) 

107 if self.config.doWrite: 107 ↛ 109line 107 didn't jump to line 109, because the condition on line 107 was never false

108 butler.put(skyMap, self.config.coaddName + "Coadd_skyMap") 

109 return pipeBase.Struct( 

110 skyMap=skyMap 

111 ) 

112 

113 def logSkyMapInfo(self, skyMap): 

114 """!Log information about a sky map 

115 

116 @param[in] skyMap sky map (an lsst.skyMap.SkyMap) 

117 """ 

118 self.log.info("sky map has %s tracts", len(skyMap)) 

119 for tractInfo in skyMap: 

120 wcs = tractInfo.getWcs() 

121 posBox = geom.Box2D(tractInfo.getBBox()) 

122 pixelPosList = ( 

123 posBox.getMin(), 

124 geom.Point2D(posBox.getMaxX(), posBox.getMinY()), 

125 posBox.getMax(), 

126 geom.Point2D(posBox.getMinX(), posBox.getMaxY()), 

127 ) 

128 skyPosList = [wcs.pixelToSky(pos).getPosition(geom.degrees) for pos in pixelPosList] 

129 posStrList = ["(%0.3f, %0.3f)" % tuple(skyPos) for skyPos in skyPosList] 

130 self.log.info("tract %s has corners %s (RA, Dec deg) and %s x %s patches", 

131 tractInfo.getId(), ", ".join(posStrList), 

132 tractInfo.getNumPatches()[0], tractInfo.getNumPatches()[1]) 

133 

134 @classmethod 

135 def _makeArgumentParser(cls): 

136 """Create an argument parser 

137 

138 No identifiers are added because none are used. 

139 """ 

140 return pipeBase.ArgumentParser(name=cls._DefaultName) 

141 

142 def _getConfigName(self): 

143 """Disable persistence of config 

144 

145 There's only one SkyMap per rerun anyway, so the config is redundant, 

146 and checking it means we can't overwrite or append to one once we've 

147 written it. 

148 """ 

149 return None 

150 

151 def _getMetadataName(self): 

152 """Disable persistence of metadata 

153 

154 There's nothing worth persisting. 

155 """ 

156 return None