ConfigClass = MakeWarpConfig
_DefaultName = "makeWarp"
@utils.inheritDoc(pipeBase.PipelineTask)
def runQuantum(self, butlerQC, inputRefs, outputRefs):
# Obtain the list of input detectors from calExpList. Sort them by
# detector order (to ensure reproducibility). Then ensure all input
# lists are in the same sorted detector order.
detectorOrder = [ref.datasetRef.dataId['detector'] for ref in inputRefs.calExpList]
detectorOrder.sort()
inputRefs = reorderRefs(inputRefs, detectorOrder, dataIdKey='detector')
# Read in all inputs.
inputs = butlerQC.get(inputRefs)
# Construct skyInfo expected by `run`. We remove the SkyMap itself
# from the dictionary so we can pass it as kwargs later.
skyMap = inputs.pop("skyMap")
quantumDataId = butlerQC.quantum.dataId
skyInfo = makeSkyInfo(skyMap, tractId=quantumDataId['tract'], patchId=quantumDataId['patch'])
# Construct list of input DataIds expected by `run`
dataIdList = [ref.datasetRef.dataId for ref in inputRefs.calExpList]
# Construct list of packed integer IDs expected by `run`
ccdIdList = [dataId.pack("visit_detector") for dataId in dataIdList]
# Run the selector and filter out calexps that were not selected
# primarily because they do not overlap the patch
cornerPosList = lsst.geom.Box2D(skyInfo.bbox).getCorners()
coordList = [skyInfo.wcs.pixelToSky(pos) for pos in cornerPosList]
goodIndices = self.select.run(**inputs, coordList=coordList, dataIds=dataIdList)
inputs = self.filterInputs(indices=goodIndices, inputs=inputs)
# Read from disk only the selected calexps
inputs['calExpList'] = [ref.get() for ref in inputs['calExpList']]
# Extract integer visitId requested by `run`
visits = [dataId['visit'] for dataId in dataIdList]
visitId = visits[0]
if self.config.doApplyExternalSkyWcs:
if self.config.useGlobalExternalSkyWcs:
externalSkyWcsCatalog = inputs.pop("externalSkyWcsGlobalCatalog")
else:
externalSkyWcsCatalog = inputs.pop("externalSkyWcsTractCatalog")
else:
externalSkyWcsCatalog = None
if self.config.doApplyExternalPhotoCalib:
if self.config.useGlobalExternalPhotoCalib:
externalPhotoCalibCatalog = inputs.pop("externalPhotoCalibGlobalCatalog")
else:
externalPhotoCalibCatalog = inputs.pop("externalPhotoCalibTractCatalog")
else:
externalPhotoCalibCatalog = None
completeIndices = self.prepareCalibratedExposures(**inputs,
externalSkyWcsCatalog=externalSkyWcsCatalog,
externalPhotoCalibCatalog=externalPhotoCalibCatalog)
# Redo the input selection with inputs with complete wcs/photocalib info.
inputs = self.filterInputs(indices=completeIndices, inputs=inputs)
results = self.run(**inputs, visitId=visitId,
ccdIdList=[ccdIdList[i] for i in goodIndices],
dataIdList=[dataIdList[i] for i in goodIndices],
skyInfo=skyInfo)
if self.config.makeDirect and results.exposures["direct"] is not None:
butlerQC.put(results.exposures["direct"], outputRefs.direct)
if self.config.makePsfMatched and results.exposures["psfMatched"] is not None:
butlerQC.put(results.exposures["psfMatched"], outputRefs.psfMatched)
def filterInputs(self, indices, inputs):
for key in inputs.keys():
# Only down-select on list inputs
if isinstance(inputs[key], list):
inputs[key] = [inputs[key][ind] for ind in indices]
return inputs
def prepareCalibratedExposures(self, calExpList, backgroundList=None, skyCorrList=None,
externalSkyWcsCatalog=None, externalPhotoCalibCatalog=None,
**kwargs):
Definition at line 600 of file makeCoaddTempExp.py.