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