[med-svn] [python-mne] 334/376: ENH : adding pick_normal option in MNE estimates
Yaroslav Halchenko
debian at onerussian.com
Fri Nov 27 17:23:17 UTC 2015
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 15aefd3e824a7210ec13fb0207898ad0d52d8125
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date: Tue Aug 9 11:34:48 2011 -0400
ENH : adding pick_normal option in MNE estimates
---
examples/inverse/plot_compute_mne_inverse.py | 2 +-
.../plot_compute_mne_inverse_raw_in_label.py | 2 +-
mne/minimum_norm/inverse.py | 109 ++++++++++++++-------
3 files changed, 75 insertions(+), 38 deletions(-)
diff --git a/examples/inverse/plot_compute_mne_inverse.py b/examples/inverse/plot_compute_mne_inverse.py
index 7813f7c..c67b1fb 100644
--- a/examples/inverse/plot_compute_mne_inverse.py
+++ b/examples/inverse/plot_compute_mne_inverse.py
@@ -34,7 +34,7 @@ evoked = Evoked(fname_evoked, setno=setno, baseline=(None, 0))
inverse_operator = read_inverse_operator(fname_inv)
# Compute inverse solution
-stc = apply_inverse(evoked, inverse_operator, lambda2, dSPM)
+stc = apply_inverse(evoked, inverse_operator, lambda2, dSPM, pick_normal=False)
# Save result in stc files
stc.save('mne_dSPM_inverse')
diff --git a/examples/inverse/plot_compute_mne_inverse_raw_in_label.py b/examples/inverse/plot_compute_mne_inverse_raw_in_label.py
index 610c804..ee4bcbf 100644
--- a/examples/inverse/plot_compute_mne_inverse_raw_in_label.py
+++ b/examples/inverse/plot_compute_mne_inverse_raw_in_label.py
@@ -41,7 +41,7 @@ start, stop = raw.time_to_index(0, 15) # read the first 15s of data
# Compute inverse solution
stc = apply_inverse_raw(raw, inverse_operator, lambda2, dSPM, label,
- start, stop)
+ start, stop, pick_normal=False)
# Save result in stc files
stc.save('mne_dSPM_raw_inverse_%s' % label_name)
diff --git a/mne/minimum_norm/inverse.py b/mne/minimum_norm/inverse.py
index 1496859..7f36d4d 100644
--- a/mne/minimum_norm/inverse.py
+++ b/mne/minimum_norm/inverse.py
@@ -246,13 +246,13 @@ def combine_xyz(vec, square=False):
Parameters
----------
- vec : 2d array of shape [3 n x p]
+ vec: 2d array of shape [3 n x p]
Input [ x1 y1 z1 ... x_n y_n z_n ] where x1 ... z_n
can be vectors
Returns
-------
- comb : array
+ comb: array
Output vector [sqrt(x1^2+y1^2+z1^2), ..., sqrt(x_n^2+y_n^2+z_n^2)]
"""
if vec.ndim != 2:
@@ -276,18 +276,18 @@ def prepare_inverse_operator(orig, nave, lambda2, dSPM):
Parameters
----------
- orig : dict
+ orig: dict
The inverse operator structure read from a file
- nave : int
+ nave: int
Number of averages (scales the noise covariance)
- lambda2 : float
+ lambda2: float
The regularization factor. Recommended to be 1 / SNR**2
- dSPM : bool
+ dSPM: bool
If True, compute the noise-normalization factors for dSPM.
Returns
-------
- inv : dict
+ inv: dict
Prepared inverse operator
"""
@@ -389,7 +389,8 @@ def prepare_inverse_operator(orig, nave, lambda2, dSPM):
return inv
-def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True):
+def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True,
+ pick_normal=False):
"""Apply inverse operator to evoked data
Computes a L2-norm inverse solution
@@ -406,6 +407,10 @@ def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True):
The regularization parameter
dSPM: bool
do dSPM ?
+ pick_normal: bool
+ If True, rather than pooling the orientations by taking the norm,
+ only the radial component is kept. This is only implemented
+ when working with loose orientations.
Returns
-------
@@ -433,10 +438,10 @@ def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True):
# eigenleads
#
trans = inv['reginv'][:, None] * reduce(np.dot,
- [inv['eigen_fields']['data'],
- inv['whitener'],
- inv['proj'],
- evoked.data])
+ [inv['eigen_fields']['data'],
+ inv['whitener'],
+ inv['proj'],
+ evoked.data])
#
# Transformation into current distributions by weighting the eigenleads
@@ -458,7 +463,14 @@ def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True):
if inv['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI:
print 'combining the current components...',
- sol = combine_xyz(sol)
+ if pick_normal:
+ is_loose = 0 < inverse_operator['orient_prior']['data'][0] < 1
+ if not is_loose:
+ raise ValueError('The pick_normal parameter is only valid '
+ 'when working with loose orientations.')
+ sol = sol[2::3] # take one every 3 sources ie. only the normal
+ else:
+ sol = combine_xyz(sol)
if dSPM:
print '(dSPM)...',
@@ -479,7 +491,7 @@ def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True):
def apply_inverse_raw(raw, inverse_operator, lambda2, dSPM=True,
label=None, start=None, stop=None, nave=1,
- time_func=None):
+ time_func=None, pick_normal=False):
"""Apply inverse operator to Raw data
Computes a L2-norm inverse solution
@@ -507,6 +519,11 @@ def apply_inverse_raw(raw, inverse_operator, lambda2, dSPM=True,
Set to 1 on raw data.
time_func: callable
Linear function applied to sensor space time series.
+ pick_normal: bool
+ If True, rather than pooling the orientations by taking the norm,
+ only the radial component is kept. This is only implemented
+ when working with loose orientations.
+
Returns
-------
stc: SourceEstimate
@@ -590,8 +607,16 @@ def apply_inverse_raw(raw, inverse_operator, lambda2, dSPM=True,
sol = np.sqrt(source_cov) * np.dot(eigen_leads, trans)
if inv['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI:
- print 'combining the current components...',
- sol = combine_xyz(sol)
+ if pick_normal:
+ print 'Picking only the normal components...',
+ is_loose = 0 < inverse_operator['orient_prior']['data'][0] < 1
+ if not is_loose:
+ raise ValueError('The pick_normal parameter is only valid '
+ 'when working with loose orientations.')
+ sol = sol[2::3] # take one every 3 sources ie. only the normal
+ else:
+ print 'Combining the current components...',
+ sol = combine_xyz(sol)
if dSPM:
print '(dSPM)...',
@@ -621,14 +646,14 @@ def _xyz2lf(Lf_xyz, normals):
Parameters
----------
- Lf_xyz : array of shape [n_sensors, n_positions x 3]
+ Lf_xyz: array of shape [n_sensors, n_positions x 3]
Leadfield
- normals : array of shape [n_positions, 3]
+ normals: array of shape [n_positions, 3]
Normals to the cortex
Returns
-------
- Lf_cortex : array of shape [n_sensors, n_positions x 3]
+ Lf_cortex: array of shape [n_sensors, n_positions x 3]
Lf_cortex is a leadfield matrix for dipoles in rotated orientations, so
that the first column is the gain vector for the cortical normal dipole
and the following two column vectors are the gain vectors for the
@@ -656,7 +681,7 @@ def _xyz2lf(Lf_xyz, normals):
def minimum_norm(evoked, forward, whitener, method='dspm',
orientation='fixed', snr=3, loose=0.2, depth=True,
weight_exp=0.8, weight_limit=10, fmri=None, fmri_thresh=None,
- fmri_off=0.1):
+ fmri_off=0.1, pick_normal=False):
"""Minimum norm estimate (MNE)
Compute MNE, dSPM and sLORETA on evoked data starting from
@@ -664,39 +689,43 @@ def minimum_norm(evoked, forward, whitener, method='dspm',
Parameters
----------
- evoked : Evoked
+ evoked: Evoked
Evoked data to invert
- forward : dict
+ forward: dict
Forward operator
- whitener : Whitener
+ whitener: Whitener
Whitening matrix derived from noise covariance matrix
- method : 'wmne' | 'dspm' | 'sloreta'
+ method: 'wmne' | 'dspm' | 'sloreta'
The method to use
- orientation : 'fixed' | 'free' | 'loose'
+ orientation: 'fixed' | 'free' | 'loose'
Type of orientation constraints 'fixed'.
- snr : float
+ snr: float
Signal-to noise ratio defined as in MNE (default: 3).
- loose : float in [0, 1]
+ loose: float in [0, 1]
Value that weights the source variances of the dipole components
defining the tangent space of the cortical surfaces.
- depth : bool
+ depth: bool
Flag to do depth weighting (default: True).
- weight_exp : float
+ weight_exp: float
Order of the depth weighting. {0=no, 1=full normalization, default=0.8}
- weight_limit : float
+ weight_limit: float
Maximal amount depth weighting (default: 10).
- fmri : array of shape [n_sources]
+ fmri: array of shape [n_sources]
Vector of fMRI values are the source points.
- fmri_thresh : float
+ fmri_thresh: float
fMRI threshold. The source variances of source points with fmri smaller
than fmri_thresh will be multiplied by fmri_off.
- fmri_off : float
+ fmri_off: float
Weight assigned to non-active source points according to fmri
and fmri_thresh.
+ pick_normal: bool
+ If True, rather than pooling the orientations by taking the norm,
+ only the radial component is kept. This is only implemented
+ when working with loose orientations.
Returns
-------
- stc : dict
+ stc: dict
Source time courses
"""
assert method in ['wmne', 'dspm', 'sloreta']
@@ -850,8 +879,16 @@ def minimum_norm(evoked, forward, whitener, method='dspm',
sol = np.dot(Kernel, evoked.data[sel])
if n_dip_per_pos > 1:
- print 'combining the current components...',
- sol = combine_xyz(sol)
+ if pick_normal:
+ print 'Picking only the normal components...',
+ if orientation != 'loose':
+ raise ValueError('The pick_normal parameter is only valid '
+ 'when working with loose orientations.')
+ sol = sol[2::3] # take one every 3 sources ie. only the normal
+ else:
+ print 'Combining the current components...',
+ sol = combine_xyz(sol)
+
src = forward['src']
stc = SourceEstimate(None)
--
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