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

1from builtins import zip 

2import matplotlib 

3matplotlib.use("Agg") 

4import numpy as np 

5import unittest 

6import lsst.sims.maf.metrics as metrics 

7import lsst.sims.maf.slicers as slicers 

8import lsst.sims.maf.metricBundles as metricBundle 

9import lsst.utils.tests 

10 

11 

12class Test2D(unittest.TestCase): 

13 

14 def setUp(self): 

15 names = ['night', 'fieldId', 'fieldRA', 'fieldDec', 'fiveSigmaDepth', 'observationStartMJD'] 

16 types = [int, int, float, float, float, float] 

17 

18 self.m5_1 = 25. 

19 self.m5_2 = 24. 

20 

21 self.n1 = 50 

22 self.n2 = 49 

23 

24 # Picking RA and Dec values that will hit nside=16 healpixels 

25 self.simData = np.zeros(self.n1+self.n2, dtype=list(zip(names, types))) 

26 self.simData['night'][0:self.n1] = 1 

27 self.simData['fieldId'][0:self.n1] = 1 

28 self.simData['fieldRA'][0:self.n1] = 10. 

29 self.simData['fieldDec'][0:self.n1] = 0. 

30 self.simData['fiveSigmaDepth'][0:self.n1] = self.m5_1 

31 

32 self.simData['night'][self.n1:] = 2 

33 self.simData['fieldId'][self.n1:] = 2 

34 self.simData['fieldRA'][self.n1:] = 190. 

35 self.simData['fieldDec'][self.n1:] = -20. 

36 self.simData['fiveSigmaDepth'][self.n1:] = self.m5_2 

37 

38 self.fieldData = np.zeros(2, dtype=list(zip(['fieldId', 'fieldRA', 'fieldDec'], 

39 [int, float, float]))) 

40 self.fieldData['fieldId'] = [1, 2] 

41 self.fieldData['fieldRA'] = np.radians([10., 190.]) 

42 self.fieldData['fieldDec'] = np.radians([0., -20.]) 

43 

44 self.simData['observationStartMJD'] = self.simData['night'] 

45 

46 def testOpsim2dSlicer(self): 

47 metric = metrics.AccumulateCountMetric(bins=[0.5, 1.5, 2.5]) 

48 slicer = slicers.OpsimFieldSlicer() 

49 sql = '' 

50 mb = metricBundle.MetricBundle(metric, slicer, sql) 

51 # Clobber the stacker that gets auto-added 

52 mb.stackerList = [] 

53 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

54 mbg.setCurrent('') 

55 mbg.fieldData = self.fieldData 

56 mbg.runCurrent('', simData=self.simData) 

57 expected = np.array([[self.n1, self.n1], 

58 [-666., self.n2]]) 

59 assert(np.array_equal(mb.metricValues.data, expected)) 

60 

61 def testHealpix2dSlicer(self): 

62 metric = metrics.AccumulateCountMetric(bins=[0.5, 1.5, 2.5]) 

63 slicer = slicers.HealpixSlicer(nside=16) 

64 sql = '' 

65 mb = metricBundle.MetricBundle(metric, slicer, sql) 

66 # Clobber the stacker that gets auto-added 

67 mb.stackerList = [] 

68 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

69 mbg.setCurrent('') 

70 mbg.runCurrent('', simData=self.simData) 

71 

72 good = np.where(mb.metricValues.mask[:, -1] == False)[0] 

73 expected = np.array([[self.n1, self.n1], 

74 [-666., self.n2]]) 

75 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

76 

77 def testHistogramMetric(self): 

78 metric = metrics.HistogramMetric(bins=[0.5, 1.5, 2.5]) 

79 slicer = slicers.HealpixSlicer(nside=16) 

80 sql = '' 

81 mb = metricBundle.MetricBundle(metric, slicer, sql) 

82 # Clobber the stacker that gets auto-added 

83 mb.stackerList = [] 

84 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

85 mbg.setCurrent('') 

86 mbg.runCurrent('', simData=self.simData) 

87 

88 good = np.where(mb.metricValues.mask[:, -1] == False)[0] 

89 expected = np.array([[self.n1, 0.], 

90 [0., self.n2]]) 

91 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

92 

93 # Check that I can run a different statistic 

94 metric = metrics.HistogramMetric(col='fiveSigmaDepth', 

95 statistic='sum', 

96 bins=[0.5, 1.5, 2.5]) 

97 mb = metricBundle.MetricBundle(metric, slicer, sql) 

98 # Clobber the stacker that gets auto-added 

99 mb.stackerList = [] 

100 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

101 mbg.setCurrent('') 

102 mbg.runCurrent('', simData=self.simData) 

103 expected = np.array([[self.m5_1*self.n1, 0.], 

104 [0., self.m5_2*self.n2]]) 

105 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

106 

107 def testAccumulateMetric(self): 

108 metric = metrics.AccumulateMetric(col='fiveSigmaDepth', bins=[0.5, 1.5, 2.5]) 

109 slicer = slicers.HealpixSlicer(nside=16) 

110 sql = '' 

111 mb = metricBundle.MetricBundle(metric, slicer, sql) 

112 # Clobber the stacker that gets auto-added 

113 mb.stackerList = [] 

114 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

115 mbg.setCurrent('') 

116 mbg.runCurrent('', simData=self.simData) 

117 good = np.where(mb.metricValues.mask[:, -1] == False)[0] 

