[med-svn] [python-mne] 33/52: ENH : adding support for nifti output + nice example
Yaroslav Halchenko
debian at onerussian.com
Fri Nov 27 17:23:47 UTC 2015
This is an automated email from the git hooks/post-receive script.
yoh pushed a commit to annotated tag v0.2
in repository python-mne.
commit efb94008cbfa67bab91b8401fb34bad56046e0eb
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date: Thu Oct 13 10:58:20 2011 -0400
ENH : adding support for nifti output + nice example
---
.../inverse/plot_compute_mne_inverse_volume.py | 54 ++++++++++++++++++++++
mne/__init__.py | 3 +-
mne/source_estimate.py | 53 +++++++++++++++++++++
mne/source_space.py | 11 ++++-
4 files changed, 119 insertions(+), 2 deletions(-)
diff --git a/examples/inverse/plot_compute_mne_inverse_volume.py b/examples/inverse/plot_compute_mne_inverse_volume.py
new file mode 100644
index 0000000..a87f658
--- /dev/null
+++ b/examples/inverse/plot_compute_mne_inverse_volume.py
@@ -0,0 +1,54 @@
+"""
+=======================================================================
+Compute MNE-dSPM inverse solution on evoked data in volume source space
+=======================================================================
+
+Compute dSPM inverse solution on MNE evoked dataset in a volume source
+space and stores the solution in a nifti file for visualisation.
+
+"""
+
+# Author: Alexandre Gramfort <gramfort at nmr.mgh.harvard.edu>
+#
+# License: BSD (3-clause)
+
+print __doc__
+
+import numpy as np
+import pylab as pl
+import mne
+from mne.datasets import sample
+from mne.fiff import Evoked
+from mne.minimum_norm import apply_inverse, read_inverse_operator
+from mne.source_space import read_source_spaces
+
+data_path = sample.data_path('..')
+fname_inv = data_path + '/MEG/sample/sample_audvis-meg-vol-7-meg-inv.fif'
+fname_evoked = data_path + '/MEG/sample/sample_audvis-ave.fif'
+
+setno = 0
+snr = 3.0
+lambda2 = 1.0 / snr ** 2
+dSPM = True
+
+# Load data
+evoked = Evoked(fname_evoked, setno=setno, baseline=(None, 0))
+inverse_operator = read_inverse_operator(fname_inv)
+src = inverse_operator['src']
+
+# Compute inverse solution
+stc = apply_inverse(evoked, inverse_operator, lambda2, dSPM)
+stc.crop(0.0, 0.2)
+
+# Save result in a 4D nifti file
+img = mne.save_stc_as_volume('mne_dSPM_inverse.nii', stc, src)
+data = img.get_data()
+
+# plot result
+coronal_slice = data[:, 10, :, 60]
+pl.imshow(np.ma.masked_less(coronal_slice, 8), cmap=pl.cm.Reds,
+ interpolation='nearest')
+pl.contour(coronal_slice != 0, 1, colors=['black'])
+pl.xticks([])
+pl.yticks([])
+pl.show()
diff --git a/mne/__init__.py b/mne/__init__.py
index 92379c9..e2e11d5 100644
--- a/mne/__init__.py
+++ b/mne/__init__.py
@@ -6,7 +6,8 @@ from .event import read_events, write_events, find_events, merge_events
from .forward import read_forward_solution
from .source_estimate import read_stc, write_stc, SourceEstimate, morph_data, \
spatio_temporal_src_connectivity, \
- spatio_temporal_tris_connectivity
+ spatio_temporal_tris_connectivity, \
+ save_stc_as_volume
from .surface import read_bem_surfaces, read_surface
from .source_space import read_source_spaces
from .epochs import Epochs
diff --git a/mne/source_estimate.py b/mne/source_estimate.py
index 6d23912..11adfa3 100644
--- a/mne/source_estimate.py
+++ b/mne/source_estimate.py
@@ -565,3 +565,56 @@ def _get_ico_tris(grade):
ico = s
break
return ico['tris']
+
+
+def save_stc_as_volume(fname, stc, src, dest='mri'):
+ """Save a volume source estimate in a nifti file
+
+ Parameters
+ ----------
+ fname: string
+ The name of the generated nifti file.
+ stc: instance of SourceEstimate
+ The source estimate
+ src: list
+ The list of source spaces (should actually be of length 1)
+ dest: 'mri' | 'surf'
+ If 'mri' the volume is defined in the coordinate system of
+ the original T1 image. If 'surf' the coordinate system
+ of the FreeSurfer surface is used (Surface RAS).
+
+ Returns
+ -------
+ img : instance Nifti1Image
+ The image object.
+ """
+ if stc.is_surface():
+ raise Exception('Only volume source estimates can be saved as '
+ 'volumes')
+
+ shape = src[0]['shape']
+ n_times = stc.data.shape[1]
+ shape3d = (shape[2], shape[1], shape[0])
+ shape = (n_times, shape[2], shape[1], shape[0])
+ vol = np.zeros(shape)
+ mask3d = src[0]['inuse'].reshape(shape3d).astype(np.bool)
+
+ for k, v in enumerate(vol):
+ v[mask3d] = stc.data[:, k]
+ vol = vol.T
+ affine = src[0]['vox_mri_t']['trans'].copy()
+ if dest == 'mri':
+ affine = np.dot(src[0]['mri_ras_t']['trans'], affine)
+ affine[:3] *= 1e3
+
+ try:
+ import nibabel as nib # lazy import to avoid dependency
+ except ImportError:
+ raise ImportError("nibabel is required to save volume images.")
+
+ header = nib.nifti1.Nifti1Header()
+ header.set_xyzt_units('mm', 'msec')
+ header['pixdim'][4] = 1e3 * stc.tstep
+ img = nib.Nifti1Image(vol, affine, header=header)
+ nib.save(img, fname)
+ return img
diff --git a/mne/source_space.py b/mne/source_space.py
index d9bca0e..9f78ee2 100644
--- a/mne/source_space.py
+++ b/mne/source_space.py
@@ -7,7 +7,7 @@ import numpy as np
from .fiff.constants import FIFF
from .fiff.tree import dir_tree_find
-from .fiff.tag import find_tag
+from .fiff.tag import find_tag, read_tag
from .fiff.open import fiff_open
@@ -146,6 +146,15 @@ def _read_one_source_space(fid, this):
if tag is not None:
res['mri_head_t'] = tag.data
+ for d in this['directory']:
+ if d.kind == FIFF.FIFF_COORD_TRANS:
+ tag = read_tag(fid, d.pos)
+ trans = tag.data
+ if trans['from'] == FIFF.FIFFV_MNE_COORD_MRI_VOXEL:
+ res['vox_mri_t'] = tag.data
+ if trans['to'] == FIFF.FIFFV_MNE_COORD_RAS:
+ res['mri_ras_t'] = tag.data
+
tag = find_tag(fid, this, FIFF.FIFF_MNE_SOURCE_SPACE_MRI_FILE)
if tag is not None:
res['mri_file'] = tag.data
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git
More information about the debian-med-commit
mailing list