fiducials: head -> MRI ccordinates ?

Vladimir Litvak v.litvak at ION.UCL.AC.UK
Tue Apr 27 13:32:49 CEST 2010

Hi Markus,

On Mon, Apr 26, 2010 at 5:51 PM, Markus Bauer <m.bauer at> wrote:
> Are the fiducial positions after manual coregistration (using
> spm_eeg_inv_datareg_ui) stored anywhere in MRI-coordinates?
> I looked into the code and from what I see there, the manually entered
> fiducials (by clicking in the interactive window) are stored in the
> following field:
> forward.datareg.fid_mri.fid.pnt
> But that seems to be in (CTF ?) headcoordinates.
> I also found
> forward.mesh.fid.fid.pnt
> which seem to be the standard (MNI based) fiducial positions.
> I also found
> forward.datareg.fid_eeg.fid.pnt
> which could be the fiducials measured by the system, but I neither found the
> fiducials in MRI coordinates nor the transformation matrix to go from MRI to
> headcoordinates.
> Do you know where that is?

I'll try to give a detailed answer this time to explain the logic
behind the code. SPM needs to take into account 4 coordinate systems
that might or might not be different.

1) The coordinate system in which sensor locations were provided.
That's what you get from D.sensors and D.fiducials.
2) MNI coordinates corresponding to the template brain .
3) Native coordinates corresponding to the subject's structural. They
might be the same as MNI coordinates of the structural was
coregistered to the template, but might also be different.
4) The coordinate system in which MRI and sensors are coregistered. In
the case of EEG these are 'native coordinates' (3) and in the case of
MEG these are sensor coordinates (1). Usually for MEG these are so
called head coordinates, but they are defined in different way for
different MEG systems.

The reason for the difference between EEG and MEG is that for EEG the
coordinate system where sensor locations are measured is usually not
very meaningful so it is convenient to express everything in
MRI-linked coordinates. In MEG, however, it is convenient to use head
coordinates because then the same coregistration can be used for
different runs  (the location of the head in head coordinates is fixed
and only the sensor locations change).

Now, the canonical meshes that can be found in the .gii files under
spm/canonical are in MNI coordinates. There is also a set of standard
fiducials defined in MNI coordinates on the template brain. When you
use individual structural, nonlinear transformation is computed from
the template image to your individual image. The meshes and the
standard fiducials are then warped to correspond to the individual
image. These new meshes are stored in gii files in the directory where
that structural is. The names of these files appear in
D.inv{...}.mesh. There is also a copy of the unwarped canonical mesh
stored there (mesh.tess_mni). This is useful for producing output when
you move your datasets with inversions somewhere where the links to
individual meshes no longer work. Under D.inv{...}.mesh.fid you can
find the standard fiducials transformed to the 'native' coordinates.
If you use the template rather than individual image, these fiducials
will be in MNI coordinates. Under D.inv{...}.mesh.Affine you can find
a transformation matrix from native to MNI coordinates. Note that this
is just approximation to the nonlinear transform that is actually
applied to the meshes.

Now, when you do coregistration you define some corresponding points
in the native coordinates to at least 3 fiducials from those available
in sensor coordinates. These are used to compute the transformation
matrix between sensor and native coordinates (called M1 in the code of
spm_eeg_inv_datareg_ui). In the MEG case everything is then stored in
sensor coordinates, including the MRI fiducials. The function also
computes transformation matrices between the coregistration
coordinates (head coordinates) and MNI coordinates, since these are
the most useful to know in practice. If you look at lines 174-175 in
the latest version, you'll see:

D.inv{val}.datareg(ind).toMNI = D.inv{val}.mesh.Affine*M1;
D.inv{val}.datareg(ind).fromMNI = inv(D.inv{val}.datareg(ind).toMNI);

Now I can finally answer your question. You have MRI fiducials in head
coordinates stored under D.inv{...}.datareg.fid_mri . You can use the
function forwinv_transform_headshape (in the latest in-house SPM it's
called ft_transform_headshape) to transform these fiducials to another
coordinate system. All you need to provide is a 4x4 transformation
matrix. All you need for that is also provided. To go from head to MNI
coordinates you can use D.inv{...}.datareg.toMNI . To go to native
coordinates you can use
inv(D.inv{...}.mesh.Affine)*D.inv{...}.datareg.toMNI. So let's say
that you have a unimodal MEG dataset with a single inversion and want
to get MRI fiducials in MNI coordinates. Then you do:

mnifid = ft_transform_headshape(D.inv{1}.datareg.toMNI,
D.inv{1}.datareg.fid_mri );

I hope that was clear. If not, keep asking.



The aim of this list is to facilitate the discussion between users of the FieldTrip  toolbox, to share experiences and to discuss new ideas for MEG and EEG analysis. See also and

More information about the fieldtrip mailing list