[074d3d]: / mne / viz / _brain / tests / test_notebook.py

Download this file

156 lines (137 with data), 5.4 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Authors: The MNE-Python contributors.
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
# NOTE: Tests in this directory must be self-contained because they are
# executed in a separate IPython kernel.
import pytest
from mne.datasets import testing
@testing.requires_testing_data
def test_notebook_alignment(renderer_notebook, brain_gc, nbexec):
"""Test plot alignment in a notebook."""
import pytest
import mne
with pytest.MonkeyPatch().context() as mp:
mp.delenv("_MNE_FAKE_HOME_DIR")
data_path = mne.datasets.testing.data_path(download=False)
raw_fname = data_path / "MEG" / "sample" / "sample_audvis_trunc_raw.fif"
subjects_dir = data_path / "subjects"
subject = "sample"
trans = data_path / "MEG" / "sample" / "sample_audvis_trunc-trans.fif"
info = mne.io.read_info(raw_fname)
mne.viz.set_3d_backend("notebook")
fig = mne.viz.plot_alignment(
info,
trans,
subject=subject,
dig=True,
meg=["helmet", "sensors"],
subjects_dir=subjects_dir,
surfaces=["head-dense"],
)
assert fig.display is not None
@pytest.mark.slowtest # ~3 min on GitHub macOS
@testing.requires_testing_data
def test_notebook_interactive(renderer_notebook, brain_gc, nbexec):
"""Test interactive modes."""
import tempfile
import time
from contextlib import contextmanager
from pathlib import Path
import matplotlib.pyplot as plt
import pytest
from ipywidgets import Button
from numpy.testing import assert_allclose
import mne
from mne.datasets import testing
with pytest.MonkeyPatch().context() as mp:
mp.delenv("_MNE_FAKE_HOME_DIR")
data_path = testing.data_path(download=False)
sample_dir = data_path / "MEG" / "sample"
subjects_dir = data_path / "subjects"
fname_stc = sample_dir / "sample_audvis_trunc-meg"
stc = mne.read_source_estimate(fname_stc, subject="sample")
stc.crop(0.1, 0.11)
initial_time = 0.13
mne.viz.set_3d_backend("notebook")
brain_class = mne.viz.get_brain_class()
@contextmanager
def interactive(on):
old = plt.isinteractive()
plt.interactive(on)
try:
yield
finally:
plt.interactive(old)
with interactive(False):
brain = stc.plot(
subjects_dir=subjects_dir,
initial_time=initial_time,
clim=dict(kind="value", pos_lims=[3, 6, 9]),
time_viewer=True,
show_traces=True,
hemi="lh",
size=300,
)
assert isinstance(brain, brain_class)
assert brain._renderer.figure.notebook
assert brain._renderer.figure.display is not None
brain._renderer._update()
tmp_path = Path(tempfile.mkdtemp())
movie_path = tmp_path / "test.gif"
screenshot_path = tmp_path / "test.png"
actions = brain._renderer.actions
assert actions["movie_field"]._action.value == ""
actions["movie_field"]._action.value = str(movie_path)
assert not movie_path.is_file()
assert actions["screenshot_field"]._action.value == ""
brain._renderer.actions["screenshot_field"]._action.value = str(screenshot_path)
assert not screenshot_path.is_file()
total_number_of_buttons = sum(
"_field" not in k for k in brain._renderer.actions.keys()
)
assert "play" in brain._renderer.actions
# play is not a button widget, it does not have a click() method
number_of_buttons = 1
button_names = list()
for name, action in brain._renderer.actions.items():
widget = action._action
if isinstance(widget, Button):
widget.click()
button_names.append(name)
number_of_buttons += 1
assert number_of_buttons == total_number_of_buttons
time.sleep(0.5)
assert "movie" in button_names, button_names
assert movie_path.is_file(), movie_path
assert "screenshot" in button_names, button_names
assert screenshot_path.is_file(), screenshot_path
img_nv = brain.screenshot()
assert img_nv.shape == (300, 300, 3), img_nv.shape
img_v = brain.screenshot(time_viewer=True)
assert img_v.shape[1:] == (300, 3), img_v.shape
# XXX This rtol is not very good, ideally would be zero
assert_allclose(
img_v.shape[0], img_nv.shape[0] * 1.25, err_msg=img_nv.shape, rtol=0.1
)
brain.close()
@testing.requires_testing_data
def test_notebook_button_counts(renderer_notebook, brain_gc, nbexec):
"""Test button counts."""
from ipywidgets import Button
import mne
mne.viz.set_3d_backend("notebook")
rend = mne.viz.create_3d_figure(size=(100, 100), scene=False)
fig = rend.scene()
mne.viz.set_3d_title(fig, "Notebook testing")
mne.viz.set_3d_view(fig, 200, 70, focalpoint=[0, 0, 0])
assert fig.display is None
rend.show()
total_number_of_buttons = sum("_field" not in k for k in rend.actions.keys())
number_of_buttons = 0
for action in rend.actions.values():
widget = action._action
if isinstance(widget, Button):
widget.click()
number_of_buttons += 1
assert number_of_buttons == total_number_of_buttons
assert fig.display is not None