118 expected = np.array([[self.n1*self.m5_1, self.n1*self.m5_1], 

119 [-666., self.n2 * self.m5_2]]) 

120 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

121 

122 def testHistogramM5Metric(self): 

123 metric = metrics.HistogramM5Metric(bins=[0.5, 1.5, 2.5]) 

124 slicer = slicers.HealpixSlicer(nside=16) 

125 sql = '' 

126 mb = metricBundle.MetricBundle(metric, slicer, sql) 

127 # Clobber the stacker that gets auto-added 

128 mb.stackerList = [] 

129 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

130 mbg.setCurrent('') 

131 mbg.runCurrent('', simData=self.simData) 

132 good = np.where((mb.metricValues.mask[:, 0] == False) | 

133 (mb.metricValues.mask[:, 1] == False))[0] 

134 

135 checkMetric = metrics.Coaddm5Metric() 

136 tempSlice = np.zeros(self.n1, dtype=list(zip(['fiveSigmaDepth'], [float]))) 

137 tempSlice['fiveSigmaDepth'] += self.m5_1 

138 val1 = checkMetric.run(tempSlice) 

139 tempSlice = np.zeros(self.n2, dtype=list(zip(['fiveSigmaDepth'], [float]))) 

140 tempSlice['fiveSigmaDepth'] += self.m5_2 

141 val2 = checkMetric.run(tempSlice) 

142 

143 expected = np.array([[val1, -666.], 

144 [-666., val2]]) 

145 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

146 

147 def testAccumulateM5Metric(self): 

148 metric = metrics.AccumulateM5Metric(bins=[0.5, 1.5, 2.5]) 

149 slicer = slicers.HealpixSlicer(nside=16) 

150 sql = '' 

151 mb = metricBundle.MetricBundle(metric, slicer, sql) 

152 # Clobber the stacker that gets auto-added 

153 mb.stackerList = [] 

154 mbg = metricBundle.MetricBundleGroup({0: mb}, None, saveEarly=False) 

155 mbg.setCurrent('') 

156 mbg.runCurrent('', simData=self.simData) 

157 good = np.where(mb.metricValues.mask[:, -1] == False)[0] 

158 

159 checkMetric = metrics.Coaddm5Metric() 

160 tempSlice = np.zeros(self.n1, dtype=list(zip(['fiveSigmaDepth'], [float]))) 

161 tempSlice['fiveSigmaDepth'] += self.m5_1 

162 val1 = checkMetric.run(tempSlice) 

163 tempSlice = np.zeros(self.n2, dtype=list(zip(['fiveSigmaDepth'], [float]))) 

164 tempSlice['fiveSigmaDepth'] += self.m5_2 

165 val2 = checkMetric.run(tempSlice) 

166 

167 expected = np.array([[val1, val1], 

168 [-666., val2]]) 

169 assert(np.array_equal(mb.metricValues.data[good, :], expected)) 

170 

171 def testAccumulateUniformityMetric(self): 

172 names = ['night'] 

173 types = ['float'] 

174 dataSlice = np.zeros(3652, dtype=list(zip(names, types))) 

175 

176 # Test that a uniform distribution is very close to zero 

177 dataSlice['night'] = np.arange(1, dataSlice.size+1) 

178 metric = metrics.AccumulateUniformityMetric() 

179 result = metric.run(dataSlice) 

180 assert(np.max(result) < 1./365.25) 

181 assert(np.min(result) >= 0) 

182 

183 # Test that if everythin on night 1 or last night, then result is ~1 

184 dataSlice['night'] = 1 

185 result = metric.run(dataSlice) 

186 assert(np.max(result) >= 1.-1./365.25) 

187 dataSlice['night'] = 3652 

188 result = metric.run(dataSlice) 

189 assert(np.max(result) >= 1.-1./365.25) 

190 

191 # Test if all taken in the middle, result ~0.5 

192 dataSlice['night'] = 3652/2 

193 result = metric.run(dataSlice) 

194 assert(np.max(result) >= 0.5-1./365.25) 

195 

196 def testRunRegularToo(self): 

197 """ 

198 Test that a binned slicer and a regular slicer can run together 

199 """ 

200 bundleList = [] 

201 metric = metrics.AccumulateM5Metric(bins=[0.5, 1.5, 2.5]) 

202 slicer = slicers.HealpixSlicer(nside=16) 

203 sql = '' 

204 bundleList.append(metricBundle.MetricBundle(metric, slicer, sql)) 

205 metric = metrics.Coaddm5Metric() 

206 slicer = slicers.HealpixSlicer(nside=16) 

207 bundleList.append(metricBundle.MetricBundle(metric, slicer, sql)) 

208 for bundle in bundleList: 

209 bundle.stackerList = [] 

210 bd = metricBundle.makeBundlesDictFromList(bundleList) 

211 mbg = metricBundle.MetricBundleGroup(bd, None, saveEarly=False) 

212 mbg.setCurrent('') 

213 mbg.runCurrent('', simData=self.simData) 

214 

215 assert(np.array_equal(bundleList[0].metricValues[:, 1].compressed(), 

216 bundleList[1].metricValues.compressed())) 

217 

218 

219class TestMemory(lsst.utils.tests.MemoryTestCase): 

220 pass 

221 

222 

223def setup_module(module): 

224 lsst.utils.tests.init() 

225 

226 

227if __name__ == "__main__": 227 ↛ 228line 227 didn't jump to line 228, because the condition on line 227 was never true

228 lsst.utils.tests.init() 

229 unittest.main()