This is an automated email from the git hooks/post-receive script. yoh pushed a commit to tag 0.4 in repository python-mne.
commit aa342f294327618b414d4f3332d8bd75e0baa72c Author: Martin Luessi <[email protected]> Date: Mon Jan 30 12:42:58 2012 -0500 ENH: include pick_normal into _assemble_kernel to avoid computation of non-normal components when pick_normal=True --- mne/minimum_norm/inverse.py | 69 ++++++++++++++++++++++---------------- mne/minimum_norm/time_frequency.py | 4 +-- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/mne/minimum_norm/inverse.py b/mne/minimum_norm/inverse.py index 54301b5..7e33dc0 100644 --- a/mne/minimum_norm/inverse.py +++ b/mne/minimum_norm/inverse.py @@ -288,19 +288,6 @@ def combine_xyz(vec, square=False): return comb -def _combine_ori(sol, inverse_operator, pick_normal): - if inverse_operator['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI: - 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) - return sol - - def _chech_ch_names(inv, info): """Check that channels in inverse operator are measurements""" @@ -440,10 +427,10 @@ def prepare_inverse_operator(orig, nave, lambda2, dSPM): return inv -def _assemble_kernel(inv, label, dSPM): +def _assemble_kernel(inv, label, dSPM, pick_normal): # # Simple matrix multiplication followed by combination of the - # three current components + # current components # # This does all the data transformations to compute the weights for the # eigenleads @@ -470,6 +457,20 @@ def _assemble_kernel(inv, label, dSPM): eigen_leads = eigen_leads[src_sel] source_cov = source_cov[src_sel] + if pick_normal: + if not inv['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI: + raise ValueError('Pick normal can only be used with a free ' + 'orientation inverse operator.') + + is_loose = 0 < inv['orient_prior']['data'][0] < 1 + if not is_loose: + raise ValueError('The pick_normal parameter is only valid ' + 'when working with loose orientations.') + + # keep only the normal components + eigen_leads = eigen_leads[2::3] + source_cov = source_cov[2::3] + trans = inv['reginv'][:, None] * reduce(np.dot, [inv['eigen_fields']['data'], inv['whitener'], @@ -574,10 +575,15 @@ def apply_inverse(evoked, inverse_operator, lambda2, dSPM=True, print 'Picked %d channels from the data' % len(sel) print 'Computing inverse...', - K, noise_norm, _ = _assemble_kernel(inv, None, dSPM) + K, noise_norm, _ = _assemble_kernel(inv, None, dSPM, pick_normal) sol = np.dot(K, evoked.data[sel]) # apply imaging kernel - print 'combining the current components...', - sol = _combine_ori(sol, inv, pick_normal) + + is_free_ori = (inverse_operator['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI + and not pick_normal) + + if is_free_ori: + print 'combining the current components...', + sol = combine_xyz(sol) if noise_norm is not None: print '(dSPM)...', @@ -658,11 +664,12 @@ def apply_inverse_raw(raw, inverse_operator, lambda2, dSPM=True, if time_func is not None: data = time_func(data) - K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM) + K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM, pick_normal) - inv_free_ori = inverse_operator['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI + is_free_ori = (inverse_operator['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI + and not pick_normal) - if buffer_size is not None and inv_free_ori: + if buffer_size is not None and is_free_ori: # Process the data in segments to conserve memory n_seg = int(np.ceil(data.shape[1] / float(buffer_size))) print 'computing inverse and combining the current components'\ @@ -675,13 +682,14 @@ def apply_inverse_raw(raw, inverse_operator, lambda2, dSPM=True, for pos in xrange(0, n_times, buffer_size): sol[:, pos:pos + buffer_size] = \ - _combine_ori(np.dot(K, data[:, pos:pos + buffer_size]), - inv, pick_normal) + combine_xyz(np.dot(K, data[:, pos:pos + buffer_size])) + print 'segment %d / %d done..' % (pos / buffer_size + 1, n_seg) else: sol = np.dot(K, data) - print 'combining the current components...', - sol = _combine_ori(sol, inv, pick_normal) + if is_free_ori: + print 'combining the current components...', + sol = combine_xyz(sol) if noise_norm is not None: sol *= noise_norm @@ -739,17 +747,22 @@ def apply_inverse_epochs(epochs, inverse_operator, lambda2, dSPM=True, print 'Picked %d channels from the data' % len(sel) print 'Computing inverse...', - K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM) + K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM, pick_normal) stcs = list() tstep = 1.0 / epochs.info['sfreq'] tmin = epochs.times[0] + is_free_ori = (inverse_operator['source_ori'] == FIFF.FIFFV_MNE_FREE_ORI + and not pick_normal) + for k, e in enumerate(epochs): print "Processing epoch : %d" % (k + 1) sol = np.dot(K, e[sel]) # apply imaging kernel - print 'combining the current components...', - sol = _combine_ori(sol, inv, pick_normal) + + if is_free_ori: + print 'combining the current components...', + sol = combine_xyz(sol) if noise_norm is not None: sol *= noise_norm diff --git a/mne/minimum_norm/time_frequency.py b/mne/minimum_norm/time_frequency.py index 8b049ba..95f2667 100644 --- a/mne/minimum_norm/time_frequency.py +++ b/mne/minimum_norm/time_frequency.py @@ -102,7 +102,7 @@ def _compute_pow_plv(data, K, sel, Ws, source_ori, use_fft, Vh, with_plv, n_freqs = len(Ws) n_sources = K.shape[0] is_free_ori = False - if source_ori == FIFF.FIFFV_MNE_FREE_ORI: + if (source_ori == FIFF.FIFFV_MNE_FREE_ORI and not pick_normal): is_free_ori = True n_sources /= 3 @@ -190,7 +190,7 @@ def _source_induced_power(epochs, inverse_operator, frequencies, label=None, # This does all the data transformations to compute the weights for the # eigenleads # - K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM) + K, noise_norm, vertno = _assemble_kernel(inv, label, dSPM, pick_normal) if pca: U, s, Vh = linalg.svd(K, full_matrices=False) -- 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
