LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
dataIdExtractor.py
Go to the documentation of this file.
1 # This file is part of obs_base.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (https://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 
22 __all__ = ["DataIdExtractor"]
23 
24 from typing import Union, Optional
25 
26 from lsst.skymap import BaseSkyMap
27 from lsst.daf.butler import DataCoordinate, DatasetType, StorageClass, DimensionUniverse
28 from ..mapping import Mapping
29 from .filePathParser import FilePathParser
30 from .translators import Translator
31 
32 
34  """A class that extracts Gen3 data IDs from Gen2 filenames for a
35  particular dataset type.
36 
37  Parameters
38  ----------
39  datasetTypeName : `str`
40  Name of the dataset type the object will process.
41  storageClass : `str` or `lsst.daf.butler.StorageClass`
42  Gen3 storage class of the dataset type.
43  universe : `lsst.daf.butler.DimensionUniverse`
44  Object containing all dimension definitions.
45  instrument : `str`
46  Name of the Gen3 instrument for output data IDs that include that
47  dimension.
48  filePathParser : `FilePathParser`, optional
49  Object responsible for reading a Gen2 data ID from a filename. Will
50  be created from ``mapper`` if not provided.
51  translator : `Translator`, optional
52  Object responsible for converting a Gen2 data ID into a Gen3 data ID.
53  Will be created if not provided.
54  mapping : `lsst.obs.base.Mapper`, optional
55  Object that defines a Gen2 dataset type. Must be provided if
56  ``filePathParser`` is not.
57  skyMap : `lsst.skymap.BaseSkyMap`, optional
58  SkyMap that defines tracts and patches. Must be provided for datasets
59  with a ``patch`` key in their data IDs.
60  skyMapName: `str`, optional
61  Name of the Gen3 skymap for output data IDs that include that
62  dimension.
63 
64  Raises
65  ------
66  RuntimeError
67  Raised if the given mapping has no template.
68  """
69 
70  def __init__(self, datasetTypeName: str, storageClass: Union[str, StorageClass], *,
71  universe: DimensionUniverse,
72  instrument: str,
73  filePathParser: Optional[FilePathParser] = None,
74  translator: Optional[Translator] = None,
75  mapping: Optional[Mapping] = None,
76  skyMap: Optional[BaseSkyMap] = None,
77  skyMapName: Optional[str] = None):
78  if filePathParser is None:
79  filePathParser = FilePathParser.fromMapping(mapping)
80  self.filePathParser = filePathParser
81  if translator is None:
82  translator = Translator.makeMatching(datasetTypeName, filePathParser.keys,
83  instrument=instrument, skyMap=skyMap, skyMapName=skyMapName)
84  self.translator = translator
85  self.datasetType = DatasetType(datasetTypeName, dimensions=self.translator.dimensionNames,
86  storageClass=storageClass, universe=universe)
87 
88  def apply(self, fileNameInRoot: str) -> Optional[DataCoordinate]:
89  """Extract a Gen3 data ID from the given filename,
90 
91  Parameters
92  ----------
93  fileNameInRoot : `str`
94  Filename relative to a Gen2 data repository root.
95 
96  Returns
97  -------
98  dataId : `lsst.daf.butler.DataCoordinate` or `None`
99  The Gen3 data ID, or `None` if the file was not recognized as an
100  instance of the extractor's dataset type.
101  """
102  gen2id = self.filePathParser(fileNameInRoot)
103  if gen2id is None:
104  return None
105  return DataCoordinate.standardize(self.translator(gen2id), graph=self.datasetType.dimensions)