LSST Applications 27.0.0,g0265f82a02+469cd937ee,g02d81e74bb+21ad69e7e1,g1470d8bcf6+cbe83ee85a,g2079a07aa2+e67c6346a6,g212a7c68fe+04a9158687,g2305ad1205+94392ce272,g295015adf3+81dd352a9d,g2bbee38e9b+469cd937ee,g337abbeb29+469cd937ee,g3939d97d7f+72a9f7b576,g487adcacf7+71499e7cba,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+df404f777f,g5a732f18d5+be83d3ecdb,g64a986408d+21ad69e7e1,g858d7b2824+21ad69e7e1,g8a8a8dda67+a6fc98d2e7,g99cad8db69+f62e5b0af5,g9ddcbc5298+d4bad12328,ga1e77700b3+9c366c4306,ga8c6da7877+71e4819109,gb0e22166c9+25ba2f69a1,gb6a65358fc+469cd937ee,gbb8dafda3b+69d3c0e320,gc07e1c2157+a98bf949bb,gc120e1dc64+615ec43309,gc28159a63d+469cd937ee,gcf0d15dbbd+72a9f7b576,gdaeeff99f8+a38ce5ea23,ge6526c86ff+3a7c1ac5f1,ge79ae78c31+469cd937ee,gee10cc3b42+a6fc98d2e7,gf1cff7945b+21ad69e7e1,gfbcc870c63+9a11dc8c8f
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Attributes | List of all members
lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask Class Reference
Inheritance diagram for lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask:
lsst.fgcmcal.fgcmBuildStarsBase.FgcmBuildStarsBaseTask

Public Member Functions

 __init__ (self, initInputs=None, **kwargs)
 
 runQuantum (self, butlerQC, inputRefs, outputRefs)
 
 fgcmMakeAllStarObservations (self, groupedHandles, visitCat, sourceSchema, camera, calibFluxApertureRadius=None)
 

Public Attributes

 sourceSchema
 

Static Public Attributes

 ConfigClass = FgcmBuildStarsTableConfig
 
bool canMultiprocess = False
 

Protected Member Functions

 _groupHandles (self, sourceTableHandleDict, visitSummaryHandleDict)
 
 _get_sourceTable_visit_columns (self, inColumns)
 

Static Protected Attributes

str _DefaultName = "fgcmBuildStarsTable"
 

Detailed Description

Build stars for the FGCM global calibration, using sourceTable_visit catalogs.

Definition at line 209 of file fgcmBuildStarsTable.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.__init__ ( self,
initInputs = None,
** kwargs )

Reimplemented from lsst.fgcmcal.fgcmBuildStarsBase.FgcmBuildStarsBaseTask.

Definition at line 218 of file fgcmBuildStarsTable.py.

218 def __init__(self, initInputs=None, **kwargs):
219 super().__init__(initInputs=initInputs, **kwargs)
220 if initInputs is not None:
221 self.sourceSchema = initInputs["sourceSchema"].schema
222

Member Function Documentation

◆ _get_sourceTable_visit_columns()

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask._get_sourceTable_visit_columns ( self,
inColumns )
protected
Get the sourceTable_visit columns from the config.

Parameters
----------
inColumns : `list`
    List of columns available in the sourceTable_visit

Returns
-------
columns : `list`
    List of columns to read from sourceTable_visit.

Definition at line 460 of file fgcmBuildStarsTable.py.

460 def _get_sourceTable_visit_columns(self, inColumns):
461 """
462 Get the sourceTable_visit columns from the config.
463
464 Parameters
465 ----------
466 inColumns : `list`
467 List of columns available in the sourceTable_visit
468
469 Returns
470 -------
471 columns : `list`
472 List of columns to read from sourceTable_visit.
473 """
474 # Some names are hard-coded in the parquet table.
475 columns = ['visit', 'detector',
476 'ra', 'dec', 'x', 'y', self.config.psfCandidateName,
477 self.config.instFluxField, self.config.instFluxField + 'Err',
478 self.config.apertureInnerInstFluxField, self.config.apertureInnerInstFluxField + 'Err',
479 self.config.apertureOuterInstFluxField, self.config.apertureOuterInstFluxField + 'Err']
480 if self.sourceSelector.config.doFlags:
481 columns.extend(self.sourceSelector.config.flags.bad)
482 if self.sourceSelector.config.doUnresolved:
483 columns.append(self.sourceSelector.config.unresolved.name)
484 if self.sourceSelector.config.doIsolated:
485 columns.append(self.sourceSelector.config.isolated.parentName)
486 columns.append(self.sourceSelector.config.isolated.nChildName)
487 if self.sourceSelector.config.doRequirePrimary:
488 columns.append(self.sourceSelector.config.requirePrimary.primaryColName)
489 if self.config.doSubtractLocalBackground:
490 columns.append(self.config.localBackgroundFluxField)
491
492 return columns

◆ _groupHandles()

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask._groupHandles ( self,
sourceTableHandleDict,
visitSummaryHandleDict )
protected
Group sourceTable and visitSummary handles.

Parameters
----------
sourceTableHandleDict : `dict` [`int`, `str`]
    Dict of source tables, keyed by visit.
visitSummaryHandleDict : `dict` [int, `str`]
    Dict of visit summary catalogs, keyed by visit.

Returns
-------
groupedHandles : `dict` [`int`, `list`]
    Dictionary with sorted visit keys, and `list`s with
    `lsst.daf.butler.DeferredDataSetHandle`.  The first
    item in the list will be the visitSummary ref, and
    the second will be the source table ref.

Definition at line 293 of file fgcmBuildStarsTable.py.

293 def _groupHandles(self, sourceTableHandleDict, visitSummaryHandleDict):
294 """Group sourceTable and visitSummary handles.
295
296 Parameters
297 ----------
298 sourceTableHandleDict : `dict` [`int`, `str`]
299 Dict of source tables, keyed by visit.
300 visitSummaryHandleDict : `dict` [int, `str`]
301 Dict of visit summary catalogs, keyed by visit.
302
303 Returns
304 -------
305 groupedHandles : `dict` [`int`, `list`]
306 Dictionary with sorted visit keys, and `list`s with
307 `lsst.daf.butler.DeferredDataSetHandle`. The first
308 item in the list will be the visitSummary ref, and
309 the second will be the source table ref.
310 """
311 groupedHandles = collections.defaultdict(list)
312 visits = sorted(sourceTableHandleDict.keys())
313
314 for visit in visits:
315 groupedHandles[visit] = [visitSummaryHandleDict[visit],
316 sourceTableHandleDict[visit]]
317
318 return groupedHandles
319

◆ fgcmMakeAllStarObservations()

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.fgcmMakeAllStarObservations ( self,
groupedHandles,
visitCat,
sourceSchema,
camera,
calibFluxApertureRadius = None )
Compile all good star observations from visits in visitCat.

Parameters
----------
groupedHandles : `dict` [`list` [`lsst.daf.butler.DeferredDatasetHandle`]]
    Dataset handles, grouped by visit.
visitCat : `afw.table.BaseCatalog`
    Catalog with visit data for FGCM
sourceSchema : `lsst.afw.table.Schema`
    Schema for the input src catalogs.
camera : `lsst.afw.cameraGeom.Camera`
calibFluxApertureRadius : `float`, optional
    Aperture radius for calibration flux.
inStarObsCat : `afw.table.BaseCatalog`
    Input observation catalog.  If this is incomplete, observations
    will be appended from when it was cut off.

Returns
-------
fgcmStarObservations : `afw.table.BaseCatalog`
    Full catalog of good observations.

Raises
------
RuntimeError: Raised if doSubtractLocalBackground is True and
   calibFluxApertureRadius is not set.

Reimplemented from lsst.fgcmcal.fgcmBuildStarsBase.FgcmBuildStarsBaseTask.

Definition at line 320 of file fgcmBuildStarsTable.py.

323 calibFluxApertureRadius=None):
324 startTime = time.time()
325
326 if self.config.doSubtractLocalBackground and calibFluxApertureRadius is None:
327 raise RuntimeError("Must set calibFluxApertureRadius if doSubtractLocalBackground is True.")
328
329 # To get the correct output schema, we use the legacy code.
330 # We are not actually using this mapper, except to grab the outputSchema
331 sourceMapper = self._makeSourceMapper(sourceSchema)
332 outputSchema = sourceMapper.getOutputSchema()
333
334 # Construct mapping from ccd number to index
335 ccdMapping = {}
336 for ccdIndex, detector in enumerate(camera):
337 ccdMapping[detector.getId()] = ccdIndex
338
339 approxPixelAreaFields = computeApproxPixelAreaFields(camera)
340
341 fullCatalog = afwTable.BaseCatalog(outputSchema)
342
343 visitKey = outputSchema['visit'].asKey()
344 ccdKey = outputSchema['ccd'].asKey()
345 instMagKey = outputSchema['instMag'].asKey()
346 instMagErrKey = outputSchema['instMagErr'].asKey()
347 deltaMagAperKey = outputSchema['deltaMagAper'].asKey()
348
349 # Prepare local background if desired
350 if self.config.doSubtractLocalBackground:
351 localBackgroundArea = np.pi*calibFluxApertureRadius**2.
352
353 columns = None
354
355 k = 2.5/np.log(10.)
356
357 for counter, visit in enumerate(visitCat):
358 expTime = visit['exptime']
359
360 handle = groupedHandles[visit['visit']][-1]
361
362 if columns is None:
363 inColumns = handle.get(component='columns')
364 columns = self._get_sourceTable_visit_columns(inColumns)
365 df = handle.get(parameters={'columns': columns})
366
367 goodSrc = self.sourceSelector.selectSources(df)
368
369 # Need to add a selection based on the local background correction
370 # if necessary
371 if self.config.doSubtractLocalBackground:
372 localBackground = localBackgroundArea*df[self.config.localBackgroundFluxField].values
373 use, = np.where((goodSrc.selected)
374 & ((df[self.config.instFluxField].values - localBackground) > 0.0))
375 else:
376 use, = np.where(goodSrc.selected)
377
378 tempCat = afwTable.BaseCatalog(fullCatalog.schema)
379 tempCat.resize(use.size)
380
381 tempCat['ra'][:] = np.deg2rad(df['ra'].values[use])
382 tempCat['dec'][:] = np.deg2rad(df['dec'].values[use])
383 tempCat['x'][:] = df['x'].values[use]
384 tempCat['y'][:] = df['y'].values[use]
385 # The "visit" name in the parquet table is hard-coded.
386 tempCat[visitKey][:] = df['visit'].values[use]
387 tempCat[ccdKey][:] = df['detector'].values[use]
388 tempCat['psf_candidate'] = df[self.config.psfCandidateName].values[use]
389
390 with warnings.catch_warnings():
391 # Ignore warnings, we will filter infinites and nans below
392 warnings.simplefilter("ignore")
393
394 instMagInner = -2.5*np.log10(df[self.config.apertureInnerInstFluxField].values[use])
395 instMagErrInner = k*(df[self.config.apertureInnerInstFluxField + 'Err'].values[use]
396 / df[self.config.apertureInnerInstFluxField].values[use])
397 instMagOuter = -2.5*np.log10(df[self.config.apertureOuterInstFluxField].values[use])
398 instMagErrOuter = k*(df[self.config.apertureOuterInstFluxField + 'Err'].values[use]
399 / df[self.config.apertureOuterInstFluxField].values[use])
400 tempCat[deltaMagAperKey][:] = instMagInner - instMagOuter
401 # Set bad values to illegal values for fgcm.
402 tempCat[deltaMagAperKey][~np.isfinite(tempCat[deltaMagAperKey][:])] = 99.0
403
404 if self.config.doSubtractLocalBackground:
405 # At the moment we only adjust the flux and not the flux
406 # error by the background because the error on
407 # base_LocalBackground_instFlux is the rms error in the
408 # background annulus, not the error on the mean in the
409 # background estimate (which is much smaller, by sqrt(n)
410 # pixels used to estimate the background, which we do not
411 # have access to in this task). In the default settings,
412 # the annulus is sufficiently large such that these
413 # additional errors are are negligibly small (much less
414 # than a mmag in quadrature).
415
416 # This is the difference between the mag with local background correction
417 # and the mag without local background correction.
418 tempCat['deltaMagBkg'] = (-2.5*np.log10(df[self.config.instFluxField].values[use]
419 - localBackground[use]) -
420 -2.5*np.log10(df[self.config.instFluxField].values[use]))
421 else:
422 tempCat['deltaMagBkg'][:] = 0.0
423
424 # Need to loop over ccds here
425 for detector in camera:
426 ccdId = detector.getId()
427 # used index for all observations with a given ccd
428 use2 = (tempCat[ccdKey] == ccdId)
429 tempCat['jacobian'][use2] = approxPixelAreaFields[ccdId].evaluate(tempCat['x'][use2],
430 tempCat['y'][use2])
431 scaledInstFlux = (df[self.config.instFluxField].values[use[use2]]
432 * visit['scaling'][ccdMapping[ccdId]])
433 tempCat[instMagKey][use2] = (-2.5*np.log10(scaledInstFlux) + 2.5*np.log10(expTime))
434
435 # Compute instMagErr from instFluxErr/instFlux, any scaling
436 # will cancel out.
437 tempCat[instMagErrKey][:] = k*(df[self.config.instFluxField + 'Err'].values[use]
438 / df[self.config.instFluxField].values[use])
439
440 # Apply the jacobian if configured
441 if self.config.doApplyWcsJacobian:
442 tempCat[instMagKey][:] -= 2.5*np.log10(tempCat['jacobian'][:])
443
444 fullCatalog.extend(tempCat)
445
446 deltaOk = (np.isfinite(instMagInner) & np.isfinite(instMagErrInner)
447 & np.isfinite(instMagOuter) & np.isfinite(instMagErrOuter))
448
449 visit['deltaAper'] = np.median(instMagInner[deltaOk] - instMagOuter[deltaOk])
450 visit['sources_read'] = True
451
452 self.log.info(" Found %d good stars in visit %d (deltaAper = %0.3f)",
453 use.size, visit['visit'], visit['deltaAper'])
454
455 self.log.info("Found all good star observations in %.2f s" %
456 (time.time() - startTime))
457
458 return fullCatalog
459

