22 """Shim classes that provide (limited) Gen2 Butler interfaces to Gen3 
   25 All of the classes here still operate on Gen3 data IDs - the shim layer 
   26 essentially assumes that Gen2 Tasks treat the data ID as an opaque blob, which 
   27 is usually (but not always true).  When it isn't, the best approach now is 
   28 probably to use the GENERATION class attribute on the Butler classes to 
   29 special-case code for each generation. 
   32 __all__ = (
"ShimButler", 
"ShimButlerSubset", 
"ShimDataRef")
 
   35 from lsst.daf.butler 
import StorageClassFactory
 
   39     """A shim for a Gen2 `~lsst.daf.persistence.Butler` with a Gen3 
   40     `~lsst.daf.butler.Butler` backend. 
   44     butler3 : `lsst.daf.butler.Butler` 
   45         Generation 3 Butler instance. 
   49     """This is a Generation 2 shim for a Generation3 Butler. 
   55     def _makeDataId(self, dataId=None, **rest):
 
   56         """Construct a full data ID by merging the given arguments with the 
   60         if dataId 
is not None:
 
   61             fullDataId.update(dataId)
 
   62         fullDataId.update(rest)
 
   65     def _translateDatasetType(self, datasetType):
 
   66         if "_" in datasetType:
 
   67             if datasetType.endswith(
"_md"):
 
   68                 return f
"{datasetType[:-3]}.metadata" 
   69             for component 
in StorageClassFactory().getStorageClass(
"Exposure").components:
 
   70                 suffix = f
"_{component}" 
   71                 if datasetType.endswith(suffix):
 
   72                     return "{}.{}".
format(datasetType[:-len(suffix)], component)
 
   76         """Check whether a datataset exists in the repository. 
   81             Name of the Gen2 dataset type. 
   82         dataId : `dict` or `~lsst.daf.butler.DataId`, optional 
   83             A Generation 3 data ID that identifies the dataset. 
   85             This option is provided for compatibility with 
   86             `lsst.daf.persistence.Butler`, but must be `False`. 
   88             Additional key-value pairs to augment the given data ID. 
   93             `True` if the dataset is present in the repository, `False` 
   97             raise NotImplementedError(
"ShimButler cannot implement datasetExists with 'write=True'")
 
  107     def get(self, datasetType, dataId=None, immediate=True, **rest):
 
  108         """Retrieve a dataset. 
  113             Name of the Gen2 dataset type. 
  114         dataId : `dict` or `~lsst.daf.butler.DataId`, optional 
  115             A Generation 3 data ID that identifies the dataset. 
  117             This option is provided for compatibility with 
  118             `lsst.daf.persistence.Butler`, but is ignored. 
  120             Additional key-value pairs to augment the given data ID. 
  129         `~lsst.daf.persistence.NoResults` 
  130             Raised if the dataset does not exist. 
  134         if datasetType.endswith(
"_sub"):
 
  136             datasetType = datasetType[:-len(
"_sub")]
 
  137             parameters = dict(bbox=fullDataId.pop(
"bbox"))
 
  138             origin = fullDataId.pop(
"imageOrigin", lsst.afw.image.PARENT)
 
  139             parameters[
"origin"] = origin
 
  143             return self.
_butler3.
get(datasetType, fullDataId, parameters=parameters)
 
  144         except (FileNotFoundError, LookupError) 
as err:
 
  145             raise NoResults(str(err), datasetType, fullDataId)
 
  147     def put(self, obj, datasetType, dataId=None, doBackup=False, **rest):
 
  155             Name of the Gen2 dataset type. 
  156         dataId : `dict` or `~lsst.daf.butler.DataId`, optional 
  157             A Generation 3 data ID that identifies the dataset. 
  159             This option is provided for compatibility with 
  160             `lsst.daf.persistence.Butler`, but must be `False`. 
  162             Additional key-value pairs to augment the given data ID. 
  165             raise NotImplementedError(
"ShimButler cannot implement put with 'doBackup=True'")
 
  169     def dataRef(self, datasetType, level=None, dataId=None, **rest):
 
  170         """Return a DataRef associated with the given dataset type and data ID. 
  175             Name of the dataset type. 
  176         dataId : `dict` or `~lsst.daf.butler.DataId`, optional 
  177             A Generation 3 data ID that identifies the dataset. 
  179             This option is provided for compatibility with 
  180             `lsst.daf.persistence.Butler`, but must be `None`. 
  182             Additional key-value pairs to augment the given data ID. 
  184         if level 
is not None:
 
  185             raise NotImplementedError(
"ShimButler cannot implement dataRef with 'level != None'")
 
  187         if dataId 
is not None:
 
  188             fullDataId.update(dataId)
 
  189         fullDataId.update(rest)
 
  194     """A shim for a Gen2 `~lsst.daf.persistence.ButlerSubset` with a Gen3 
  195     `~lsst.daf.butler.Butler` backend. 
  199     butler : `ShimButler` 
  200         Butler shim instance. 
  202         Name of the dataset type. 
  203     dataIds : iterable of `dict` or `~lsst.daf.butler.DataId` 
  204         Generation 3 data IDs that define the data in this subset. 
  208     """This is a Generation 2 shim for a Generation3 Butler. 
  225     """A shim for a Gen2 `~lsst.daf.persistence.ButlerDataRef` with a Gen3 
  226     `~lsst.daf.butler.Butler` backend. 
  230     butlerSubset : `ShimButlerSubset` 
  231         ButlerSubset shim instance.  Sets the butler and default dataset type 
  233     dataId : `dict` or `~lsst.daf.butler.DataId` 
  234         Generation 3 data ID associated with this reference. 
  238     """This is a Generation 2 shim for a Generation3 Butler. 
  245     def get(self, datasetType=None, **rest):
 
  246         """Retrieve a dataset. 
  250         datasetType : `str`, optional. 
  251             Name of the dataset type.  Defaults to the dataset type used to 
  252             construct the `ShimButlerSubset`. 
  254             Additional arguments forwarded to `ShimButler.get`. 
  263         `~lsst.daf.persistence.NoResults` 
  264             Raised if the dataset does not exist. 
  266         if datasetType 
is None:
 
  270     def put(self, obj, datasetType=None, doBackup=False, **rest):
 
  277         datasetType : `str`, optional 
  278             Name of the dataset type.  Defaults to the dataset type used to 
  279             construct the `ShimButlerSubset`. 
  281             This option is provided for compatibility with 
  282             `lsst.daf.persistence.ButlerDataRef`, but must be `False`. 
  284             Additional arguments forwarded to `ShimButler.put`. 
  286         if datasetType 
is None:
 
  288         self.
butlerSubset.butler.put(obj, datasetType, self.
dataId, doBackup=doBackup, **rest)
 
  291         """Check whether a datataset exists in the repository. 
  295         datasetType : `str`, optional 
  296             Name of the dataset type.  Defaults to the dataset type used to 
  297             construct the `ShimButlerSubset`. 
  299             This option is provided for compatibility with 
  300             `lsst.daf.persistence.ButlerDataRef`, but must be `False`. 
  302             Additional arguments forwarded to `ShimButler.datasetExists`. 
  307             `True` if the dataset is present in the repository, `False` 
  310         if datasetType 
is None:
 
  313             datasetType, self.
dataId, write=write, **rest)
 
  316         """Return the (shim) Butler used by this DataRef.