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
330
331 sourceMapper = self._makeSourceMapper(sourceSchema)
332 outputSchema = sourceMapper.getOutputSchema()
333
334
335 ccdMapping = {}
336 for ccdIndex, detector in enumerate(camera):
337 ccdMapping[detector.getId()] = ccdIndex
338
339 approxPixelAreaFields = computeApproxPixelAreaFields(camera)
340
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
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
370
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
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
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
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
402 tempCat[deltaMagAperKey][~np.isfinite(tempCat[deltaMagAperKey][:])] = 99.0
403
404 if self.config.doSubtractLocalBackground:
405
406
407
408
409
410
411
412
413
414
415
416
417
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
425 for detector in camera:
426 ccdId = detector.getId()
427
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
436
437 tempCat[instMagErrKey][:] = k*(df[self.config.instFluxField + 'Err'].values[use]
438 / df[self.config.instFluxField].values[use])
439
440
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