From e79624d5bc53fd6763cbcf73df6fd9c8fc5b7bcc Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Thu, 6 Feb 2020 14:38:51 -0500 Subject: [PATCH 1/7] FIX: Safer exit --- surfer/viz.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/surfer/viz.py b/surfer/viz.py index 094fc37..b13b21a 100644 --- a/surfer/viz.py +++ b/surfer/viz.py @@ -2290,20 +2290,30 @@ def hide_colorbar(self, row=-1, col=-1): def close(self): """Close all figures and cleanup data structure.""" + + def _close(self, force_render=True): for ri, ff in enumerate(self._figures): for ci, f in enumerate(ff): if f is not None: - mlab.close(f) + try: + mlab.close(f) + except Exception: + pass self._figures[ri][ci] = None - _force_render([]) + + if force_render: + _force_render([]) # should we tear down other variables? if getattr(self, '_v', None) is not None: - self._v.dispose() + try: + self._v.dispose() + except Exception: + pass self._v = None def __del__(self): - self.close() + self._close(force_render=False) ########################################################################### # SAVING OUTPUT From 78950ed3690be87915ca9ccc92c4fcdb30e292b8 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 7 Feb 2020 09:35:06 -0500 Subject: [PATCH 2/7] FIX: Actually close --- surfer/io.py | 2 +- surfer/tests/test_viz.py | 2 ++ surfer/viz.py | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/surfer/io.py b/surfer/io.py index 8ddcf69..efda923 100644 --- a/surfer/io.py +++ b/surfer/io.py @@ -29,7 +29,7 @@ def read_scalar_data(filepath): flat numpy array of scalar data """ try: - scalar_data = nib.load(filepath).get_data() + scalar_data = np.asanyarray(nib.load(filepath).dataobj) scalar_data = np.ravel(scalar_data, order="F") return scalar_data diff --git a/surfer/tests/test_viz.py b/surfer/tests/test_viz.py index 46dfce6..6a17762 100644 --- a/surfer/tests/test_viz.py +++ b/surfer/tests/test_viz.py @@ -87,6 +87,8 @@ def test_image(tmpdir): brain.close() brain = Brain(*std_args, size=100) + for b in brain.brain_matrix.ravel(): + assert b._f.scene is not None brain.save_image(tmp_name) brain.save_image(tmp_name, 'rgba', True) brain.screenshot() diff --git a/surfer/viz.py b/surfer/viz.py index b13b21a..6c4ddd8 100644 --- a/surfer/viz.py +++ b/surfer/viz.py @@ -2290,6 +2290,7 @@ def hide_colorbar(self, row=-1, col=-1): def close(self): """Close all figures and cleanup data structure.""" + self._close() def _close(self, force_render=True): for ri, ff in enumerate(self._figures): From e79e15d128fe113f566db34c3b7c1d2a6209d923 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 7 Feb 2020 09:45:22 -0500 Subject: [PATCH 3/7] FIX: Try again --- surfer/viz.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/surfer/viz.py b/surfer/viz.py index 6c4ddd8..0067974 100644 --- a/surfer/viz.py +++ b/surfer/viz.py @@ -1,4 +1,5 @@ from copy import deepcopy +import gc import logging from math import floor import os @@ -2312,6 +2313,7 @@ def _close(self, force_render=True): except Exception: pass self._v = None + gc.collect() def __del__(self): self._close(force_render=False) From 0b20e8b84a5935c5167ac1c03c5a96ecc4d0aa92 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 7 Feb 2020 09:54:37 -0500 Subject: [PATCH 4/7] FIX: Again again --- surfer/tests/test_viz.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/surfer/tests/test_viz.py b/surfer/tests/test_viz.py index 6a17762..70dd9c2 100644 --- a/surfer/tests/test_viz.py +++ b/surfer/tests/test_viz.py @@ -1,3 +1,4 @@ +import gc import os import os.path as op from os.path import join as pjoin @@ -85,6 +86,7 @@ def test_image(tmpdir): brain.add_overlay(overlay_fname, hemi='lh', min=5, max=20, sign="pos") brain.save_imageset(tmp_name, ['med', 'lat'], 'jpg') brain.close() + del brain brain = Brain(*std_args, size=100) for b in brain.brain_matrix.ravel(): @@ -151,6 +153,7 @@ def test_annot(): annots = ['aparc', 'aparc.a2005s'] borders = [True, False, 2] alphas = [1, 0.5] + gc.collect() brain = Brain(*std_args) view = get_view(brain) From 1435b57b3a40e67257a983e785c39b71d28da45e Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 7 Feb 2020 10:05:11 -0500 Subject: [PATCH 5/7] FIX: Different --- surfer/tests/test_viz.py | 30 +++++++----------------------- surfer/viz.py | 10 ++-------- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/surfer/tests/test_viz.py b/surfer/tests/test_viz.py index 70dd9c2..8d355be 100644 --- a/surfer/tests/test_viz.py +++ b/surfer/tests/test_viz.py @@ -3,7 +3,6 @@ import os.path as op from os.path import join as pjoin import sys -import warnings import pytest from mayavi import mlab @@ -17,8 +16,6 @@ from surfer.utils import (requires_fsaverage, requires_imageio, requires_fs, _get_extra) -warnings.simplefilter('always') - subject_id = 'fsaverage' std_args = [subject_id, 'lh', 'inflated'] data_dir = pjoin(op.dirname(__file__), '..', '..', 'examples', 'example_data') @@ -85,21 +82,12 @@ def test_image(tmpdir): brain = Brain(subject_id, 'both', surf=surf, size=100) brain.add_overlay(overlay_fname, hemi='lh', min=5, max=20, sign="pos") brain.save_imageset(tmp_name, ['med', 'lat'], 'jpg') - brain.close() - del brain - - brain = Brain(*std_args, size=100) - for b in brain.brain_matrix.ravel(): - assert b._f.scene is not None brain.save_image(tmp_name) brain.save_image(tmp_name, 'rgba', True) brain.screenshot() - if os.getenv('TRAVIS', '') != 'true': - # for some reason these fail on Travis sometimes - brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='v') - brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='h') - brain.save_montage(tmp_name, [['l', 'v'], ['m', 'f']]) - brain.close() + brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='v') + brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='h') + brain.save_montage(tmp_name, [['l', 'v'], ['m', 'f']]) @requires_fsaverage() @@ -108,8 +96,7 @@ def test_brains(): # testing backend breaks when passing in a figure, so we use 'auto' here # (shouldn't affect usability, but it makes testing more annoying) _set_backend('auto') - with warnings.catch_warnings(record=True): # traits for mlab.figure() - mlab.figure(101) + mlab.figure(101) surfs = ['inflated', 'white', 'white', 'white', 'white', 'white', 'white'] hemis = ['lh', 'rh', 'both', 'both', 'rh', 'both', 'both'] titles = [None, 'Hello', 'Good bye!', 'lut test', @@ -122,8 +109,7 @@ def test_brains(): (0.2, 0.2, 0.2), "black", "0.75"] foregrounds = ["black", "white", "0.75", "red", (0.2, 0.2, 0.2), "blue", "black"] - with warnings.catch_warnings(record=True): # traits for mlab.figure() - figs = [101, mlab.figure(), None, None, mlab.figure(), None, None] + figs = [101, mlab.figure(), None, None, mlab.figure(), None, None] subj_dir = utils._get_subjects_dir() subj_dirs = [None, subj_dir, subj_dir, subj_dir, subj_dir, subj_dir, subj_dir] @@ -153,7 +139,6 @@ def test_annot(): annots = ['aparc', 'aparc.a2005s'] borders = [True, False, 2] alphas = [1, 0.5] - gc.collect() brain = Brain(*std_args) view = get_view(brain) @@ -463,9 +448,8 @@ def test_probabilistic_labels(): prob_field[ids] = probs brain.add_data(prob_field, thresh=1e-5) - with warnings.catch_warnings(record=True): - brain.data["colorbar"].number_of_colors = 10 - brain.data["colorbar"].number_of_labels = 11 + brain.data["colorbar"].number_of_colors = 10 + brain.data["colorbar"].number_of_labels = 11 brain.close() diff --git a/surfer/viz.py b/surfer/viz.py index 0067974..45e2ea3 100644 --- a/surfer/viz.py +++ b/surfer/viz.py @@ -1,5 +1,4 @@ from copy import deepcopy -import gc import logging from math import floor import os @@ -2291,9 +2290,6 @@ def hide_colorbar(self, row=-1, col=-1): def close(self): """Close all figures and cleanup data structure.""" - self._close() - - def _close(self, force_render=True): for ri, ff in enumerate(self._figures): for ci, f in enumerate(ff): if f is not None: @@ -2303,8 +2299,7 @@ def _close(self, force_render=True): pass self._figures[ri][ci] = None - if force_render: - _force_render([]) + _force_render([]) # should we tear down other variables? if getattr(self, '_v', None) is not None: @@ -2313,10 +2308,9 @@ def _close(self, force_render=True): except Exception: pass self._v = None - gc.collect() def __del__(self): - self._close(force_render=False) + self.close() ########################################################################### # SAVING OUTPUT From 2cf1d7381ee16f76e2e4d59293fbd0f0a2d06a0d Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 7 Feb 2020 10:29:41 -0500 Subject: [PATCH 6/7] FIX: One more --- surfer/tests/test_viz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfer/tests/test_viz.py b/surfer/tests/test_viz.py index 8d355be..3f7ced5 100644 --- a/surfer/tests/test_viz.py +++ b/surfer/tests/test_viz.py @@ -1,4 +1,3 @@ -import gc import os import os.path as op from os.path import join as pjoin @@ -88,6 +87,7 @@ def test_image(tmpdir): brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='v') brain.save_montage(tmp_name, ['l', 'v', 'm'], orientation='h') brain.save_montage(tmp_name, [['l', 'v'], ['m', 'f']]) + brain.close() @requires_fsaverage() From 5aaf0430e43c700dc358ad946e193f78d1137ad4 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Mon, 10 Feb 2020 10:41:50 -0500 Subject: [PATCH 7/7] FIX: Dont reuse by default --- surfer/tests/test_viz.py | 13 +++++++++++++ surfer/viz.py | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/surfer/tests/test_viz.py b/surfer/tests/test_viz.py index 3f7ced5..5bb6b18 100644 --- a/surfer/tests/test_viz.py +++ b/surfer/tests/test_viz.py @@ -90,6 +90,19 @@ def test_image(tmpdir): brain.close() +@requires_fsaverage() +def test_brain_separate(): + """Test that Brain does not reuse existing figures by default.""" + _set_backend('auto') + brain = Brain(*std_args) + assert brain.brain_matrix.size == 1 + brain_2 = Brain(*std_args) + assert brain_2.brain_matrix.size == 1 + assert brain._figures[0][0] is not brain_2._figures[0][0] + brain_3 = Brain(*std_args, figure=brain._figures[0][0]) + assert brain._figures[0][0] is brain_3._figures[0][0] + + @requires_fsaverage() def test_brains(): """Test plotting of Brain with different arguments.""" diff --git a/surfer/viz.py b/surfer/viz.py index 45e2ea3..f600d69 100644 --- a/surfer/viz.py +++ b/surfer/viz.py @@ -217,8 +217,8 @@ def _make_viewer(figure, n_row, n_col, title, scene_size, offscreen, # Triage: don't make TraitsUI if we don't have to if n_row == 1 and n_col == 1: with warnings.catch_warnings(record=True): # traits - figure = mlab.figure(title, size=(w, h)) - mlab.clf(figure) + figure = mlab.figure(size=(w, h)) + figure.name = title # should set the figure title figures = [[figure]] _v = None else: