21 from __future__
import annotations
23 __all__ = [
"StandardRepoConverter"]
26 from dataclasses
import dataclass
27 from typing
import TYPE_CHECKING, Dict, Iterator, Optional, Tuple
29 from lsst.log
import Log
30 from lsst.log.utils
import temporaryLogLevel
31 from lsst.daf.persistence
import Butler
as Butler2
32 from lsst.daf.butler
import DatasetType, DatasetRef, DataCoordinate, FileDataset
33 from .repoConverter
import RepoConverter
34 from .repoWalker
import RepoWalker
36 SKYMAP_DATASET_TYPES = {
37 coaddName: f
"{coaddName}Coadd_skyMap" for coaddName
in (
"deep",
"goodSeeing",
"dcr")
41 from lsst.skymap
import BaseSkyMap
42 from lsst.daf.butler
import StorageClass
43 from .cameraMapper
import CameraMapper
44 from ..mapping
import Mapping
as CameraMapperMapping
49 """Struct containing information about a SkyMap found in a Gen2 repository.
53 """Name of the skymap used in Gen3 data IDs.
57 """An instance of the actual skymap class.
61 """The coadd name used as a prefix for the dataset type this skymap was
66 """A `DatasetRef` that can be used to ingest the skymap dataset into a
71 """Name of the file containing the skymap dataset, relative to the
77 """A specialization of `RepoConverter` for non-calibration repositories.
82 Keyword arguments are forwarded to (and required by) `RepoConverter`.
88 with temporaryLogLevel(
"CameraMapper", Log.ERROR):
89 with temporaryLogLevel(
"HscMapper", Log.ERROR):
96 return datasetTypeName
in SKYMAP_DATASET_TYPES.values()
100 self.
task.log.info(f
"Looking for skymaps in root {self.root}.")
101 for coaddName, datasetTypeName
in SKYMAP_DATASET_TYPES.items():
102 if not self.
task.isDatasetTypeIncluded(datasetTypeName):
105 exists = self.
butler2.datasetExists(datasetTypeName)
106 except AttributeError:
111 instance = self.
butler2.get(datasetTypeName)
112 name = self.
task.useSkyMap(instance)
113 datasetType = DatasetType(datasetTypeName, dimensions=[
"skymap"],
114 storageClass=
"SkyMap", universe=self.
task.universe)
115 dataId = DataCoordinate.standardize(skymap=name, universe=self.
task.universe)
116 struct =
FoundSkyMap(name=name, instance=instance, coaddName=coaddName,
117 ref=DatasetRef(datasetType, dataId),
118 filename=self.
butler2.getUri(datasetTypeName))
120 self.
task.log.info(
"Found skymap %s in %s in %s.", name, datasetTypeName, self.
root)
125 for datasetTypeName, mapping
in self.
mapper.mappings.items():
126 if datasetTypeName
not in self.
mapper.calibrations:
127 yield datasetTypeName, mapping
130 """Return the appropriate SkyMap for the given dataset type.
134 datasetTypeName : `str`
135 Name of the dataset type for which a skymap is sought.
139 skyMap : `BaseSkyMap` or `None`
140 The `BaseSkyMap` instance, or `None` if there was no match.
141 skyMapName : `str` or `None`
142 The Gen3 name for the SkyMap, or `None` if there was no match.
147 for coaddName
in SKYMAP_DATASET_TYPES.keys():
148 if coaddName
in datasetTypeName:
157 (
"Dataset %s looks like it might need a skymap, but no %sCoadd_skyMap "
158 "found in repo %s."),
159 datasetTypeName, coaddName, self.
root
161 if struct
is not None:
162 return struct.instance, struct.name
167 storageClass: StorageClass) -> RepoWalker.Target:
170 return RepoWalker.Target(
171 datasetTypeName=datasetTypeName,
172 storageClass=storageClass,
175 universe=self.
task.registry.dimensions,
176 instrument=self.
task.instrument.getName(),
178 skyMapName=skyMapName,
184 if self.
task.isDatasetTypeIncluded(struct.ref.datasetType.name):
185 yield FileDataset(path=os.path.join(self.
root, struct.filename), refs=struct.ref)
192 """Gen2 butler associated with this repository.
196 """Gen2 mapper associated with this repository.