from builtins import zip
import os
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()
|