from builtins import zip
import numpy as np
import numpy.ma as ma
import matplotlib
matplotlib.use("Agg")
import healpy as hp
import unittest
import lsst.sims.maf.slicers as slicers
import lsst.utils.tests
class TestSlicers(unittest.TestCase):
def setUp(self):
self.filenames = []
self.baseslicer = slicers.BaseSlicer()
def test_healpixSlicer_obj(self):
rng = np.random.RandomState(8121)
nside = 32
slicer = slicers.HealpixSlicer(nside=nside)
metricValues = rng.rand(hp.nside2npix(nside)).astype('object')
metricValues = ma.MaskedArray(data=metricValues,
mask=np.where(metricValues < .1, True, False),
fill_value=slicer.badval)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
metadata = 'testdata'
slicer.writeData(filename, metricValues, metadata=metadata)
metricValuesBack, slicerBack, header = self.baseslicer.readData(filename)
np.testing.assert_almost_equal(metricValuesBack, metricValues)
assert(slicer == slicerBack)
assert(metadata == header['metadata'])
attr2check = ['nside', 'nslice', 'columnsNeeded', 'lonCol', 'latCol']
for att in attr2check:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_healpixSlicer_floats(self):
rng = np.random.RandomState(71231)
nside = 32
slicer = slicers.HealpixSlicer(nside=nside)
metricValues = rng.rand(hp.nside2npix(nside))
with lsst.utils.tests.getTempFilePath('.npz') as filename:
slicer.writeData(filename, metricValues, metadata='testdata')
metricValuesBack, slicerBack, header = self.baseslicer.readData(filename)
np.testing.assert_almost_equal(metricValuesBack, metricValues)
assert(slicer == slicerBack)
attr2check = ['nside', 'nslice', 'columnsNeeded', 'lonCol', 'latCol']
for att in attr2check:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_healpixSlicer_masked(self):
rng = np.random.RandomState(712551)
nside = 32
slicer = slicers.HealpixSlicer(nside=nside)
metricValues = rng.rand(hp.nside2npix(nside))
metricValues = ma.MaskedArray(data=metricValues,
mask=np.where(metricValues < .1, True, False),
fill_value=slicer.badval)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
slicer.writeData(filename, metricValues, metadata='testdata')
metricValuesBack, slicerBack, header = self.baseslicer.readData(filename)
np.testing.assert_almost_equal(metricValuesBack, metricValues)
assert(slicer == slicerBack)
attr2check = ['nside', 'nslice', 'columnsNeeded', 'lonCol', 'latCol']
for att in attr2check:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_oneDSlicer(self):
rng = np.random.RandomState(71111)
slicer = slicers.OneDSlicer(sliceColName='testdata')
dataValues = np.zeros(10000, dtype=[('testdata', 'float')])
dataValues['testdata'] = rng.rand(10000)
slicer.setupSlicer(dataValues)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
slicer.writeData(filename, dataValues[:100])
dataBack, slicerBack, header = self.baseslicer.readData(filename)
assert(slicer == slicerBack)
# np.testing.assert_almost_equal(dataBack,dataValues[:100])
attr2check = ['nslice', 'columnsNeeded']
for att in attr2check:
81 ↛ 82line 81 didn't jump to line 82, because the condition on line 81 was never true if type(getattr(slicer, att)).__module__ == 'numpy':
np.testing.assert_almost_equal(getattr(slicer, att), getattr(slicerBack, att))
else:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_opsimFieldSlicer(self):
rng = np.random.RandomState(7442)
slicer = slicers.OpsimFieldSlicer()
names = ['fieldRA', 'fieldDec', 'fieldId']
dt = ['float', 'float', 'int']
metricValues = rng.rand(100)
fieldData = np.zeros(100, dtype=list(zip(names, dt)))
fieldData['fieldRA'] = rng.rand(100)
fieldData['fieldDec'] = rng.rand(100)
fieldData['fieldId'] = np.arange(100)
names = ['data1', 'data2', 'fieldId']
simData = np.zeros(100, dtype=list(zip(names, dt)))
simData['data1'] = rng.rand(100)
simData['fieldId'] = np.arange(100)
slicer.setupSlicer(simData, fieldData)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
slicer.writeData(filename, metricValues)
metricBack, slicerBack, header = self.baseslicer.readData(filename)
assert(slicer == slicerBack)
np.testing.assert_almost_equal(metricBack, metricValues)
attr2check = ['nslice', 'columnsNeeded', 'lonCol', 'latCol', 'simDataFieldIdColName']
for att in attr2check:
108 ↛ 109line 108 didn't jump to line 109, because the condition on line 108 was never true if type(getattr(slicer, att)).__name__ == 'dict':
for key in getattr(slicer, att):
np.testing.assert_almost_equal(getattr(slicer, att)[key],
getattr(slicerBack, att)[key])
else:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_unislicer(self):
rng = np.random.RandomState(34229)
slicer = slicers.UniSlicer()
data = np.zeros(1, dtype=[('testdata', 'float')])
data[:] = rng.rand(1)
slicer.setupSlicer(data)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
metricValue = np.array([25.])
slicer.writeData(filename, metricValue)
dataBack, slicerBack, header = self.baseslicer.readData(filename)
assert(slicer == slicerBack)
np.testing.assert_almost_equal(dataBack, metricValue)
attr2check = ['nslice', 'columnsNeeded']
for att in attr2check:
assert(getattr(slicer, att) == getattr(slicerBack, att))
def test_complex(self):
# Test case where there is a complex metric
rng = np.random.RandomState(5442)
nside = 8
slicer = slicers.HealpixSlicer(nside=nside)
data = np.zeros(slicer.nslice, dtype='object')
for i, ack in enumerate(data):
n_el = rng.rand(1)*4 # up to 4 elements
data[i] = np.arange(n_el)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
slicer.writeData(filename, data)
dataBack, slicerBack, header = self.baseslicer.readData(filename)
assert(slicer == slicerBack)
# This is a crazy slow loop!
for i, ack in enumerate(data):
np.testing.assert_almost_equal(dataBack[i], data[i])
def test_nDSlicer(self):
rng = np.random.RandomState(621)
colnames = ['test1', 'test2', 'test3']
data = []
for c in colnames:
data.append(rng.rand(1000))
dv = np.core.records.fromarrays(data, names=colnames)
slicer = slicers.NDSlicer(colnames, binsList=10)
slicer.setupSlicer(dv)
with lsst.utils.tests.getTempFilePath('.npz') as filename:
metricdata = np.zeros(slicer.nslice, dtype='float')
for i, s in enumerate(slicer):
metricdata[i] = i
slicer.writeData(filename, metricdata)
dataBack, slicerBack, header = self.baseslicer.readData(filename)
assert(slicer == slicerBack)
np.testing.assert_almost_equal(dataBack, metricdata)
class TestMemory(lsst.utils.tests.MemoryTestCase):
pass
def setup_module(module):
lsst.utils.tests.init()
175 ↛ 176line 175 didn't jump to line 176, because the condition on line 175 was never trueif __name__ == "__main__":
lsst.utils.tests.init()
unittest.main()
|