Coverage for tests/testJSON.py : 24%

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
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
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
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
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
73class TestJSONoutUniSlicer(unittest.TestCase):
75 def setUp(self):
76 self.testslicer = slicers.UniSlicer()
78 def tearDown(self):
79 del self.testslicer
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)
97class TestJSONoutOneDSlicer2(unittest.TestCase):
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)
105 def tearDown(self):
106 del self.testslicer
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)
123class TestJSONoutHealpixSlicer(unittest.TestCase):
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)
129 def tearDown(self):
130 del self.testslicer
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)
149class TestJSONoutOpsimFieldSlicer(unittest.TestCase):
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)
158 def tearDown(self):
159 del self.testslicer
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)
178class TestMemory(lsst.utils.tests.MemoryTestCase):
179 pass
182def setup_module(module):
183 lsst.utils.tests.init()
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()