275 def runDataRef(self, butler):
277 Make FGCM output products for use in the stack
281 butler: `lsst.daf.persistence.Butler`
283 Final fit cycle number, override config.
287 offsets: `lsst.pipe.base.Struct`
288 A structure with array of zeropoint offsets
293 Raised if any one of the following is true:
295 - butler cannot find "fgcmBuildStars_config" or
296 "fgcmBuildStarsTable_config".
297 - butler cannot find "fgcmFitCycle_config".
298 - "fgcmFitCycle_config" does not refer to
299 `self.config.cycleNumber`.
300 - butler cannot find "fgcmAtmosphereParameters" and
301 `self.config.doAtmosphereOutput` is `True`.
302 - butler cannot find "fgcmStandardStars" and
303 `self.config.doReferenceCalibration` is `True` or
304 `self.config.doRefcatOutput` is `True`.
305 - butler cannot find "fgcmZeropoints" and
306 `self.config.doZeropointOutput` is `True`.
311 if not butler.datasetExists(
'fgcmBuildStarsTable_config')
and \
312 not butler.datasetExists(
'fgcmBuildStars_config'):
313 raise RuntimeError(
"Cannot find fgcmBuildStarsTable_config or fgcmBuildStars_config, "
314 "which is prereq for fgcmOutputProducts")
316 if butler.datasetExists(
'fgcmBuildStarsTable_config'):
317 fgcmBuildStarsConfig = butler.get(
'fgcmBuildStarsTable_config')
319 fgcmBuildStarsConfig = butler.get(
'fgcmBuildStars_config')
320 self.visitDataRefName = fgcmBuildStarsConfig.visitDataRefName
321 self.ccdDataRefName = fgcmBuildStarsConfig.ccdDataRefName
322 self.filterMap = fgcmBuildStarsConfig.filterMap
324 if self.config.doComposeWcsJacobian
and not fgcmBuildStarsConfig.doApplyWcsJacobian:
325 raise RuntimeError(
"Cannot compose the WCS jacobian if it hasn't been applied "
326 "in fgcmBuildStarsTask.")
328 if not self.config.doComposeWcsJacobian
and fgcmBuildStarsConfig.doApplyWcsJacobian:
329 self.log.
warn(
"Jacobian was applied in build-stars but doComposeWcsJacobian is not set.")
332 if not butler.datasetExists(
'fgcmFitCycle_config', fgcmcycle=self.config.cycleNumber):
333 raise RuntimeError(
"Cannot find fgcmFitCycle_config from cycle %d " % (self.config.cycleNumber) +
334 "which is required for fgcmOutputProducts.")
336 fitCycleConfig = butler.get(
'fgcmFitCycle_config', fgcmcycle=self.config.cycleNumber)
337 self.configBands = fitCycleConfig.bands
339 if self.config.doReferenceCalibration
and fitCycleConfig.doReferenceCalibration:
340 self.log.
warn(
"doReferenceCalibration is set, and is possibly redundant with "
341 "fitCycleConfig.doReferenceCalibration")
344 if (self.config.doAtmosphereOutput
and
345 not butler.datasetExists(
'fgcmAtmosphereParameters', fgcmcycle=self.config.cycleNumber)):
346 raise RuntimeError(
"Atmosphere parameters are missing for cycle %d." %
347 (self.config.cycleNumber))
349 if ((self.config.doReferenceCalibration
or self.config.doRefcatOutput)
and
350 (
not butler.datasetExists(
'fgcmStandardStars',
351 fgcmcycle=self.config.cycleNumber))):
352 raise RuntimeError(
"Standard stars are missing for cycle %d." %
353 (self.config.cycleNumber))
355 if (self.config.doZeropointOutput
and
356 (
not butler.datasetExists(
'fgcmZeropoints', fgcmcycle=self.config.cycleNumber))):
357 raise RuntimeError(
"Zeropoints are missing for cycle %d." %
358 (self.config.cycleNumber))
361 if butler.datasetExists(
'fgcmFitCycle_config', fgcmcycle=self.config.cycleNumber + 1):
362 raise RuntimeError(
"The task fgcmOutputProducts should only be run"
363 "on the final fit cycle products")
365 if self.config.doReferenceCalibration
or self.config.doRefcatOutput:
366 stdCat = butler.get(
'fgcmStandardStars', fgcmcycle=self.config.cycleNumber)
367 md = stdCat.getMetadata()
368 self.bands = md.getArray(
'BANDS')
371 self.bands = self.configBands
373 if self.config.doReferenceCalibration:
374 offsets = self._computeReferenceOffsets(butler, stdCat)
376 offsets = np.zeros(len(self.bands))
379 if self.config.doRefcatOutput:
380 self._outputStandardStars(butler, stdCat, offsets, self.config.datasetConfig)
385 if self.config.doZeropointOutput:
386 zptCat = butler.get(
'fgcmZeropoints', fgcmcycle=self.config.cycleNumber)
387 visitCat = butler.get(
'fgcmVisitCatalog')
389 self._outputZeropoints(butler, zptCat, visitCat, offsets)
392 if self.config.doAtmosphereOutput:
393 atmCat = butler.get(
'fgcmAtmosphereParameters', fgcmcycle=self.config.cycleNumber)
394 self._outputAtmospheres(butler, atmCat)
397 return pipeBase.Struct(offsets=offsets)