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.utils.tests 

8 

9 

10class TestSimpleMetrics(unittest.TestCase): 

11 

12 def setUp(self): 

13 dv = np.arange(0, 10, .5) 

14 dv2 = np.arange(-10, 10.25, .5) 

15 self.dv = np.array(list(zip(dv)), dtype=[('testdata', 'float')]) 

16 self.dv2 = np.array(list(zip(dv2)), dtype=[('testdata', 'float')]) 

17 

18 def testMaxMetric(self): 

19 """Test max metric.""" 

20 testmetric = metrics.MaxMetric('testdata') 

21 self.assertEqual(testmetric.run(self.dv), self.dv['testdata'].max()) 

22 

23 def testMinMetric(self): 

24 """Test min metric.""" 

25 testmetric = metrics.MinMetric('testdata') 

26 self.assertEqual(testmetric.run(self.dv), self.dv['testdata'].min()) 

27 

28 def testMeanMetric(self): 

29 """Test mean metric.""" 

30 testmetric = metrics.MeanMetric('testdata') 

31 self.assertEqual(testmetric.run(self.dv), self.dv['testdata'].mean()) 

32 

33 def testMedianMetric(self): 

34 """Test median metric.""" 

35 testmetric = metrics.MedianMetric('testdata') 

36 self.assertEqual(testmetric.run(self.dv), np.median(self.dv['testdata'])) 

37 

38 def testAbsMedianMetric(self): 

39 testmetric = metrics.AbsMedianMetric('testdata') 

40 self.assertEqual(testmetric.run(self.dv), np.abs(np.median(self.dv['testdata']))) 

41 

42 def testFullRangeMetric(self): 

43 """Test full range metric.""" 

44 testmetric = metrics.FullRangeMetric('testdata') 

45 self.assertEqual(testmetric.run(self.dv), self.dv['testdata'].max()-self.dv['testdata'].min()) 

46 

47 def testCoaddm5Metric(self): 

48 """Test coaddm5 metric.""" 

49 testmetric = metrics.Coaddm5Metric(m5Col='testdata') 

50 self.assertEqual(testmetric.run(self.dv), 1.25 * np.log10(np.sum(10.**(.8*self.dv['testdata'])))) 

51 

52 def testRmsMetric(self): 

53 """Test rms metric.""" 

54 testmetric = metrics.RmsMetric('testdata') 

55 self.assertEqual(testmetric.run(self.dv), np.std(self.dv['testdata'])) 

56 

57 def testSumMetric(self): 

58 """Test Sum metric.""" 

59 testmetric = metrics.SumMetric('testdata') 

60 self.assertEqual(testmetric.run(self.dv), self.dv['testdata'].sum()) 

61 

62 def testCountUniqueMetric(self): 

63 """Test CountUniqueMetric""" 

64 testmetric = metrics.CountUniqueMetric('testdata') 

65 self.assertEqual(testmetric.run(self.dv), np.size(np.unique(self.dv['testdata']))) 

66 d2 = self.dv.copy() 

67 d2['testdata'][1] = d2['testdata'][0] 

68 self.assertEqual(testmetric.run(d2), np.size(np.unique(d2))) 

69 

70 def testCountMetric(self): 

71 """Test count metric.""" 

72 testmetric = metrics.CountMetric('testdata') 

73 self.assertEqual(testmetric.run(self.dv), np.size(self.dv['testdata'])) 

74 

75 def testCountRatioMetric(self): 

76 """Test countratio metric.""" 

77 testmetric = metrics.CountRatioMetric('testdata', normVal=2.) 

78 self.assertEqual(testmetric.run(self.dv), np.size(self.dv['testdata'])/2.0) 

79 

80 def testCountSubsetMetric(self): 

81 """Test countsubset metric.""" 

82 testmetric = metrics.CountSubsetMetric('testdata', subset=0) 

83 self.assertEqual(testmetric.run(self.dv), 1) 

84 

85 def testMaxPercentMetric(self): 

86 testmetric = metrics.MaxPercentMetric('testdata') 

87 self.assertEqual(testmetric.run(self.dv), 1.0/len(self.dv)*100.0) 

88 self.assertEqual(testmetric.run(self.dv2), 1.0/len(self.dv2)*100.0) 

89 

90 def testAbsMaxPercentMetric(self): 

91 testmetric = metrics.AbsMaxPercentMetric('testdata') 

92 self.assertEqual(testmetric.run(self.dv), 1./len(self.dv)*100.) 

93 self.assertEqual(testmetric.run(self.dv2), 2./len(self.dv2)*100.) 

94 

95 def testRobustRmsMetric(self): 

