[074d3d]: / mne / viz / _brain / _linkviewer.py

Download this file

99 lines (74 with data), 3.2 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
# Authors: The MNE-Python contributors.
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
import numpy as np
from ...utils import warn
from ..ui_events import link
class _LinkViewer:
"""Class to link multiple Brain objects."""
def __init__(self, brains, time=True, camera=False, colorbar=True, picking=False):
self.brains = brains
self.leader = self.brains[0] # select a brain as leader
# check time infos
times = [brain._times for brain in brains]
if time and not all(np.allclose(x, times[0]) for x in times):
warn("stc.times do not match, not linking time")
time = False
if camera:
self.link_cameras()
events_to_link = []
if time:
events_to_link.append("time_change")
if colorbar:
events_to_link.append("colormap_range")
for brain in brains[1:]:
link(self.leader, brain, include_events=events_to_link)
if picking:
def _func_add(*args, **kwargs):
for brain in self.brains:
brain._add_vertex_glyph2(*args, **kwargs)
brain.plotter.update()
def _func_remove(*args, **kwargs):
for brain in self.brains:
brain._remove_vertex_glyph2(*args, **kwargs)
# save initial picked points
initial_points = dict()
for hemi in ("lh", "rh"):
initial_points[hemi] = set()
for brain in self.brains:
initial_points[hemi] |= set(brain.picked_points[hemi])
# link the viewers
for brain in self.brains:
brain.clear_glyphs()
brain._add_vertex_glyph2 = brain._add_vertex_glyph
brain._add_vertex_glyph = _func_add
brain._remove_vertex_glyph2 = brain._remove_vertex_glyph
brain._remove_vertex_glyph = _func_remove
# link the initial points
for hemi in initial_points.keys():
if hemi in brain._layered_meshes:
mesh = brain._layered_meshes[hemi]._polydata
for vertex_id in initial_points[hemi]:
self.leader._add_vertex_glyph(hemi, mesh, vertex_id)
def set_fmin(self, value):
self.leader.update_lut(fmin=value)
def set_fmid(self, value):
self.leader.update_lut(fmid=value)
def set_fmax(self, value):
self.leader.update_lut(fmax=value)
def set_time_point(self, value):
self.leader.set_time_point(value)
def set_playback_speed(self, value):
self.leader.set_playback_speed(value)
def toggle_playback(self):
self.leader.toggle_playback()
def link_cameras(self):
from ..backends._pyvista import _add_camera_callback
def _update_camera(vtk_picker, event):
for brain in self.brains:
brain.plotter.update()
camera = self.leader.plotter.camera
_add_camera_callback(camera, _update_camera)
for brain in self.brains:
for renderer in brain.plotter.renderers:
renderer.camera = camera