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

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
25import lsst.geom as geom
26import lsst.pex.config as pexConfig
27import lsst.pipe.base as pipeBase
28from lsst.skymap import skyMapRegistry
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 )
51class MakeSkyMapRunner(pipeBase.TaskRunner):
52 """Only need a single butler instance to run on."""
53 @staticmethod
54 def getTargetList(parsedCmd):
55 return [parsedCmd.butler]
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 )
83class MakeSkyMapTask(pipeBase.CmdLineTask):
84 """!Make a sky map in a repository
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
93 def __init__(self, **kwargs):
94 pipeBase.CmdLineTask.__init__(self, **kwargs)
96 @pipeBase.timeMethod
97 def runDataRef(self, butler):
98 """!Make a skymap, persist it (optionally) and log some information about it
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: 106 ↛ 108line 106 didn't jump to line 108, because the condition on line 106 was never false
107 butler.put(skyMap, self.config.coaddName + "Coadd_skyMap")
108 return pipeBase.Struct(
109 skyMap=skyMap
110 )
112 def logSkyMapInfo(self, skyMap):
113 """!Log information about a sky map
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]))
133 @classmethod
134 def _makeArgumentParser(cls):
135 """Create an argument parser
137 No identifiers are added because none are used.
138 """
139 return pipeBase.ArgumentParser(name=cls._DefaultName)
141 def _getConfigName(self):
142 """Disable persistence of config
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
150 def _getMetadataName(self):
151 """Disable persistence of metadata
153 There's nothing worth persisting.
154 """
155 return None