Coverage for python/lsst/coadd/utils/coaddDataIdContainer.py: 15%

29 statements  

« prev     ^ index     » next       coverage.py v7.2.1, created at 2023-03-12 01:50 -0800

1# 

2# LSST Data Management System 

3# Copyright 2008-2015 AURA/LSST. 

4# 

5# This product includes software developed by the 

6# LSST Project (http://www.lsst.org/). 

7# 

8# This program is free software: you can redistribute it and/or modify 

9# it under the terms of the GNU General Public License as published by 

10# the Free Software Foundation, either version 3 of the License, or 

11# (at your option) any later version. 

12# 

13# This program is distributed in the hope that it will be useful, 

14# but WITHOUT ANY WARRANTY; without even the implied warranty of 

15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

16# GNU General Public License for more details. 

17# 

18# You should have received a copy of the LSST License Statement and 

19# the GNU General Public License along with this program. If not, 

20# see <http://www.lsstcorp.org/LegalNotices/>. 

21# 

22__all__ = ["CoaddDataIdContainer", "ExistingCoaddDataIdContainer"] 

23 

24import argparse 

25 

26import lsst.pipe.base as pipeBase 

27 

28 

29class CoaddDataIdContainer(pipeBase.DataIdContainer): 

30 """A version of lsst.pipe.base.DataIdContainer specialized for coaddition. 

31 

32 Required because butler.subset does not support patch and tract 

33 

34 This code was originally in pipe_tasks (coaddBase.py) 

35 """ 

36 

37 def getSkymap(self, namespace): 

38 """Only retrieve skymap if required""" 

39 if not hasattr(self, "_skymap"): 

40 self._skymap = namespace.butler.get(namespace.config.coaddName + "Coadd_skyMap") 

41 return self._skymap 

42 

43 def makeDataRefList(self, namespace): 

44 """Make self.refList from self.idList 

45 """ 

46 validKeys = namespace.butler.getKeys(datasetType=self.datasetType, level=self.level) 

47 

48 for dataId in self.idList: 

49 for key in validKeys: 

50 if key in ("tract", "patch"): 

51 # Will deal with these explicitly 

52 continue 

53 if key not in dataId: 

54 raise argparse.ArgumentError(None, "--id must include " + key) 

55 

56 # tract and patch are required; iterate over them if not provided 

57 if "tract" not in dataId: 

58 if "patch" in dataId: 

59 raise RuntimeError("'patch' cannot be specified without 'tract'") 

60 addList = [dict(tract=tract.getId(), patch="%d,%d" % patch.getIndex(), **dataId) 

61 for tract in self.getSkymap(namespace) for patch in tract] 

62 elif "patch" not in dataId: 

63 tract = self.getSkymap(namespace)[dataId["tract"]] 

64 addList = [dict(patch="%d,%d" % patch.getIndex(), **dataId) for patch in tract] 

65 else: 

66 addList = [dataId] 

67 

68 self.refList += [namespace.butler.dataRef(datasetType=self.datasetType, dataId=addId) 

69 for addId in addList] 

70 

71 

72class ExistingCoaddDataIdContainer(CoaddDataIdContainer): 

73 """A version of CoaddDataIdContainer that only produces references that exist""" 

74 

75 def makeDataRefList(self, namespace): 

76 super(ExistingCoaddDataIdContainer, self).makeDataRefList(namespace) 

77 self.refList = [ref for ref in self.refList if ref.datasetExists()]