12 from lsst.coadd.utils
import CoaddDataIdContainer
14 __all__ = [
"PerTractCcdDataIdContainer"]
18 """A version of lsst.pipe.base.DataIdContainer that combines raw data IDs (defined as whatever we use 19 for 'src') with a tract. 23 """Validate data IDs and cast them to the correct type (modify idList in place). 31 idKeyTypeDict = butler.getKeys(datasetType=
"src", level=self.level)
33 raise KeyError(
"Cannot get keys for datasetType %s at level %s: %s" % (
"src", self.level, e))
35 idKeyTypeDict = idKeyTypeDict.copy()
36 idKeyTypeDict[
"tract"] = int
38 for dataDict
in self.idList:
39 for key, strVal
in dataDict.items():
41 keyType = idKeyTypeDict[key]
43 validKeys = sorted(idKeyTypeDict.keys())
44 raise KeyError(
"Unrecognized ID key %r; valid keys are: %s" % (key, validKeys))
47 castVal = keyType(strVal)
49 raise TypeError(
"Cannot cast value %r to %s for ID key %r" % (strVal, keyType, key,))
50 dataDict[key] = castVal
52 def _addDataRef(self, namespace, dataId, tract):
53 """Construct a dataRef based on dataId, but with an added tract key""" 54 forcedDataId = dataId.copy()
55 forcedDataId[
'tract'] = tract
56 dataRef = namespace.butler.dataRef(datasetType=self.datasetType, dataId=forcedDataId)
57 self.refList.append(dataRef)
60 """Make self.refList from self.idList 62 if self.datasetType
is None:
63 raise RuntimeError(
"Must call setDatasetType first")
68 for dataId
in self.idList:
69 if "tract" not in dataId:
71 log.infof(
"Reading WCS to determine tracts for components of dataId={}", dict(dataId))
73 skymap = self.getSkymap(namespace)
75 for ref
in namespace.butler.subset(
"calexp", dataId=dataId):
76 if not ref.datasetExists(
"calexp"):
77 log.warnf(
"calexp with dataId: {} not found.", dict(dataId))
81 if "visit" in ref.dataId.keys():
82 visit = ref.dataId[
"visit"]
85 visit = namespace.butler.queryMetadata(
"calexp", (
"visit"), ref.dataId)[0]
86 if visit
not in visitRefs:
87 visitRefs[visit] =
list()
88 visitRefs[visit].append(ref)
90 wcs = ref.get(
"calexp_wcs", immediate=
True)
94 tract = skymap.findTract(wcs.pixelToSky(box.getCenter()))
95 if lsst.meas.base.imageOverlapsTract(tract, wcs, box):
96 if visit
not in visitTract:
97 visitTract[visit] =
set()
98 visitTract[visit].add(tract.getId())
100 tract = dataId.pop(
"tract")
102 for ref
in namespace.butler.subset(
"src", dataId=dataId):
103 if ref.datasetExists():
109 for visit, tractSet
in sorted(visitTract.items()):
110 for ref
in visitRefs[visit]:
111 for tract
in sorted(tractSet):
114 tractCounter = collections.Counter()
115 for tractSet
in visitTract.values():
116 tractCounter.update(tractSet)
117 log.infof(
"Number of visits per tract: {}", dict(tractCounter))
def _addDataRef(self, namespace, dataId, tract)
def castDataIds(self, butler)
def makeDataRefList(self, namespace)
static Log getLogger(std::string const &loggername)