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
|