LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
Functions
lsst.jointcal.testUtils Namespace Reference

Functions

def canRunTests ()
 
def createTwoFakeCcdImages (num1=4, num2=4, seed=100, fakeDetectorId=12, photoCalibMean1=1e-2, photoCalibMean2=1.2e-2, fakeWcses=(None, None), fakeVisitInfos=(None, None))
 
def createFakeCcdImage (butler, visit, num, fluxFieldName, photoCalibMean=1e-2, photoCalibErr=1.0, fakeDetectorId=12, fakeWcs=None, fakeVisitInfo=None)
 
def createFakeCatalog (num, bbox, fluxFieldName, skyWcs=None, refCat=False)
 
def fillCatalog (schema, num, bbox, centroidKey, xErrKey, yErrKey, shapeKey, fluxFieldName, skyWcs=None, fluxErrFraction=0.05, refCat=False)
 
def getMeasuredStarsFromCatalog (catalog, pixToFocal)
 

Function Documentation

◆ canRunTests()

def lsst.jointcal.testUtils.canRunTests ( )
Returns True if the necessary packages and files are available.

We need ``obs_cfht`` to load the test/data/cfht_minimal dataset, which
includes the metadata that is used to build the fake catalogs.

Definition at line 39 of file testUtils.py.

39def canRunTests():
40 """Returns True if the necessary packages and files are available.
41
42 We need ``obs_cfht`` to load the test/data/cfht_minimal dataset, which
43 includes the metadata that is used to build the fake catalogs.
44 """
45 try:
46 import lsst.obs.cfht # noqa: F401
47 return True
48 except ImportError:
49 return False
50
51

◆ createFakeCatalog()

def lsst.jointcal.testUtils.createFakeCatalog (   num,
  bbox,
  fluxFieldName,
  skyWcs = None,
  refCat = False 
)
Return a fake minimally-useful catalog for jointcal.

Parameters
----------
num : `int`
    Number of sources to put in the catalogs. Should be
    a square, to have sqrt(num) centroids on a grid.
bbox : `lsst.geom.Box2I`
    Bounding Box of the detector to populate.
fluxFieldName : `str`
    Name of the flux field to populate in the catalog, without `_instFlux`
    (e.g. "slot_CalibFlux").
skyWcs : `lsst.afw.geom.SkyWcs` or None, optional
    If supplied, use this to fill in coordinates from centroids.
refCat : `bool`, optional
    Return a ``SimpleCatalog`` so that it behaves like a reference catalog?

Returns
-------
catalog : `lsst.afw.table.SourceCatalog`
    A populated source catalog.

Definition at line 191 of file testUtils.py.

191def createFakeCatalog(num, bbox, fluxFieldName, skyWcs=None, refCat=False):
192 """Return a fake minimally-useful catalog for jointcal.
193
194 Parameters
195 ----------
196 num : `int`
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?
208
209 Returns
210 -------
212 A populated source catalog.
213 """
215 # centroid
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")
219 # shape
220 shapeKey = lsst.afw.table.QuadrupoleKey.addFields(schema, "shape", "",
221 lsst.afw.table.CoordinateType.PIXEL)
222 # Put the fake sources in the minimal catalog.
223 schema.addField(fluxFieldName+"_instFlux", type="D", doc="post-ISR instFlux")
224 schema.addField(fluxFieldName+"_instFluxErr", type="D", doc="post-ISR instFlux stddev")
225 schema.addField(fluxFieldName+"_flux", type="D", doc="source flux (nJy)")
226 schema.addField(fluxFieldName+"_fluxErr", type="D", doc="flux stddev (nJy)")
227 schema.addField(fluxFieldName+"_mag", type="D", doc="magnitude")
228 schema.addField(fluxFieldName+"_magErr", type="D", doc="magnitude stddev")
229 return fillCatalog(schema, num, bbox,
230 centroidKey, xErrKey, yErrKey, shapeKey, fluxFieldName,
231 skyWcs=skyWcs, refCat=refCat)
232
233
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
Definition: SkyWcs.h:117
static QuadrupoleKey addFields(Schema &schema, std::string const &name, std::string const &doc, CoordinateType coordType=CoordinateType::PIXEL)
Add a set of quadrupole subfields to a schema and return a QuadrupoleKey that points to them.
Definition: aggregates.cc:126
static Schema makeMinimalSchema()
Return a minimal schema for Source tables and records.
Definition: Source.h:258
An integer coordinate rectangle.
Definition: Box.h:55

