LSST Applications  21.0.0+75b29a8a7f,21.0.0+e70536a077,21.0.0-1-ga51b5d4+62c747d40b,21.0.0-10-gbfb87ad6+3307648ee3,21.0.0-15-gedb9d5423+47cba9fc36,21.0.0-2-g103fe59+fdf0863a2a,21.0.0-2-g1367e85+d38a93257c,21.0.0-2-g45278ab+e70536a077,21.0.0-2-g5242d73+d38a93257c,21.0.0-2-g7f82c8f+e682ffb718,21.0.0-2-g8dde007+d179fbfa6a,21.0.0-2-g8f08a60+9402881886,21.0.0-2-ga326454+e682ffb718,21.0.0-2-ga63a54e+08647d4b1b,21.0.0-2-gde069b7+26c92b3210,21.0.0-2-gecfae73+0445ed2f95,21.0.0-2-gfc62afb+d38a93257c,21.0.0-27-gbbd0d29+ae871e0f33,21.0.0-28-g5fc5e037+feb0e9397b,21.0.0-3-g21c7a62+f4b9c0ff5c,21.0.0-3-g357aad2+57b0bddf0b,21.0.0-3-g4be5c26+d38a93257c,21.0.0-3-g65f322c+3f454acf5d,21.0.0-3-g7d9da8d+75b29a8a7f,21.0.0-3-gaa929c8+9e4ef6332c,21.0.0-3-ge02ed75+4b120a55c4,21.0.0-4-g3300ddd+e70536a077,21.0.0-4-g591bb35+4b120a55c4,21.0.0-4-gc004bbf+4911b9cd27,21.0.0-4-gccdca77+f94adcd104,21.0.0-4-ge8fba5a+2b3a696ff9,21.0.0-5-gb155db7+2c5429117a,21.0.0-5-gdf36809+637e4641ee,21.0.0-6-g00874e7+c9fd7f7160,21.0.0-6-g4e60332+4b120a55c4,21.0.0-7-gc8ca178+40eb9cf840,21.0.0-8-gfbe0b4b+9e4ef6332c,21.0.0-9-g2fd488a+d83b7cd606,w.2021.05
LSST Data Management Base Package
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask Class Reference
Inheritance diagram for lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask:
lsst.pipe.base.task.Task

Public Member Functions

def __init__ (self, config=None, *Butler3 butler3, Instrument instrument, **kwargs)
 
def isDatasetTypeIncluded (self, str datasetTypeName)
 
str useSkyMap (self, BaseSkyMap skyMap, str skyMapName)
 
def registerUsedSkyMaps (self, Optional[ConversionSubset] subset)
 
def useSkyPix (self, SkyPixDimension dimension)
 
def registerUsedSkyPix (self, Optional[ConversionSubset] subset)
 
def run (self, str root, *Optional[List[CalibRepo]] calibs=None, Optional[List[Rerun]] reruns=None, Optional[Iterable[int]] visits=None, Optional[Pool] pool=None, int processes=1)
 
def emptyMetadata (self)
 
def getSchemaCatalogs (self)
 
def getAllSchemaCatalogs (self)
 
def getFullMetadata (self)
 
def getFullName (self)
 
def getName (self)
 
def getTaskDict (self)
 
def makeSubtask (self, name, **keyArgs)
 
def timer (self, name, logLevel=Log.DEBUG)
 
def makeField (cls, doc)
 
def __reduce__ (self)
 

Public Attributes

 butler3
 
 registry
 
 universe
 
 raws
 
 defineVisits
 
 instrument
 
 translatorFactory
 
 metadata
 
 log
 
 config
 

Static Public Attributes

 ConfigClass = ConvertRepoConfig
 

Detailed Description

A task that converts one or more related Gen2 data repositories to a
single Gen3 data repository (with multiple collections).

Parameters
----------
config: `ConvertRepoConfig`
    Configuration for this task.
butler3: `lsst.daf.butler.Butler`
    A writeable Gen3 Butler instance that represents the data repository
    that datasets will be ingested into.  If the 'raw' dataset is
    configured to be included in the conversion, ``butler3.run`` should be
    set to the name of the collection raws should be ingested into, and
    ``butler3.collections`` should include a calibration collection from
    which the ``camera`` dataset can be loaded, unless a calibration repo
    is converted and ``doWriteCuratedCalibrations`` is `True`.
instrument : `lsst.obs.base.Instrument`
    The Gen3 instrument that should be used for this conversion.
**kwargs
    Other keyword arguments are forwarded to the `Task` constructor.

