LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
makeSkyMap.py
Go to the documentation of this file.
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
29from lsst.utils.timer import timeMethod
30
31
32class 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
52class 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 results = None # in case the task fails
61 exitStatus = 0 # exit status for shell
62 if self.doRaise:
63 results = task.runDataRef(butler)
64 else:
65 try:
66 results = task.runDataRef(butler)
67 except Exception as e:
68 task.log.fatal("Failed: %s", e)
69 exitStatus = 1
70 if not isinstance(e, pipeBase.TaskError):
71 traceback.print_exc(file=sys.stderr)
72 task.writeMetadata(butler)
73 if self.doReturnResults:
74 return pipeBase.Struct(
75 exitStatus=exitStatus,
76 result=results,
77 )
78 else:
79 return pipeBase.Struct(
80 exitStatus=exitStatus,
81 )
82
83
84class MakeSkyMapTask(pipeBase.CmdLineTask):
85 """!Make a sky map in a repository
86
87 Making a sky map in a repository is a prerequisite for making a coadd,
88 since the sky map is used as the pixelization for the coadd.
89 """
90 ConfigClass = MakeSkyMapConfig
91 _DefaultName = "makeSkyMap"
92 RunnerClass = MakeSkyMapRunner
93
94 def __init__(self, **kwargs):
95 pipeBase.CmdLineTask.__init__(self, **kwargs)
96
97 @timeMethod
98 def runDataRef(self, butler):
99 """!Make a skymap, persist it (optionally) and log some information about it
100
101 @param[in] butler data butler
102 @return a pipeBase Struct containing:
103 - skyMap: the constructed SkyMap
104 """
105 skyMap = self.config.skyMap.apply()
106 self.logSkyMapInfologSkyMapInfo(skyMap)
107 if self.config.doWrite:
108 butler.put(skyMap, self.config.coaddName + "Coadd_skyMap")
109 return pipeBase.Struct(
110 skyMap=skyMap
111 )
112
113 def logSkyMapInfo(self, skyMap):
114 """!Log information about a sky map
115
116 @param[in] skyMap sky map (an lsst.skyMap.SkyMap)
117 """
118 self.log.info("sky map has %s tracts", len(skyMap))
119 for tractInfo in skyMap:
120 wcs = tractInfo.getWcs()
121 posBox = geom.Box2D(tractInfo.getBBox())
122 pixelPosList = (
123 posBox.getMin(),
124 geom.Point2D(posBox.getMaxX(), posBox.getMinY()),
125 posBox.getMax(),
126 geom.Point2D(posBox.getMinX(), posBox.getMaxY()),
127 )
128 skyPosList = [wcs.pixelToSky(pos).getPosition(geom.degrees) for pos in pixelPosList]
129 posStrList = ["(%0.3f, %0.3f)" % tuple(skyPos) for skyPos in skyPosList]
130 self.log.info("tract %s has corners %s (RA, Dec deg) and %s x %s patches",
131 tractInfo.getId(), ", ".join(posStrList),
132 tractInfo.getNumPatches()[0], tractInfo.getNumPatches()[1])
133
134 @classmethod
135 def _makeArgumentParser(cls):
136 """Create an argument parser
137
138 No identifiers are added because none are used.
139 """
140 return pipeBase.ArgumentParser(name=cls._DefaultName_DefaultName)
141
142 def _getConfigName(self):
143 """Disable persistence of config
144
145 There's only one SkyMap per rerun anyway, so the config is redundant,
146 and checking it means we can't overwrite or append to one once we've
147 written it.
148 """
149 return None
150
151 def _getMetadataName(self):
152 """Disable persistence of metadata
153
154 There's nothing worth persisting.
155 """
156 return None
A floating-point coordinate rectangle geometry.
Definition: Box.h:413
Make a sky map in a repository.
Definition: makeSkyMap.py:84
def runDataRef(self, butler)
Make a skymap, persist it (optionally) and log some information about it.
Definition: makeSkyMap.py:98
def logSkyMapInfo(self, skyMap)
Log information about a sky map.
Definition: makeSkyMap.py:113