◆ createFakeCcdImage()

def lsst.jointcal.testUtils.createFakeCcdImage (   butler,
  visit,
  num,
  fluxFieldName,
  photoCalibMean = 1e-2,
  photoCalibErr = 1.0,
  fakeDetectorId = 12,
  fakeWcs = None,
  fakeVisitInfo = None 
)
Create a fake CcdImage by making a fake catalog.

Parameters
----------
butler : `lsst.daf.butler.Butler`
    Butler to load metadata from.
visit : `int`
    Visit identifier to build a butler dataId.
num : `int`
    Number of sources to put in the catalogs. Should be
    a square, to have sqrt(num) centroids on a grid.
fluxFieldName : `str`
    Name of the flux field to populate in the catalog, without `_instFlux`
    (e.g. "slot_CalibFlux").
photoCalibMean : `float`, optional
    Value to set for calibrationMean in the created PhotoCalib.
    Note: this value is 1/instFluxMag0, so it should be less than 1.
photoCalibErr : `float`, optional
    Value to set for calibrationErr in the created PhotoCalib.
fakeDetectorId : `int`, optional
    Use this as the detectorId in the returned CcdImage.
fakeWcs : `lsst.afw.geom.SkyWcs`, optional
    A SkyWcs to use instead of one read from disk.
fakeVisitInfo : `lsst.afw.image.VisitInfo`, optional
    A VisitInfo to use instead of one read from disk.

Returns
-------
struct : `lsst.pipe.base.Struct`
   Result struct with components:

   - `catalog` : Catalogs containing fake sources
       (`lsst.afw.table.SourceCatalog`).
   - `ccdImage` : CcdImage containing the metadata and fake sources
       (`lsst.jointcal.CcdImage`).
   - `bbox` : Bounding Box of the image (`lsst.geom.Box2I`).
   - `skyWcs` : SkyWcs of the image (`lsst.afw.geom.SkyWcs`).

Definition at line 133 of file testUtils.py.

135 fakeWcs=None, fakeVisitInfo=None):
136 """Create a fake CcdImage by making a fake catalog.
137
138 Parameters
139 ----------
140 butler : `lsst.daf.butler.Butler`
141 Butler to load metadata from.
142 visit : `int`
143 Visit identifier to build a butler dataId.
144 num : `int`
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.
161
162 Returns
163 -------
164 struct : `lsst.pipe.base.Struct`
165 Result struct with components:
166
167 - `catalog` : Catalogs containing fake sources
169 - `ccdImage` : CcdImage containing the metadata and fake sources
171 - `bbox` : Bounding Box of the image (`lsst.geom.Box2I`).
172 - `skyWcs` : SkyWcs of the image (`lsst.afw.geom.SkyWcs`).
173 """
174 detectorId = 12 # we only have data for detector=12
175
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
182 photoCalib = lsst.afw.image.PhotoCalib(photoCalibMean, photoCalibErr)
183
184 catalog = createFakeCatalog(num, bbox, fluxFieldName, skyWcs=skyWcs)
185 ccdImage = lsst.jointcal.ccdImage.CcdImage(catalog, skyWcs, visitInfo, bbox, filt, photoCalib,
186 detector, visit, fakeDetectorId, fluxFieldName)
187
188 return lsst.pipe.base.Struct(catalog=catalog, ccdImage=ccdImage, bbox=bbox, skyWcs=skyWcs)
189
190
The photometric calibration of an exposure.
Definition: PhotoCalib.h:114
Information about a single exposure of an imaging camera.
Definition: VisitInfo.h:68
Handler of an actual image from a single CCD.
Definition: CcdImage.h:64

◆ createTwoFakeCcdImages()

def lsst.jointcal.testUtils.createTwoFakeCcdImages (   num1 = 4,
  num2 = 4,
  seed = 100,
  fakeDetectorId = 12,
  photoCalibMean1 = 1e-2,
  photoCalibMean2 = 1.2e-2,
  fakeWcses = (None, None),
  fakeVisitInfos = (None, None) 
)
Return two fake ccdImages built on CFHT Megacam metadata.

If ``num1 == num2``, the catalogs will align on-sky so each source will
have a match in the other catalog.

This uses the butler dataset stored in `tests/data/cfht_minimal` to
bootstrap the metadata.

Parameters
----------
num1, num2 : `int`, optional
    Number of sources to put in the first and second catalogs. Should be
    a square, to have sqrt(num) centroids on a grid.
seed : `int`, optional
    Seed value for np.random.
fakeDetectorId : `int`, optional
    Sensor identifier to use for both CcdImages. The wcs, bbox, photoCalib, etc.
    will still be drawn from the CFHT ccd=12 files, as that is the only
    testdata that is included in this simple test dataset.
photoCalibMean1, photoCalibMean2: `float`, optional
    The mean photometric calibration to pass to each ccdImage construction.
    Note: this value is 1/instFluxMag0, so it should be less than 1.
fakeWcses : `list` [`lsst.afw.geom.SkyWcs`], optional
    The SkyWcses to use instead of the ones read from disk.
fakeWcses : `list` [`lsst.afw.image.VisitInfo`], optional
    The VisitInfos to use instead of the ones read from disk.

Returns
-------
struct : `lsst.pipe.base.Struct`
   Result struct with components:

   - `camera` : Camera representing these catalogs
       (`lsst.afw.cameraGeom.Camera`).
   - `catalogs` : Catalogs containing fake sources
       (`list` of `lsst.afw.table.SourceCatalog`).
   - `ccdImageList` : CcdImages containing the metadata and fake sources
       (`list` of `lsst.jointcal.CcdImage`).
   - `bbox` : Bounding Box of the image (`lsst.geom.Box2I`).
   - 'fluxFieldName' : name of the instFlux field in the catalogs ('str').

Definition at line 52 of file testUtils.py.

55 fakeVisitInfos=(None, None)):
56 """Return two fake ccdImages built on CFHT Megacam metadata.
57
58 If ``num1 == num2``, the catalogs will align on-sky so each source will
59 have a match in the other catalog.
60
61 This uses the butler dataset stored in `tests/data/cfht_minimal` to
62 bootstrap the metadata.
63
64 Parameters
65 ----------
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.
82
83 Returns
84 -------
85 struct : `lsst.pipe.base.Struct`
86 Result struct with components:
87
88 - `camera` : Camera representing these catalogs
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').
96 """
97 if not canRunTests():
98 msg = "Necessary packages not available to run tests that use the cfht_minimal dataset."
99 raise unittest.SkipTest(msg)
100
101 np.random.seed(seed)
102
103 visit1 = 849375
104 visit2 = 850587
105 fluxFieldName = "SomeFlux"
106
107 # Load or fake the necessary metadata for each CcdImage
108 dataDir = lsst.utils.getPackageDir('jointcal')
109 inputDir = os.path.join(dataDir, 'tests/data/cfht_minimal/repo')
110 # Ensure this butler is not writeable, so that we don't mess up the repo accidentally.
111 butler = lsst.daf.butler.Butler(inputDir, collections=["singleFrame"], writeable=False)
112
113 # so we can access parts of the camera later (e.g. focal plane)
114 camera = butler.get('camera', instrument="MegaPrime")
115
116 struct1 = createFakeCcdImage(butler, visit1, num1, fluxFieldName,
117 photoCalibMean=photoCalibMean1, photoCalibErr=1.0,
118 fakeDetectorId=fakeDetectorId,
119 fakeWcs=fakeWcses[0], fakeVisitInfo=fakeVisitInfos[0])
120 struct2 = createFakeCcdImage(butler, visit2, num2, fluxFieldName,
121 photoCalibMean=photoCalibMean2, photoCalibErr=5.0,
122 fakeDetectorId=fakeDetectorId,
123 fakeWcs=fakeWcses[1], fakeVisitInfo=fakeVisitInfos[1])
124
125 return lsst.pipe.base.Struct(camera=camera,
126 catalogs=[struct1.catalog, struct2.catalog],
127 ccdImageList=[struct1.ccdImage, struct2.ccdImage],
128 bbox=struct1.bbox,
129 skyWcs=[struct1.skyWcs, struct2.skyWcs],
130 fluxFieldName=fluxFieldName)
131
132
An immutable representation of a camera.
Definition: Camera.h:43

◆ fillCatalog()

def lsst.jointcal.testUtils.fillCatalog (   schema,
  num,
  bbox,
  centroidKey,
  xErrKey,
  yErrKey,
  shapeKey,
  fluxFieldName,
  skyWcs = None,
  fluxErrFraction = 0.05,
  refCat = False 
)
Return a catalog populated with fake, but reasonable, sources.

Centroids are placed on a uniform grid, errors are normally distributed.

Parameters
----------
schema : `lsst.afw.table.Schema`
    Pre-built schema to make the catalog from.
num : `int`
    Number of sources to put in the catalog.
bbox : `lsst.geom.Box2I`
    Bounding box of the ccd to put sources in.
centroidKey : `lsst.afw.table.Key`
    Key for the centroid field to populate.
xErrKey : `lsst.afw.table.Key`
    Key for the xErr field to populate.
yErrKey : `lsst.afw.table.Key`
    Key for the yErr field to populate.
shapeKey : `lsst.afw.table.Key`
    Key for the shape field to populate.
fluxFieldName : `str`
    Name of the flux field to populate in the catalog, without `_instFlux`
    (e.g. "slot_CalibFlux").
skyWcs : `lsst.afw.geom.SkyWcs` or None, optional
    If supplied, use this to fill in coordinates from centroids.
fluxErrFraction : `float`, optional
    Fraction of instFlux to use for the instFluxErr.
refCat : `bool`, optional
    Return a ``SimpleCatalog`` so that it behaves like a reference catalog?

Returns
-------
catalog : `lsst.afw.table.SourceCatalog`
    The filled catalog.

Definition at line 234 of file testUtils.py.

