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 numpy as np 

3import numpy.ma as ma 

4import unittest 

5import json 

6import matplotlib 

7matplotlib.use("Agg") 

8import lsst.sims.maf.slicers as slicers 

9import lsst.utils.tests 

10 

11 

12def makeDataValues(size=100, min=0., max=1., random=-1): 

13 """Generate a simple array of numbers, evenly arranged between min/max, but (optional) random order.""" 

14 datavalues = np.arange(0, size, dtype='float') 

15 datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min()) 

16 datavalues += min 

17 if random > 0: 

18 rng = np.random.RandomState(random) 

19 randorder = rng.rand(size) 

20 randind = np.argsort(randorder) 

21 datavalues = datavalues[randind] 

22 datavalues = np.array(list(zip(datavalues)), dtype=[('testdata', 'float')]) 

23 return datavalues 

24 

25 

26def makeMetricData(slicer, dtype='float', seed=8800): 

27 rng = np.random.RandomState(seed) 

28 metricValues = rng.rand(len(slicer)).astype(dtype) 

29 metricValues = ma.MaskedArray(data=metricValues, 

30 mask=np.zeros(len(slicer), 'bool'), 

31 fill_value=slicer.badval) 

32 return metricValues 

33 

34 

35def makeFieldData(): 

36 """Set up sample field data.""" 

37 # These are a subset of the fields from opsim. 

38 fieldId = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010] 

39 ra_rad = [1.4961071750760884, 4.009380232682723, 2.2738050744968632, 

40 2.7527439701957053, 6.043715459855715, 

41 0.23946974745438585, 3.4768050063149119, 2.8063803008646744, 4.0630173623005916, 

42 2.2201678117208452] 

43 dec_rad = [-0.25205231807872636, -0.25205228478831621, -0.25205228478831621, 

44 -0.25205228478831621, -0.25205145255075168, 

45 -0.25205145255075168, -0.24630904473998308, -0.24630904473998308, 

46 -0.24630894487049795, -0.24630894487049795] 

47 fieldId = np.array(fieldId, 'int') 

48 ra_rad = np.array(ra_rad, 'float') 

49 dec_rad = np.array(dec_rad, 'float') 

50 fieldData = np.core.records.fromarrays([fieldId, ra_rad, dec_rad], 

51 names=['fieldId', 'fieldRA', 'fieldDec']) 

52 return fieldData 

53 

54 

55def makeOpsimDataValues(fieldData, size=10000, min=0., max=1., random=88): 

56 """Generate a simple array of numbers, evenly arranged between min/max, but (optional) random order.""" 

57 datavalues = np.arange(0, size, dtype='float') 

58 datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min()) 

59 datavalues += min 

60 rng = np.random.RandomState(random) 

61 randorder = rng.rand(size) 

62 randind = np.argsort(randorder) 

63 datavalues = datavalues[randind] 

64 # Add valid fieldId values to match data values 

65 fieldId = np.zeros(len(datavalues), 'int') 

66 idxs = rng.rand(size) * len(fieldData['fieldId']) 

67 for i, d in enumerate(datavalues): 

68 fieldId[i] = fieldData[int(idxs[i])][0] 

69 simData = np.core.records.fromarrays([fieldId, datavalues], names=['fieldId', 'testdata']) 

70 return simData 

71 

72 

73class TestJSONoutUniSlicer(unittest.TestCase): 

74 

75 def setUp(self): 

76 self.testslicer = slicers.UniSlicer() 

77 

78 def tearDown(self): 

79 del self.testslicer 

80 

81 @unittest.skip("13 March 2017--Skipping to clear python 3 update. Probably string unicode issues.") 

82 def test(self): 

83 metricVal = makeMetricData(self.testslicer, 'float', seed=88102231) 

84 io = self.testslicer.outputJSON(metricVal, metricName='testMetric', 

85 simDataName='testSim', metadata='testmeta') 

86 jsn = json.loads(io.getvalue()) 

87 jsn_header = jsn[0] 

88 jsn_data = jsn[1] 

89 self.assertEqual(jsn_header['metricName'], 'testMetric') 

90 self.assertEqual(jsn_header['simDataName'], 'testSim') 

91 self.assertEqual(jsn_header['metadata'], 'testmeta') 

92 self.assertEqual(jsn_header['slicerName'], 'UniSlicer') 

93 self.assertEqual(jsn_header['slicerLen'], 1) 

94 self.assertEqual(len(jsn_data), 1) 

95 

96 

