[med-svn] [python-mne] 161/353: FIX : fix writing of inv op obtained with make_inverse_operator

Yaroslav Halchenko debian at onerussian.com
Fri Nov 27 17:24:50 UTC 2015


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 13c2aa894fd04beb6af531d819eb6d7445000bd7
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date:   Mon Apr 30 14:12:40 2012 +0200

    FIX : fix writing of inv op obtained with make_inverse_operator
---
 mne/cov.py                             |  2 +-
 mne/fiff/cov.py                        |  4 +--
 mne/forward.py                         | 11 +++++----
 mne/minimum_norm/inverse.py            | 45 ++++++++++++++++++++++++++++------
 mne/minimum_norm/tests/test_inverse.py |  5 ++--
 5 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/mne/cov.py b/mne/cov.py
index 389599e..79ae554 100644
--- a/mne/cov.py
+++ b/mne/cov.py
@@ -418,7 +418,7 @@ def prepare_noise_cov(noise_cov, info, ch_names):
 
     assert(len(C_meg_idx) + len(C_eeg_idx) == n_chan)
 
-    noise_cov = Covariance(None)
+    noise_cov = copy.deepcopy(noise_cov)
     noise_cov.update(data=C, eig=eig, eigvec=eigvec, dim=len(ch_names),
                      diag=False, names=ch_names)
 
diff --git a/mne/fiff/cov.py b/mne/fiff/cov.py
index f92d0ac..984fcde 100644
--- a/mne/fiff/cov.py
+++ b/mne/fiff/cov.py
@@ -49,13 +49,13 @@ def read_cov(fid, node, cov_kind):
             tag = find_tag(fid, this, FIFF.FIFF_MNE_COV_DIM)
             if tag is None:
                 raise ValueError('Covariance matrix dimension not found')
+            dim = int(tag.data)
 
-            dim = tag.data
             tag = find_tag(fid, this, FIFF.FIFF_MNE_COV_NFREE)
             if tag is None:
                 nfree = -1
             else:
-                nfree = tag.data
+                nfree = int(tag.data)
 
             tag = find_tag(fid, this, FIFF.FIFF_MNE_ROW_NAMES)
             if tag is None:
diff --git a/mne/forward.py b/mne/forward.py
index 025c3f6..0f12412 100644
--- a/mne/forward.py
+++ b/mne/forward.py
@@ -103,31 +103,32 @@ def _read_one(fid, node):
     if node is None:
         return None
 
+    one = dict()
+
     tag = find_tag(fid, node, FIFF.FIFF_MNE_SOURCE_ORIENTATION)
     if tag is None:
         fid.close()
         raise ValueError('Source orientation tag not found')
+    one['source_ori'] = int(tag.data)
 
-    one = dict()
-    one['source_ori'] = tag.data
     tag = find_tag(fid, node, FIFF.FIFF_MNE_COORD_FRAME)
     if tag is None:
         fid.close()
         raise ValueError('Coordinate frame tag not found')
+    one['coord_frame'] = int(tag.data)
 
-    one['coord_frame'] = tag.data
     tag = find_tag(fid, node, FIFF.FIFF_MNE_SOURCE_SPACE_NPOINTS)
     if tag is None:
         fid.close()
         raise ValueError('Number of sources not found')
+    one['nsource'] = int(tag.data)
 
-    one['nsource'] = tag.data
     tag = find_tag(fid, node, FIFF.FIFF_NCHAN)
     if tag is None:
         fid.close()
         raise ValueError('Number of channels not found')
+    one['nchan'] = int(tag.data)
 
-    one['nchan'] = tag.data
     try:
         one['sol'] = _read_named_matrix(fid, node,
                                             FIFF.FIFF_MNE_FORWARD_SOLUTION)
diff --git a/mne/minimum_norm/inverse.py b/mne/minimum_norm/inverse.py
index 9399d06..a0a1102 100644
--- a/mne/minimum_norm/inverse.py
+++ b/mne/minimum_norm/inverse.py
@@ -21,6 +21,7 @@ from ..fiff.write import write_int, write_float_matrix, start_file, \
                          write_coord_trans
 
 from ..fiff.cov import read_cov, write_cov
+from ..fiff.pick import pick_types
 from ..cov import prepare_noise_cov
 from ..forward import compute_depth_prior, compute_depth_prior_fixed
 from ..source_space import read_source_spaces_from_tree, \
@@ -93,7 +94,7 @@ def read_inverse_operator(fname):
         raise Exception('Modalities not found')
 
     inv = dict()
-    inv['methods'] = tag.data
+    inv['methods'] = int(tag.data)
 
     tag = find_tag(fid, invs, FIFF.FIFF_MNE_SOURCE_ORIENTATION)
     if tag is None:
@@ -107,7 +108,7 @@ def read_inverse_operator(fname):
         fid.close()
         raise Exception('Number of sources not found')
 
-    inv['nsource'] = tag.data
+    inv['nsource'] = int(tag.data)
     inv['nchan'] = 0
     #
     #   Coordinate frame
@@ -1006,7 +1007,10 @@ def make_inverse_operator(info, forward, noise_cov, loose=0.2, depth=0.8):
     gain = np.dot(W, gain)
 
     source_cov = depth_prior.copy()
-    depth_prior = dict(data=depth_prior)
+    depth_prior = dict(data=depth_prior, kind=FIFF.FIFFV_MNE_DEPTH_PRIOR_COV,
+                       bads=None, diag=True, names=None, eig=None,
+                       eigvec=None, dim=depth_prior.size, nfree=1,
+                       projs=[])
 
     # apply loose orientations
     if not is_fixed_ori:
@@ -1016,7 +1020,11 @@ def make_inverse_operator(info, forward, noise_cov, loose=0.2, depth=0.8):
                                                                     % loose)
             orient_prior[np.mod(np.arange(n_dipoles), 3) != 2] *= loose
             source_cov *= orient_prior
-        orient_prior = dict(data=orient_prior)
+        orient_prior = dict(data=orient_prior,
+                            kind=FIFF.FIFFV_MNE_ORIENT_PRIOR_COV,
+                            bads=None, diag=True, names=None, eig=None,
+                            eigvec=None, dim=orient_prior.size, nfree=1,
+                            projs=[])
     else:
         orient_prior = None
 
@@ -1030,7 +1038,10 @@ def make_inverse_operator(info, forward, noise_cov, loose=0.2, depth=0.8):
     source_cov *= scaling_source_cov
     gain *= sqrt(scaling_source_cov)
 
-    source_cov = dict(data=source_cov)
+    source_cov = dict(data=source_cov, dim=source_cov.size,
+                      kind=FIFF.FIFFV_MNE_SOURCE_COV, diag=True,
+                      names=None, projs=[], eig=None, eigvec=None,
+                      nfree=1, bads=None)
 
     # now np.trace(np.dot(gain, gain.T)) == n_nzero
     # print np.trace(np.dot(gain, gain.T)), n_nzero
@@ -1038,16 +1049,34 @@ def make_inverse_operator(info, forward, noise_cov, loose=0.2, depth=0.8):
     print 'Computing SVD of whitened and weighted lead field matrix.'
     eigen_fields, sing, eigen_leads = linalg.svd(gain, full_matrices=False)
 
-    eigen_fields = dict(data=eigen_fields.T, col_names=ch_names)
-    eigen_leads = dict(data=eigen_leads.T, nrow=eigen_leads.shape[1])
+    eigen_fields = dict(data=eigen_fields.T, col_names=ch_names, row_names=[],
+                        nrow=eigen_fields.shape[1], ncol=eigen_fields.shape[0])
+    eigen_leads = dict(data=eigen_leads.T, nrow=eigen_leads.shape[1],
+                       ncol=eigen_leads.shape[0], row_names=[],
+                       col_names=[])
     nave = 1.0
 
+    # Handle methods
+    n_meg = len(pick_types(info, meg=True, eeg=False, exclude=info['bads']))
+    n_eeg = len(pick_types(info, meg=False, eeg=True, exclude=info['bads']))
+    has_meg = n_meg > 0
+    has_eeg = n_eeg > 0
+    if has_eeg and has_meg:
+        methods = FIFF.FIFFV_MNE_MEG_EEG
+    elif has_meg:
+        methods = FIFF.FIFFV_MNE_MEG
+    else:
+        methods = FIFF.FIFFV_MNE_EEG
+
     inv_op = dict(eigen_fields=eigen_fields, eigen_leads=eigen_leads,
                   sing=sing, nave=nave, depth_prior=depth_prior,
                   source_cov=source_cov, noise_cov=noise_cov,
                   orient_prior=orient_prior, projs=deepcopy(info['projs']),
                   eigen_leads_weighted=False, source_ori=forward['source_ori'],
                   mri_head_t=deepcopy(forward['mri_head_t']),
-                  src=deepcopy(forward['src']))
+                  methods=methods, nsource=forward['nsource'],
+                  coord_frame=forward['coord_frame'],
+                  source_nn=forward['source_nn'].copy(),
+                  src=deepcopy(forward['src']), fmri_prior=None)
 
     return inv_op
diff --git a/mne/minimum_norm/tests/test_inverse.py b/mne/minimum_norm/tests/test_inverse.py
index 793f59e..79e6c56 100644
--- a/mne/minimum_norm/tests/test_inverse.py
+++ b/mne/minimum_norm/tests/test_inverse.py
@@ -11,7 +11,7 @@ from ...label import read_label, label_sign_flip
 from ...event import read_events
 from ...epochs import Epochs
 from ...source_estimate import SourceEstimate
-from ... import fiff, Covariance, read_forward_solution
+from ... import fiff, read_cov, read_forward_solution
 from ..inverse import apply_inverse, read_inverse_operator, \
                       apply_inverse_raw, apply_inverse_epochs, \
                       make_inverse_operator, write_inverse_operator
@@ -43,7 +43,7 @@ inverse_operator = read_inverse_operator(fname_inv)
 inverse_operator_fixed = read_inverse_operator(fname_inv_fixed)
 inverse_operator_vol = read_inverse_operator(fname_vol_inv)
 label = read_label(fname_label)
-noise_cov = Covariance(fname_cov)
+noise_cov = read_cov(fname_cov)
 raw = fiff.Raw(fname_raw)
 snr = 3.0
 lambda2 = 1.0 / snr ** 2
@@ -111,6 +111,7 @@ def test_apply_inverse_operator():
 
     my_inv_op = make_inverse_operator(evoked.info, fwd_op, noise_cov,
                                       loose=0.2, depth=0.8)
+    write_inverse_operator('test-inv.fif', my_inv_op)
 
     my_stc = apply_inverse(evoked, my_inv_op, lambda2, dSPM)
 

-- 
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