Coverage for python/lsst/analysis/tools/tasks/objectTableSurveyAnalysis.py: 45%

32 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-08 07:15 -0700

1# Developed for the LSST Data Management System. 

2# This product includes software developed by the LSST Project 

3# (https://www.lsst.org). 

4# See the COPYRIGHT file at the top-level directory of this distribution 

5# for details of code ownership. 

6# 

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

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

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

10# (at your option) any later version. 

11# 

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

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

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

15# GNU General Public License for more details. 

16# 

17# You should have received a copy of the GNU General Public License 

18# along with this program. If not, see <https://www.gnu.org/licenses/>. 

19 

20from __future__ import annotations 

21 

22__all__ = ("ObjectTableSurveyAnalysisTask",) 

23 

24 

25from typing import TYPE_CHECKING, Any, Iterable, Mapping, cast 

26 

27import pandas as pd 

28 

29if TYPE_CHECKING: 29 ↛ 30line 29 didn't jump to line 30, because the condition on line 29 was never true

30 from lsst.daf.butler import DataCoordinate, DeferredDatasetHandle 

31 

32from lsst.pipe.base import connectionTypes as ct 

33 

34from ..actions.plot.plotUtils import shorten_list 

35from ..interfaces import AnalysisBaseConfig, AnalysisBaseConnections, AnalysisPipelineTask, KeyedData 

36 

37 

38class ObjectTableSurveyAnalysisConnections( 

39 AnalysisBaseConnections, 

40 dimensions=("skymap",), 

41 defaultTemplates={"input": "deepCoadd"}, 

42): 

43 skymap = ct.Input( 

44 doc="Input definition of geometry/bbox and projection/wcs for warped exposures", 

45 name="skyMap", 

46 storageClass="SkyMap", 

47 dimensions=("skymap",), 

48 ) 

49 

50 data = ct.Input( 

51 doc="Input catalog of objects", 

52 name="objectTable_tract", 

53 storageClass="DataFrame", 

54 deferLoad=True, 

55 multiple=True, 

56 dimensions=("tract", "skymap"), 

57 ) 

58 

59 

60class ObjectTableSurveyAnalysisConfig( 

61 AnalysisBaseConfig, pipelineConnections=ObjectTableSurveyAnalysisConnections 

62): 

63 pass 

64 

65 

66class ObjectTableSurveyAnalysisTask(AnalysisPipelineTask): 

67 """A specialized ``AnalysisPipelineTask`` for multiple tracts.""" 

68 

69 ConfigClass = ObjectTableSurveyAnalysisConfig 

70 _DefaultName = "objectTableSurveyAnalysis" 

71 

72 def parsePlotInfo( 

73 self, inputs: Mapping[str, Any] | None, dataId: DataCoordinate | None, connectionName: str = "data" 

74 ) -> Mapping[str, str]: 

75 # Docstring inherited 

76 

77 if inputs is None: 

78 tableName = "" 

79 run = "" 

80 tracts = [] 

81 else: 

82 tableName = inputs[connectionName][0].ref.datasetType.name 

83 run = inputs[connectionName][0].ref.run 

84 tracts = [data.ref.dataId["tract"] for data in inputs[connectionName]] 

85 

86 # Initialize the plot info dictionary 

87 plotInfo = { 

88 "tableName": tableName, 

89 "run": run, 

90 "tract": shorten_list(tracts), 

91 } 

92 

93 self._populatePlotInfoWithDataId(plotInfo, dataId) 

94 return plotInfo 

95 

96 def loadData( # type: ignore[override] 

97 self, 

98 handle: Iterable[DeferredDatasetHandle], 

99 names: Iterable[str] | None = None, 

100 ) -> KeyedData: 

101 """Load the minimal set of keyed data from the input dataset. 

102 

103 Parameters 

104 ---------- 

105 handle : `Iterable` of `DeferredDatasetHandle` 

106 Handle to load the dataset with only the specified columns. 

107 names : `Iterable` of `str` 

108 The names of keys to extract from the dataset. 

109 If `names` is `None` then the `collectInputNames` method 

110 is called to generate the names. 

111 For most purposes these are the names of columns to load from 

112 a catalog or data frame. 

113 

114 Returns 

115 ------- 

116 result: `KeyedData` 

117 The dataset with only the specified keys loaded. 

118 """ 

119 # Except associatedSourceTractAnalysis, all other tasks trivially 

120 # subclass this, so names don't get utilized. 

121 if names is None: 

122 names = self.collectInputNames() 

123 

124 return cast(KeyedData, pd.concat(h.get(parameters={"columns": names}) for h in handle))