Notes
-----
Most of the work of converting repositories is delegated to instances of
the `RepoConverter` hierarchy.  The `ConvertRepoTask` instance itself holds
only state that is relevant for all Gen2 repositories being ingested, while
each `RepoConverter` instance holds only state relevant for the conversion
of a single Gen2 repository.  Both the task and the `RepoConverter`
instances are single use; `ConvertRepoTask.run` and most `RepoConverter`
methods may only be called once on a particular instance.

Definition at line 390 of file convertRepo.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.__init__ (   self,
  config = None,
*Butler3  butler3,
Instrument  instrument,
**  kwargs 
)

Definition at line 426 of file convertRepo.py.

426  def __init__(self, config=None, *, butler3: Butler3, instrument: Instrument, **kwargs):
427  config.validate() # Not a CmdlineTask nor PipelineTask, so have to validate the config here.
428  super().__init__(config, **kwargs)
429  # Make self.butler3 one that doesn't have any collections associated
430  # with it - those are needed by RawIngestTask and DefineVisitsTask, but
431  # we don't want them messing with converted datasets, because those
432  # have their own logic for figuring out which collections to write to.
433  self.butler3 = Butler3(butler=butler3)
434  self.registry = self.butler3.registry
435  self.universe = self.registry.dimensions
436  if self.isDatasetTypeIncluded("raw"):
437  self.makeSubtask("raws", butler=butler3)
438  self.makeSubtask("defineVisits", butler=butler3)
439  else:
440  self.raws = None
441  self.defineVisits = None
442  self.instrument = instrument
443  self._configuredSkyMapsBySha1 = {}
444  self._configuredSkyMapsByName = {}
445  for name, config in self.config.skyMaps.items():
446  instance = config.skyMap.apply()
447  self._populateSkyMapDicts(name, instance)
448  self._usedSkyPix = set()
449  self.translatorFactory = self.instrument.makeDataIdTranslatorFactory()
450  self.translatorFactory.log = self.log.getChild("translators")
451 
daf::base::PropertySet * set
Definition: fits.cc:912

Member Function Documentation

◆ __reduce__()

def lsst.pipe.base.task.Task.__reduce__ (   self)
inherited
Pickler.

Reimplemented in lsst.pipe.drivers.multiBandDriver.MultiBandDriverTask, and lsst.pipe.drivers.coaddDriver.CoaddDriverTask.

Definition at line 432 of file task.py.

432  def __reduce__(self):
433  """Pickler.
434  """
435  return self._unpickle_via_factory, (self.__class__, [], self._reduce_kwargs())

◆ emptyMetadata()

def lsst.pipe.base.task.Task.emptyMetadata (   self)
inherited
Empty (clear) the metadata for this Task and all sub-Tasks.

Definition at line 166 of file task.py.

166  def emptyMetadata(self):
167  """Empty (clear) the metadata for this Task and all sub-Tasks.
168  """
169  for subtask in self._taskDict.values():
170  subtask.metadata = dafBase.PropertyList()
171 
Class for storing ordered metadata with comments.
Definition: PropertyList.h:68

◆ getAllSchemaCatalogs()

def lsst.pipe.base.task.Task.getAllSchemaCatalogs (   self)
inherited
Get schema catalogs for all tasks in the hierarchy, combining the
results into a single dict.

Returns
-------
schemacatalogs : `dict`
    Keys are butler dataset type, values are a empty catalog (an
    instance of the appropriate `lsst.afw.table` Catalog type) for all
    tasks in the hierarchy, from the top-level task down
    through all subtasks.

Notes
-----
This method may be called on any task in the hierarchy; it will return
the same answer, regardless.

The default implementation should always suffice. If your subtask uses
schemas the override `Task.getSchemaCatalogs`, not this method.

Definition at line 204 of file task.py.

204  def getAllSchemaCatalogs(self):
205  """Get schema catalogs for all tasks in the hierarchy, combining the
206  results into a single dict.
207 
208  Returns
209  -------
210  schemacatalogs : `dict`
211  Keys are butler dataset type, values are a empty catalog (an
212  instance of the appropriate `lsst.afw.table` Catalog type) for all
213  tasks in the hierarchy, from the top-level task down
214  through all subtasks.
215 
216  Notes
217  -----
218  This method may be called on any task in the hierarchy; it will return
219  the same answer, regardless.
220 
221  The default implementation should always suffice. If your subtask uses
222  schemas the override `Task.getSchemaCatalogs`, not this method.
223  """
224  schemaDict = self.getSchemaCatalogs()
225  for subtask in self._taskDict.values():
226  schemaDict.update(subtask.getSchemaCatalogs())
227  return schemaDict
228 

