Hide keyboard shortcuts

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 

2 

3import lsst.afw.image 

4import lsst.afw.geom 

5import lsst.afw.math 

6import lsst.pex.config 

7from lsst.pipe.tasks.fakes import BaseFakeSourcesConfig, BaseFakeSourcesTask 

8 

9 

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") 

19 

20 

21class RandomStarFakeSourcesTask(BaseFakeSourcesTask): 

22 ConfigClass = RandomStarFakeSourcesConfig 

23 

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) 

29 

30 def run(self, exposure, background): 

31 

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 

51 

52 psfMaskedImage = lsst.afw.image.MaskedImageF(psfImage.convertF()) 

53 

54 mask = psfMaskedImage.getMask() 

55 mask.set(self.bitmask) 

56 

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