65def computePsfImage(psfModels, position, useKernelImage=True):
66 """Get a multiband PSF image
67
68 The PSF Image or PSF Kernel Image is computed for each band
69 and combined into a (filter, y, x) array.
70
71 Parameters
72 ----------
73 psfModels : `dict[str, lsst.afw.detection.Psf]`
74 The list of PSFs in each band.
75 position : `Point2D` or `tuple`
76 Coordinates to evaluate the PSF.
77 useKernelImage: `bool`
78 Execute ``Psf.computeKernelImage`` when ``True`,
79 ``PSF/computeImage`` when ``False``.
80
81 Returns
82 -------
83 psfs: `lsst.afw.image.MultibandImage`
84 The multiband PSF image.
85 """
86 psfs = {}
87
88 if not isinstance(position, Point2D):
89 position = Point2D(position[0], position[1])
90
91 incomplete = False
92
93 for band, psfModel in psfModels.items():
94 try:
95 if useKernelImage:
96 psf = psfModel.computeKernelImage(position)
97 else:
98 psf = psfModel.computeImage(position)
99 psfs[band] = psf
100 except InvalidParameterError:
101 incomplete = True
102
103 left = np.min([psf.getBBox().getMinX() for psf in psfs.values()])
104 bottom = np.min([psf.getBBox().getMinY() for psf in psfs.values()])
105 right = np.max([psf.getBBox().getMaxX() for psf in psfs.values()])
106 top = np.max([psf.getBBox().getMaxY() for psf in psfs.values()])
107 bbox = Box2I(Point2I(left, bottom), Point2I(right, top))
108
109 psf_images = [projectImage(psf, bbox) for psf in psfs.values()]
110
111 mPsf = MultibandImage.fromImages(list(psfs.keys()), psf_images)
112
113 if incomplete:
114 raise IncompleteDataError(list(psfModels.keys()), position, mPsf)
115
116 return mPsf
117
118