◆ getFullMetadata()

def lsst.pipe.base.task.Task.getFullMetadata (   self)
inherited
Get metadata for all tasks.

Returns
-------
metadata : `lsst.daf.base.PropertySet`
    The `~lsst.daf.base.PropertySet` keys are the full task name.
    Values are metadata for the top-level task and all subtasks,
    sub-subtasks, etc.

Notes
-----
The returned metadata includes timing information (if
``@timer.timeMethod`` is used) and any metadata set by the task. The
name of each item consists of the full task name with ``.`` replaced
by ``:``, followed by ``.`` and the name of the item, e.g.::

    topLevelTaskName:subtaskName:subsubtaskName.itemName

using ``:`` in the full task name disambiguates the rare situation
that a task has a subtask and a metadata item with the same name.

Definition at line 229 of file task.py.

229  def getFullMetadata(self):
230  """Get metadata for all tasks.
231 
232  Returns
233  -------
234  metadata : `lsst.daf.base.PropertySet`
235  The `~lsst.daf.base.PropertySet` keys are the full task name.
236  Values are metadata for the top-level task and all subtasks,
237  sub-subtasks, etc.
238 
239  Notes
240  -----
241  The returned metadata includes timing information (if
242  ``@timer.timeMethod`` is used) and any metadata set by the task. The
243  name of each item consists of the full task name with ``.`` replaced
244  by ``:``, followed by ``.`` and the name of the item, e.g.::
245 
246  topLevelTaskName:subtaskName:subsubtaskName.itemName
247 
248  using ``:`` in the full task name disambiguates the rare situation
249  that a task has a subtask and a metadata item with the same name.
250  """
251  fullMetadata = dafBase.PropertySet()
252  for fullName, task in self.getTaskDict().items():
253  fullMetadata.set(fullName.replace(".", ":"), task.metadata)
254  return fullMetadata
255 
std::vector< SchemaItem< Flag > > * items
Class for storing generic metadata.
Definition: PropertySet.h:67

◆ getFullName()

def lsst.pipe.base.task.Task.getFullName (   self)
inherited
Get the task name as a hierarchical name including parent task
names.

Returns
-------
fullName : `str`
    The full name consists of the name of the parent task and each
    subtask separated by periods. For example:

    - The full name of top-level task "top" is simply "top".
    - The full name of subtask "sub" of top-level task "top" is
      "top.sub".
    - The full name of subtask "sub2" of subtask "sub" of top-level
      task "top" is "top.sub.sub2".

Definition at line 256 of file task.py.

256  def getFullName(self):
257  """Get the task name as a hierarchical name including parent task
258  names.
259 
260  Returns
261  -------
262  fullName : `str`
263  The full name consists of the name of the parent task and each
264  subtask separated by periods. For example:
265 
266  - The full name of top-level task "top" is simply "top".
267  - The full name of subtask "sub" of top-level task "top" is
268  "top.sub".
269  - The full name of subtask "sub2" of subtask "sub" of top-level
270  task "top" is "top.sub.sub2".
271  """
272  return self._fullName
273 

◆ getName()

def lsst.pipe.base.task.Task.getName (   self)
inherited
Get the name of the task.

Returns
-------
taskName : `str`
    Name of the task.

See also
--------
getFullName

Definition at line 274 of file task.py.

274  def getName(self):
275  """Get the name of the task.
276 
277  Returns
278  -------
279  taskName : `str`
280  Name of the task.
281 
282  See also
283  --------
284  getFullName
285  """
286  return self._name
287 
std::string const & getName() const noexcept
Return a filter's name.
Definition: Filter.h:78

◆ getSchemaCatalogs()

def lsst.pipe.base.task.Task.getSchemaCatalogs (   self)
inherited
Get the schemas generated by this task.

Returns
-------
schemaCatalogs : `dict`
    Keys are butler dataset type, values are an empty catalog (an
    instance of the appropriate `lsst.afw.table` Catalog type) for
    this task.

Notes
-----

.. warning::

   Subclasses that use schemas must override this method. The default
   implementation returns an empty dict.

This method may be called at any time after the Task is constructed,
which means that all task schemas should be computed at construction
time, *not* when data is actually processed. This reflects the
philosophy that the schema should not depend on the data.

Returning catalogs rather than just schemas allows us to save e.g.
slots for SourceCatalog as well.

See also
--------
Task.getAllSchemaCatalogs

