LSSTApplications  20.0.0
LSSTDataManagementBasePackage
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 import sys
23 import traceback
24 
25 import lsst.geom as geom
26 import lsst.pex.config as pexConfig
27 import lsst.pipe.base as pipeBase
28 from lsst.skymap import skyMapRegistry
29 
30 
31 class 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 
51 class 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 
83 class 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
lsst.pipe.tasks.makeSkyMap.MakeSkyMapRunner
Definition: makeSkyMap.py:51
lsst::log.log.logContinued.info
def info(fmt, *args)
Definition: logContinued.py:198
lsst.pipe.tasks.makeSkyMap.MakeSkyMapTask._DefaultName
_DefaultName
Definition: makeSkyMap.py:90
lsst.pipe.tasks.makeSkyMap.MakeSkyMapTask
Make a sky map in a repository.
Definition: makeSkyMap.py:83
lsst.pipe.tasks.makeSkyMap.MakeSkyMapConfig
Definition: makeSkyMap.py:31
lsst.pipe.tasks.makeSkyMap.MakeSkyMapTask.__init__
def __init__(self, **kwargs)
Definition: makeSkyMap.py:93
lsst.pipe.tasks.makeSkyMap.MakeSkyMapTask.runDataRef
def runDataRef(self, butler)
Make a skymap, persist it (optionally) and log some information about it.
Definition: makeSkyMap.py:97
lsst::geom
Definition: geomOperators.dox:4
lsst.pipe.tasks.makeSkyMap.MakeSkyMapRunner.getTargetList
def getTargetList(parsedCmd)
Definition: makeSkyMap.py:54
lsst.pipe.tasks.makeSkyMap.MakeSkyMapTask.logSkyMapInfo
def logSkyMapInfo(self, skyMap)
Log information about a sky map.
Definition: makeSkyMap.py:112
lsst::geom::Point< double, 2 >
lsst.skymap
Definition: __init__.py:1
lsst::geom::Box2D
A floating-point coordinate rectangle geometry.
Definition: Box.h:413
lsst.pipe.base
Definition: __init__.py:1
lsst.pipe.tasks.makeSkyMap.MakeSkyMapRunner.__call__
def __call__(self, butler)
Definition: makeSkyMap.py:57