33 __all__ = [
"PerTractCcdDataIdContainer"]
 
   37     """A version of lsst.pipe.base.DataIdContainer that combines raw data IDs (defined as whatever we use 
   38     for 'src') with a tract. 
   42         """Validate data IDs and cast them to the correct type (modify idList in place). 
   50             idKeyTypeDict = butler.getKeys(datasetType=
"src", level=self.level)
 
   52             raise KeyError(
"Cannot get keys for datasetType %s at level %s: %s" % (
"src", self.level, e))
 
   54         idKeyTypeDict = idKeyTypeDict.copy()
 
   55         idKeyTypeDict[
"tract"] = int
 
   57         for dataDict 
in self.idList:
 
   58             for key, strVal 
in dataDict.items():
 
   60                     keyType = idKeyTypeDict[key]
 
   62                     validKeys = sorted(idKeyTypeDict.keys())
 
   63                     raise KeyError(
"Unrecognized ID key %r; valid keys are: %s" % (key, validKeys))
 
   66                         castVal = keyType(strVal)
 
   68                         raise TypeError(
"Cannot cast value %r to %s for ID key %r" % (strVal, keyType, key,))
 
   69                     dataDict[key] = castVal
 
   71     def _addDataRef(self, namespace, dataId, tract):
 
   72         """Construct a dataRef based on dataId, but with an added tract key""" 
   73         forcedDataId = dataId.copy()
 
   74         forcedDataId[
'tract'] = tract
 
   75         dataRef = namespace.butler.dataRef(datasetType=self.datasetType, dataId=forcedDataId)
 
   76         self.refList.
append(dataRef)
 
   79         """Make self.refList from self.idList 
   81         if self.datasetType 
is None:
 
   82             raise RuntimeError(
"Must call setDatasetType first")
 
   87         for dataId 
in self.idList:
 
   88             if "tract" not in dataId:
 
   90                 log.infof(
"Reading WCS to determine tracts for components of dataId={}", dict(dataId))
 
   94                 for ref 
in namespace.butler.subset(
"calexp", dataId=dataId):
 
   95                     if not ref.datasetExists(
"calexp"):
 
   96                         log.warnf(
"calexp with dataId: {} not found.", dict(dataId))
 
  100                     if "visit" in ref.dataId.keys():
 
  101                         visit = ref.dataId[
"visit"]
 
  104                         visit = namespace.butler.queryMetadata(
"calexp", (
"visit"), ref.dataId)[0]
 
  105                     if visit 
not in visitRefs:
 
  106                         visitRefs[visit] = 
list()
 
  107                     visitRefs[visit].
append(ref)
 
  109                     wcs = ref.get(
"calexp_wcs", immediate=
True)
 
  113                     tract = skymap.findTract(wcs.pixelToSky(box.getCenter()))
 
  114                     if lsst.meas.base.imageOverlapsTract(tract, wcs, box):
 
  115                         if visit 
not in visitTract:
 
  116                             visitTract[visit] = 
set()
 
  117                         visitTract[visit].add(tract.getId())
 
  119                 tract = dataId.pop(
"tract")
 
  121                 for ref 
in namespace.butler.subset(
"src", dataId=dataId):
 
  122                     if ref.datasetExists():
 
  128         for visit, tractSet 
in sorted(visitTract.items()):
 
  129             for ref 
in visitRefs[visit]:
 
  130                 for tract 
in sorted(tractSet):
 
  133             tractCounter = collections.Counter()
 
  134             for tractSet 
in visitTract.values():
 
  135                 tractCounter.update(tractSet)
 
  136             log.infof(
"Number of visits per tract: {}", dict(tractCounter))