53 photoCalibMean1=1e-2, photoCalibMean2=1.2e-2,
54 fakeWcses=(
None,
None),
55 fakeVisitInfos=(
None,
None)):
56 """Return two fake ccdImages built on CFHT Megacam metadata.
58 If ``num1 == num2``, the catalogs will align on-sky so each source will
59 have a match in the other catalog.
61 This uses the butler dataset stored in `tests/data/cfht_minimal` to
62 bootstrap the metadata.
66 num1, num2 : `int`, optional
67 Number of sources to put in the first and second catalogs. Should be
68 a square, to have sqrt(num) centroids on a grid.
69 seed : `int`, optional
70 Seed value for np.random.
71 fakeDetectorId : `int`, optional
72 Sensor identifier to use for both CcdImages. The wcs, bbox, photoCalib, etc.
73 will still be drawn from the CFHT ccd=12 files, as that is the only
74 testdata that is included in this simple test dataset.
75 photoCalibMean1, photoCalibMean2: `float`, optional
76 The mean photometric calibration to pass to each ccdImage construction.
77 Note: this value is 1/instFluxMag0, so it should be less than 1.
78 fakeWcses : `list` [`lsst.afw.geom.SkyWcs`], optional
79 The SkyWcses to use instead of the ones read from disk.
80 fakeWcses : `list` [`lsst.afw.image.VisitInfo`], optional
81 The VisitInfos to use instead of the ones read from disk.
85 struct : `lsst.pipe.base.Struct`
86 Result struct with components:
88 - `camera` : Camera representing these catalogs
89 (`lsst.afw.cameraGeom.Camera`).
90 - `catalogs` : Catalogs containing fake sources
91 (`list` of `lsst.afw.table.SourceCatalog`).
92 - `ccdImageList` : CcdImages containing the metadata and fake sources
93 (`list` of `lsst.jointcal.CcdImage`).
94 - `bbox` : Bounding Box of the image (`lsst.geom.Box2I`).
95 - 'fluxFieldName' : name of the instFlux field in the catalogs ('str').
98 msg =
"Necessary packages not available to run tests that use the cfht_minimal dataset."
99 raise unittest.SkipTest(msg)
105 fluxFieldName =
"SomeFlux"
108 dataDir = lsst.utils.getPackageDir(
'jointcal')
109 inputDir = os.path.join(dataDir,
'tests/data/cfht_minimal/repo')
111 butler = lsst.daf.butler.Butler(inputDir, collections=[
"singleFrame"], writeable=
False)
114 camera = butler.get(
'camera', instrument=
"MegaPrime")
117 photoCalibMean=photoCalibMean1, photoCalibErr=1.0,
118 fakeDetectorId=fakeDetectorId,
119 fakeWcs=fakeWcses[0], fakeVisitInfo=fakeVisitInfos[0])
121 photoCalibMean=photoCalibMean2, photoCalibErr=5.0,
122 fakeDetectorId=fakeDetectorId,
123 fakeWcs=fakeWcses[1], fakeVisitInfo=fakeVisitInfos[1])
125 return lsst.pipe.base.Struct(camera=camera,
126 catalogs=[struct1.catalog, struct2.catalog],
127 ccdImageList=[struct1.ccdImage, struct2.ccdImage],
129 skyWcs=[struct1.skyWcs, struct2.skyWcs],
130 fluxFieldName=fluxFieldName)
134 photoCalibMean=1e-2, photoCalibErr=1.0, fakeDetectorId=12,
135 fakeWcs=None, fakeVisitInfo=None):
136 """Create a fake CcdImage by making a fake catalog.
140 butler : `lsst.daf.butler.Butler`
141 Butler to load metadata from.
143 Visit identifier to build a butler dataId.
145 Number of sources to put in the catalogs. Should be
146 a square, to have sqrt(num) centroids on a grid.
147 fluxFieldName : `str`
148 Name of the flux field to populate in the catalog, without `_instFlux`
149 (e.g. "slot_CalibFlux").
150 photoCalibMean : `float`, optional
151 Value to set for calibrationMean in the created PhotoCalib.
152 Note: this value is 1/instFluxMag0, so it should be less than 1.
153 photoCalibErr : `float`, optional
154 Value to set for calibrationErr in the created PhotoCalib.
155 fakeDetectorId : `int`, optional
156 Use this as the detectorId in the returned CcdImage.
157 fakeWcs : `lsst.afw.geom.SkyWcs`, optional
158 A SkyWcs to use instead of one read from disk.
159 fakeVisitInfo : `lsst.afw.image.VisitInfo`, optional
160 A VisitInfo to use instead of one read from disk.
164 struct : `lsst.pipe.base.Struct`
165 Result struct with components:
167 - `catalog` : Catalogs containing fake sources
168 (`lsst.afw.table.SourceCatalog`).
169 - `ccdImage` : CcdImage containing the metadata and fake sources
170 (`lsst.jointcal.CcdImage`).
171 - `bbox` : Bounding Box of the image (`lsst.geom.Box2I`).
172 - `skyWcs` : SkyWcs of the image (`lsst.afw.geom.SkyWcs`).
176 dataId =
dict(visit=visit, detector=detectorId, instrument=
"MegaPrime")
177 skyWcs = fakeWcs
if fakeWcs
is not None else butler.get(
'calexp.wcs', dataId=dataId)
178 visitInfo = fakeVisitInfo
if fakeVisitInfo
is not None else butler.get(
'calexp.visitInfo', dataId=dataId)
179 bbox = butler.get(
'calexp.bbox', dataId=dataId)
180 detector = butler.get(
'calexp.detector', dataId=dataId)
181 filt = butler.get(
"calexp.filter", dataId=dataId).bandLabel
186 detector, visit, fakeDetectorId, fluxFieldName)
188 return lsst.pipe.base.Struct(catalog=catalog, ccdImage=ccdImage, bbox=bbox, skyWcs=skyWcs)
192 """Return a fake minimally-useful catalog for jointcal.
197 Number of sources to put in the catalogs. Should be
198 a square, to have sqrt(num) centroids on a grid.
199 bbox : `lsst.geom.Box2I`
200 Bounding Box of the detector to populate.
201 fluxFieldName : `str`
202 Name of the flux field to populate in the catalog, without `_instFlux`
203 (e.g. "slot_CalibFlux").
204 skyWcs : `lsst.afw.geom.SkyWcs` or None, optional
205 If supplied, use this to fill in coordinates from centroids.
206 refCat : `bool`, optional
207 Return a ``SimpleCatalog`` so that it behaves like a reference catalog?
211 catalog : `lsst.afw.table.SourceCatalog`
212 A populated source catalog.
216 centroidKey = lsst.afw.table.Point2DKey.addFields(schema,
"centroid",
"centroid",
"pixels")
217 xErrKey = schema.addField(
"centroid_xErr", type=
"F")
218 yErrKey = schema.addField(
"centroid_yErr", type=
"F")
223 lsst.afw.table.CoordinateType.PIXEL)
225 schema.addField(fluxFieldName+
"_instFlux", type=
"D", doc=
"post-ISR instFlux")
226 schema.addField(fluxFieldName+
"_instFluxErr", type=
"D", doc=
"post-ISR instFlux stddev")
227 schema.addField(fluxFieldName+
"_flux", type=
"D", doc=
"source flux (nJy)")
228 schema.addField(fluxFieldName+
"_fluxErr", type=
"D", doc=
"flux stddev (nJy)")
229 schema.addField(fluxFieldName+
"_mag", type=
"D", doc=
"magnitude")
230 schema.addField(fluxFieldName+
"_magErr", type=
"D", doc=
"magnitude stddev")
232 centroidKey, xErrKey, yErrKey, shapeKey, fluxFieldName,
233 skyWcs=skyWcs, refCat=refCat)
237 centroidKey, xErrKey, yErrKey, shapeKey, fluxFieldName,
238 skyWcs=None, fluxErrFraction=0.05, refCat=False):
239 """Return a catalog populated with fake, but reasonable, sources.
241 Centroids are placed on a uniform grid, errors are normally distributed.
245 schema : `lsst.afw.table.Schema`
246 Pre-built schema to make the catalog from.
248 Number of sources to put in the catalog.
249 bbox : `lsst.geom.Box2I`
250 Bounding box of the ccd to put sources in.
251 centroidKey : `lsst.afw.table.Key`
252 Key for the centroid field to populate.
253 xErrKey : `lsst.afw.table.Key`
254 Key for the xErr field to populate.
255 yErrKey : `lsst.afw.table.Key`
256 Key for the yErr field to populate.
257 shapeKey : `lsst.afw.table.Key`
258 Key for the shape field to populate.
259 fluxFieldName : `str`
260 Name of the flux field to populate in the catalog, without `_instFlux`
261 (e.g. "slot_CalibFlux").
262 skyWcs : `lsst.afw.geom.SkyWcs` or None, optional
263 If supplied, use this to fill in coordinates from centroids.
264 fluxErrFraction : `float`, optional
265 Fraction of instFlux to use for the instFluxErr.
266 refCat : `bool`, optional
267 Return a ``SimpleCatalog`` so that it behaves like a reference catalog?
271 catalog : `lsst.afw.table.SourceCatalog`
275 table.defineCentroid(
'centroid')
276 table.defineShape(
'shape')
277 table.defineCalibFlux(fluxFieldName)
283 instFlux = np.random.random(num)*10000
284 instFluxErr = np.abs(instFlux * np.random.normal(fluxErrFraction, scale=0.1, size=num))
285 xx = np.linspace(bbox.getMinX(), bbox.getMaxX(),
int(np.sqrt(num)))
286 yy = np.linspace(bbox.getMinY(), bbox.getMaxY(),
int(np.sqrt(num)))
287 xv, yv = np.meshgrid(xx, yy)
288 vx = np.random.normal(scale=0.1, size=num)
289 vy = np.random.normal(scale=0.1, size=num)
296 for i, (x, y)
in enumerate(
zip(xv.ravel(), yv.ravel())):
297 record = catalog.addNew()
302 if skyWcs
is not None:
305 catalog[xErrKey] = vx
306 catalog[yErrKey] = vy
307 catalog[fluxFieldName +
'_instFlux'] = instFlux
308 catalog[fluxFieldName +
'_instFluxErr'] = instFluxErr
createTwoFakeCcdImages(num1=4, num2=4, seed=100, fakeDetectorId=12, photoCalibMean1=1e-2, photoCalibMean2=1.2e-2, fakeWcses=(None, None), fakeVisitInfos=(None, None))
fillCatalog(schema, num, bbox, centroidKey, xErrKey, yErrKey, shapeKey, fluxFieldName, skyWcs=None, fluxErrFraction=0.05, refCat=False)
createFakeCcdImage(butler, visit, num, fluxFieldName, photoCalibMean=1e-2, photoCalibErr=1.0, fakeDetectorId=12, fakeWcs=None, fakeVisitInfo=None)