22__all__ = [
"SnapPsfMatchConfigDF",
"SnapPsfMatchConfigAL",
"SnapPsfMatchConfig",
"SnapPsfMatchTask"]
25from .psfMatch
import PsfMatchConfigDF, PsfMatchConfigAL
26from .imagePsfMatch
import ImagePsfMatchTask, ImagePsfMatchConfig
30 """Delta-function Psf-matching config optimized for snap subtraction"""
33 PsfMatchConfigDF.setDefaults(self)
45 """Sum-of-Gaussian (Alard-Lupton) Psf-matching config optimized for snap subtraction"""
48 PsfMatchConfigAL.setDefaults(self)
57 kernel = pexConfig.ConfigChoiceField(
60 AL=SnapPsfMatchConfigAL,
61 DF=SnapPsfMatchConfigDF
66 doWarping = pexConfig.Field(
68 doc=
"Warp the snaps?",
73 ImagePsfMatchConfig.setDefaults(self)
89 """Image-based Psf-matching of two subsequent snaps from the same visit
93 This Task differs from ImagePsfMatchTask
in that it matches two Exposures assuming that the images have
94 been acquired very closely
in time. Under this assumption, the astrometric misalignments
and/
or
95 relative distortions should be within a pixel,
and the Psf-shapes should be very similar. As a
96 consequence, the default configurations
for this
class assume a very simple solution.
98 - The spatial variation
in the kernel (SnapPsfMatchConfig.spatialKernelOrder)
is assumed to be zero
100 - With no spatial variation, we turn of the spatial
101 clipping loops (SnapPsfMatchConfig.spatialKernelClipping)
103 - The differential background
is not fit
for (SnapPsfMatchConfig.fitForBackground)
105 - The kernel
is expected to be appx.
106 a delta function,
and has a small size (SnapPsfMatchConfig.kernelSize)
108 The sub-configurations
for the Alard-Lupton (SnapPsfMatchConfigAL)
109 and delta-function (SnapPsfMatchConfigDF)
110 bases also are designed to generate a small, simple kernel.
114 Initialization
is the same
as base
class ImagePsfMatch.__init__,
115 with the difference being that the Task
's
116 ConfigClass is SnapPsfMatchConfig.
120 The Task
is only configured to have a subtractExposures method, which
in turn calls
121 ImagePsfMatchTask.subtractExposures.
123 Configuration parameters
125 See SnapPsfMatchConfig, which uses either SnapPsfMatchConfigDF
and SnapPsfMatchConfigAL
126 as its active configuration.
130 The ``pipetask`` command line interface supports a
131 flag --debug to
import @b debug.py
from your PYTHONPATH. The relevant contents of debug.py
132 for this Task include:
140 if name ==
"lsst.ip.diffim.psfMatch":
142 di.maskTransparency = 80
143 di.displayCandidates =
True
144 di.displayKernelBasis =
False
145 di.displayKernelMosaic =
True
146 di.plotKernelSpatialModel =
False
147 di.showBadCandidates =
True
148 elif name ==
"lsst.ip.diffim.imagePsfMatch":
150 di.maskTransparency = 30
151 di.displayTemplate =
True
152 di.displaySciIm =
True
153 di.displaySpatialCells =
True
154 di.displayDiffIm =
True
155 di.showBadCandidates =
True
156 elif name ==
"lsst.ip.diffim.diaCatalogSourceSelector":
158 di.maskTransparency = 30
159 di.displayExposure =
True
160 di.pauseAtEnd =
False
165 Note that
if you want addional logging info, you may add to your scripts:
169 import lsst.utils.logging
as logUtils
170 logUtils.trace_set_at(
"lsst.ip.diffim", 4)
174 First, create a subclass of SnapPsfMatchTask that accepts two exposures.
175 Ideally these exposures would have been taken back-to-back,
176 such that the pointing/background/Psf does
not vary substantially between the two:
181 def __init__(self, *args, **kwargs):
182 SnapPsfMatchTask.__init__(self, *args, **kwargs)
183 def run(self, templateExp, scienceExp):
186 And allow the user the freedom to either run the script
in default mode,
187 or point to their own images on disk. Note that these images must be
192 if __name__ ==
"__main__":
194 parser = argparse.ArgumentParser(description=
"Demonstrate the use of ImagePsfMatchTask")
195 parser.add_argument(
"--debug",
"-d", action=
"store_true", help=
"Load debug.py?", default=
False)
196 parser.add_argument(
"--template",
"-t", help=
"Template Exposure to use", default=
None)
197 parser.add_argument(
"--science",
"-s", help=
"Science Exposure to use", default=
None)
198 args = parser.parse_args()
200 We have enabled some minor display debugging
in this script via the –debug option. However,
201 if you have an lsstDebug debug.in your PYTHONPATH you will get additional debugging displays.
202 The following block checks
for this script
210 debug.lsstDebug.frame = 3
211 except ImportError
as e:
212 print(e, file=sys.stderr)
214 Finally, we call a run method that we define below.
215 First set up a Config
and choose the basis set to use:
223 config = SnapPsfMatchTask.ConfigClass()
224 config.doWarping =
True
225 config.kernel.name =
"AL"
227 Make sure the images (
if any) that were sent to the script exist on disk
and are readable.
228 If no images are sent, make some fake data up
for the sake of this example script
229 (have a look at the code
if you want more details on generateFakeImages;
230 as a detail of how the fake images were made, you do have to fit
for a differential background):
235 if args.template
is not None and args.science
is not None:
236 if not os.path.isfile(args.template):
237 raise FileNotFoundError(
"Template image %s does not exist" % (args.template))
238 if not os.path.isfile(args.science):
239 raise FileNotFoundError(
"Science image %s does not exist" % (args.science))
241 templateExp = afwImage.ExposureF(args.template)
242 except Exception
as e:
243 raise RuntimeError(
"Cannot read template image %s" % (args.template))
245 scienceExp = afwImage.ExposureF(args.science)
246 except Exception
as e:
247 raise RuntimeError(
"Cannot read science image %s" % (args.science))
249 templateExp, scienceExp = generateFakeImages()
250 config.kernel.active.fitForBackground =
True
251 config.kernel.active.spatialBgOrder = 0
252 config.kernel.active.sizeCellX = 128
253 config.kernel.active.sizeCellY = 128
255 Display the two images
if -debug
260 afwDisplay.Display(frame=1).mtv(templateExp, title=
"Example script: Input Template")
261 afwDisplay.Display(frame=2).mtv(scienceExp, title=
"Example script: Input Science Image")
263 Create
and run the Task
268 psfMatchTask = MySnapPsfMatchTask(config=config)
270 result = psfMatchTask.run(templateExp, scienceExp)
272 And
finally provide optional debugging display of the Psf-matched (via the Psf models) science image:
279 frame = debug.lsstDebug.frame + 1
282 afwDisplay.Display(frame=frame).mtv(result.matchedExposure,
283 title=
"Example script: Matched Template Image")
284 if "subtractedExposure" in result.getDict():
285 afwDisplay.Display(frame=frame + 1).mtv(result.subtractedExposure,
286 title=
"Example script: Subtracted Image")
290 ConfigClass = SnapPsfMatchConfig
294 templateFwhmPix=None, scienceFwhmPix=None,
296 return ImagePsfMatchTask.subtractExposures(self,
297 templateExposure=templateExposure,
298 scienceExposure=scienceExposure,
299 templateFwhmPix=templateFwhmPix,
300 scienceFwhmPix=scienceFwhmPix,
301 candidateList=candidateList,
302 doWarping=self.config.doWarping,
def __init__(self, *args, **kwargs)
def subtractExposures(self, templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None, doWarping=True, convolveTemplate=True)
def subtractExposures(self, templateExposure, scienceExposure, templateFwhmPix=None, scienceFwhmPix=None, candidateList=None)
def run(self, coaddExposures, bbox, wcs, dataIds, **kwargs)