97class TestJSONoutOneDSlicer2(unittest.TestCase): 

98 

99 def setUp(self): 

100 # Set up a slicer and some metric data for that slicer. 

101 dv = makeDataValues(1000, random=40082) 

102 self.testslicer = slicers.OneDSlicer(sliceColName='testdata') 

103 self.testslicer.setupSlicer(dv) 

104 

105 def tearDown(self): 

106 del self.testslicer 

107 

108 @unittest.skip("13 March 2017--Skipping to clear python 3 update. Probably string unicode issues.") 

109 def test(self): 

110 metricVal = makeMetricData(self.testslicer, 'float', seed=18) 

111 io = self.testslicer.outputJSON(metricVal) 

112 jsn = json.loads(io.getvalue()) 

113 jsn_header = jsn[0] 

114 jsn_data = jsn[1] 

115 self.assertEqual(jsn_header['slicerName'], 'OneDSlicer') 

116 self.assertEqual(jsn_header['slicerLen'], len(self.testslicer)) 

117 self.assertEqual(len(jsn_data), len(metricVal)+1) 

118 for jsndat, binleft, mval in zip(jsn_data, self.testslicer.slicePoints['bins'], metricVal.data): 

119 self.assertEqual(jsndat[0], binleft) 

120 self.assertEqual(jsndat[1], mval) 

121 

122 

123class TestJSONoutHealpixSlicer(unittest.TestCase): 

124 

125 def setUp(self): 

126 # Set up a slicer and some metric data for that slicer. 

127 self.testslicer = slicers.HealpixSlicer(nside=4, verbose=False) 

128 

129 def tearDown(self): 

130 del self.testslicer 

131 

132 @unittest.skip("13 March 2017--Skipping to clear python 3 update. Probably string unicode issues.") 

133 def test(self): 

134 metricVal = makeMetricData(self.testslicer, 'float', seed=452) 

135 io = self.testslicer.outputJSON(metricVal) 

136 jsn = json.loads(io.getvalue()) 

137 jsn_header = jsn[0] 

138 jsn_data = jsn[1] 

139 self.assertEqual(jsn_header['slicerName'], 'HealpixSlicer') 

140 self.assertEqual(jsn_header['slicerLen'], len(self.testslicer)) 

141 self.assertEqual(len(jsn_data), len(metricVal)) 

142 for jsndat, ra, dec, mval in zip(jsn_data, self.testslicer.slicePoints['ra'], 

143 self.testslicer.slicePoints['dec'], metricVal.data): 

144 self.assertAlmostEqual(jsndat[0], ra/np.pi*180.) 

145 self.assertAlmostEqual(jsndat[1], dec/np.pi*180.) 

146 self.assertEqual(jsndat[2], mval) 

147 

148 

149class TestJSONoutOpsimFieldSlicer(unittest.TestCase): 

150 

151 def setUp(self): 

152 # Set up a slicer and some metric data for that slicer. 

153 self.testslicer = slicers.OpsimFieldSlicer() 

154 self.fieldData = makeFieldData() 

155 self.simData = makeOpsimDataValues(self.fieldData, random=7162) 

156 self.testslicer.setupSlicer(self.simData, self.fieldData) 

157 

158 def tearDown(self): 

159 del self.testslicer 

160 

161 @unittest.skip("13 March 2017--Skipping to clear python 3 update. Probably string unicode issues.") 

162 def test(self): 

163 metricVal = makeMetricData(self.testslicer, 'float', seed=334) 

164 io = self.testslicer.outputJSON(metricVal) 

165 jsn = json.loads(io.getvalue()) 

166 jsn_header = jsn[0] 

167 jsn_data = jsn[1] 

168 self.assertEqual(jsn_header['slicerName'], 'OpsimFieldSlicer') 

169 self.assertEqual(jsn_header['slicerLen'], len(self.testslicer)) 

170 self.assertEqual(len(jsn_data), len(metricVal)) 

171 for jsndat, ra, dec, mval in zip(jsn_data, self.testslicer.slicePoints['ra'], 

172 self.testslicer.slicePoints['dec'], metricVal.data): 

173 self.assertAlmostEqual(jsndat[0], ra/np.pi*180.) 

174 self.assertAlmostEqual(jsndat[1], dec/np.pi*180.) 

175 self.assertEqual(jsndat[2], mval) 

176 

177 

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

179 pass 

180 

181 

182def setup_module(module): 

183 lsst.utils.tests.init() 

184 

185 

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

187 lsst.utils.tests.init() 

188 unittest.main()