LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
warpAndPsfMatch.py
Go to the documentation of this file.
1# This file is part of pipe_tasks.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22__all__ = ["WarpAndPsfMatchTask"]
23
24import lsst.pex.config as pexConfig
25import lsst.afw.math as afwMath
26import lsst.geom as geom
27import lsst.afw.geom as afwGeom
28import lsst.pipe.base as pipeBase
29from lsst.ip.diffim import ModelPsfMatchTask
30from lsst.meas.algorithms import WarpedPsf
31
32
33class WarpAndPsfMatchConfig(pexConfig.Config):
34 """Config for WarpAndPsfMatchTask
35 """
36 psfMatch = pexConfig.ConfigurableField(
37 target=ModelPsfMatchTask,
38 doc="PSF matching model to model task",
39 )
40 warp = pexConfig.ConfigField(
41 dtype=afwMath.Warper.ConfigClass,
42 doc="warper configuration",
43 )
44
45
46class WarpAndPsfMatchTask(pipeBase.Task):
47 """A task to warp and PSF-match an exposure
48 """
49 ConfigClass = WarpAndPsfMatchConfig
50
51 def __init__(self, *args, **kwargs):
52 pipeBase.Task.__init__(self, *args, **kwargs)
53 self.makeSubtask("psfMatch")
54 self.warper = afwMath.Warper.fromConfig(self.config.warp)
55
56 def run(self, exposure, wcs, modelPsf=None, maxBBox=None, destBBox=None,
57 makeDirect=True, makePsfMatched=False):
58 """Warp and optionally PSF-match exposure
59
60 Parameters
61 ----------
62 exposure : :cpp:class: `lsst::afw::image::Exposure`
63 Exposure to preprocess.
64 wcs : :cpp:class:`lsst::afw::image::Wcs`
65 Desired WCS of temporary images.
66 modelPsf : :cpp:class: `lsst::meas::algorithms::KernelPsf` or None
67 Target PSF to which to match.
68 maxBBox : :cpp:class:`lsst::afw::geom::Box2I` or None
69 Maximum allowed parent bbox of warped exposure.
70 If None then the warped exposure will be just big enough to contain all warped pixels;
71 if provided then the warped exposure may be smaller, and so missing some warped pixels;
72 ignored if destBBox is not None.
73 destBBox: :cpp:class: `lsst::afw::geom::Box2I` or None
74 Exact parent bbox of warped exposure.
75 If None then maxBBox is used to determine the bbox, otherwise maxBBox is ignored.
76 makeDirect : bool
77 Return an exposure that has been only warped?
78 makePsfMatched : bool
79 Return an exposure that has been warped and PSF-matched?
80
81 Returns
82 -------
83 An lsst.pipe.base.Struct with the following fields:
84
85 direct : :cpp:class:`lsst::afw::image::Exposure`
86 warped exposure
87 psfMatched : :cpp:class: `lsst::afw::image::Exposure`
88 warped and psf-Matched temporary exposure
89 """
90 if makePsfMatched and modelPsf is None:
91 raise RuntimeError("makePsfMatched=True, but no model PSF was provided")
92
93 if not makePsfMatched and not makeDirect:
94 self.log.warning("Neither makeDirect nor makePsfMatched requested")
95
96 # Warp PSF before overwriting exposure
97 xyTransform = afwGeom.makeWcsPairTransform(exposure.getWcs(), wcs)
98 psfWarped = WarpedPsf(exposure.getPsf(), xyTransform)
99
100 if makePsfMatched and maxBBox is not None:
101 # grow warped region to provide sufficient area for PSF-matching
102 pixToGrow = 2 * max(self.psfMatch.kConfig.sizeCellX,
103 self.psfMatch.kConfig.sizeCellY)
104 # replace with copy
105 maxBBox = geom.Box2I(maxBBox)
106 maxBBox.grow(pixToGrow)
107
108 with self.timer("warp"):
109 exposure = self.warper.warpExposure(wcs, exposure, maxBBox=maxBBox, destBBox=destBBox)
110 exposure.setPsf(psfWarped)
111
112 if makePsfMatched:
113 try:
114 exposurePsfMatched = self.psfMatch.run(exposure, modelPsf).psfMatchedExposure
115 except Exception as e:
116 exposurePsfMatched = None
117 self.log.info("Cannot PSF-Match: %s", e)
118
119 return pipeBase.Struct(
120 direct=exposure if makeDirect else None,
121 psfMatched=exposurePsfMatched if makePsfMatched else None
122 )
int max
An integer coordinate rectangle.
Definition: Box.h:55
A Psf class that maps an arbitrary Psf through a coordinate transformation.
Definition: WarpedPsf.h:52
std::shared_ptr< TransformPoint2ToPoint2 > makeWcsPairTransform(SkyWcs const &src, SkyWcs const &dst)
A Transform obtained by putting two SkyWcs objects "back to back".
Definition: SkyWcs.cc:146