1 from __future__
import print_function
2 from builtins
import range
7 from lsst.pipe.tasks.fakes
import BaseFakeSourcesConfig, BaseFakeSourcesTask
14 nStars = lsst.pex.config.Field(dtype=int, default=1,
15 doc=
"Number of stars to add")
16 magnitude = lsst.pex.config.Field(dtype=float, default=20.0,
17 doc=
"Magnitude of all stars to be added")
18 margin = lsst.pex.config.Field(dtype=int, default=
None, optional=
True,
19 doc=
"Size of margin at edge that should not be added")
20 seed = lsst.pex.config.Field(dtype=int, default=1,
21 doc=
"Seed for random number generator")
25 ConfigClass = RandomStarFakeSourcesConfig
28 BaseFakeSourcesTask.__init__(self, **kwargs)
29 print(
"RNG seed:", self.config.seed)
31 self.
npRand = np.random.RandomState(self.config.seed)
33 def run(self, exposure, background):
35 self.log.info(
"Adding fake random stars")
36 psf = exposure.getPsf()
37 psfBBox = psf.computeImage().getBBox()
38 margin =
int(np.floor(max(psfBBox.getWidth(), psfBBox.getHeight())/2)) + 1
39 if self.config.margin
is not None:
40 if self.config.margin < margin:
41 raise ValueError(
"margin is not large enough for PSF")
42 bboxI = exposure.getBBox(lsst.afw.image.PARENT)
45 flux = exposure.getCalib().getFlux(self.config.magnitude)
46 md = exposure.getMetadata()
47 for i
in range(self.config.nStars):
48 x = self.
rng.flat(bboxD.getMinX(), bboxD.getMaxX())
49 y = self.
rng.flat(bboxD.getMinY(), bboxD.getMaxY())
50 md.set(
"FAKE%d" % i,
"%.3f, %.3f" % (x, y))
51 self.log.info(
"Adding fake at: %.1f,%.1f" % (x, y))
55 psfMaskedImage = lsst.afw.image.MaskedImageF(psfImage.convertF())
57 mask = psfMaskedImage.getMask()
58 mask.set(self.bitmask)
63 subMaskedImage = exposure.getMaskedImage().Factory(exposure.getMaskedImage(),
64 psfImage.getBBox(lsst.afw.image.PARENT),
65 lsst.afw.image.PARENT)
66 subMaskedImage += psfMaskedImage
def run(self, exposure, background)
def __init__(self, kwargs)