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 109a9c5c5f87f139515ef5bad342c48d580acad3 Author: Alexandre Gramfort <[email protected]> Date: Thu Oct 13 21:13:48 2011 -0400 ENH : allowing export of volume stc to full MRI resolution --- .../inverse/plot_compute_mne_inverse_volume.py | 10 +++++--- mne/fiff/constants.py | 2 ++ mne/source_estimate.py | 28 ++++++++++++++++++--- mne/source_space.py | 29 ++++++++++++++++------ 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/examples/inverse/plot_compute_mne_inverse_volume.py b/examples/inverse/plot_compute_mne_inverse_volume.py index a87f658..884a43b 100644 --- a/examples/inverse/plot_compute_mne_inverse_volume.py +++ b/examples/inverse/plot_compute_mne_inverse_volume.py @@ -20,7 +20,6 @@ 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' @@ -41,13 +40,16 @@ 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) +img = mne.save_stc_as_volume('mne_dSPM_inverse.nii.gz', stc, src, + mri_resolution=False) # set to True for full MRI resolution data = img.get_data() -# plot result +# plot result (one slice) coronal_slice = data[:, 10, :, 60] +pl.close('all') pl.imshow(np.ma.masked_less(coronal_slice, 8), cmap=pl.cm.Reds, - interpolation='nearest') + interpolation='nearest') +pl.colorbar() pl.contour(coronal_slice != 0, 1, colors=['black']) pl.xticks([]) pl.yticks([]) diff --git a/mne/fiff/constants.py b/mne/fiff/constants.py index 518b932..c46258d 100644 --- a/mne/fiff/constants.py +++ b/mne/fiff/constants.py @@ -187,6 +187,8 @@ FIFF.FIFF_MRI_WIDTH = 2010 FIFF.FIFF_MRI_WIDTH_M = 2011 FIFF.FIFF_MRI_HEIGHT = 2012 FIFF.FIFF_MRI_HEIGHT_M = 2013 +FIFF.FIFF_MRI_DEPTH = 2014 +FIFF.FIFF_MRI_DEPTH_M = 2015 # FIFF.FIFFV_MRI_PIXEL_BYTE = 1 FIFF.FIFFV_MRI_PIXEL_WORD = 2 diff --git a/mne/source_estimate.py b/mne/source_estimate.py index 11adfa3..f5076b6 100644 --- a/mne/source_estimate.py +++ b/mne/source_estimate.py @@ -567,7 +567,7 @@ def _get_ico_tris(grade): return ico['tris'] -def save_stc_as_volume(fname, stc, src, dest='mri'): +def save_stc_as_volume(fname, stc, src, dest='mri', mri_resolution=False): """Save a volume source estimate in a nifti file Parameters @@ -582,6 +582,10 @@ def save_stc_as_volume(fname, stc, src, dest='mri'): 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). + mri_resolution: bool + It True the image is saved in MRI resolution. + WARNING: if you have many time points the file produced can be + huge. Returns ------- @@ -592,17 +596,35 @@ def save_stc_as_volume(fname, stc, src, dest='mri'): raise Exception('Only volume source estimates can be saved as ' 'volumes') - shape = src[0]['shape'] n_times = stc.data.shape[1] + shape = src[0]['shape'] 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) + if mri_resolution: + mri_shape3d = (src[0]['mri_height'], src[0]['mri_depth'], + src[0]['mri_width']) + mri_shape = (n_times, src[0]['mri_height'], src[0]['mri_depth'], + src[0]['mri_width']) + mri_vol = np.zeros(mri_shape) + interpolator = src[0]['interpolator'] + for k, v in enumerate(vol): v[mask3d] = stc.data[:, k] + if mri_resolution: + mri_vol[k] = (interpolator * v.ravel()).reshape(mri_shape3d) + + if mri_resolution: + vol = mri_vol + vol = vol.T - affine = src[0]['vox_mri_t']['trans'].copy() + + if mri_resolution: + affine = src[0]['vox_mri_t']['trans'].copy() + else: + affine = src[0]['src_mri_t']['trans'].copy() if dest == 'mri': affine = np.dot(src[0]['mri_ras_t']['trans'], affine) affine[:3] *= 1e3 diff --git a/mne/source_space.py b/mne/source_space.py index 9f78ee2..addfc5d 100644 --- a/mne/source_space.py +++ b/mne/source_space.py @@ -138,15 +138,12 @@ def _read_one_source_space(fid, this): if tag is not None: res['shape'] = tuple(tag.data) - tag = find_tag(fid, this, FIFF.FIFF_MNE_SOURCE_SPACE_INTERPOLATOR) - if tag is not None: - res['interpolator'] = tag.data - tag = find_tag(fid, this, FIFF.FIFF_COORD_TRANS) if tag is not None: - res['mri_head_t'] = tag.data + res['src_mri_t'] = tag.data - for d in this['directory']: + mri = dir_tree_find(this, FIFF.FIFFB_MNE_PARENT_MRI_FILE)[0] + for d in mri['directory']: if d.kind == FIFF.FIFF_COORD_TRANS: tag = read_tag(fid, d.pos) trans = tag.data @@ -155,10 +152,28 @@ def _read_one_source_space(fid, this): 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) + tag = find_tag(fid, mri, FIFF.FIFF_MNE_SOURCE_SPACE_INTERPOLATOR) + if tag is not None: + res['interpolator'] = tag.data + else: + print "Interpolation matrix for MRI not found." + + tag = find_tag(fid, mri, FIFF.FIFF_MNE_SOURCE_SPACE_MRI_FILE) if tag is not None: res['mri_file'] = tag.data + tag = find_tag(fid, mri, FIFF.FIFF_MRI_WIDTH) + if tag is not None: + res['mri_width'] = int(tag.data) + + tag = find_tag(fid, mri, FIFF.FIFF_MRI_HEIGHT) + if tag is not None: + res['mri_height'] = int(tag.data) + + tag = find_tag(fid, mri, FIFF.FIFF_MRI_DEPTH) + if tag is not None: + res['mri_depth'] = int(tag.data) + tag = find_tag(fid, this, FIFF.FIFF_MNE_SOURCE_SPACE_NPOINTS) if tag is None: -- 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
