lsst.pipe.drivers  13.0-17-g3ce57e5+37
 All Classes Namespaces Files Functions Variables Pages
utils.py
Go to the documentation of this file.
1 from __future__ import absolute_import, division, print_function
2 import argparse
3 
4 from lsst.pipe.base import Struct, TaskRunner
5 from lsst.pipe.tasks.coaddBase import CoaddDataIdContainer
6 from lsst.pipe.tasks.selectImages import BaseSelectImagesTask, BaseExposureInfo
7 
8 
9 class ButlerTaskRunner(TaskRunner):
10  """Get a butler into the Task scripts"""
11  @staticmethod
12  def getTargetList(parsedCmd, **kwargs):
13  """Task.run should receive a butler in the kwargs"""
14  return TaskRunner.getTargetList(parsedCmd, butler=parsedCmd.butler, **kwargs)
15 
16 
17 def getDataRef(butler, dataId, datasetType="raw"):
18  """Construct a dataRef from a butler and data identifier"""
19  dataRefList = [ref for ref in butler.subset(datasetType, **dataId)]
20  assert len(dataRefList) == 1
21  return dataRefList[0]
22 
23 
24 class NullSelectImagesTask(BaseSelectImagesTask):
25  """Select images by taking everything we're given without further examination
26 
27  This is useful if the examination (e.g., Wcs checking) has been performed
28  previously, and we've been provided a good list.
29  """
30 
31  def runDataRef(self, patchRef, coordList, makeDataRefList=True, selectDataList=[]):
32  return Struct(
33  dataRefList=[s.dataRef for s in selectDataList],
34  exposureInfoList=[BaseExposureInfo(
35  s.dataRef.dataId, None) for s in selectDataList],
36  )
37 
38 
39 class TractDataIdContainer(CoaddDataIdContainer):
40 
41  def makeDataRefList(self, namespace):
42  """Make self.refList from self.idList
43 
44  It's difficult to make a data reference that merely points to an entire
45  tract: there is no data product solely at the tract level. Instead, we
46  generate a list of data references for patches within the tract.
47  """
48  datasetType = namespace.config.coaddName + "Coadd_calexp"
49  validKeys = set(["tract", "filter", "patch"])
50 
51  def getPatchRefList(tract):
52  return [namespace.butler.dataRef(datasetType=datasetType,
53  tract=tract.getId(),
54  filter=dataId["filter"],
55  patch="%d,%d" % patch.getIndex())
56  for patch in tract]
57 
58  tractRefs = {} # Data references for each tract
59  for dataId in self.idList:
60  for key in validKeys:
61  if key in ("tract", "patch",):
62  # Will deal with these explicitly
63  continue
64  if key not in dataId:
65  raise argparse.ArgumentError(
66  None, "--id must include " + key)
67 
68  skymap = self.getSkymap(namespace)
69 
70  if "tract" in dataId:
71  tractId = dataId["tract"]
72  if tractId not in tractRefs:
73  tractRefs[tractId] = []
74  if "patch" in dataId:
75  tractRefs[tractId].append(namespace.butler.dataRef(datasetType=datasetType, tract=tractId,
76  filter=dataId[
77  'filter'],
78  patch=dataId['patch']))
79  else:
80  tractRefs[tractId] += getPatchRefList(skymap[tractId])
81  else:
82  tractRefs = dict((tract.getId(), tractRefs.get(tract.getId(), []) +
83  getPatchRefList(tract)) for tract in skymap)
84 
85  self.refList = list(tractRefs.values())