96 """Test Robust RMS metric.""" 

97 testmetric = metrics.RobustRmsMetric('testdata') 

98 rms_approx = (np.percentile(self.dv['testdata'], 75) - np.percentile(self.dv['testdata'], 25)) / 1.349 

99 self.assertEqual(testmetric.run(self.dv), rms_approx) 

100 

101 def testFracAboveMetric(self): 

102 cutoff = 5.1 

103 testmetric = metrics.FracAboveMetric('testdata', cutoff=cutoff) 

104 self.assertEqual(testmetric.run(self.dv), 

105 np.size(np.where(self.dv['testdata'] >= cutoff)[0])/float(np.size(self.dv))) 

106 testmetric = metrics.FracAboveMetric('testdata', cutoff=cutoff, scale=2) 

107 self.assertEqual(testmetric.run(self.dv), 

108 2.0*np.size(np.where(self.dv['testdata'] >= cutoff)[0])/float(np.size(self.dv))) 

109 

110 def testFracBelowMetric(self): 

111 cutoff = 5.1 

112 testmetric = metrics.FracBelowMetric('testdata', cutoff=cutoff) 

113 self.assertEqual(testmetric.run(self.dv), 

114 np.size(np.where(self.dv['testdata'] <= cutoff)[0])/float(np.size(self.dv))) 

115 testmetric = metrics.FracBelowMetric('testdata', cutoff=cutoff, scale=2) 

116 self.assertEqual(testmetric.run(self.dv), 

117 2.0*np.size(np.where(self.dv['testdata'] <= cutoff)[0])/float(np.size(self.dv))) 

118 

119 def testNoutliersNsigma(self): 

120 data = self.dv 

121 testmetric = metrics.NoutliersNsigmaMetric('testdata', nSigma=1.) 

122 med = np.mean(data['testdata']) 

123 shouldBe = np.size(np.where(data['testdata'] > med + data['testdata'].std())[0]) 

124 self.assertEqual(shouldBe, testmetric.run(data)) 

125 testmetric = metrics.NoutliersNsigmaMetric('testdata', nSigma=-1.) 

126 shouldBe = np.size(np.where(data['testdata'] < med - data['testdata'].std())[0]) 

127 self.assertEqual(shouldBe, testmetric.run(data)) 

128 

129 def testMeanAngleMetric(self): 

130 """Test mean angle metric.""" 

131 rng = np.random.RandomState(6573) 

132 dv1 = np.arange(0, 32, 2.5) 

133 dv2 = (dv1 - 20.0) % 360. 

134 dv1 = np.array(list(zip(dv1)), dtype=[('testdata', 'float')]) 

135 dv2 = np.array(list(zip(dv2)), dtype=[('testdata', 'float')]) 

136 testmetric = metrics.MeanAngleMetric('testdata') 

137 result1 = testmetric.run(dv1) 

138 result2 = testmetric.run(dv2) 

139 self.assertAlmostEqual(result1, (result2+20)%360.) 

140 dv = rng.rand(10000)*360.0 

141 dv = dv 

142 dv = np.array(list(zip(dv)), dtype=[('testdata', 'float')]) 

143 result = testmetric.run(dv) 

144 result = result 

145 self.assertAlmostEqual(result, 180) 

146 

147 def testFullRangeAngleMetric(self): 

148 """Test full range angle metric.""" 

149 rng = np.random.RandomState(5422) 

150 dv1 = np.arange(0, 32, 2.5) 

151 dv2 = (dv1 - 20.0) % 360. 

152 dv1 = np.array(list(zip(dv1)), dtype=[('testdata', 'float')]) 

153 dv2 = np.array(list(zip(dv2)), dtype=[('testdata', 'float')]) 

154 testmetric = metrics.FullRangeAngleMetric('testdata') 

155 result1 = testmetric.run(dv1) 

156 result2 = testmetric.run(dv2) 

157 self.assertAlmostEqual(result1, result2) 

158 dv = np.arange(0, 358, 5) 

159 dv = np.array(list(zip(dv)), dtype=[('testdata', 'float')]) 

160 result = testmetric.run(dv) 

161 self.assertAlmostEqual(result, 355) 

162 dv = rng.rand(10000)*360.0 

163 dv = np.array(list(zip(dv)), dtype=[('testdata', 'float')]) 

164 result = testmetric.run(dv) 

165 result = result 

166 self.assertGreater(result, 355) 

167 

168 

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

170 pass 

171 

172 

173def setup_module(module): 

174 lsst.utils.tests.init() 

175 

176 

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

178 lsst.utils.tests.init() 

179 unittest.main()