Definition at line 172 of file task.py.

172  def getSchemaCatalogs(self):
173  """Get the schemas generated by this task.
174 
175  Returns
176  -------
177  schemaCatalogs : `dict`
178  Keys are butler dataset type, values are an empty catalog (an
179  instance of the appropriate `lsst.afw.table` Catalog type) for
180  this task.
181 
182  Notes
183  -----
184 
185  .. warning::
186 
187  Subclasses that use schemas must override this method. The default
188  implementation returns an empty dict.
189 
190  This method may be called at any time after the Task is constructed,
191  which means that all task schemas should be computed at construction
192  time, *not* when data is actually processed. This reflects the
193  philosophy that the schema should not depend on the data.
194 
195  Returning catalogs rather than just schemas allows us to save e.g.
196  slots for SourceCatalog as well.
197 
198  See also
199  --------
200  Task.getAllSchemaCatalogs
201  """
202  return {}
203 

◆ getTaskDict()

def lsst.pipe.base.task.Task.getTaskDict (   self)
inherited
Get a dictionary of all tasks as a shallow copy.

Returns
-------
taskDict : `dict`
    Dictionary containing full task name: task object for the top-level
    task and all subtasks, sub-subtasks, etc.

Definition at line 288 of file task.py.

288  def getTaskDict(self):
289  """Get a dictionary of all tasks as a shallow copy.
290 
291  Returns
292  -------
293  taskDict : `dict`
294  Dictionary containing full task name: task object for the top-level
295  task and all subtasks, sub-subtasks, etc.
296  """
297  return self._taskDict.copy()
298 
def getTaskDict(config, taskDict=None, baseName="")

◆ isDatasetTypeIncluded()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.isDatasetTypeIncluded (   self,
str  datasetTypeName 
)
Return `True` if configuration indicates that the given dataset type
should be converted.

This method is intended to be called primarily by the
`RepoConverter` instances used interally by the task.

Parameters
----------
datasetTypeName: str
    Name of the dataset type.

Returns
-------
included : `bool`
    Whether the dataset should be included in the conversion.

Definition at line 461 of file convertRepo.py.

461  def isDatasetTypeIncluded(self, datasetTypeName: str):
462  """Return `True` if configuration indicates that the given dataset type
463  should be converted.
464 
465  This method is intended to be called primarily by the
466  `RepoConverter` instances used interally by the task.
467 
468  Parameters
469  ----------
470  datasetTypeName: str
471  Name of the dataset type.
472 
473  Returns
474  -------
475  included : `bool`
476  Whether the dataset should be included in the conversion.
477  """
478  return (
479  any(fnmatch.fnmatchcase(datasetTypeName, pattern)
480  for pattern in self.config.datasetIncludePatterns)
481  and not any(fnmatch.fnmatchcase(datasetTypeName, pattern)
482  for pattern in self.config.datasetIgnorePatterns)
483  )
484 
bool any(CoordinateExpr< N > const &expr) noexcept
Return true if any elements are true.

◆ makeField()

def lsst.pipe.base.task.Task.makeField (   cls,
  doc 
)
inherited
Make a `lsst.pex.config.ConfigurableField` for this task.

Parameters
----------
doc : `str`
    Help text for the field.

Returns
-------
configurableField : `lsst.pex.config.ConfigurableField`
    A `~ConfigurableField` for this task.

Examples
--------
Provides a convenient way to specify this task is a subtask of another
task.

Here is an example of use:

.. code-block:: python

    class OtherTaskConfig(lsst.pex.config.Config):
        aSubtask = ATaskClass.makeField("brief description of task")

Definition at line 359 of file task.py.

359  def makeField(cls, doc):
360  """Make a `lsst.pex.config.ConfigurableField` for this task.
361 
362  Parameters
363  ----------
364  doc : `str`
365  Help text for the field.
366 
367  Returns
368  -------
369  configurableField : `lsst.pex.config.ConfigurableField`
370  A `~ConfigurableField` for this task.
371 
372  Examples
373  --------
374  Provides a convenient way to specify this task is a subtask of another
375  task.
376 
377  Here is an example of use:
378 
379  .. code-block:: python
380 
381  class OtherTaskConfig(lsst.pex.config.Config):
382  aSubtask = ATaskClass.makeField("brief description of task")
383  """
384  return ConfigurableField(doc=doc, target=cls)
385 

◆ makeSubtask()

def lsst.pipe.base.task.Task.makeSubtask (   self,
  name,
**  keyArgs 
)
inherited
Create a subtask as a new instance as the ``name`` attribute of this
task.

Parameters
----------
name : `str`
    Brief name of the subtask.
keyArgs
    Extra keyword arguments used to construct the task. The following
    arguments are automatically provided and cannot be overridden:

    - "config".
    - "parentTask".

Notes
-----
The subtask must be defined by ``Task.config.name``, an instance of
`~lsst.pex.config.ConfigurableField` or
`~lsst.pex.config.RegistryField`.

Definition at line 299 of file task.py.

299  def makeSubtask(self, name, **keyArgs):
300  """Create a subtask as a new instance as the ``name`` attribute of this
301  task.
302 
303  Parameters
304  ----------
305  name : `str`
306  Brief name of the subtask.
307  keyArgs
308  Extra keyword arguments used to construct the task. The following
309  arguments are automatically provided and cannot be overridden:
310 
311  - "config".
312  - "parentTask".
313 
314  Notes
315  -----
316  The subtask must be defined by ``Task.config.name``, an instance of
317  `~lsst.pex.config.ConfigurableField` or
318  `~lsst.pex.config.RegistryField`.
319  """
320  taskField = getattr(self.config, name, None)
321  if taskField is None:
322  raise KeyError(f"{self.getFullName()}'s config does not have field {name!r}")
323  subtask = taskField.apply(name=name, parentTask=self, **keyArgs)
324  setattr(self, name, subtask)
325 

◆ registerUsedSkyMaps()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.registerUsedSkyMaps (   self,
Optional[ConversionSubset subset 
)
Register all skymaps that have been marked as used.

This method is intended to be called primarily by the
`RepoConverter` instances used interally by the task.

Parameters
----------
subset : `ConversionSubset`, optional
    Object that will be used to filter converted datasets by data ID.
    If given, it will be updated with the tracts of this skymap that
    overlap the visits in the subset.

Definition at line 520 of file convertRepo.py.

520  def registerUsedSkyMaps(self, subset: Optional[ConversionSubset]):
521  """Register all skymaps that have been marked as used.
522 
523  This method is intended to be called primarily by the
524  `RepoConverter` instances used interally by the task.
525 
526  Parameters
527  ----------
528  subset : `ConversionSubset`, optional
529  Object that will be used to filter converted datasets by data ID.
530  If given, it will be updated with the tracts of this skymap that
531  overlap the visits in the subset.
532  """
533  for struct in self._configuredSkyMapsBySha1.values():
534  if struct.used:
535  struct.instance.register(struct.name, self.butler3)
536  if subset is not None and self.config.relatedOnly:
537  subset.addSkyMap(self.registry, struct.name)
538 

◆ registerUsedSkyPix()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.registerUsedSkyPix (   self,
Optional[ConversionSubset subset 
)
Register all skymaps that have been marked as used.

This method is intended to be called primarily by the
`RepoConverter` instances used interally by the task.

Parameters
----------
subset : `ConversionSubset`, optional
    Object that will be used to filter converted datasets by data ID.
    If given, it will be updated with the pixelization IDs that
    overlap the visits in the subset.

Definition at line 552 of file convertRepo.py.

552  def registerUsedSkyPix(self, subset: Optional[ConversionSubset]):
553  """Register all skymaps that have been marked as used.
554 
555  This method is intended to be called primarily by the
556  `RepoConverter` instances used interally by the task.
557 
558  Parameters
559  ----------
560  subset : `ConversionSubset`, optional
561  Object that will be used to filter converted datasets by data ID.
562  If given, it will be updated with the pixelization IDs that
563  overlap the visits in the subset.
564  """
565  if subset is not None and self.config.relatedOnly:
566  for dimension in self._usedSkyPix:
567  subset.addSkyPix(self.registry, dimension)
568 

◆ run()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.run (   self,
str  root,
*Optional[List[CalibRepo]]   calibs = None,
Optional[List[Rerun]]   reruns = None,
Optional[Iterable[int]]   visits = None,
Optional[Pool]   pool = None,
int   processes = 1 
)
Convert a group of related data repositories.

Parameters
----------
root : `str`
    Complete path to the root Gen2 data repository.  This should be
    a data repository that includes a Gen2 registry and any raw files
    and/or reference catalogs.
calibs : `list` of `CalibRepo`
    Specifications for Gen2 calibration repos to convert.  If `None`
    (default), curated calibrations only will be written to the default
    calibration collection for this instrument; set to ``()`` explictly
    to disable this.
reruns : `list` of `Rerun`
    Specifications for rerun (processing output) repos to convert.  If
    `None` (default), no reruns are converted.
visits : iterable of `int`, optional
    The integer IDs of visits to convert.  If not provided, all visits
    in the Gen2 root repository will be converted.
pool : `multiprocessing.Pool`, optional
    If not `None`, a process pool with which to parallelize some
    operations.
processes : `int`, optional
    The number of processes to use for conversion.

Definition at line 569 of file convertRepo.py.

574  processes: int = 1):
575  """Convert a group of related data repositories.
576 
577  Parameters
578  ----------
579  root : `str`
580  Complete path to the root Gen2 data repository. This should be
581  a data repository that includes a Gen2 registry and any raw files
582  and/or reference catalogs.
583  calibs : `list` of `CalibRepo`
584  Specifications for Gen2 calibration repos to convert. If `None`
585  (default), curated calibrations only will be written to the default
586  calibration collection for this instrument; set to ``()`` explictly
587  to disable this.
588  reruns : `list` of `Rerun`
589  Specifications for rerun (processing output) repos to convert. If
590  `None` (default), no reruns are converted.
591  visits : iterable of `int`, optional
592  The integer IDs of visits to convert. If not provided, all visits
593  in the Gen2 root repository will be converted.
594  pool : `multiprocessing.Pool`, optional
595  If not `None`, a process pool with which to parallelize some
596  operations.
597  processes : `int`, optional
598  The number of processes to use for conversion.
599  """
600  if pool is None and processes > 1:
601  pool = Pool(processes)
602  if calibs is None:
603  calibs = [CalibRepo(path=None)]
604  if visits is not None:
605  subset = ConversionSubset(instrument=self.instrument.getName(), visits=frozenset(visits))
606  else:
607  if self.config.relatedOnly:
608  self.log.warn("config.relatedOnly is True but all visits are being ingested; "
609  "no filtering will be done.")
610  subset = None
611 
612  # Check that at most one CalibRepo is marked as default, to fail before
613  # we actually write anything.
614  defaultCalibRepos = [c.path for c in calibs if c.default]
615  if len(defaultCalibRepos) > 1:
616  raise ValueError(f"Multiple calib repos marked as default: {defaultCalibRepos}.")
617 
618  # Make converters for all Gen2 repos.
619  converters = []
620  # Start with the root repo, which must always be given even if we are
621  # not configured to convert anything from it.
622  rootConverter = RootRepoConverter(task=self, root=root, subset=subset, instrument=self.instrument)
623  converters.append(rootConverter)
624  # Calibration repos are next.
625  for spec in calibs:
626  calibRoot = spec.path
627  if calibRoot is not None:
628  if not os.path.isabs(calibRoot):
629  calibRoot = os.path.join(rootConverter.root, calibRoot)
630  converter = CalibRepoConverter(task=self, root=calibRoot,
631  labels=spec.labels,
632  instrument=self.instrument,
633  mapper=rootConverter.mapper,
634  subset=rootConverter.subset)
635  converters.append(converter)
636  # CalibRepo entries that don't have a path are just there for
637  # curated calibs and maybe to set up a collection pointer; that's
638  # handled further down (after we've done everything we can that
639  # doesn't involve actually writing to the output Gen3 repo).
640  # And now reruns.
641  rerunConverters = {}
642  for spec in reruns:
643  runRoot = spec.path
644  if not os.path.isabs(runRoot):
645  runRoot = os.path.join(rootConverter.root, runRoot)
646  spec.guessCollectionNames(self.instrument, rootConverter.root)
647  converter = StandardRepoConverter(task=self, root=runRoot, run=spec.runName,
648  instrument=self.instrument, subset=rootConverter.subset)
649  converters.append(converter)
650  rerunConverters[spec.runName] = converter
651 
652  # Register the instrument if we're configured to do so.
653  if self.config.doRegisterInstrument:
654  self.instrument.register(self.registry)
655 
656  # Run raw ingest (does nothing if we weren't configured to convert the
657  # 'raw' dataset type).
658  rootConverter.runRawIngest(pool=pool)
659 
660  # Write curated calibrations to all calibration collections where they
661  # were requested (which may be implicit, by passing calibs=None). Also
662  # set up a CHAINED collection that points to the default CALIBRATION
663  # collection if one is needed.
664  for spec in calibs:
665  if spec.curated:
666  self.instrument.writeCuratedCalibrations(self.butler3, labels=spec.labels)
667  if spec.default and spec.labels:
668  # This is guaranteed to be True at most once in the loop by
669  # logic at the top of this method.
670  defaultCalibName = self.instrument.makeCalibrationCollectionName()
671  self.butler3.registry.registerCollection(defaultCalibName, CollectionType.CHAINED)
672  recommendedCalibName = self.instrument.makeCalibrationCollectionName(*spec.labels)
673  self.butler3.registry.registerCollection(recommendedCalibName, CollectionType.CALIBRATION)
674  self.butler3.registry.setCollectionChain(defaultCalibName, [recommendedCalibName])
675 
676  # Define visits (also does nothing if we weren't configurd to convert
677  # the 'raw' dataset type).
678  rootConverter.runDefineVisits(pool=pool)
679 
680  # Walk Gen2 repos to find datasets convert.
681  for converter in converters:
682  converter.prep()
683 
684  # Insert dimensions that are potentially shared by all Gen2
685  # repositories (and are hence managed directly by the Task, rather
686  # than a converter instance).
687  # This also finishes setting up the (shared) converter.subsets object
688  # that is used to filter data IDs for config.relatedOnly.
689  self.registerUsedSkyMaps(rootConverter.subset)
690  self.registerUsedSkyPix(rootConverter.subset)
691 
692  # Look for datasets, generally by scanning the filesystem.
693  # This requires dimensions to have already been inserted so we can use
694  # dimension information to identify related datasets.
695  for converter in converters:
696  converter.findDatasets()
697 
698  # Expand data IDs.
699  for converter in converters:
700  converter.expandDataIds()
701 
702  # Actually ingest datasets.
703  for converter in converters:
704  converter.ingest()
705 
706  # Perform any post-ingest processing.
707  for converter in converters:
708  converter.finish()
709 
710  # Make the umbrella collection, if desired.
711  if self.config.doMakeUmbrellaCollection:
712  umbrella = self.instrument.makeUmbrellaCollectionName()
713  self.registry.registerCollection(umbrella, CollectionType.CHAINED)
714  children = list(self.registry.getCollectionChain(umbrella))
715  children.extend(rootConverter.getCollectionChain())
716  children.append(self.instrument.makeCalibrationCollectionName())
717  if BaseSkyMap.SKYMAP_RUN_COLLECTION_NAME not in children:
718  # Ensure the umbrella collection includes the global skymap
719  # collection, even if it's currently empty.
720  self.registry.registerRun(BaseSkyMap.SKYMAP_RUN_COLLECTION_NAME)
721  children.append(BaseSkyMap.SKYMAP_RUN_COLLECTION_NAME)
722  children.extend(self.config.extraUmbrellaChildren)
723  self.log.info("Defining %s from chain %s.", umbrella, children)
724  self.registry.setCollectionChain(umbrella, children)
725 
726  # Add chained collections for reruns.
727  for spec in reruns:
728  if spec.chainName is not None:
729  self.butler3.registry.registerCollection(spec.chainName, type=CollectionType.CHAINED)
730  chain = [spec.runName]
731  chain.extend(rerunConverters[spec.runName].getCollectionChain())
732  for parent in spec.parents:
733  chain.append(parent)
734  parentConverter = rerunConverters.get(parent)
735  if parentConverter is not None:
736  chain.extend(parentConverter.getCollectionChain())
737  chain.extend(rootConverter.getCollectionChain())
738  if len(calibs) == 1:
739  # Exactly one calibration repo being converted, so it's
740  # safe-ish to assume that's the one the rerun used.
741  chain.append(self.instrument.makeCalibrationCollectionName(*calibs[0].labels))
742  self.log.info("Defining %s from chain %s.", spec.chainName, chain)
743  self.butler3.registry.setCollectionChain(spec.chainName, chain)
def writeCuratedCalibrations(repo, instrument, collection, labels)
daf::base::PropertyList * list
Definition: fits.cc:913

◆ timer()

def lsst.pipe.base.task.Task.timer (   self,
  name,
  logLevel = Log.DEBUG 
)
inherited
Context manager to log performance data for an arbitrary block of
code.

Parameters
----------
name : `str`
    Name of code being timed; data will be logged using item name:
    ``Start`` and ``End``.
logLevel
    A `lsst.log` level constant.

Examples
--------
Creating a timer context:

.. code-block:: python

    with self.timer("someCodeToTime"):
        pass  # code to time

See also
--------
timer.logInfo

Definition at line 327 of file task.py.

327  def timer(self, name, logLevel=Log.DEBUG):
328  """Context manager to log performance data for an arbitrary block of
329  code.
330 
331  Parameters
332  ----------
333  name : `str`
334  Name of code being timed; data will be logged using item name:
335  ``Start`` and ``End``.
336  logLevel
337  A `lsst.log` level constant.
338 
339  Examples
340  --------
341  Creating a timer context:
342 
343  .. code-block:: python
344 
345  with self.timer("someCodeToTime"):
346  pass # code to time
347 
348  See also
349  --------
350  timer.logInfo
351  """
352  logInfo(obj=self, prefix=name + "Start", logLevel=logLevel)
353  try:
354  yield
355  finally:
356  logInfo(obj=self, prefix=name + "End", logLevel=logLevel)
357 
def logInfo(obj, prefix, logLevel=Log.DEBUG)
Definition: timer.py:63

◆ useSkyMap()

str lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.useSkyMap (   self,
BaseSkyMap  skyMap,
str  skyMapName 
)
Indicate that a repository uses the given SkyMap.

This method is intended to be called primarily by the
`RepoConverter` instances used interally by the task.

Parameters
----------
skyMap : `lsst.skymap.BaseSkyMap`
    SkyMap instance being used, typically retrieved from a Gen2
    data repository.
skyMapName : `str`
    The name of the gen2 skymap, for error reporting.

Returns
-------
name : `str`
    The name of the skymap in Gen3 data IDs.

Raises
------
    LookupError
        Raised if the specified skymap cannot be found.

Definition at line 485 of file convertRepo.py.

485  def useSkyMap(self, skyMap: BaseSkyMap, skyMapName: str) -> str:
486  """Indicate that a repository uses the given SkyMap.
487 
488  This method is intended to be called primarily by the
489  `RepoConverter` instances used interally by the task.
490 
491  Parameters
492  ----------
493  skyMap : `lsst.skymap.BaseSkyMap`
494  SkyMap instance being used, typically retrieved from a Gen2
495  data repository.
496  skyMapName : `str`
497  The name of the gen2 skymap, for error reporting.
498 
499  Returns
500  -------
501  name : `str`
502  The name of the skymap in Gen3 data IDs.
503 
504  Raises
505  ------
506  LookupError
507  Raised if the specified skymap cannot be found.
508  """
509  sha1 = skyMap.getSha1()
510  if sha1 not in self._configuredSkyMapsBySha1:
511  self._populateSkyMapDicts(skyMapName, skyMap)
512  try:
513  struct = self._configuredSkyMapsBySha1[sha1]
514  except KeyError as err:
515  msg = f"SkyMap '{skyMapName}' with sha1={sha1} not included in configuration."
516  raise LookupError(msg) from err
517  struct.used = True
518  return struct.name
519 

◆ useSkyPix()

def lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.useSkyPix (   self,
SkyPixDimension  dimension 
)
Indicate that a repository uses the given SkyPix dimension.

This method is intended to be called primarily by the
`RepoConverter` instances used interally by the task.

Parameters
----------
dimension : `lsst.daf.butler.SkyPixDimension`
    Dimension represening a pixelization of the sky.

Definition at line 539 of file convertRepo.py.

539  def useSkyPix(self, dimension: SkyPixDimension):
540  """Indicate that a repository uses the given SkyPix dimension.
541 
542  This method is intended to be called primarily by the
543  `RepoConverter` instances used interally by the task.
544 
545  Parameters
546  ----------
547  dimension : `lsst.daf.butler.SkyPixDimension`
548  Dimension represening a pixelization of the sky.
549  """
550  self._usedSkyPix.add(dimension)
551 

Member Data Documentation

◆ butler3

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.butler3

Definition at line 433 of file convertRepo.py.

◆ config

lsst.pipe.base.task.Task.config
inherited

Definition at line 162 of file task.py.

◆ ConfigClass

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.ConfigClass = ConvertRepoConfig
static

Definition at line 422 of file convertRepo.py.

◆ defineVisits

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.defineVisits

Definition at line 441 of file convertRepo.py.

◆ instrument

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.instrument

Definition at line 442 of file convertRepo.py.

◆ log

lsst.pipe.base.task.Task.log
inherited

Definition at line 161 of file task.py.

◆ metadata

lsst.pipe.base.task.Task.metadata
inherited

Definition at line 134 of file task.py.

◆ raws

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.raws

Definition at line 440 of file convertRepo.py.

◆ registry

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.registry

Definition at line 434 of file convertRepo.py.

◆ translatorFactory

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.translatorFactory

Definition at line 449 of file convertRepo.py.

◆ universe

lsst.obs.base.gen2to3.convertRepo.ConvertRepoTask.universe

Definition at line 435 of file convertRepo.py.


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