◆ runQuantum()

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.runQuantum ( self,
butlerQC,
inputRefs,
outputRefs )

Definition at line 223 of file fgcmBuildStarsTable.py.

223 def runQuantum(self, butlerQC, inputRefs, outputRefs):
224 inputRefDict = butlerQC.get(inputRefs)
225
226 sourceTableHandles = inputRefDict['sourceTable_visit']
227
228 self.log.info("Running with %d sourceTable_visit handles",
229 len(sourceTableHandles))
230
231 sourceTableHandleDict = {sourceTableHandle.dataId['visit']: sourceTableHandle for
232 sourceTableHandle in sourceTableHandles}
233
234 if self.config.doReferenceMatches:
235 # Get the LUT handle
236 lutHandle = inputRefDict['fgcmLookUpTable']
237
238 # Prepare the reference catalog loader
239 refConfig = LoadReferenceObjectsConfig()
240 refConfig.filterMap = self.config.fgcmLoadReferenceCatalog.filterMap
241 refObjLoader = ReferenceObjectLoader(dataIds=[ref.datasetRef.dataId
242 for ref in inputRefs.refCat],
243 refCats=butlerQC.get(inputRefs.refCat),
244 name=self.config.connections.refCat,
245 log=self.log,
246 config=refConfig)
247 self.makeSubtask('fgcmLoadReferenceCatalog',
248 refObjLoader=refObjLoader,
249 refCatName=self.config.connections.refCat)
250 else:
251 lutHandle = None
252
253 # Compute aperture radius if necessary. This is useful to do now before
254 # any heave lifting has happened (fail early).
255 calibFluxApertureRadius = None
256 if self.config.doSubtractLocalBackground:
257 try:
258 calibFluxApertureRadius = computeApertureRadiusFromName(self.config.instFluxField)
259 except RuntimeError as e:
260 raise RuntimeError("Could not determine aperture radius from %s. "
261 "Cannot use doSubtractLocalBackground." %
262 (self.config.instFluxField)) from e
263
264 visitSummaryHandles = inputRefDict['visitSummary']
265 visitSummaryHandleDict = {visitSummaryHandle.dataId['visit']: visitSummaryHandle for
266 visitSummaryHandle in visitSummaryHandles}
267
268 camera = inputRefDict['camera']
269 groupedHandles = self._groupHandles(sourceTableHandleDict,
270 visitSummaryHandleDict)
271
272 visitCat = self.fgcmMakeVisitCatalog(camera, groupedHandles)
273
274 rad = calibFluxApertureRadius
275 fgcmStarObservationCat = self.fgcmMakeAllStarObservations(groupedHandles,
276 visitCat,
277 self.sourceSchema,
278 camera,
279 calibFluxApertureRadius=rad)
280
281 butlerQC.put(visitCat, outputRefs.fgcmVisitCatalog)
282 butlerQC.put(fgcmStarObservationCat, outputRefs.fgcmStarObservations)
283
284 fgcmStarIdCat, fgcmStarIndicesCat, fgcmRefCat = self.fgcmMatchStars(visitCat,
285 fgcmStarObservationCat,
286 lutHandle=lutHandle)
287
288 butlerQC.put(fgcmStarIdCat, outputRefs.fgcmStarIds)
289 butlerQC.put(fgcmStarIndicesCat, outputRefs.fgcmStarIndices)
290 if fgcmRefCat is not None:
291 butlerQC.put(fgcmRefCat, outputRefs.fgcmReferenceStars)
292

Member Data Documentation

◆ _DefaultName

str lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask._DefaultName = "fgcmBuildStarsTable"
staticprotected

Definition at line 214 of file fgcmBuildStarsTable.py.

◆ canMultiprocess

bool lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.canMultiprocess = False
static

Definition at line 216 of file fgcmBuildStarsTable.py.

◆ ConfigClass

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.ConfigClass = FgcmBuildStarsTableConfig
static

Definition at line 213 of file fgcmBuildStarsTable.py.

◆ sourceSchema

lsst.fgcmcal.fgcmBuildStarsTable.FgcmBuildStarsTableTask.sourceSchema

Definition at line 221 of file fgcmBuildStarsTable.py.


The documentation for this class was generated from the following file: