LSSTApplications  17.0+103,17.0+11,17.0+61,18.0.0+13,18.0.0+25,18.0.0+5,18.0.0+52,18.0.0-4-g68ffd23,18.1.0-1-g0001055+8,18.1.0-1-g03d53ef+1,18.1.0-1-g1349e88+28,18.1.0-1-g2505f39+22,18.1.0-1-g380d4d4+27,18.1.0-1-g5315e5e+1,18.1.0-1-g5e4b7ea+10,18.1.0-1-g7e8fceb+1,18.1.0-1-g85f8cd4+23,18.1.0-1-g9a6769a+13,18.1.0-1-ga1a4c1a+22,18.1.0-1-gd55f500+17,18.1.0-12-g42eabe8e+10,18.1.0-14-gd04256d+15,18.1.0-16-g430f6a53+1,18.1.0-17-gd2166b6e4,18.1.0-18-gb5d19ff+1,18.1.0-2-gfbf3545+7,18.1.0-2-gfefb8b5+16,18.1.0-3-g52aa583+13,18.1.0-3-g62b5e86+14,18.1.0-3-g8f4a2b1+17,18.1.0-3-g9bc06b8+7,18.1.0-3-gb69f684+9,18.1.0-4-g1ee41a7+1,18.1.0-5-g6dbcb01+13,18.1.0-5-gc286bb7+3,18.1.0-6-g48bdcd3+2,18.1.0-6-gd05e160+9,18.1.0-7-gc4d902b+2,18.1.0-7-gebc0338+8,18.1.0-9-gae7190a+10,w.2019.38
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.obs.base.gen3.repoConverter.RepoConverter Class Reference
Inheritance diagram for lsst.obs.base.gen3.repoConverter.RepoConverter:
lsst.obs.base.gen3.calibRepoConverter.CalibRepoConverter

Public Member Functions

def __init__ (self, root, universe, baseDataId, mapper=None, skyMap=None)
 
def addDatasetType (self, datasetTypeName, storageClass)
 
def extractDatasetRef (self, fileNameInRoot)
 
def walkRepo (self, directory=None, skipDirs=())
 
def convertRepo (self, butler, directory=None, transfer=None, formatter=None, skipDirs=())
 

Public Attributes

 root
 
 mapper
 
 universe
 
 baseDataId
 
 extractors
 
 skyMap
 

Static Public Attributes

tuple COADD_NAMES = ("deep", "goodSeeing", "dcr")
 
tuple REPO_ROOT_FILES
 

Detailed Description

A helper class that ingests (some of) the contents of a Gen2 data
repository into a Gen3 data repository.

Parameters
----------
root : `str`
    Root of the Gen2 data repository.
universe : `lsst.daf.butler.DimensionUniverse`
    Object containing all dimension definitions.
baseDataId : `dict`
    Key-value pairs that may need to appear in the Gen3 data ID, but can
    never be inferred from a Gen2 filename.  This should always include
    the instrument name (even Gen3 data IDs that don't involve the
    instrument dimension have instrument-dependent Gen2 filenames) and
    should also include the skymap name in order to process any data IDs
    that involve tracts or patches.
mapper : `lsst.obs.base.CameraMapper`, optional
    Object that defines Gen2 filename templates.  Will be identified,
    imported, and constructed from ``root`` if not provided.
skyMap : `lsst.skymap.BaseSkyMap`, optional
    SkyMap that defines tracts and patches.  Must be provided in order to
    provess datasets with a ``patch`` key in their data IDs.

Definition at line 142 of file repoConverter.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.obs.base.gen3.repoConverter.RepoConverter.__init__ (   self,
  root,
  universe,
  baseDataId,
  mapper = None,
  skyMap = None 
)

Definition at line 171 of file repoConverter.py.

171  def __init__(self, root, *, universe, baseDataId, mapper=None, skyMap=None):
172  self.root = root
173  if mapper is None:
174  # Shush spurious log messages from Gen2 Mapper classes.
175  # These aren't spurious in other contexts - we're just playing fast
176  # and loose with mapper initialization, because we don't care about
177  # things like parent lookups (we just want the set of templates).
178  with temporaryLogLevel("CameraMapper", Log.ERROR):
179  with temporaryLogLevel("HscMapper", Log.ERROR):
180  cls = findMapperClass(root)
181  mapper = cls(root=root)
182  self.mapper = mapper
183  self.universe = universe
184  self.baseDataId = baseDataId
185  self.extractors = OrderedDict() # for move_to_end
186  if "skymap" in baseDataId:
187  if skyMap is None:
188  for name in self.COADD_NAMES:
189  mapping = self.mapper.mappings.get(f"{name}Coadd_skyMap", None)
190  if mapping is None:
191  continue
192  filename = os.path.join(self.root, mapping.template)
193  if os.path.exists(filename):
194  if skyMap is not None:
195  raise ValueError("Multiple SkyMaps found in repository; please use multiple "
196  "RepoConverters with an explicit skyMap argument for each.")
197  with open(filename, "rb") as f:
198  skyMap = pickle.load(f, encoding="latin1")
199  self.skyMap = skyMap
200 
def temporaryLogLevel(name, level)
Definition: utils.py:45
def __init__(self, minimum, dataRange, Q)

Member Function Documentation

◆ addDatasetType()

def lsst.obs.base.gen3.repoConverter.RepoConverter.addDatasetType (   self,
  datasetTypeName,
  storageClass 
)
Add a dataset type to those recognized by the converter.

Parameters
----------
datasetTypeName : `str`
    String name of the dataset type.
storageClass : `str` or `lsst.daf.butler.StorageClass`
    Gen3 storage class of the dataset type.

Returns
-------
extractor : `DataIdExtractor`
    The object that will be used to extract data IDs for instances of
    this dataset type (also held internally, so the return value can
    usually be ignored).

Definition at line 201 of file repoConverter.py.

201  def addDatasetType(self, datasetTypeName, storageClass):
202  """Add a dataset type to those recognized by the converter.
203 
204  Parameters
205  ----------
206  datasetTypeName : `str`
207  String name of the dataset type.
208  storageClass : `str` or `lsst.daf.butler.StorageClass`
209  Gen3 storage class of the dataset type.
210 
211  Returns
212  -------
213  extractor : `DataIdExtractor`
214  The object that will be used to extract data IDs for instances of
215  this dataset type (also held internally, so the return value can
216  usually be ignored).
217  """
218  r = DataIdExtractor(datasetTypeName, storageClass, mapper=self.mapper,
219  universe=self.universe, baseDataId=self.baseDataId, skyMap=self.skyMap)
220  self.extractors[datasetTypeName] = r
221  return r
222 

◆ convertRepo()

def lsst.obs.base.gen3.repoConverter.RepoConverter.convertRepo (   self,
  butler,
  directory = None,
  transfer = None,
  formatter = None,
  skipDirs = () 
)
Ingest all recognized files into a Gen3 repository.

Parameters
----------
butler : `lsst.daf.butler.Butler`
    Gen3 butler that files should be ingested into.
directory : `str`, optional
    A subdirectory of the repository root to process, instead of
    processing the entire repository.
transfer : str, optional
    If not `None`, must be one of 'move', 'copy', 'hardlink', or
    'symlink' indicating how to transfer the file.
formatter : `lsst.daf.butler.Formatter`, optional
    Formatter that should be used to retreive the Dataset.  If not
    provided, the formatter will be constructed according to
    Datastore configuration.  This should only be used when converting
    only a single dataset type multiple dataset types of the same
    storage class.
skipDirs : sequence of `str`
    Subdirectories that should be skipped.

Definition at line 286 of file repoConverter.py.

286  def convertRepo(self, butler, *, directory=None, transfer=None, formatter=None, skipDirs=()):
287  """Ingest all recognized files into a Gen3 repository.
288 
289  Parameters
290  ----------
291  butler : `lsst.daf.butler.Butler`
292  Gen3 butler that files should be ingested into.
293  directory : `str`, optional
294  A subdirectory of the repository root to process, instead of
295  processing the entire repository.
296  transfer : str, optional
297  If not `None`, must be one of 'move', 'copy', 'hardlink', or
298  'symlink' indicating how to transfer the file.
299  formatter : `lsst.daf.butler.Formatter`, optional
300  Formatter that should be used to retreive the Dataset. If not
301  provided, the formatter will be constructed according to
302  Datastore configuration. This should only be used when converting
303  only a single dataset type multiple dataset types of the same
304  storage class.
305  skipDirs : sequence of `str`
306  Subdirectories that should be skipped.
307  """
308  log = Log.getLogger("RepoConverter")
309  for extractor in self.extractors.values():
310  butler.registry.registerDatasetType(extractor.datasetType)
311  skipped = {}
312  for file in self.walkRepo(directory=directory, skipDirs=skipDirs):
313  ref = self.extractDatasetRef(file)
314  if ref is not None:
315  try:
316  butler.ingest(os.path.join(self.root, file), ref, transfer=transfer, formatter=formatter)
317  except Exception as err:
318  skipped.setdefault(type(err), []).append(str(err))
319  if skipped:
320  for cls, messages in skipped.items():
321  log.warn("Skipped %s files due to exceptions of type %s.", len(messages), cls.__name__)
322  if log.isDebugEnabled():
323  for message in messages:
324  log.debug(message)
325 
std::shared_ptr< FrameSet > append(FrameSet const &first, FrameSet const &second)
Construct a FrameSet that performs two transformations in series.
Definition: functional.cc:33
table::Key< int > type
Definition: Detector.cc:167

◆ extractDatasetRef()

def lsst.obs.base.gen3.repoConverter.RepoConverter.extractDatasetRef (   self,
  fileNameInRoot 
)
Extract a Gen3 `~lsst.daf.butler.DatasetRef` from a filename in a
Gen2 data repository.

Parameters
----------
fileNameInRoot : `str`
    Name of the file, relative to the root of its Gen2 repository.

