11 nStars = lsst.pex.config.Field(dtype=int, default=1,
12 doc=
"Number of stars to add")
13 magnitude = lsst.pex.config.Field(dtype=float, default=20.0,
14 doc=
"Magnitude of all stars to be added")
15 margin = lsst.pex.config.Field(dtype=int, default=
None, optional=
True,
16 doc=
"Size of margin at edge that should not be added")
17 seed = lsst.pex.config.Field(dtype=int, default=1,
18 doc=
"Seed for random number generator")
22 ConfigClass = RandomStarFakeSourcesConfig
25 BaseFakeSourcesTask.__init__(self, **kwargs)
26 print(
"RNG seed:", self.
config.seed)
30 def run(self, exposure, background):
32 self.
log.
info(
"Adding fake random stars")
33 psf = exposure.getPsf()
34 psfBBox = psf.computeImage().getBBox()
35 margin = int(np.floor(
max(psfBBox.getWidth(), psfBBox.getHeight())/2)) + 1
36 if self.
config.margin
is not None:
37 if self.
config.margin < margin:
38 raise ValueError(
"margin is not large enough for PSF")
39 bboxI = exposure.getBBox(lsst.afw.image.PARENT)
41 bboxD = lsst.afw.geom.BoxD(bboxI)
42 flux = exposure.getCalib().getFlux(self.
config.magnitude)
43 md = exposure.getMetadata()
44 for i
in range(self.
config.nStars):
45 x = self.
rng.flat(bboxD.getMinX(), bboxD.getMaxX())
46 y = self.
rng.flat(bboxD.getMinY(), bboxD.getMaxY())
47 md.set(
"FAKE%d" % i,
"%.3f, %.3f" % (x, y))
48 self.
log.
info(
"Adding fake at: %.1f,%.1f" % (x, y))
49 psfImage = psf.computeImage(lsst.afw.geom.Point2D(x, y))
52 psfMaskedImage = lsst.afw.image.MaskedImageF(psfImage.convertF())
54 mask = psfMaskedImage.getMask()
60 subMaskedImage = exposure.getMaskedImage().
Factory(exposure.getMaskedImage(),
61 psfImage.getBBox(lsst.afw.image.PARENT),
62 lsst.afw.image.PARENT)
63 subMaskedImage += psfMaskedImage