236 skyWcs=None, fluxErrFraction=0.05, refCat=False):
237 """Return a catalog populated with fake, but reasonable, sources.
238
239 Centroids are placed on a uniform grid, errors are normally distributed.
240
241 Parameters
242 ----------
243 schema : `lsst.afw.table.Schema`
244 Pre-built schema to make the catalog from.
245 num : `int`
246 Number of sources to put in the catalog.
247 bbox : `lsst.geom.Box2I`
248 Bounding box of the ccd to put sources in.
249 centroidKey : `lsst.afw.table.Key`
250 Key for the centroid field to populate.
251 xErrKey : `lsst.afw.table.Key`
252 Key for the xErr field to populate.
253 yErrKey : `lsst.afw.table.Key`
254 Key for the yErr field to populate.
255 shapeKey : `lsst.afw.table.Key`
256 Key for the shape field to populate.
257 fluxFieldName : `str`
258 Name of the flux field to populate in the catalog, without `_instFlux`
259 (e.g. "slot_CalibFlux").
260 skyWcs : `lsst.afw.geom.SkyWcs` or None, optional
261 If supplied, use this to fill in coordinates from centroids.
262 fluxErrFraction : `float`, optional
263 Fraction of instFlux to use for the instFluxErr.
264 refCat : `bool`, optional
265 Return a ``SimpleCatalog`` so that it behaves like a reference catalog?
266
267 Returns
268 -------
270 The filled catalog.
271 """
272 table = lsst.afw.table.SourceTable.make(schema)
273 table.defineCentroid('centroid')
274 table.defineShape('shape')
275 table.defineCalibFlux(fluxFieldName)
276 if refCat:
277 catalog = lsst.afw.table.SimpleCatalog(table)
278 else:
279 catalog = lsst.afw.table.SourceCatalog(table)
280
281 instFlux = np.random.random(num)*10000
282 instFluxErr = np.abs(instFlux * np.random.normal(fluxErrFraction, scale=0.1, size=num))
283 xx = np.linspace(bbox.getMinX(), bbox.getMaxX(), int(np.sqrt(num)))
284 yy = np.linspace(bbox.getMinY(), bbox.getMaxY(), int(np.sqrt(num)))
285 xv, yv = np.meshgrid(xx, yy)
286 vx = np.random.normal(scale=0.1, size=num)
287 vy = np.random.normal(scale=0.1, size=num)
288
289 # make all the sources perfectly spherical, for simplicity.
290 mxx = 1
291 myy = 1
292 mxy = 0
293
294 for i, (x, y) in enumerate(zip(xv.ravel(), yv.ravel())):
295 record = catalog.addNew()
296 record.set('id', i)
297 record.set(centroidKey, lsst.geom.Point2D(x, y))
298 record.set(shapeKey, lsst.afw.geom.ellipses.Quadrupole(mxx, myy, mxy))
299
300 if skyWcs is not None:
301 lsst.afw.table.updateSourceCoords(skyWcs, catalog)
302
303 catalog[xErrKey] = vx
304 catalog[yErrKey] = vy
305 catalog[fluxFieldName + '_instFlux'] = instFlux
306 catalog[fluxFieldName + '_instFluxErr'] = instFluxErr
307
308 return catalog
309
310
An ellipse core with quadrupole moments as parameters.
Definition: Quadrupole.h:47
A class used as a handle to a particular field in a table.
Definition: Key.h:53
Defines the fields and offsets for a table.
Definition: Schema.h:51
Custom catalog class for record/table subclasses that are guaranteed to have an ID,...
Definition: SortedCatalog.h:42
static std::shared_ptr< SourceTable > make(Schema const &schema, std::shared_ptr< IdFactory > const &idFactory)
Construct a new table.
Definition: Source.cc:382
void updateSourceCoords(geom::SkyWcs const &wcs, SourceCollection &sourceList)
Update sky coordinates in a collection of source objects.
Definition: wcsUtils.cc:95

◆ getMeasuredStarsFromCatalog()

def lsst.jointcal.testUtils.getMeasuredStarsFromCatalog (   catalog,
  pixToFocal 
)
Return a list of measuredStars built from a catalog.

Parameters
----------
catalog : `lsst.afw.table.SourceCatalog`
    The table to get sources from.
pixToFocal : `lsst.afw.geom.TransformPoint2ToPoint2`
    Transform that goes from pixel to focal plane coordinates, to set the
    MeasuredStar x/y focal points.

Returns
-------
stars : `list` of `lsst.jointcal.MeasuredStar`
    MeasuredStars built from the catalog sources.

Definition at line 311 of file testUtils.py.

311def getMeasuredStarsFromCatalog(catalog, pixToFocal):
312 """Return a list of measuredStars built from a catalog.
313
314 Parameters
315 ----------
317 The table to get sources from.
319 Transform that goes from pixel to focal plane coordinates, to set the
320 MeasuredStar x/y focal points.
321
322 Returns
323 -------
324 stars : `list` of `lsst.jointcal.MeasuredStar`
325 MeasuredStars built from the catalog sources.
326 """
327 stars = []
328 for record in catalog:
329 star = lsst.jointcal.star.MeasuredStar()
330 star.x = record.getX()
331 star.y = record.getY()
332 star.setInstFluxAndErr(record.getCalibInstFlux(), record.getCalibInstFluxErr())
333 # TODO: cleanup after DM-4044
334 point = lsst.geom.Point2D(star.x, star.y)
335 pointFocal = pixToFocal.applyForward(point)
336 star.setXFocal(pointFocal.getX())
337 star.setYFocal(pointFocal.getY())
338 stars.append(star)
339
340 return stars
Transform LSST spatial data, such as lsst::geom::Point2D and lsst::geom::SpherePoint,...
Definition: Transform.h:68
Sources measured on images.
Definition: MeasuredStar.h:51