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 lsst.sims.maf.metrics as metrics 

2import lsst.sims.maf.slicers as slicers 

3import lsst.sims.maf.metricBundles as mb 

4from .colMapDict import ColMapDict 

5from .common import standardSummary 

6 

7__all__ = ['filtersPerNight', 'filtersWholeSurvey'] 

8 

9 

10def setupMetrics(colmap, wholesurvey=False): 

11 metricList = [] 

12 captionList = [] 

13 # Number of filter changes (per slice - either whole survey or X nights) 

14 if wholesurvey: 

15 metricList.append(metrics.NChangesMetric(col=colmap['filter'], orderBy=colmap['mjd'], 

16 metricName='Total Filter Changes')) 

17 else: 

18 metricList.append(metrics.NChangesMetric(col=colmap['filter'], orderBy=colmap['mjd'], 

19 metricName='Filter Changes')) 

20 captionList.append('Total filter changes ') 

21 # Minimum time between filter changes 

22 metricList.append(metrics.MinTimeBetweenStatesMetric(changeCol=colmap['filter'], timeCol=colmap['mjd'])) 

23 captionList.append('Minimum time between filter changes ') 

24 # Number of filter changes faster than 10 minutes 

25 metricList.append(metrics.NStateChangesFasterThanMetric(changeCol=colmap['filter'], timeCol=colmap['mjd'], 

26 cutoff=10)) 

27 captionList.append('Number of filter changes faster than 10 minutes ') 

28 # Number of filter changes faster than 20 minutes 

29 metricList.append(metrics.NStateChangesFasterThanMetric(changeCol=colmap['filter'], timeCol=colmap['mjd'], 

30 cutoff=20)) 

31 captionList.append('Number of filter changes faster than 20 minutes ') 

32 # Maximum number of filter changes faster than 10 minutes within slice 

33 metricList.append(metrics.MaxStateChangesWithinMetric(changeCol=colmap['filter'], timeCol=colmap['mjd'], 

34 timespan=10)) 

35 captionList.append('Max number of filter changes within a window of 10 minutes ') 

36 # Maximum number of filter changes faster than 20 minutes within slice 

37 metricList.append(metrics.MaxStateChangesWithinMetric(changeCol=colmap['filter'], timeCol=colmap['mjd'], 

38 timespan=20)) 

39 captionList.append('Max number of filter changes within a window of 20 minutes ') 

40 return metricList, captionList 

41 

42 

43def filtersPerNight(colmap=None, runName='opsim', nights=1, extraSql=None, extraMetadata=None): 

44 """Generate a set of metrics measuring the number and rate of filter changes over a given span of nights. 

45 

46 Parameters 

47 ---------- 

48 colmap : dict, opt 

49 A dictionary with a mapping of column names. Default will use OpsimV4 column names. 

50 run_name : str, opt 

51 The name of the simulated survey. Default is "opsim". 

52 nights : int, opt 

53 Size of night bin to use when calculating metrics. Default is 1. 

54 extraSql : str, opt 

55 Additional constraint to add to any sql constraints (e.g. 'propId=1' or 'fieldID=522'). 

56 Default None, for no additional constraints. 

57 extraMetadata : str, opt 

58 Additional metadata to add before any below (i.e. "WFD"). Default is None. 

59 

60 Returns 

61 ------- 

62 metricBundleDict 

63 """ 

64 

65 if colmap is None: 

66 colmap = ColMapDict('opsimV4') 

67 bundleList = [] 

68 

69 # Set up sql and metadata, if passed any additional information. 

70 sql = '' 

71 metadata = 'Per' 

72 if nights == 1: 

73 metadata += ' Night' 

74 else: 

75 metadata += ' %s Nights' % nights 

76 metacaption = metadata.lower() 

77 if (extraSql is not None) and (len(extraSql) > 0): 

78 sql = extraSql 

79 if extraMetadata is None: 

80 metadata += ' %s' % extraSql 

81 metacaption += ', with %s selection' % extraSql 

82 if extraMetadata is not None: 

83 metadata += ' %s' % extraMetadata 

84 metacaption += ', %s only' % extraMetadata 

85 metacaption += '.' 

86 

87 displayDict = {'group': 'Filter Changes', 'subgroup': metadata} 

88 summaryStats = standardSummary() 

89 

90 slicer = slicers.OneDSlicer(sliceColName=colmap['night'], binsize=nights) 

91 metricList, captionList = setupMetrics(colmap) 

92 for m, caption in zip(metricList, captionList): 

93 displayDict['caption'] = caption + metacaption 

94 bundle = mb.MetricBundle(m, slicer, sql, runName=runName, metadata=metadata, 

95 displayDict=displayDict, 

96 summaryMetrics=summaryStats) 

97 bundleList.append(bundle) 

98 

99 for b in bundleList: 

100 b.setRunName(runName) 

101 return mb.makeBundlesDictFromList(bundleList) 

102 

103 

104def filtersWholeSurvey(colmap=None, runName='opsim', extraSql=None, extraMetadata=None): 

105 """Generate a set of metrics measuring the number and rate of filter changes over the entire survey. 

106 

107 Parameters 

108 ---------- 

109 colmap : dict, opt 

110 A dictionary with a mapping of column names. Default will use OpsimV4 column names. 

111 run_name : str, opt 

112 The name of the simulated survey. Default is "opsim". 

113 extraSql : str, opt 

114 Additional constraint to add to any sql constraints (e.g. 'propId=1' or 'fieldID=522'). 

115 Default None, for no additional constraints. 

116 extraMetadata : str, opt 

117 Additional metadata to add before any below (i.e. "WFD"). Default is None. 

118 

119 Returns 

120 ------- 

121 metricBundleDict 

122 """ 

123 if colmap is None: 

124 colmap = ColMapDict('opsimV4') 

125 bundleList = [] 

126 

127 # Set up sql and metadata, if passed any additional information. 

128 sql = '' 

129 metadata = 'Whole Survey' 

130 metacaption = 'over the whole survey' 

131 if (extraSql is not None) and (len(extraSql) > 0): 

132 sql = extraSql 

133 if extraMetadata is None: 

134 metadata += ' %s' % extraSql 

135 metacaption += ', with %s selction' % extraSql 

136 if extraMetadata is not None: 

137 metadata += ' %s' % extraMetadata 

138 metacaption += ', %s only' % (extraMetadata) 

139 metacaption += '.' 

140 

141 displayDict = {'group': 'Filter Changes', 'subgroup': metadata} 

142 

143 slicer = slicers.UniSlicer() 

144 metricList, captionList = setupMetrics(colmap) 

145 for m, caption in zip(metricList, captionList): 

146 displayDict['caption'] = caption + metacaption 

147 bundle = mb.MetricBundle(m, slicer, sql, runName=runName, metadata=metadata, 

148 displayDict=displayDict) 

149 bundleList.append(bundle) 

150 

151 for b in bundleList: 

152 b.setRunName(runName) 

153 return mb.makeBundlesDictFromList(bundleList)