Everything is correct.
Vladimir
On Tue, Apr 27, 2010 at 2:36 PM, Markus Bauer <[log in to unmask]> wrote:
> Hi Vladimir
>
> thanks a lot for your elaborated and detailed response...
>
> to quickly summarize and check that I have understood you correctly:
>
> forward.datareg.fid_mri.fid.pnt -
>
> "sensor coordinate" based positions of the fiducials.
> 'sensor based' meaning here that they are in the same coordinate system as
> the D.sensors (or in fieldtrip the 'grad' definition) - but does not
> (necessarily) mean that they are "locked" to the actual sensor positions.
> those can vary between datasets (esp for MEG)
>
> D.inv{...}.mesh.Affine -
>
> is the transformation matrix between the coordinate system inherent to the
> individual MRI (i.e usually the analyze file *.hdr/*.img) and the MNI
>
> the transformation matrix (in the code represented by 'M1') that rotates the
> 'sensor-based' (in the case of CTF: head-based) coordinate system onto the
> native individual's MRI (as in the analyze file) - is not directly stored
> but can be obtained by:
>
> inv(D.inv{val}.mesh.Affine) * D.inv{val}.datareg(ind).toMNI
>
>
> Thanks a lot again. I guess that should be correct and seems quite clear.
> Markus
>
>
>
>> Hi Markus,
>>
>> On Mon, Apr 26, 2010 at 5:51 PM, Markus Bauer<[log in to unmask]> 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.
>>
>> Best,
>>
>> Vladimir
>>
>
|