43 """Make an exposure with stars (modelled as Gaussians)
47 bbox : `lsst.geom.Box2I`
48 Parent bbox of exposure
50 Kernal width (and height; kernal is square)
52 Amount of sky background (counts)
53 coordList : `list [tuple]`
54 A list of [x, y, counts, sigma] where:
55 * x,y are relative to exposure origin
56 * counts is the integrated counts for the star
57 * sigma is the Gaussian sigma in pixels
58 addPoissonNoise : `bool`
59 If True: add Poisson noise to the exposure
62 img = afwImage.ImageD(bbox)
64 for coord
in coordList:
65 x, y, counts, sigma = coord
69 psf = SingleGaussianPsf(kwid, kwid, sigma)
76 psfBox = thisPsfImg.getBBox()
78 if psfBox != thisPsfImg.getBBox():
79 thisPsfImg = thisPsfImg[psfBox, afwImage.PARENT]
80 imgSeg = img[psfBox, afwImage.PARENT]
82 meanSigma /= len(coordList)
88 np.random.seed(seed=1)
89 imgArr = img.getArray()
90 imgArr[:] = np.random.poisson(imgArr)
93 mask = afwImage.Mask(bbox)
94 var = img.convertFloat()
96 mimg = afwImage.MaskedImageF(img.convertFloat(), mask, var)
97 exposure = afwImage.makeExposure(mimg)
100 psf = SingleGaussianPsf(kwid, kwid, meanSigma)
107 maxRadius=80.0, nRadii=30, perturb=0.05):
108 """Create a random TransmissionCurve with nontrivial spatial and
109 wavelength variation.
113 rng : numpy.random.RandomState
114 Random number generator.
115 minWavelength : float
116 Average minimum wavelength for generated TransmissionCurves (will be
118 maxWavelength : float
119 Average maximum wavelength for generated TransmissionCurves (will be
122 Number of samples in the wavelength dimension.
124 Average maximum radius for spatial variation (will be perturbed).
126 Number of samples in the radial dimension.
128 Fraction by which wavelength and radius bounds should be randomly
131 dWavelength = maxWavelength - minWavelength
133 def perturbed(x, s=perturb*dWavelength):
134 return x + 2.0*s*(rng.rand() - 0.5)
136 wavelengths = np.linspace(perturbed(minWavelength), perturbed(maxWavelength), nWavelengths)
137 radii = np.linspace(0.0, perturbed(maxRadius, perturb*maxRadius), nRadii)
138 throughput = np.zeros(wavelengths.shape + radii.shape, dtype=float)
141 peak0 = perturbed(0.9, 0.05)
142 start0 = perturbed(minWavelength + 0.25*dWavelength)
143 stop0 = perturbed(minWavelength + 0.75*dWavelength)
144 for i, r
in enumerate(radii):
145 mask = np.logical_and(wavelengths >= start0 + r, wavelengths <= stop0 + r)
146 throughput[mask, i] = peak0*(1.0 - r/1000.0)
147 return afwImage.TransmissionCurve.makeRadial(throughput, wavelengths, radii)