Hide keyboard shortcuts

Hot-keys 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

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 

29 

30 

31class MakeSkyMapConfig(pexConfig.Config): 

32 """Config for MakeSkyMapTask 

33 """ 

34 coaddName = pexConfig.Field( 

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

36 dtype=str, 

37 default="deep", 

38 ) 

39 skyMap = skyMapRegistry.makeField( 

40 doc="type of skyMap", 

41 default="dodeca", 

42 ) 

43 doWrite = pexConfig.Field( 

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

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

46 dtype=bool, 

47 default=True, 

48 ) 

49 

50 

51class MakeSkyMapRunner(pipeBase.TaskRunner): 

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

53 @staticmethod 

54 def getTargetList(parsedCmd): 

55 return [parsedCmd.butler] 

56 

57 def __call__(self, butler): 

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

59 results = None # in case the task fails 

60 exitStatus = 0 # exit status for shell 

61 if self.doRaise: 

62 results = task.runDataRef(butler) 

63 else: 

64 try: 

65 results = task.runDataRef(butler) 

66 except Exception as e: 

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

68 exitStatus = 1 

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

70 traceback.print_exc(file=sys.stderr) 

71 task.writeMetadata(butler) 

72 if self.doReturnResults: 

73 return pipeBase.Struct( 

74 exitStatus=exitStatus, 

75 result=results, 

76 ) 

77 else: 

78 return pipeBase.Struct( 

79 exitStatus=exitStatus, 

80 ) 

81 

82 

83class MakeSkyMapTask(pipeBase.CmdLineTask): 

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

85 

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

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

88 """ 

89 ConfigClass = MakeSkyMapConfig 

90 _DefaultName = "makeSkyMap" 

91 RunnerClass = MakeSkyMapRunner 

92 

93 def __init__(self, **kwargs): 

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

95 

96 @pipeBase.timeMethod 

97 def runDataRef(self, butler): 

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

99 

100 @param[in] butler data butler 

101 @return a pipeBase Struct containing: 

102 - skyMap: the constructed SkyMap 

103 """ 

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

105 self.logSkyMapInfo(skyMap) 

106 if self.config.doWrite: 

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

108 return pipeBase.Struct( 

109 skyMap=skyMap 

110 ) 

111 

112 def logSkyMapInfo(self, skyMap): 

113 """!Log information about a sky map 

114 

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

116 """ 

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

118 for tractInfo in skyMap: 

119 wcs = tractInfo.getWcs() 

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

121 pixelPosList = ( 

122 posBox.getMin(), 

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

124 posBox.getMax(), 

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

126 ) 

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

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

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

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

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

132 

133 @classmethod 

134 def _makeArgumentParser(cls): 

135 """Create an argument parser 

136 

137 No identifiers are added because none are used. 

138 """ 

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

140 

141 def _getConfigName(self): 

142 """Disable persistence of config 

143 

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

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

146 written it. 

147 """ 

148 return None 

149 

150 def _getMetadataName(self): 

151 """Disable persistence of metadata 

152 

153 There's nothing worth persisting. 

154 """ 

155 return None