Return
------
ref : `lsst.daf.butler.DatasetRef` or `None`
    Reference to the Gen3 dataset that would be created by converting
    this file, or `None` if the file is not recognized as an instance
    of a dataset type known to this converter.

Definition at line 223 of file repoConverter.py.

223  def extractDatasetRef(self, fileNameInRoot):
224  """Extract a Gen3 `~lsst.daf.butler.DatasetRef` from a filename in a
225  Gen2 data repository.
226 
227  Parameters
228  ----------
229  fileNameInRoot : `str`
230  Name of the file, relative to the root of its Gen2 repository.
231 
232  Return
233  ------
234  ref : `lsst.daf.butler.DatasetRef` or `None`
235  Reference to the Gen3 dataset that would be created by converting
236  this file, or `None` if the file is not recognized as an instance
237  of a dataset type known to this converter.
238  """
239  for datasetTypeName, extractor in self.extractors.items():
240  dataId = extractor.apply(fileNameInRoot)
241  if dataId is not None:
242  # Move the extractor that matched to the front of the
243  # dictionary, as we're likely to see instances of the
244  # same DatasetType together.
245  self.extractors.move_to_end(datasetTypeName, last=False)
246  return DatasetRef(extractor.datasetType, dataId=dataId)
247  return None
248 
std::vector< SchemaItem< Flag > > * items

◆ walkRepo()

def lsst.obs.base.gen3.repoConverter.RepoConverter.walkRepo (   self,
  directory = None,
  skipDirs = () 
)
Recursively a (subset of) a Gen2 data repository, yielding files
that may be convertible.

Parameters
----------
directory : `str`, optional
    A subdirectory of the repository root to process, instead of
    processing the entire repository.
skipDirs : sequence of `str`
    Subdirectories that should be skipped.

Yields
------
fileNameInRoot : `str`
    Name of a file in the repository, relative to the root of the
    repository.

Definition at line 249 of file repoConverter.py.

249  def walkRepo(self, directory=None, skipDirs=()):
250  """Recursively a (subset of) a Gen2 data repository, yielding files
251  that may be convertible.
252 
253  Parameters
254  ----------
255  directory : `str`, optional
256  A subdirectory of the repository root to process, instead of
257  processing the entire repository.
258  skipDirs : sequence of `str`
259  Subdirectories that should be skipped.
260 
261  Yields
262  ------
263  fileNameInRoot : `str`
264  Name of a file in the repository, relative to the root of the
265  repository.
266  """
267  if directory is None:
268  directory = self.root
269  for dirPath, subdirNamesInDir, fileNamesInDir in os.walk(directory, followlinks=True):
270  # Remove subdirectories that appear to be repositories themselves
271  # from the walking
272  def isRepoRoot(dirName):
273  return any(os.path.exists(os.path.join(dirPath, dirName, f))
274  for f in self.REPO_ROOT_FILES)
275  subdirNamesInDir[:] = [d for d in subdirNamesInDir if not isRepoRoot(d) and d not in skipDirs]
276  # Loop over files in this directory, and ask per-DatasetType
277  # extractors if they recognize them and can extract a data ID;
278  # if so, ingest.
279  dirPathInRoot = dirPath[len(self.root) + len(os.path.sep):]
280  for fileNameInDir in fileNamesInDir:
281  fileNameInRoot = os.path.join(dirPathInRoot, fileNameInDir)
282  if fileNameInRoot in self.REPO_ROOT_FILES:
283  continue
284  yield fileNameInRoot
285 
bool any(CoordinateExpr< N > const &expr) noexcept
Return true if any elements are true.

Member Data Documentation

◆ baseDataId

lsst.obs.base.gen3.repoConverter.RepoConverter.baseDataId

Definition at line 184 of file repoConverter.py.

◆ COADD_NAMES

tuple lsst.obs.base.gen3.repoConverter.RepoConverter.COADD_NAMES = ("deep", "goodSeeing", "dcr")
static

Definition at line 167 of file repoConverter.py.

◆ extractors

lsst.obs.base.gen3.repoConverter.RepoConverter.extractors

Definition at line 185 of file repoConverter.py.

◆ mapper

lsst.obs.base.gen3.repoConverter.RepoConverter.mapper

Definition at line 182 of file repoConverter.py.

◆ REPO_ROOT_FILES

tuple lsst.obs.base.gen3.repoConverter.RepoConverter.REPO_ROOT_FILES
static
Initial value:
= ("registry.sqlite3", "_mapper", "repositoryCfg.yaml",
"calibRegistry.sqlite3", "_parent")

Definition at line 168 of file repoConverter.py.

◆ root

lsst.obs.base.gen3.repoConverter.RepoConverter.root

Definition at line 172 of file repoConverter.py.

◆ skyMap

lsst.obs.base.gen3.repoConverter.RepoConverter.skyMap

Definition at line 199 of file repoConverter.py.

◆ universe

lsst.obs.base.gen3.repoConverter.RepoConverter.universe

Definition at line 183 of file repoConverter.py.


The documentation for this class was generated from the following file: