Coverage for python/lsst/synpipe/randomStarFakes.py : 31%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import numpy as np
3import lsst.afw.image
4import lsst.afw.geom
5import lsst.afw.math
6import lsst.pex.config
7from lsst.pipe.tasks.fakes import BaseFakeSourcesConfig, BaseFakeSourcesTask
10class RandomStarFakeSourcesConfig(BaseFakeSourcesConfig):
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")
21class RandomStarFakeSourcesTask(BaseFakeSourcesTask):
22 ConfigClass = RandomStarFakeSourcesConfig
24 def __init__(self, **kwargs):
25 BaseFakeSourcesTask.__init__(self, **kwargs)
26 print("RNG seed:", self.config.seed)
27 self.rng = lsst.afw.math.Random(seed=self.config.seed)
28 self.npRand = np.random.RandomState(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)
40 bboxI.grow(-margin)
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))
50 psfImage *= flux
52 psfMaskedImage = lsst.afw.image.MaskedImageF(psfImage.convertF())
54 mask = psfMaskedImage.getMask()
55 mask.set(self.bitmask)
57 # the line below would work if the subimage call worked in PARENT coordinates.
58 # Since it doesn't at present, we have to do the longer call below.
59 # subMaskedImage = exposure.getMaskedImage()[psfImage.getBBox(lsst.afw.image.PARENT)]
60 subMaskedImage = exposure.getMaskedImage().Factory(exposure.getMaskedImage(),
61 psfImage.getBBox(lsst.afw.image.PARENT),
62 lsst.afw.image.PARENT)
63 subMaskedImage += psfMaskedImage