From dbeda417b4c473df143ef4ecffef3d14389bec62 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Tue, 14 Jun 2016 16:51:15 +0100 Subject: [PATCH] New test case for overlapping writes. One more test case to go. --- test/test_imagewrapper.py | 107 +++++++++++--------------------------- 1 file changed, 30 insertions(+), 77 deletions(-) diff --git a/test/test_imagewrapper.py b/test/test_imagewrapper.py index c0bdb5e3f..e51dfa491 100644 --- a/test/test_imagewrapper.py +++ b/test/test_imagewrapper.py @@ -663,11 +663,11 @@ def test_ImageWrapper_write_out(niters=150): assert np.isclose(newHi, expHi) print '--------------' + +def test_ImageWrapper_write_in_overlap(niters=150): + # This is HORRIBLE - -def best_ImageWrapper_write_in_overlap(): - - # Generate an image with only two volumes. We're only + # Generate an image with just two volumes. We're only # testing within-volume modifications here. ndims = random.choice((2, 3, 4)) - 1 shape = np.random.randint(5, 60, size=ndims + 1) @@ -683,27 +683,22 @@ def best_ImageWrapper_write_in_overlap(): data[..., i] = data[..., 0] * (i + 1) # Generate a bunch of random coverages - for i in range(1): + for i in range(niters): # Generate a random coverage cov = random_coverage(shape, vol_limit=1) - print 'This is the coverage: {}'.format(cov) - - img = nib.Nifti1Image(data, np.eye(4)) - wrapper = imagewrap.ImageWrapper(img) - applyCoverage(wrapper, cov) - clo, chi = wrapper.dataRange - # Now, we'll simulate some writes - # outside of the coverage area. - for i in range(5): + # which are contained within, or + # overlap with, the initial coverage + for i in range(niters): - # Generate some slices inside/overlapping - # with the coverage area, making sure that - # the slice covers at least two elements + # Generate some slices outside + # of the coverage area, making + # sure that the slice covers + # at least two elements while True: - slices = random_slices(cov, shape, np.random.choice(('in', 'overlap'))) + slices = random_slices(cov, shape, random.choice(('in', 'overlap'))) slices[-1] = [0, 1] sliceshape = [hi - lo for lo, hi in slices] @@ -715,82 +710,40 @@ def best_ImageWrapper_write_in_overlap(): sliceshape = sliceshape[:-1] break - print '---------------' - print 'Slice {}'.format(slices) - # Expected wrapper coverage after the write - expCov = imagewrap.adjustCoverage(cov[..., 0], slices) - - # Figure out the data range of the - # expanded coverage (the original - # coverage expanded to include this - # slice). - elo, ehi = coverageDataRange(data, cov, slices) + # Expected wrapper coverage after the write + # The write will invalidate the current + # known data range and coverage, so the + # expected coverage after the write will + # be the area covered by the write slice + nullCov = np.zeros(cov.shape) + nullCov[:] = np.nan + expCov = imagewrap.adjustCoverage(nullCov[..., 0], slices) - # Test all data range possibilities: - # - inside the existing range (clo < rlo < rhi < chi) - # - encompassing the existing range (rlo < clo < chi < rhi) - # - Overlapping the existing range (rlo < clo < rhi < chi) - # (clo < rlo < chi < rhi) - # - Outside of the existing range (clo < chi < rlo < rhi) - # (rlo < rhi < clo < chi) - loRanges = [rfloat(clo, chi), - rfloat(elo - 100, elo), - rfloat(elo - 100, elo), - rfloat(clo, chi), - rfloat(ehi, ehi + 100), - rfloat(elo - 100, elo)] + for i in range(10): - hiRanges = [rfloat(loRanges[0], chi), - rfloat(ehi, ehi + 100), - rfloat(clo, chi), - rfloat(ehi, ehi + 100), - rfloat(loRanges[4], ehi + 100), - rfloat(loRanges[5], elo)] - - for rlo, rhi in zip(loRanges, hiRanges): + rlo = rfloat(data.min() - 100, data.max() + 100) + rhi = rfloat(rlo, data.max() + 100) img = nib.Nifti1Image(np.copy(data), np.eye(4)) wrapper = imagewrap.ImageWrapper(img) applyCoverage(wrapper, cov) - print 'ndims', ndims - print 'sliceshape', sliceshape - print 'sliceobjs', sliceobjs - newData = np.linspace(rlo, rhi, np.prod(sliceshape)) newData = newData.reshape(sliceshape) - # Make sure that the expected low/high values - # are present in the data being written - print 'Writing data (shape: {})'.format(newData.shape) - - oldCov = wrapper.coverage(0) + print 'Old range: {} - {}'.format(*wrapper.dataRange) wrapper[tuple(sliceobjs)] = newData - expLo, expHi = coverageDataRange(img.get_data(), cov, slices) + newCov = wrapper.coverage(0) newLo, newHi = wrapper.dataRange - print 'Old range: {} - {}'.format(clo, chi) - print 'Sim range: {} - {}'.format(rlo, rhi) - print 'Exp range: {} - {}'.format(expLo, expHi) - print 'NewDat range: {} - {}'.format(newData.min(), newData.max()) - print 'Data range: {} - {}'.format(data.min(), data.max()) - print 'Expand range: {} - {}'.format(elo, ehi) - print 'New range: {} - {}'.format(newLo, newHi) - - newCov = wrapper.coverage(0) - print 'Old coverage: {}'.format(oldCov) - print 'New coverage: {}'.format(newCov) - print 'Expected coverage: {}'.format(expCov) - print - print + print 'Expected range: {} - {}'.format(rlo, rhi) + print 'New range: {} - {}'.format(newLo, newHi) assert np.all(newCov == expCov) - assert np.isclose(newLo, expLo) - assert np.isclose(newHi, expHi) - - print '--------------' + assert np.isclose(newLo, rlo) + assert np.isclose(newHi, rhi) -- GitLab