Commit a6f32494 authored by Paul McCarthy's avatar Paul McCarthy
Browse files

Avoid random 'Bus error' when using mmap in docker container

parent 561e33e1
......@@ -56,7 +56,7 @@ def make_image(filename=None,
xform = np.eye(4)
for i, p in enumerate(pixdims):
xform[i, i] = p
data = np.array(np.random.random(dims) * 100, dtype=dtype)
if imgtype == 0: img = nib.AnalyzeImage(data, xform, hdr)
......@@ -68,7 +68,7 @@ def make_image(filename=None,
if op.splitext(filename)[1] == '':
if imgtype == 0: filename = '{}.img'.format(filename)
else: filename = '{}.nii'.format(filename)
nib.save(img, filename)
return img
......@@ -95,7 +95,7 @@ def test_load():
'ambiguous.img',
'ambiguous.img.gz',
'notnifti.nii.gz']
shouldPass = ['compressed',
'compressed.nii.gz',
......@@ -121,12 +121,12 @@ def test_load():
testdir = tempfile.mkdtemp()
for f in toCreate:
if f.startswith('notnifti'):
make_dummy_file(op.join(testdir, f))
else:
make_random_image(op.join(testdir, f))
# Not raising an error means the test passes
try:
for fname in shouldPass:
......@@ -164,7 +164,7 @@ def test_create():
assert img.niftiVersion == 1
for imgType in [0, 1, 2]:
nimg = make_image(imgtype=imgType, pixdims=(5, 6, 7))
nhdr = nimg.header
......@@ -189,13 +189,13 @@ def test_create():
img = fslimage.Image(nimg)
assert img.niftiVersion == imgtype
assert np.all(np.isclose(img.pixdim, (2, 3, 4)))
finally:
shutil.rmtree(testdir)
def test_bad_create():
class BadThing(object):
pass
......@@ -204,7 +204,7 @@ def test_bad_create():
fslimage.Image(
np.random.random((10, 10, 10)),
header=BadThing())
# Bad data
with pytest.raises(Exception):
fslimage.Image(BadThing())
......@@ -221,18 +221,18 @@ def test_bad_create():
with pytest.raises(Exception):
fslimage.Image(np.random.random(10, 10, 10),
xform=np.eye(3))
with pytest.raises(Exception):
fslimage.Image(np.random.random(10, 10, 10),
xform=np.eye(5))
def test_Image_atts_analyze(): _test_Image_atts(0)
def test_Image_atts_analyze(): _test_Image_atts(0)
def test_Image_atts_nifti1(): _test_Image_atts(1)
def test_Image_atts_nifti2(): _test_Image_atts(2)
def _test_Image_atts(imgtype):
"""Test that basic Nifti/Image attributes are correct. """
testdir = tempfile.mkdtemp()
allowedExts = fslimage.ALLOWED_EXTENSIONS
fileGroups = fslimage.FILE_GROUPS
......@@ -259,17 +259,17 @@ def _test_Image_atts(imgtype):
tests = it.product(dims, pixdims, dtypes)
tests = list(tests)
paths = ['test{:03d}'.format(i) for i in range(len(tests))]
for path, atts in zip(paths, tests):
dims, pixdims, dtype = atts
ndims = len(dims)
pixdims = pixdims[:ndims]
pixdims = pixdims[:ndims]
path = op.abspath(op.join(testdir, path))
make_image(path, imgtype, dims, pixdims, dtype)
try:
for path, atts in zip(paths, tests):
......@@ -295,12 +295,12 @@ def _test_Image_atts(imgtype):
fileGroups=fileGroups)
finally:
shutil.rmtree(testdir)
def test_Image_atts2_analyze(): _test_Image_atts2(0)
def test_Image_atts2_analyze(): _test_Image_atts2(0)
def test_Image_atts2_nifti1(): _test_Image_atts2(1)
def test_Image_atts2_nifti2(): _test_Image_atts2(2)
def _test_Image_atts2(imgtype):
# See fsl.utils.constants for the meanings of these codes
xyzUnits = [0, 1, 2, 3]
timeUnits = [8, 16, 24, 32, 40, 48]
......@@ -392,7 +392,7 @@ def test_addExt():
for path in toCreate:
path = op.abspath(op.join(testdir, path))
make_random_image(path)
make_random_image(path)
try:
for path, mustExist, expected in tests:
......@@ -456,14 +456,14 @@ def test_defaultExt():
os.environ['FSLOUTPUTTYPE'] = o
assert fslimage.defaultExt() == e
def test_Image_orientation_analyze_neuro(): _test_Image_orientation(0, 'neuro')
def test_Image_orientation_analyze_radio(): _test_Image_orientation(0, 'radio')
def test_Image_orientation_nifti1_neuro(): _test_Image_orientation(1, 'neuro')
def test_Image_orientation_nifti1_radio(): _test_Image_orientation(1, 'radio')
def test_Image_orientation_nifti2_neuro(): _test_Image_orientation(2, 'neuro')
def test_Image_orientation_nifti2_radio(): _test_Image_orientation(2, 'radio')
def test_Image_orientation_nifti2_radio(): _test_Image_orientation(2, 'radio')
def _test_Image_orientation(imgtype, voxorient):
"""Test the Nifti.isNeurological and Nifti.getOrientation methods. """
......@@ -493,7 +493,7 @@ def _test_Image_orientation(imgtype, voxorient):
expectvox0Orientation = constants.ORIENT_R2L
expectvox1Orientation = constants.ORIENT_P2A
expectvox2Orientation = constants.ORIENT_I2S
elif voxorient == 'neuro':
expectNeuroTest = True
expectvox0Orientation = constants.ORIENT_L2R
......@@ -534,7 +534,7 @@ def test_Image_sqforms_nifti1_nosqform(): _test_Image_sqforms(1, 1, 0)
def test_Image_sqforms_nifti2_normal(): _test_Image_sqforms(2, 1, 1)
def test_Image_sqforms_nifti2_nosform(): _test_Image_sqforms(2, 0, 1)
def test_Image_sqforms_nifti2_noqform(): _test_Image_sqforms(2, 1, 0)
def test_Image_sqforms_nifti2_nosqform(): _test_Image_sqforms(2, 0, 0)
def test_Image_sqforms_nifti2_nosqform(): _test_Image_sqforms(2, 0, 0)
def _test_Image_sqforms(imgtype, sformcode, qformcode):
"""Test the Nifti.getXFormCode method, and the voxToWorldMat/worldToVoxMat
attributes for NIFTI images with the given sform/qform code combination.
......@@ -587,7 +587,7 @@ def _test_Image_sqforms(imgtype, sformcode, qformcode):
with pytest.raises(ValueError):
image.getXFormCode('badcode')
try:
assert np.all(np.isclose(image.voxToWorldMat, expAffine))
assert np.all(np.isclose(image.worldToVoxMat, invExpAffine))
......@@ -601,10 +601,10 @@ def _test_Image_sqforms(imgtype, sformcode, qformcode):
shutil.rmtree(testdir)
def test_Image_changeXform_analyze(): _test_Image_changeXform(0)
def test_Image_changeXform_analyze(): _test_Image_changeXform(0)
def test_Image_changeXform_nifti1(): _test_Image_changeXform(1)
def test_Image_changeXform_nifti1_nosqform(): _test_Image_changeXform(1, 0, 0)
def test_Image_changeXform_nifti2(): _test_Image_changeXform(2)
def test_Image_changeXform_nifti2(): _test_Image_changeXform(2)
def _test_Image_changeXform(imgtype, sformcode=None, qformcode=None):
"""Test changing the Nifti.voxToWorldMat attribute. """
......@@ -641,7 +641,7 @@ def _test_Image_changeXform(imgtype, sformcode=None, qformcode=None):
if imgtype > 0:
expSformCode = image.get_sform(coded=True)[1]
expQformCode = image.get_qform(coded=True)[1]
if sformcode == 0:
expSformCode = constants.NIFTI_XFORM_ALIGNED_ANAT
else:
......@@ -654,7 +654,7 @@ def _test_Image_changeXform(imgtype, sformcode=None, qformcode=None):
assert img.saveState
if imgtype == 0:
# ANALYZE affine is not editable
# ANALYZE affine is not editable
with pytest.raises(Exception):
img.voxToWorldMat = newXform
return
......@@ -679,7 +679,7 @@ def _test_Image_changeXform(imgtype, sformcode=None, qformcode=None):
def test_Image_changeData_analyze(seed): _test_Image_changeData(0)
def test_Image_changeData_nifti1(seed): _test_Image_changeData(1)
def test_Image_changeData_nifti2(seed): _test_Image_changeData(2)
def test_Image_changeData_nifti2(seed): _test_Image_changeData(2)
def _test_Image_changeData(imgtype):
"""Test that changing image data triggers notification, and also causes
the dataRange attribute to be updated.
......@@ -687,13 +687,13 @@ def _test_Image_changeData(imgtype):
testdir = tempfile.mkdtemp()
imagefile = op.join(testdir, 'image')
make_image(imagefile, imgtype)
img = fslimage.Image(imagefile)
notified = {}
def randvox():
return (np.random.randint(0, img.shape[0]),
np.random.randint(0, img.shape[1]),
......@@ -773,7 +773,7 @@ def _test_Image_2D(imgtype):
# which happens when you create
# an XY slice with fslroi. This
# should still be read in as a
# 3D image.
# 3D image.
testdims = [(10, 20),
(10, 20, 1),
(10, 1, 20),
......@@ -787,9 +787,9 @@ def _test_Image_2D(imgtype):
for shape in testdims:
pixdim = [2] * len(shape)
imagefile = op.join(testdir, 'image')
make_image(imagefile, imgtype, shape, pixdim)
image = fslimage.Image(imagefile)
......@@ -831,9 +831,9 @@ def test_Image_voxelsToScaledVoxels():
if itype > 0 and pixdims[0] > 0:
xf[0, 0] = -pixdims[0]
xf[0, 3] = pixdims[0] * (dims[0] - 1)
return xf
for imgType, dim, pixdim in it.product(imgTypes, dims, pixdims):
nimg = make_image(imgtype=imgType, dims=dim, pixdims=pixdim)
img = fslimage.Image(nimg)
......@@ -842,7 +842,7 @@ def test_Image_voxelsToScaledVoxels():
result = img.voxelsToScaledVoxels()
assert np.all(np.isclose(result, expected))
def test_Image_sameSpace():
......@@ -853,7 +853,7 @@ def test_Image_sameSpace():
pixdims = [(2, 2, 2, 1),
(2, 3, 4, 1)]
for (imgType,
for (imgType,
dim1,
dim2,
pixdim1,
......@@ -885,8 +885,8 @@ def _test_Image_save(imgtype):
if rvox not in rvoxes:
rvoxes.append(rvox)
return rvoxes
testdir = tempfile.mkdtemp()
if imgtype == 0:
filename = op.join(testdir, 'blob.img')
......@@ -904,11 +904,13 @@ def _test_Image_save(imgtype):
try:
make_image(filename, imgtype)
img = fslimage.Image(filename)
# Using mmap can cause a "Bus error"
# under docker. No idea why.
img = fslimage.Image(filename, mmap=False)
randvoxes = randvoxes(5)
randvals = [np.random.random() for i in range(5)]
for (x, y, z), v in zip(randvoxes, randvals):
img[x, y, z] = v
......@@ -937,7 +939,7 @@ def _test_Image_save(imgtype):
# Load the image back in
img2 = fslimage.Image(img.dataSource)
assert img.saveState
assert img.dataSource == expDataSource
......@@ -945,8 +947,8 @@ def _test_Image_save(imgtype):
assert np.all(np.isclose(img.voxToWorldMat, xform))
for (x, y, z), v in zip(randvoxes, randvals):
assert np.isclose(img[x, y, z], v)
assert np.isclose(img[x, y, z], v)
finally:
shutil.rmtree(testdir)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment