lsst.pipe.tasks  13.0-51-g46e0a8d
 All Classes Namespaces Files Functions Variables Groups Pages
makeSkyMap.py
Go to the documentation of this file.
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 #
22 from __future__ import absolute_import, division, print_function
23 import sys
24 import traceback
25 
26 import lsst.afw.geom as afwGeom
27 import lsst.pex.config as pexConfig
28 import lsst.pipe.base as pipeBase
29 from lsst.skymap import skyMapRegistry
30 
31 
32 class 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 
52 class 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  if self.doRaise:
61  results = task.run(butler)
62  else:
63  try:
64  results = task.run(butler)
65  except Exception as e:
66  task.log.fatal("Failed: %s" % e)
67  if not isinstance(e, pipeBase.TaskError):
68  traceback.print_exc(file=sys.stderr)
69  task.writeMetadata(butler)
70  if self.doReturnResults:
71  return results
72 
73 
74 class MakeSkyMapTask(pipeBase.CmdLineTask):
75  """!Make a sky map in a repository
76 
77  Making a sky map in a repository is a prerequisite for making a coadd,
78  since the sky map is used as the pixelization for the coadd.
79  """
80  ConfigClass = MakeSkyMapConfig
81  _DefaultName = "makeSkyMap"
82  RunnerClass = MakeSkyMapRunner
83 
84  def __init__(self, **kwargs):
85  pipeBase.CmdLineTask.__init__(self, **kwargs)
86 
87  @pipeBase.timeMethod
88  def run(self, butler):
89  """!Make a skymap, persist it (optionally) and log some information about it
90 
91  @param[in] butler data butler
92  @return a pipeBase Struct containing:
93  - skyMap: the constructed SkyMap
94  """
95  skyMap = self.config.skyMap.apply()
96  self.logSkyMapInfo(skyMap)
97  if self.config.doWrite:
98  butler.put(skyMap, self.config.coaddName + "Coadd_skyMap")
99  return pipeBase.Struct(
100  skyMap=skyMap
101  )
102 
103  def logSkyMapInfo(self, skyMap):
104  """!Log information about a sky map
105 
106  @param[in] skyMap sky map (an lsst.skyMap.SkyMap)
107  """
108  self.log.info("sky map has %s tracts" % (len(skyMap),))
109  for tractInfo in skyMap:
110  wcs = tractInfo.getWcs()
111  posBox = afwGeom.Box2D(tractInfo.getBBox())
112  pixelPosList = (
113  posBox.getMin(),
114  afwGeom.Point2D(posBox.getMaxX(), posBox.getMinY()),
115  posBox.getMax(),
116  afwGeom.Point2D(posBox.getMinX(), posBox.getMaxY()),
117  )
118  skyPosList = [wcs.pixelToSky(pos).getPosition(afwGeom.degrees) for pos in pixelPosList]
119  posStrList = ["(%0.3f, %0.3f)" % tuple(skyPos) for skyPos in skyPosList]
120  self.log.info("tract %s has corners %s (RA, Dec deg) and %s x %s patches" %
121  (tractInfo.getId(), ", ".join(posStrList),
122  tractInfo.getNumPatches()[0], tractInfo.getNumPatches()[1]))
123 
124  @classmethod
125  def _makeArgumentParser(cls):
126  """Create an argument parser
127 
128  No identifiers are added because none are used.
129  """
130  return pipeBase.ArgumentParser(name=cls._DefaultName)
131 
132  def _getConfigName(self):
133  """Disable persistence of config
134 
135  There's only one SkyMap per rerun anyway, so the config is redundant,
136  and checking it means we can't overwrite or append to one once we've
137  written it.
138  """
139  return None
140 
141  def _getMetadataName(self):
142  """Disable persistence of metadata
143 
144  There's nothing worth persisting.
145  """
146  return None
def run
Make a skymap, persist it (optionally) and log some information about it.
Definition: makeSkyMap.py:88
def logSkyMapInfo
Log information about a sky map.
Definition: makeSkyMap.py:103
Make a sky map in a repository.
Definition: makeSkyMap.py:74