This is an automated email from the git hooks/post-receive script. yoh pushed a commit to annotated tag v0.1 in repository python-mne.
commit 7bccdfce9226acfffc1abf2e17df8e1520d81f77 Author: Alexandre Gramfort <[email protected]> Date: Tue Apr 19 17:45:03 2011 -0400 ENH : source_induced_power and SourceEstimate + 3D source viewer --- examples/plot_compute_mne_inverse.py | 5 + .../plot_source_space_time_frequency.py | 4 + mne/minimum_norm/time_frequency.py | 24 +++- mne/stc.py | 9 +- mne/viz.py | 130 ++++++++++++++------- 5 files changed, 115 insertions(+), 57 deletions(-) diff --git a/examples/plot_compute_mne_inverse.py b/examples/plot_compute_mne_inverse.py index 48f9be3..47b7eed 100755 --- a/examples/plot_compute_mne_inverse.py +++ b/examples/plot_compute_mne_inverse.py @@ -20,6 +20,8 @@ import mne from mne.datasets import sample from mne.fiff import Evoked from mne.minimum_norm import apply_inverse, read_inverse_operator +from mne.viz import plot_source_estimate + data_path = sample.data_path('.') fname_inv = data_path + '/MEG/sample/sample_audvis-meg-oct-6-meg-inv.fif' @@ -46,3 +48,6 @@ pl.plot(1e3 * stc.times, stc.data[::100, :].T) pl.xlabel('time (ms)') pl.ylabel('dSPM value') pl.show() + +# View in 3D +plot_source_estimate(inverse_operator['src'], stc) diff --git a/examples/time_frequency/plot_source_space_time_frequency.py b/examples/time_frequency/plot_source_space_time_frequency.py index 3e04be1..b3a3418 100644 --- a/examples/time_frequency/plot_source_space_time_frequency.py +++ b/examples/time_frequency/plot_source_space_time_frequency.py @@ -16,6 +16,7 @@ import mne from mne import fiff from mne.datasets import sample from mne.minimum_norm import read_inverse_operator, source_induced_power +from mne.viz import plot_source_estimate ############################################################################### # Set parameters @@ -51,3 +52,6 @@ stcs = source_induced_power(epochs, inverse_operator, bands, n_cycles=2, for b, stc in stcs.iteritems(): stc.save('induced_power_%s' % b) + +# View sources +plot_source_estimate(inverse_operator['src'], stcs['alpha']) diff --git a/mne/minimum_norm/time_frequency.py b/mne/minimum_norm/time_frequency.py index 9998bda..1392e5e 100644 --- a/mne/minimum_norm/time_frequency.py +++ b/mne/minimum_norm/time_frequency.py @@ -12,11 +12,27 @@ from .inverse import combine_xyz, prepare_inverse_operator def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0, dSPM=True, n_cycles=5, df=1, use_fft=False, - baseline=None, baseline_mode='ratio'): - """XXX for source_induced_power + baseline=None, baseline_mode='logratio'): + """Compute source space induced power Parameters ---------- + epochs: instance of Epochs + The epochs + inverse_operator: instance of inverse operator + The inverse operator + bands: dict + Example : bands = dict(alpha=[8, 9]) + lambda2: float + The regularization parameter of the minimum norm + dSPM: bool + Do dSPM or not? + n_cycles: int + Number of cycles + df: float + delta frequency within bands + use_fft: bool + Do convolutions in time or frequency domain with FFT baseline: None (default) or tuple of length 2 The time interval to apply baseline correction. If None do not apply it. If baseline is (a, b) @@ -25,13 +41,11 @@ def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0, and if b is None then b is set to the end of the interval. If baseline is equal ot (None, None) all the time interval is used. - baseline_mode : None | 'ratio' | 'zscore' + baseline_mode : None | 'logratio' | 'zscore' Do baseline correction with ratio (power is divided by mean power during baseline) or zscore (power is divided by standard deviatio of power during baseline after substracting the mean, power = [power - mean(power_baseline)] / std(power_baseline)) - - """ # diff --git a/mne/stc.py b/mne/stc.py index e698418..13919d9 100755 --- a/mne/stc.py +++ b/mne/stc.py @@ -119,7 +119,7 @@ class SourceEstimate(object): def __init__(self, fname): if fname is not None: lh = read_stc(fname + '-lh.stc') - rh = read_stc(fname + '-lh.stc') + rh = read_stc(fname + '-rh.stc') self.data = np.r_[lh['data'], rh['data']] assert lh['tmin'] == rh['tmin'] assert lh['tstep'] == rh['tstep'] @@ -144,10 +144,3 @@ class SourceEstimate(object): write_stc(fname + '-rh.stc', tmin=self.tmin, tstep=self.tstep, vertices=self.rh_vertno, data=rh_data) print '[done]' - - # def view(self, src, t, n_smooth=200, colorbar=True): - # """View in source space - # """ - # idx = np.where(evoked.times > 1e-3*t)[0][0] - # plot_sources(src, self.data[:,idx], text='%d ms' % t, - # colorbar=colorbar, n_smooth=n_smooth) diff --git a/mne/viz.py b/mne/viz.py index 01a2325..acb80b6 100755 --- a/mne/viz.py +++ b/mne/viz.py @@ -7,6 +7,7 @@ import numpy as np import pylab as pl + from .fiff.pick import channel_type @@ -78,49 +79,90 @@ def plot_evoked(evoked, picks=None, unit=True, show=True): pl.show() -def plot_sources(src, data, text=None, n_smooth=200, colorbar=True, - cmap="jet"): - """Source space data +def plot_source_estimate(src, stc, n_smooth=200, cmap='jet'): + """Plot source estimates """ - from enthought.mayavi import mlab from enthought.tvtk.api import tvtk - lh_points = src[0]['rr'] - rh_points = src[1]['rr'] - # lh_faces = src[0]['tris'] - # rh_faces = src[1]['tris'] - lh_faces = src[0]['use_tris'] - rh_faces = src[1]['use_tris'] - points = np.r_[lh_points, rh_points] - points *= 200 - faces = np.r_[lh_faces, lh_points.shape[0] + rh_faces] - - lh_idx = np.where(src[0]['inuse'])[0] - rh_idx = np.where(src[1]['inuse'])[0] - use_idx = np.r_[lh_idx, lh_points.shape[0] + rh_idx] - - points = points[use_idx] - faces = np.searchsorted(use_idx, faces) - - mlab.test_quiver3d() - mlab.clf() - mlab.options.offscreen = True - f = mlab.figure(512, bgcolor=(.05, 0, .1), size=(800, 800)) - mlab.clf() - f.scene.disable_render = True - surface_mesh = mlab.pipeline.triangular_mesh_source(points[:, 0], - points[:, 1], points[:, 2], faces, - scalars=data) - smooth_ = tvtk.SmoothPolyDataFilter(number_of_iterations=n_smooth, - relaxation_factor=0.18, - feature_angle=70, - feature_edge_smoothing=False, - boundary_smoothing=False, - convergence=0.) - surface_mesh_smooth = mlab.pipeline.user_defined(surface_mesh, - filter=smooth_) - mlab.pipeline.surface(surface_mesh_smooth, colormap=cmap) - bar = mlab.scalarbar() - if text is not None: - mlab.text(0.7, 0.9, text, width=0.2) - if not colorbar: - bar.visible = False + from enthought.traits.api import HasTraits, Range, Instance, \ + on_trait_change + from enthought.traits.ui.api import View, Item, Group + + from enthought.mayavi.core.api import PipelineBase + from enthought.mayavi.core.ui.api import MayaviScene, SceneEditor, \ + MlabSceneModel + + class SurfaceViewer(HasTraits): + n_times = Range(0, 100, 0, ) + + scene = Instance(MlabSceneModel, ()) + surf = Instance(PipelineBase) + text = Instance(PipelineBase) + + def __init__(self, src, data, times, n_smooth=20, cmap='jet'): + super(SurfaceViewer, self).__init__() + self.src = src + self.data = data + self.times = times + self.n_smooth = n_smooth + self.cmap = cmap + + lh_points = src[0]['rr'] + rh_points = src[1]['rr'] + # lh_faces = src[0]['tris'] + # rh_faces = src[1]['tris'] + lh_faces = src[0]['use_tris'] + rh_faces = src[1]['use_tris'] + points = np.r_[lh_points, rh_points] + points *= 200 + faces = np.r_[lh_faces, lh_points.shape[0] + rh_faces] + + lh_idx = np.where(src[0]['inuse'])[0] + rh_idx = np.where(src[1]['inuse'])[0] + use_idx = np.r_[lh_idx, lh_points.shape[0] + rh_idx] + + self.points = points[use_idx] + self.faces = np.searchsorted(use_idx, faces) + + # When the scene is activated, or when the parameters are changed, we + # update the plot. + @on_trait_change('n_times,scene.activated') + def update_plot(self): + idx = int(self.n_times * len(self.times) / 100) + t = self.times[idx] + d = self.data[:, idx].astype(np.float) # 8bits for mayavi + points = self.points + faces = self.faces + info_time = "%d ms" % (1e3 * t) + if self.surf is None: + surface_mesh = self.scene.mlab.pipeline.triangular_mesh_source( + points[:, 0], points[:, 1], points[:, 2], + faces, scalars=d) + smooth_ = tvtk.SmoothPolyDataFilter( + number_of_iterations=self.n_smooth, + relaxation_factor=0.18, + feature_angle=70, + feature_edge_smoothing=False, + boundary_smoothing=False, + convergence=0.) + surface_mesh_smooth = self.scene.mlab.pipeline.user_defined( + surface_mesh, filter=smooth_) + self.surf = self.scene.mlab.pipeline.surface( + surface_mesh_smooth, colormap=self.cmap) + + self.scene.mlab.colorbar() + self.text = self.scene.mlab.text(0.7, 0.9, info_time, + width=0.2) + self.scene.background = (.05, 0, .1) + else: + self.surf.mlab_source.set(scalars=d) + self.text.set(text=info_time) + + # The layout of the dialog created + view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), + height=800, width=800, show_label=False), + Group('_', 'n_times',), + resizable=True,) + + viewer = SurfaceViewer(src, stc.data, stc.times, n_smooth=200) + viewer.configure_traits() + return viewer -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
