187 startTime = time.time()
193 if (visitCatDataRef
is not None and starObsDataRef
is None
194 or visitCatDataRef
is None and starObsDataRef
is not None):
195 self.log.
warning(
"Only one of visitCatDataRef and starObsDataRef are set, so "
196 "no checkpoint files will be persisted.")
198 if self.config.doSubtractLocalBackground
and calibFluxApertureRadius
is None:
199 raise RuntimeError(
"Must set calibFluxApertureRadius if doSubtractLocalBackground is True.")
202 dataRef = groupedDataRefs[
list(groupedDataRefs.keys())[0]][0]
206 for ccdIndex, detector
in enumerate(camera):
207 ccdMapping[detector.getId()] = ccdIndex
211 sourceMapper = self._makeSourceMapper(sourceSchema)
214 aperMapper = self._makeAperMapper(sourceSchema)
216 outputSchema = sourceMapper.getOutputSchema()
218 if inStarObsCat
is not None:
219 fullCatalog = inStarObsCat
220 comp1 = fullCatalog.schema.compare(outputSchema, outputSchema.EQUAL_KEYS)
221 comp2 = fullCatalog.schema.compare(outputSchema, outputSchema.EQUAL_NAMES)
222 if not comp1
or not comp2:
223 raise RuntimeError(
"Existing fgcmStarObservations file found with mismatched schema.")
229 instFluxKey = sourceSchema[self.config.instFluxField].asKey()
230 instFluxErrKey = sourceSchema[self.config.instFluxField +
'Err'].asKey()
231 visitKey = outputSchema[
'visit'].asKey()
232 ccdKey = outputSchema[
'ccd'].asKey()
233 instMagKey = outputSchema[
'instMag'].asKey()
234 instMagErrKey = outputSchema[
'instMagErr'].asKey()
235 deltaMagBkgKey = outputSchema[
'deltaMagBkg'].asKey()
238 if self.config.doSubtractLocalBackground:
239 localBackgroundFluxKey = sourceSchema[self.config.localBackgroundFluxField].asKey()
240 localBackgroundArea = np.pi*calibFluxApertureRadius**2.
242 aperOutputSchema = aperMapper.getOutputSchema()
244 instFluxAperInKey = sourceSchema[self.config.apertureInnerInstFluxField].asKey()
245 instFluxErrAperInKey = sourceSchema[self.config.apertureInnerInstFluxField +
'Err'].asKey()
246 instFluxAperOutKey = sourceSchema[self.config.apertureOuterInstFluxField].asKey()
247 instFluxErrAperOutKey = sourceSchema[self.config.apertureOuterInstFluxField +
'Err'].asKey()
248 instMagInKey = aperOutputSchema[
'instMag_aper_inner'].asKey()
249 instMagErrInKey = aperOutputSchema[
'instMagErr_aper_inner'].asKey()
250 instMagOutKey = aperOutputSchema[
'instMag_aper_outer'].asKey()
251 instMagErrOutKey = aperOutputSchema[
'instMagErr_aper_outer'].asKey()
256 for ctr, visit
in enumerate(visitCat):
257 if visit[
'sources_read']:
260 expTime = visit[
'exptime']
267 for dataRef
in groupedDataRefs[visit[
'visit']]:
269 ccdId = dataRef.dataId[self.config.ccdDataRefName]
271 sources = dataRef.get(datasetType=
'src', flags=afwTable.SOURCE_IO_NO_FOOTPRINTS)
272 goodSrc = self.sourceSelector.selectSources(sources)
276 if self.config.doSubtractLocalBackground:
277 localBackground = localBackgroundArea*sources[localBackgroundFluxKey]
279 bad, = np.where((sources[instFluxKey] - localBackground) <= 0.0)
280 goodSrc.selected[bad] =
False
283 tempCat.reserve(goodSrc.selected.sum())
284 tempCat.extend(sources[goodSrc.selected], mapper=sourceMapper)
285 tempCat[visitKey][:] = visit[
'visit']
286 tempCat[ccdKey][:] = ccdId
289 scaledInstFlux = (sources[instFluxKey][goodSrc.selected]
290 * visit[
'scaling'][ccdMapping[ccdId]])
291 tempCat[instMagKey][:] = (-2.5*np.log10(scaledInstFlux) + 2.5*np.log10(expTime))
294 if self.config.doSubtractLocalBackground:
308 tempCat[deltaMagBkgKey][:] = (-2.5*np.log10(sources[instFluxKey][goodSrc.selected]
309 - localBackground[goodSrc.selected]) -
310 -2.5*np.log10(sources[instFluxKey][goodSrc.selected]))
312 tempCat[deltaMagBkgKey][:] = 0.0
317 tempCat[instMagErrKey][:] = k*(sources[instFluxErrKey][goodSrc.selected]
318 / sources[instFluxKey][goodSrc.selected])
321 tempCat[
'jacobian'] = approxPixelAreaFields[ccdId].evaluate(tempCat[
'x'],
325 if self.config.doApplyWcsJacobian:
326 tempCat[instMagKey][:] -= 2.5*np.log10(tempCat[
'jacobian'][:])
328 fullCatalog.extend(tempCat)
333 tempAperCat.reserve(goodSrc.selected.sum())
334 tempAperCat.extend(sources[goodSrc.selected], mapper=aperMapper)
336 with np.warnings.catch_warnings():
339 np.warnings.simplefilter(
"ignore")
341 tempAperCat[instMagInKey][:] = -2.5*np.log10(
342 sources[instFluxAperInKey][goodSrc.selected])
343 tempAperCat[instMagErrInKey][:] = k*(
344 sources[instFluxErrAperInKey][goodSrc.selected]
345 / sources[instFluxAperInKey][goodSrc.selected])
346 tempAperCat[instMagOutKey][:] = -2.5*np.log10(
347 sources[instFluxAperOutKey][goodSrc.selected])
348 tempAperCat[instMagErrOutKey][:] = k*(
349 sources[instFluxErrAperOutKey][goodSrc.selected]
350 / sources[instFluxAperOutKey][goodSrc.selected])
352 aperVisitCatalog.extend(tempAperCat)
354 nStarInVisit += len(tempCat)
357 if not aperVisitCatalog.isContiguous():
358 aperVisitCatalog = aperVisitCatalog.copy(deep=
True)
360 instMagIn = aperVisitCatalog[instMagInKey]
361 instMagErrIn = aperVisitCatalog[instMagErrInKey]
362 instMagOut = aperVisitCatalog[instMagOutKey]
363 instMagErrOut = aperVisitCatalog[instMagErrOutKey]
365 ok = (np.isfinite(instMagIn) & np.isfinite(instMagErrIn)
366 & np.isfinite(instMagOut) & np.isfinite(instMagErrOut))
368 visit[
'deltaAper'] = np.median(instMagIn[ok] - instMagOut[ok])
369 visit[
'sources_read'] =
True
371 self.log.
info(
" Found %d good stars in visit %d (deltaAper = %.3f)" %
372 (nStarInVisit, visit[
'visit'], visit[
'deltaAper']))
374 if ((ctr % self.config.nVisitsPerCheckpoint) == 0
375 and starObsDataRef
is not None and visitCatDataRef
is not None):
378 starObsDataRef.put(fullCatalog)
379 visitCatDataRef.put(visitCat)
381 self.log.
info(
"Found all good star observations in %.2f s" %
382 (time.time() - startTime))
daf::base::PropertyList * list
def computeApproxPixelAreaFields(camera)