Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import traceback 

2 

3import lsst.pipe.base as pipeBase 

4from lsst.verify.tasks import MetricConnections, MetricComputationError 

5 

6from lsst.faro.base.CatalogMeasurementBase import CatalogMeasurementBaseTaskConfig, CatalogMeasurementBaseTask 

7 

8__all__ = ("PatchMatchedMeasurementTaskConnections", "PatchMatchedMeasurementTaskConfig", 

9 "PatchMatchedMeasurementTask", 

10 "TractMatchedMeasurementTaskConnections", "TractMatchedMeasurementTaskConfig", 

11 "TractMatchedMeasurementTask", 

12 "PatchMatchedMultiBandMeasurementTaskConnections", "PatchMatchedMultiBandMeasurementTaskConfig", 

13 "PatchMatchedMultiBandMeasurementTask") 

14 

15# The first thing to do is to define a Connections class. This will define all 

16# the inputs and outputs that our task requires 

17 

18 

19class PatchMatchedMeasurementTaskConnections(MetricConnections, 

20 dimensions=("tract", "patch", "band", 

21 "instrument", "skymap")): 

22 cat = pipeBase.connectionTypes.Input(doc="Input matched catalog.", 

23 dimensions=("tract", "patch", "instrument", 

24 "band"), 

25 storageClass="SimpleCatalog", 

26 name="matchedCatalogPatch") 

27 measurement = pipeBase.connectionTypes.Output(doc="Resulting matched catalog.", 

28 dimensions=("tract", "patch", 

29 "instrument", "band"), 

30 storageClass="MetricValue", 

31 name="metricvalue_{package}_{metric}") 

32 

33 

34class PatchMatchedMeasurementTaskConfig(CatalogMeasurementBaseTaskConfig, 

35 pipelineConnections=PatchMatchedMeasurementTaskConnections): 

36 pass 

37 

38 

39class PatchMatchedMeasurementTask(CatalogMeasurementBaseTask): 

40 ConfigClass = PatchMatchedMeasurementTaskConfig 

41 _DefaultName = "patchMatchedMeasurementTask" 

42 

43 

44class TractMatchedMeasurementTaskConnections(PatchMatchedMeasurementTaskConnections, 

45 dimensions=("tract", "instrument", 

46 "band", "skymap")): 

47 cat = pipeBase.connectionTypes.Input(doc="Input matched catalog.", 

48 dimensions=("tract", "instrument", 

49 "band"), 

50 storageClass="SimpleCatalog", 

51 name="matchedCatalogTract") 

52 measurement = pipeBase.connectionTypes.Output(doc="Resulting matched catalog.", 

53 dimensions=("tract", 

54 "instrument", "band"), 

55 storageClass="MetricValue", 

56 name="metricvalue_{package}_{metric}") 

57 

58 

59class TractMatchedMeasurementTaskConfig(CatalogMeasurementBaseTaskConfig, 

60 pipelineConnections=TractMatchedMeasurementTaskConnections): 

61 pass 

62 

63 

64class TractMatchedMeasurementTask(CatalogMeasurementBaseTask): 

65 ConfigClass = TractMatchedMeasurementTaskConfig 

66 _DefaultName = "tractMatchedMeasurementTask" 

67 

68 

69class PatchMatchedMultiBandMeasurementTaskConnections(MetricConnections, 

70 dimensions=("tract", "patch", "band", 

71 "instrument", "skymap")): 

72 cat = pipeBase.connectionTypes.Input(doc="Input matched catalog.", 

73 dimensions=("tract", "patch", "instrument"), 

74 storageClass="SimpleCatalog", 

75 name="matchedCatalogPatchMultiBand") 

76 measurement = pipeBase.connectionTypes.Output(doc="Resulting matched catalog.", 

77 dimensions=("tract", "patch", 

78 "instrument", "band"), 

79 storageClass="MetricValue", 

80 name="metricvalue_{package}_{metric}") 

81 

82 

83class PatchMatchedMultiBandMeasurementTaskConfig( 

84 CatalogMeasurementBaseTaskConfig, 

85 pipelineConnections=PatchMatchedMultiBandMeasurementTaskConnections): 

86 pass 

87 

88 

89class PatchMatchedMultiBandMeasurementTask(CatalogMeasurementBaseTask): 

90 ConfigClass = PatchMatchedMultiBandMeasurementTaskConfig 

91 _DefaultName = "patchMatchedMultiBandMeasurementTask" 

92 

93 def run(self, cat, in_id, out_id): 

94 return self.measure.run(cat, self.config.connections.metric, in_id, out_id) 

95 

96 def runQuantum(self, butlerQC, inputRefs, outputRefs): 

97 """Do Butler I/O to provide in-memory objects for run. 

98 This specialization of runQuantum performs error-handling specific to 

99 MetricTasks. Most or all of this functionality may be moved to 

100 activators in the future. 

101 """ 

102 try: 

103 in_id = butlerQC.registry.expandDataId(inputRefs.cat.dataId) 

104 out_id = butlerQC.registry.expandDataId(outputRefs.measurement.dataId) 

105 inputs = butlerQC.get(inputRefs) 

106 inputs['in_id'] = in_id 

107 inputs['out_id'] = out_id 

108 outputs = self.run(**inputs) 

109 if outputs.measurement is not None: 

110 butlerQC.put(outputs, outputRefs) 

111 else: 

112 self.log.debugf("Skipping measurement of {!r} on {} " 

113 "as not applicable.", self, inputRefs) 

114 except MetricComputationError: 

115 # Apparently lsst.log doesn't have built-in exception support? 

116 self.log.errorf( 

117 "Measurement of {!r} failed on {}->{}\n{}", 

118 self, inputRefs, outputRefs, traceback.format_exc())