[FieldTrip] Electrode alignment to standard MRI template
Annika Thierfelder
athierfelder at tuebingen.mpg.de
Thu Aug 23 17:25:37 CEST 2018
Dear Jan-Mathijs,
thank you very much for your help and taking the time, your code did the
job for me - it looks pretty good now! My electrode set wasn't in
ctf-coordinates, so I had to do it a little bit different but it worked
out well.
Thanks again and have a good start into the weekend soon,
Annika
On 8/23/2018 2:57 PM, Schoffelen, J.M. (Jan Mathijs) wrote:
> Dear Annika,
>
> It’s a bit unfortunate that you ended up using the low-level
> information in the mri.hdr.fiducial field (in combination with the
> transformation matrices). I agree with you that the values are
> strange, and I am pretty sure that they do not correspond with the
> volumetric image in the same data structure. Note that the mri itself
> also has a ‘transform’ field, which provides you with the mapping
> between voxels and head space (MNI-convention, ACPC-based RAS). If you
> aim for a 3-point (nas,lpa,rpa) based coregistration between your
> electrodes and the templates needed for source reconstruction, you
> could use the set of fiducial positions that can be found in
> fieldtrip/electrode/standard1005.elc. (an alternative and possibly
> better coregistration could be achieved using a non-linear matching
> with the ‘template’ method, but that might be a story of its own).
>
> If you do:
>
> >> sens=ft_read_sens('standard_1005.elc');
> >> sens.chanpos(1:3,:)
>
> ans =
>
> -86.0761 -19.9897 -47.9860
> 85.7939 -20.0093 -48.0310
> 0.0083 86.8110 -39.9830
>
> (note that this very nicely corresponds with the template fiducials
> you reported in your e-mail)
>
> >> sens.label(1:3)
>
> ans =
>
> 'LPA'
> 'RPA'
> ‘Nz'
>
>
>
> you can verify that these three fiducials are expressed in head
> coordinates according to the ‘spm’ convention, i.e. Anterior
> Commissure is origin, the line through AC and PC is the y-axis, x-axis
> pointing to the right etc). This verification can be done with
>
> >>load(‘standard_mri’);,
>
> >>cfg = [];
> >>cfg.location = sens.chanpos(1,:);
> >>figure;ft_sourceplot(cfg, mri);
>
> Now, if /your/ electrodes' coordinate system is the same as the
> anatomical mri’s, then you can proceed to ft_electroderealign.
>
> Yet, your electrodes’ coordinate system is different, because you
> report that you’d expect the nasion to be [100 0 0], i.e. the x-axis
> to go exactly through the nasion, and the positive y-axis pointing to
> the left. This is then an ALS-based coordinate system with the origin
> somewhere between the ears (the exact definition depends on whether
> you are using the convention that e.g. CTF uses, as compared to the
> ASA coordinate system: see ‘help ft_headcoordinates’ and the fieldtrip
> wiki’s faq about coordinate systems).
>
> Now, if you need to get your electrodes expressed in the coordinate
> system that is the same as the one in which the headmodel is specified
> (called ‘spm’, or ‘acpc’), then you can do the following:
>
> T =
> ft_headcoordinates(sens.chanpos(3,:),sens.chanpos(1,:),sens.chanpos(2,:),’ctf’);
> % or ‘asa'
>
> This gives you a transformation matrix that maps from the space in
> which the ‘fiducials’ are expressed (in this case: spm) to a
> ctf/asa-based coordinate system. This you can verify with
>
> ft_warp_apply(T, sens.chanpos(1:3,:));,
>
> which will give you the fiducials’ coordinates with values close to 0,
> on 2 out of three values. Then, the inv(T) is transforming from the
> ctf/asa-based coordinate system into spm’s convention, so you can do:
>
> chanlocs_124_transformed = ft_transform_geometry(inv(T), chanlocs_124);
>
> I think that this already should get you close to where you want to
> end up.
>
> And yes, coordinate systems are always complicated.
>
> Good luck,
>
> Jan-Mathijs
>
> PS: I have removed the hdr-fields from standard_mri and standard_seg
> in the release version of the code, to avoid any future confusion.
>
>
>> On 23 Aug 2018, at 11:06, Annika Thierfelder
>> <athierfelder at tuebingen.mpg.de
>> <mailto:athierfelder at tuebingen.mpg.de>> wrote:
>>
>> Hello everyone,
>>
>> short update on my question, that is maybe easier to answer without
>> going through the code itself.
>>
>> I believe that the heart of the problem lies (of course) in the
>> coordinate definitions of the electrodes and the MRI. So, I
>> experimented a little with the example electrode set that is aligned
>> to the standard BEM model that results from the standard MRI. If I
>> try to align the example electrodes to the MRI (which is not
>> necessary but it also should not hurt), I discovered that I get the
>> same shift into the z-direction for the example electrodes.
>>
>> So, the basic question underlying my problem would be: How can the
>> MRI and the eletrodes be aligned if their fiducials are so different,
>> they even seem to be in different coordinate systems? Shouldn't they
>> be kind of similar if they are aligned? I did not see any further
>> coordinate transformation in the BEM computation from the MRI (except
>> for the conversion into 'acpc' in ft_volumesegment which doesn't
>> change anything) that would explain the alignment later on.
>>
>> MRI fiducials:
>> NAS [1, 0, 0]
>> LPA [0, 83, 0]
>> RPA [0, -117, 0]
>>
>> template electrode fiducials are roughly:
>> NAS [0, 87, -40]
>> LPA [-86, -20, -48]
>> RPA [86, -20, -48]
>>
>> Also, the MRI is supposed to be in MNI coordinates, which I don't
>> understand why, because already the first dimension doesn't point to
>> the right. I feel like understanding why the coordinates are this way
>> would be a crucial step to solve my problem.
>>
>> I'm very thankful for any help on this problem. If I understand this,
>> I hopefully can figure out the rest myself.
>>
>> Best regards,
>> Annika
>>
>> On 8/21/2018 6:21 PM, Annika Thierfelder wrote:
>>> Hello everyone,
>>>
>>> I started using fieldtrip last week to do EEG source analysis and I
>>> experienced some issues when trying to align the EEG to the MRI.
>>> Since we don't have MRI scans for our subjects, I used the
>>> standard_mri from the template folder.
>>>
>>> The solution that works "best" until now is to align the electrodes
>>> with the MRI fiducials and compute the BEM from the MRI seperately
>>> (I used bemcp for that since I work on windows, so dipoli doesn't
>>> run). However, when I plot the aligned electrodes together with the
>>> BEM head surface, the electrodes are in the correct orientation but
>>> they have an offset along the z-axis. I put the code I used below
>>> and uploaded the picture of the electrodes and the head model on
>>> google drive:
>>> https://drive.google.com/open?id=1b7Q3YGWGyzaa5oXeE-PfOOHNIDoFaLO1
>>>
>>> There are two things I'm wondering about now:
>>>
>>> Why are the nasion head coordinates in the MRI template [1, 0, 0]
>>> and not [100, 0, 0], which would make more sense (at least in my
>>> opinion) since the units are in mm and I thought the nasion is not
>>> supposed to be inside the head? The LPA and RPA values are [0, 83,
>>> 0] and [0, -117, 0] respectively, which seems perfectly fine to me.
>>>
>>> I have the feeling that the problem arises because the two
>>> coordinate systems of the data do not have the same origin. Can I
>>> shift the coordinate system of the electrode space before aligning
>>> them? I only found ways how to change the coordinate system of the
>>> MRI. I also tried to change the MRI coordinate system first before
>>> aligning the electrodes, but I found that I cannot create the BEM
>>> model with 'bemcp' anymore. It seems to throw an error if I give it
>>> an MRI with any coordinate system that is not 'spm'. So I kind of
>>> have the feeling that I need to get the electrodes into the 'spm'
>>> coordinates to match the MRI and BEM head.
>>>
>>> Thank you a lot in advance for your support!
>>>
>>> Annika
>>>
>>> PS: I know there has been a similar problem once in this mailing
>>> list, but I checked the suggestions and they did not work for me,
>>> also it seemed as if in the end it came down to fitting the
>>> electrodes manually there, and I suppose there can be another
>>> solution for this.
>>>
>>> ==================================================================================
>>>
>>>
>>> Code for the electrode alignment:
>>>
>>> %This is my how my electrode data looks like:
>>> disp(chanlocs_124)
>>> label: {124×1 cell}
>>> elecpos: [124×3 double]
>>> unit: 'mm'
>>>
>>> % get fiducials from the MRI template
>>> vox_Nas = mri_spm.hdr.fiducial.mri.nas;
>>> vox_Lpa = mri_spm.hdr.fiducial.mri.lpa;
>>> vox_Rpa = mri_spm.hdr.fiducial.mri.rpa;
>>>
>>> % I know I can skip this step because I can directly use the
>>> head-coordinates given in the MRI template
>>> % I kept it because it doesn't make a difference
>>> vox2head = mri_spm.hdr.transformMRI2Head;
>>> head_Nas = ft_warp_apply(vox2head, vox_Nas, 'homogeneous'); % nasion
>>> head_Lpa = ft_warp_apply(vox2head, vox_Lpa, 'homogeneous'); % Left
>>> preauricular
>>> head_Rpa = ft_warp_apply(vox2head, vox_Rpa, 'homogeneous'); % Right
>>> preauricular
>>>
>>> % save the MRI fiducials as target structure for the realignment
>>> % in our data set, the LPA is named TTP9 and the RPA is TTP10, so I
>>> renamed them
>>> elec_mri.elecpos(1,:) = head_Nas;
>>> elec_mri.elecpos(2,:) = head_Lpa;
>>> elec_mri.elecpos(3,:) = head_Rpa;
>>> elec_mri.label = {'Nz', 'TTP9', 'TTP10'};
>>> elec_mri.unit = 'mm';
>>>
>>> % coregister the electrodes to the MRI using fiducials
>>> cfg = [];
>>> cfg.method = 'fiducial';
>>> cfg.target = elec_mri;
>>> cfg.elec = chanlocs_124;
>>> cfg.fiducial = {'Nz', 'TTP9', 'TTP10'};
>>> chanlocs_124_spm = ft_electroderealign(cfg);
>>>
>>> ===================================================================================================
>>>
>>> Just in case this is also of interest, this is how I compute the BEM
>>> headmodel from the same MRI template:
>>>
>>> % segments the MRI into three different tissue parts
>>> % creates binary masks for each point and tissue part
>>> cfg = [];
>>> cfg.output = {'brain','skull','scalp'};
>>> segmented_mri = ft_volumesegment(cfg, mri_spm);
>>>
>>> %% create mesh with different tissues
>>> cfg=[];
>>> cfg.tissue={'brain','skull','scalp'};
>>> cfg.numvertices = [3000 2000 1000];
>>> bnd=ft_prepare_mesh(cfg,segmented_mri);
>>>
>>> % compute headmodel
>>> cfg = [];
>>> cfg.tissue={'brain','skull','scalp'};
>>> cfg.method ='bemcp';
>>> vol = ft_prepare_headmodel(cfg, bnd);
>>>
>>> _______________________________________________
>>> fieldtrip mailing list
>>> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>> https://doi.org/10.1371/journal.pcbi.1002202
>>
>> _______________________________________________
>> fieldtrip mailing list
>> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>> https://doi.org/10.1371/journal.pcbi.1002202
>
>
>
> _______________________________________________
> fieldtrip mailing list
> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
> https://doi.org/10.1371/journal.pcbi.1002202
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20180823/0c3c2594/attachment-0002.html>
More information about the fieldtrip
mailing list