29 __all__ = [
"WarpAndPsfMatchTask"]
33 """Config for WarpAndPsfMatchTask 35 psfMatch = pexConfig.ConfigurableField(
36 target=ModelPsfMatchTask,
37 doc=
"PSF matching model to model task",
39 warp = pexConfig.ConfigField(
40 dtype=afwMath.Warper.ConfigClass,
41 doc=
"warper configuration",
46 """A task to warp and PSF-match an exposure 48 ConfigClass = WarpAndPsfMatchConfig
51 pipeBase.Task.__init__(self, *args, **kwargs)
52 self.makeSubtask(
"psfMatch")
53 self.
warper = afwMath.Warper.fromConfig(self.config.warp)
55 def run(self, exposure, wcs, modelPsf=None, maxBBox=None, destBBox=None,
56 makeDirect=True, makePsfMatched=False):
57 """Warp and optionally PSF-match exposure 61 exposure : :cpp:class: `lsst::afw::image::Exposure` 62 Exposure to preprocess. 63 wcs : :cpp:class:`lsst::afw::image::Wcs` 64 Desired WCS of temporary images. 65 modelPsf : :cpp:class: `lsst::meas::algorithms::KernelPsf` or None 66 Target PSF to which to match. 67 maxBBox : :cpp:class:`lsst::afw::geom::Box2I` or None 68 Maximum allowed parent bbox of warped exposure. 69 If None then the warped exposure will be just big enough to contain all warped pixels; 70 if provided then the warped exposure may be smaller, and so missing some warped pixels; 71 ignored if destBBox is not None. 72 destBBox: :cpp:class: `lsst::afw::geom::Box2I` or None 73 Exact parent bbox of warped exposure. 74 If None then maxBBox is used to determine the bbox, otherwise maxBBox is ignored. 76 Return an exposure that has been only warped? 78 Return an exposure that has been warped and PSF-matched? 82 An lsst.pipe.base.Struct with the following fields: 84 direct : :cpp:class:`lsst::afw::image::Exposure` 86 psfMatched : :cpp:class: `lsst::afw::image::Exposure` 87 warped and psf-Matched temporary exposure 89 if makePsfMatched
and modelPsf
is None:
90 raise RuntimeError(
"makePsfMatched=True, but no model PSF was provided")
92 if not makePsfMatched
and not makeDirect:
93 self.log.
warn(
"Neither makeDirect nor makePsfMatched requested")
97 psfWarped =
WarpedPsf(exposure.getPsf(), xyTransform)
99 if makePsfMatched
and maxBBox
is not None:
101 pixToGrow = 2 *
max(self.psfMatch.kConfig.sizeCellX,
102 self.psfMatch.kConfig.sizeCellY)
105 maxBBox.grow(pixToGrow)
107 with self.timer(
"warp"):
108 exposure = self.
warper.
warpExposure(wcs, exposure, maxBBox=maxBBox, destBBox=destBBox)
109 exposure.setPsf(psfWarped)
113 exposurePsfMatched = self.psfMatch.
run(exposure, modelPsf).psfMatchedExposure
114 except Exception
as e:
115 exposurePsfMatched =
None 116 self.log.
info(
"Cannot PSF-Match: %s" % (e))
118 return pipeBase.Struct(
119 direct=exposure
if makeDirect
else None,
120 psfMatched=exposurePsfMatched
if makePsfMatched
else None
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations...
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".
def __init__(self, args, kwargs)
An integer coordinate rectangle.
A Psf class that maps an arbitrary Psf through a coordinate transformation.