24__all__ = [
"plantSources",
"makeRandomTransmissionCurve",
"makeDefectList",
25 "MockReferenceObjectLoaderFromFiles",
"MockRefcatDataId",
26 "MockReferenceObjectLoaderFromMemory"]
34from lsst
import sphgeom
35from .
import SingleGaussianPsf
38from .
import ReferenceObjectLoader
43 """Make an exposure with stars (modelled as Gaussians)
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)
151 """Create a list of defects that can be used for testing.
192 """Mock reference catalog dataId.
194 The reference catalog dataId is only used to retrieve a region property.
199 The region associated
with this mock dataId.
210 """A mock of ReferenceObjectLoader using files on disk.
212 This mock ReferenceObjectLoader uses a set of files on disk to create
213 mock dataIds and data reference handles that can be accessed
214 without a butler. The files must be afw catalog files
in the reference
215 catalog format, sharded
with HTM pixelization.
219 filenames : `list` [`str`]
220 Names of files to use.
221 config : `lsst.meas.astrom.LoadReferenceObjectsConfig`, optional
222 Configuration object
if necessary to override defaults.
223 htmLevel : `int`, optional
224 HTM level to use
for the loader.
226 def __init__(self, filenames, name='cal_ref_cat', config=None, htmLevel=4):
229 super().
__init__(dataIds, refCats, name=name, config=config)
232 """Create mock dataIds and refcat handles.
236 filenames : `list` [`str`]
237 Names of files to use.
239 HTM level to use for the loader.
241 Name of reference catalog (
for logging).
245 dataIds : `list` [`MockRefcatDataId`]
246 List of mock dataIds.
247 refCats : `list` [`lsst.pipe.base.InMemoryDatasetHandle`]
248 List of mock deferred dataset handles.
252 RuntimeError
if any file contains sources that cover more than one HTM
253 pixel at level ``htmLevel``.
256 htm = esutil.htm.HTM(htmLevel)
261 for filename
in filenames:
262 cat = afwTable.BaseCatalog.readFits(filename)
264 ids = htm.lookup_id(np.rad2deg(cat[
'coord_ra']), np.rad2deg(cat[
'coord_dec']))
266 if len(np.unique(ids)) != 1:
267 raise RuntimeError(f
"File {filename} contains more than one pixel at level {htmLevel}")
270 refCats.append(InMemoryDatasetHandle(cat, name=name))
272 return dataIds, refCats
276 """A mock of ReferenceObjectLoader using catalogs in memory.
281 In-memory catalogs to use to mock dataIds.
282 config : `lsst.meas.astrom.LoadReferenceObjectsConfig`, optional
283 Configuration object if necessary to override defaults.
284 htmLevel : `int`, optional
285 HTM level to use
for the loader.
287 def __init__(self, catalogs, name='mock_ref_cat', config=None, htmLevel=4):
289 super().
__init__(dataIds, refCats, name=name, config=config)
293 htm = esutil.htm.HTM(htmLevel)
298 for i, catalog
in enumerate(catalogs):
299 ids = htm.lookup_id(np.rad2deg(catalog[
'coord_ra']), np.rad2deg(catalog[
'coord_dec']))
301 if len(np.unique(ids)) != 1:
302 raise RuntimeError(f
"Catalog number {i} contains more than one pixel at level {htmLevel}")
305 refCats.append(InMemoryDatasetHandle(catalog, name=name))
307 return dataIds, refCats
Encapsulate information about a bad portion of a detector.
_createDataIdsAndRefcats(self, filenames, htmLevel, name)
__init__(self, filenames, name='cal_ref_cat', config=None, htmLevel=4)
_createDataIdsAndRefcats(self, catalogs, htmLevel, name)
__init__(self, catalogs, name='mock_ref_cat', config=None, htmLevel=4)
makeRandomTransmissionCurve(rng, minWavelength=4000.0, maxWavelength=7000.0, nWavelengths=200, maxRadius=80.0, nRadii=30, perturb=0.05)
plantSources(bbox, kwid, sky, coordList, addPoissonNoise=True)