21 from __future__
import annotations
23 __all__ = [
"StandardRepoConverter"]
26 from dataclasses
import dataclass
27 from typing
import TYPE_CHECKING, Dict, Iterator, List, 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, FormatterParameter
43 from .cameraMapper
import CameraMapper
44 from .repoWalker.scanner
import PathElementHandler
45 from ..mapping
import Mapping
as CameraMapperMapping
50 """Struct containing information about a SkyMap found in a Gen2 repository.
54 """Name of the skymap used in Gen3 data IDs.
58 """An instance of the actual skymap class.
62 """The coadd name used as a prefix for the dataset type this skymap was
67 """A `DatasetRef` that can be used to ingest the skymap dataset into a
72 """Name of the file containing the skymap dataset, relative to the
78 """A specialization of `RepoConverter` for non-calibration repositories.
83 Keyword arguments are forwarded to (and required by) `RepoConverter`.
89 with temporaryLogLevel(
"CameraMapper", Log.ERROR):
90 with temporaryLogLevel(
"HscMapper", Log.ERROR):
98 return datasetTypeName
in SKYMAP_DATASET_TYPES.values()
102 self.
task.log.info(f
"Looking for skymaps in root {self.root}.")
103 for coaddName, datasetTypeName
in SKYMAP_DATASET_TYPES.items():
104 if not self.
task.isDatasetTypeIncluded(datasetTypeName):
107 exists = self.
butler2.datasetExists(datasetTypeName)
108 except AttributeError:
113 instance = self.
butler2.get(datasetTypeName)
114 name = self.
task.useSkyMap(instance, datasetTypeName)
115 datasetType = DatasetType(datasetTypeName, dimensions=[
"skymap"],
116 storageClass=
"SkyMap", universe=self.
task.universe)
117 dataId = DataCoordinate.standardize(skymap=name, universe=self.
task.universe)
118 struct =
FoundSkyMap(name=name, instance=instance, coaddName=coaddName,
119 ref=DatasetRef(datasetType, dataId),
120 filename=self.
butler2.getUri(datasetTypeName))
122 self.
task.log.info(
"Found skymap %s in %s in %s.", name, datasetTypeName, self.
root)
127 for datasetTypeName, mapping
in self.
mapper.mappings.items():
128 if datasetTypeName
not in self.
mapper.calibrations:
129 yield datasetTypeName, mapping
132 """Return the appropriate SkyMap for the given dataset type.
136 datasetTypeName : `str`
137 Name of the dataset type for which a skymap is sought.
141 skyMap : `BaseSkyMap` or `None`
142 The `BaseSkyMap` instance, or `None` if there was no match.
143 skyMapName : `str` or `None`
144 The Gen3 name for the SkyMap, or `None` if there was no match.
149 for coaddName
in SKYMAP_DATASET_TYPES.keys():
150 if coaddName
in datasetTypeName:
159 (
"Dataset %s looks like it might need a skymap, but no %sCoadd_skyMap "
160 "found in repo %s."),
161 datasetTypeName, coaddName, self.
root
163 if struct
is not None:
164 return struct.instance, struct.name
169 storageClass: StorageClass,
170 formatter: FormatterParameter =
None,
171 targetHandler: Optional[PathElementHandler] =
None,
172 ) -> RepoWalker.Target:
175 return RepoWalker.Target(
176 datasetTypeName=datasetTypeName,
177 storageClass=storageClass,
180 universe=self.
task.registry.dimensions,
181 instrument=self.
task.instrument.getName(),
183 skyMapName=skyMapName,
185 targetHandler=targetHandler,
186 translatorFactory=self.
task.translatorFactory,
192 if self.
task.isDatasetTypeIncluded(struct.ref.datasetType.name):
193 yield FileDataset(path=os.path.join(self.
root, struct.filename), refs=struct.ref)
196 def getRun(self, datasetTypeName: str, calibDate: Optional[str] =
None) -> str:
198 run = self.
task.config.runsForced.get(datasetTypeName)
200 if self.
_run is not None:
203 run = self.
task.config.runs.get(datasetTypeName)
205 raise ValueError(f
"No default run for repo at {self.root}, and no "
206 f
"override for dataset {datasetTypeName}.")
207 if run
not in self.
_chain:
212 """Return run names that can be used to construct a chained collection
213 that refers to the converted repository (`list` [ `str` ]).
221 """Gen2 butler associated with this repository.
225 """Gen2 mapper associated with this repository.