LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
warpAndPsfMatch.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2008, 2009, 2010, 2011, 2012 LSST Corporation.
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 <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 import lsst.pex.config as pexConfig
23 import lsst.afw.math as afwMath
24 import lsst.geom as geom
25 import lsst.afw.geom as afwGeom
26 import lsst.pipe.base as pipeBase
27 from lsst.ip.diffim import ModelPsfMatchTask
28 from lsst.meas.algorithms import WarpedPsf
29 
30 __all__ = ["WarpAndPsfMatchTask"]
31 
32 
33 class 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 
46 class 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.warperwarper = 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.warperwarper.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
def run(self, exposure, wcs, modelPsf=None, maxBBox=None, destBBox=None, makeDirect=True, makePsfMatched=False)
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
int warpExposure(DestExposureT &destExposure, SrcExposureT const &srcExposure, WarpingControl const &control, typename DestExposureT::MaskedImageT::SinglePixel padValue=lsst::afw::math::edgePixel< typename DestExposureT::MaskedImageT >(typename lsst::afw::image::detail::image_traits< typename DestExposureT::MaskedImageT >::image_category()))
Warp (remap) one exposure to another.
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations.