[med-svn] [python-mne] 340/376: ENH: adding transform_coordinates
Yaroslav Halchenko
debian at onerussian.com
Fri Nov 27 17:23:18 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 9caac935b0d25c8a918b68210d600dc11c6a164e
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date: Tue Aug 16 18:15:59 2011 -0400
ENH: adding transform_coordinates
---
mne/__init__.py | 1 +
mne/transforms.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 109 insertions(+), 1 deletion(-)
diff --git a/mne/__init__.py b/mne/__init__.py
index 5a01bf5..92379c9 100644
--- a/mne/__init__.py
+++ b/mne/__init__.py
@@ -12,6 +12,7 @@ from .source_space import read_source_spaces
from .epochs import Epochs
from .label import label_time_courses, read_label
from .misc import parse_config, read_reject_parameters
+from .transforms import transform_coordinates
import fiff
import artifacts
import stats
diff --git a/mne/transforms.py b/mne/transforms.py
index 2b07e49..8908e5a 100644
--- a/mne/transforms.py
+++ b/mne/transforms.py
@@ -2,7 +2,9 @@ import copy
import numpy as np
from scipy import linalg
-# from .fiff import FIFF
+from .fiff import FIFF
+from .fiff.open import fiff_open
+from .fiff.tag import read_tag
def invert_transform(trans):
@@ -53,6 +55,111 @@ def transform_source_space_to(src, dest, trans):
return res
+def transform_coordinates(filename, pos, orig, dest):
+ """Transform coordinates between various MRI-related coordinate frames
+
+ Parameters
+ ----------
+ filename: string
+ Name of a fif file containing the coordinate transformations
+ This file can be conveniently created with mne_collect_transforms
+ pos: array of shape N x 3
+ array of locations to transform (in meters)
+ orig: 'meg' | 'mri'
+ Coordinate frame of the above locations.
+ 'meg' is MEG head coordinates
+ 'mri' surface RAS coordinates
+ dest: 'meg' | 'mri' | 'fs_tal' | 'mni_tal'
+ Coordinate frame of the result.
+ 'mni_tal' is MNI Talairach
+ 'fs_tal' is FreeSurfer Talairach
+
+ Return
+ ------
+ trans_pos: array of shape N x 3
+ The transformed locations
+
+ Example
+ -------
+ >>> transform_coordinates('all-trans.fif', np.eye(3), 'meg', 'fs_tal')
+ >>> transform_coordinates('all-trans.fif', np.eye(3), 'mri', 'mni_tal')
+ """
+ # Read the fif file containing all necessary transformations
+ fid, tree, directory = fiff_open(filename)
+
+ coord_names = dict(mri=FIFF.FIFFV_COORD_MRI,
+ meg=FIFF.FIFFV_COORD_HEAD,
+ mni_tal=FIFF.FIFFV_MNE_COORD_MNI_TAL,
+ fs_tal=FIFF.FIFFV_MNE_COORD_FS_TAL)
+
+ orig = coord_names[orig]
+ dest = coord_names[dest]
+
+ T0 = T1 = T2 = T3plus = T3minus = None
+ for d in directory:
+ if d.kind == FIFF.FIFF_COORD_TRANS:
+ tag = read_tag(fid, d.pos)
+ trans = tag.data
+ if (trans['from'] == FIFF.FIFFV_COORD_MRI and
+ trans['to'] == FIFF.FIFFV_COORD_HEAD):
+ T0 = invert_transform(trans)
+ elif (trans['from'] == FIFF.FIFFV_COORD_MRI and
+ trans['to'] == FIFF.FIFFV_MNE_COORD_RAS):
+ T1 = trans
+ elif (trans['from'] == FIFF.FIFFV_MNE_COORD_RAS and
+ trans['to'] == FIFF.FIFFV_MNE_COORD_MNI_TAL):
+ T2 = trans
+ elif trans['from'] == FIFF.FIFFV_MNE_COORD_MNI_TAL:
+ if trans['to'] == FIFF.FIFFV_MNE_COORD_FS_TAL_GTZ:
+ T3plus = trans
+ elif trans['to'] == FIFF.FIFFV_MNE_COORD_FS_TAL_LTZ:
+ T3minus = trans
+ fid.close()
+ #
+ # Check we have everything we need
+ #
+ if ((orig == FIFF.FIFFV_COORD_HEAD and T0 is None) or (T1 is None)
+ or (T2 is None) or (dest == FIFF.FIFFV_MNE_COORD_FS_TAL and
+ ((T3minus is None) or (T3minus is None)))):
+ raise ValueError('All required coordinate transforms not found')
+
+ #
+ # Go ahead and transform the data
+ #
+ if pos.shape[1] != 3:
+ raise ValueError('Coordinates must be given in a N x 3 array')
+
+ if dest == orig:
+ trans_pos = pos.copy()
+ else:
+ n_points = pos.shape[0]
+ pos = np.c_[pos, np.ones(n_points)].T
+ if orig == FIFF.FIFFV_COORD_HEAD:
+ pos = np.dot(T0['trans'], pos)
+ elif orig != FIFF.FIFFV_COORD_MRI:
+ raise ValueError('Input data must be in MEG head or surface RAS '
+ 'coordinates')
+
+ if dest == FIFF.FIFFV_COORD_HEAD:
+ pos = np.dot(linalg.inv(T0['trans']), pos)
+ elif dest != FIFF.FIFFV_COORD_MRI:
+ pos = np.dot(np.dot(T2['trans'], T1['trans']), pos)
+ if dest != FIFF.FIFFV_MNE_COORD_MNI_TAL:
+ if dest == FIFF.FIFFV_MNE_COORD_FS_TAL:
+ for k in xrange(n_points):
+ if pos[2, k] > 0:
+ pos[:, k] = np.dot(T3plus['trans'], pos[:, k])
+ else:
+ pos[:, k] = np.dot(T3minus['trans'], pos[:, k])
+ else:
+ raise ValueError('Illegal choice for the output '
+ 'coordinates')
+
+ trans_pos = pos[:3, :].T
+
+ return trans_pos
+
+
# def transform_meg_chs(chs, trans):
# """
# %
--
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