[FieldTrip] problem with EEG source reconstruction

Thomas Sauvigny tsauvigny at gmail.com
Sun Feb 23 18:51:22 CET 2014


Awesome, Thank you Chaitanya and Leo!
Am 23.02.2014 13:27 schrieb "Zizlsperger Leopold" <zizlsperger at gmail.com>:

> Hello
> in view of your code: first check if
> elec2       = ft_read_sens('standard_1020.elc');
> corresponds to the channel structure of your functional data (averages).
> Best to Hamburg
> Leo
>
> --
>
>
> Dr. med. Leopold Zizlsperger
> Klinik für Neurologie
> Uniklinik RWTH Aachen
> Pauwelsstrasse 30
> 52074 Aachen
> Tel: +49 241 80 35465
> lzizlsperger at ukaachen.de
>
>
>
>
>
> Leopold Zizlsperger, MD
> Department of Neurology
> RWTH Aachen University
> Pauwelsstrasse 30
> 52074 Aachen, Germany
> Tel: +49 241 80 35465
> lzizlsperger at ukaachen.de
>
>
> On 22 Feb 2014, at 15:38, Chaitanya Srinivas <chaitanya.pro at gmail.com>
> wrote:
>
> Hi Thomas,
>
>  When I was working with actual data, once I got this error. At that time,
> it was the problem of having different number of electrodes for the forward
> solution (lead-field) i have created and for each subject recording
> electrodes. Each subject has different set of recording electrodes which
> gave this problem. I think we have to check the difference in electrodes or
> number of sensors.
>
>
>
> *=============================================== *
>
>
> *<image.png>**Best Regards*
>
>
> *Chaitanya Srinivas Lanka Wiss. Mitarbeiter
>                                       *
>
> *PhD Student Functional and Restorative Neurosurgery Neural Information
> ProcessingNeurosurgical University Hospital*
>
> *             Graduate Training Center for Neuroscience  Eberhard Karls
> University                          Eberhard Karls University **Otfried-Mueller-Str.45
> Österbergstr. 3*
> *  D-72076 Tuebingen                                    **D-72074
> Tuebingen*
>
> *Mobile Phone Number : +49-176-79035731*
> *===============================================*
>
>
> On Sat, Feb 22, 2014 at 2:32 PM, Thomas Sauvigny <tsauvigny at gmail.com>wrote:
>
>> Dear fellow fiedtrippers,
>>
>> I would like to do a source reconstruction of EEG data using The FielTrip
>> example MRI dataset via minimum-norm estimate. I stick close to the MNE
>> tutorial (http://fieldtrip.fcdonders.nl/tutorial/minimumnormestimate)
>> and use a few steps from the EEG headmodel tutorial as well (
>> http://fieldtrip.fcdonders.nl/tutorial/headmodel_eeg). Unfortunately, I
>> am struggling to combine the information from both tutorials in some
>> crucial step prior to ft_sourceanalysis.
>> My first approach has been to basically run through the MNE tutorial
>> using the Fieltrip MRI dataset. As I could not save both the original
>> anatomy and the masked anatomy in a freesurfer compatible format while
>> using
>>
>> *cfg           = [];*
>> *cfg.output    = {'brain','skull','scalp'};*
>> *segmentedmri  = ft_volumesegment(cfg, mri);*
>>
>> I instead proceeded as mentioned below and aligned the electrodes to the
>> scalp in a second step (according to the headmodel tutorial). But when I
>> want to combine the headmodel (vol) and the electrodes (elec_aligned2) into
>> the leadfield, that does not work:
>>
>> *using headmodel specified in the configuration*
>> *using electrodes specified in the configuration*
>> *Error using ft_prepare_vol_sens (line 534)*
>> *unsupported volume conductor model for EEG*
>>
>> *Error in prepare_headmodel (line 94)*
>> *[vol, sens] = ft_prepare_vol_sens(vol, sens, 'channel', cfg.channel,
>> 'order',*
>> *cfg.order);*
>>
>> *Error in ft_prepare_leadfield (line 124)*
>> *[vol, sens, cfg] = prepare_headmodel(cfg, data);*
>>
>>
>> When I instead use the volume conduction model built in the headmodel
>> tutorial (vol2) and the sourcespace from the MNE tutorial I get:
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> *Error using  * Inner matrix dimensions must agree.Error in
>> minimumnormestimate (line 179)      A       = P*A; % prewhitened
>> leadfieldsError in ft_sourceanalysis (line 869)         dip(i) =
>> minimumnormestimate(grid, sens, vol, squeeze_avg, optarg{:},
>> 'noisecov', squeeze(Cy(i,:,:)));*
>>
>> In older posts in the mailing list there appeared to be problems with the
>> scaling of the different components and I adapted the units, but that did
>> not solve the problems.
>> I would be very thankful for any help.
>>
>>
>>
>> cheers
>> Thomas
>>
>>
>>
>>
>>
>>
>>
>>
>> My script:
>>
>> clear all;
>> mri = ft_read_mri('Subject01.mri');
>> save mri mri;
>> disp(mri)
>>
>> cfg            = [];
>> cfg.resolution = 1;
>> cfg.dim        = [256 256 256];
>> mrirs          = ft_volumereslice(cfg, mri);
>> save mrirs mrirs;
>>
>> % segmentation of the mri
>> % load mrirs;
>> cfg           = [];
>> cfg.coordsys  = 'ctf';
>> cfg.output    = {'skullstrip' 'brain'};
>> seg           = ft_volumesegment(cfg, mrirs);
>> save seg seg;
>>
>> disp(seg(1))
>>
>> %%% Thus, you need to identify the anterior commissure, the posterior
>> commissure, and an interhemispheric point (which defines the XZ-plane). You
>> can navigate across the slices with the arrows.
>> %%% By pressing the 'a', 'p', and 'z' at the right locations, the voxel
>> %%% coordinates of these landmarks are stored:
>> % load mrirs;
>> cfg        = [];
>> cfg.method = 'interactive';
>> mri_tal    = ft_volumerealign(cfg, mrirs);
>> save mri_tal mri_tal
>>
>> clear all;
>> load mri_tal;
>> load seg;
>> % ensure that the skull-stripped anatomy is expressed in the same
>> coordinate system as the anatomy
>> seg.transform = mri_tal.transform;
>> % save both the original anatomy, and the masked anatomy in a freesurfer
>> compatible format
>> cfg             = [];
>> cfg.filename    = 'Subject01';
>> cfg.filetype = 'mgz';
>> cfg.parameter   = 'anatomy';
>> ft_volumewrite(cfg, mri_tal);
>> cfg.filename    = 'Subject01masked';
>> ft_volumewrite(cfg, seg);
>>
>> %%%%% MAC Terminal Input %%%%%%%%%%%%%%%%
>> tcsh
>> chsh -s /bin/tcsh
>> setenv FREESURFER_HOME /Applications/freesurfer
>> source $FREESURFER_HOME/SetUpFreeSurfer.csh
>>
>> setenv SUBJECTS_DIR /Applications/freesurfer/subjects
>> setenv SUBJECT /Subject01
>> %%% .mgz files to mri folder
>> cd $SUBJECTS_DIR/Subject01/mri/
>> mri_convert -c -oc 0 0 0 Subject01masked.mgz orig.mgz
>> mri_convert -c -oc 0 0 0 Subject01.mgz orig-nomask.mgz
>>
>> recon-all -talairach -subjid Subject01
>> recon-all -nuintensitycor -subjid Subject01
>> recon-all -normalization -subjid Subject01
>> cp T1.mgz brainmask.mgz
>> recon-all -gcareg -subjid Subject01
>> recon-all -canorm -subjid Subject01
>> recon-all -careg -subjid Subject01
>> recon-all -calabel -subjid Subject01
>> recon-all -normalization2 -subjid Subject01
>> recon-all -segmentation -subjid Subject01
>> recon-all -fill -subjid Subject01
>>
>>
>> %%% This ends the part of the Freesurfer pipeline concerned with
>> volumetric processing. At this stage you should have a file filled.mgz
>> containing the segmentation of the cortical white matter (cerebellum is not
>> included!).
>> %%% You can check how this looks using FieldTrip, by doing the following:
>> % % go to the Subject01/mri directory
>> mri = ft_read_mri('filled.mgz');
>> cfg = [];
>> cfg.interactive = 'yes';
>> figure;ft_sourceplot(cfg, mri);
>>
>> %%% back in Terminal:
>> cd $SUBJECTS_DIR/Subject01/mri/
>> recon-all -tessellate -subjid Subject01
>> recon-all -smooth1 -subjid Subject01
>> recon-all -inflate1 -subjid Subject01
>> recon-all -qsphere -subjid Subject01
>> recon-all -fix -subjid Subject01
>> cp brain.mgz brain.finalsurfs.mgz
>> recon-all -finalsurfs -subjid Subject01
>> recon-all -smooth2 -subjid Subject01
>> recon-all -inflate2 -subjid Subject01
>> recon-all -sphere -subjid Subject01
>> recon-all -surfreg -subjid Subject01
>>
>> %%% MNE download and installation %%%%%%%%%%%%%%
>> setenv MNE_ROOT /Applications/MNE-2.7.4-3378-MacOSX-x86_64
>> setenv MATLAB_ROOT /Applications/MATLAB_R2013b.app
>> source $MNE_ROOT/bin/mne_setup
>>
>> %  http://martinos.org/mne/stable/manual/list.html
>> cd $MNE_ROOT/bin
>> ./mne_setup_sh
>>
>> setenv SUBJECTS_DIR /Applications/freesurfer/subjects
>> setenv SUBJECT /Subject01
>>
>> ./mne_setup_source_space --ico -6 --overwrite
>>
>> %%%% back in Matlab: /Applications/freesurfer/subjects/Subject01/bem
>> bnd = ft_read_headshape('Subject01-oct-6-src.fif', 'format',
>> 'mne_source');
>> figure;ft_plot_mesh(bnd);
>>
>> %%% Current Folder :
>> /Applications/freesurfer/subjects/Subject01/Subject01/mri
>> mri_nom = ft_read_mri('orig-nomask.mgz');
>>
>> cfg = [];
>> cfg.method = 'interactive';
>> mri_nom_ctf = ft_volumerealign(cfg, mri_nom);
>>
>> %%% fiducials chosen, fiducials l,r,n
>>
>> mri_nom_ctf = ft_convert_units(mri_nom_ctf, 'cm');
>> T   = mri_nom_ctf.transform*inv(mri_nom_ctf.transformorig);
>> %%% Current Folder :
>> /Applications/freesurfer/subjects/Subject01/Subject01/bem
>> bnd  = ft_read_headshape('Subject01-oct-6-src.fif', 'format',
>> 'mne_source');
>> sourcespace = ft_convert_units(bnd, 'cm');
>> sourcespace = ft_transform_geometry(T, sourcespace);
>> save sourcespace sourcespace;
>> save T T; %we will need the transformation matrix in the next step
>>
>> %%% Current Folder auf:
>> /Applications/freesurfer/subjects/Subject01/Subject01/mri
>> mri_nom = ft_read_mri('orig-nomask.mgz');
>>
>> cfg           = [];
>> cfg.coordsys  = 'spm';
>> cfg.output    = {'brain'};
>> seg           = ft_volumesegment(cfg, mri_nom);
>> seg           = ft_convert_units(seg,'cm');
>>
>> cfg           = [];
>> cfg.method    = 'singleshell';
>> vol           = ft_prepare_headmodel(cfg,seg);
>> vol.bnd       = ft_transform_geometry(T, vol.bnd);
>> save vol vol;
>>
>> % load vol                                       % volume conduction model
>> figure;hold on;
>> ft_plot_vol(vol, 'facecolor', 'none');alpha 0.5;
>> ft_plot_mesh(sourcespace, 'edgecolor', 'none'); camlight
>>
>>
>>
>> %%% so far, so good. >>> then I create the elec file:
>> clear all;
>> mri2 = ft_read_mri('Subject01.mri');
>> disp(mri2)
>> save mri2 mri2;
>>
>> cfg           = [];
>> cfg.output    = {'brain','skull','scalp'};
>> segmentedmri2  = ft_volumesegment(cfg, mri2);
>> save segmentedmri2 segmentedmri2
>> disp(segmentedmri2)
>>
>> cfg=[];
>> cfg.tissue={'brain','skull','scalp'};
>> cfg.numvertices = [3000 2000 1000];
>> bnd2=ft_prepare_mesh(cfg,segmentedmri2);
>>
>> save bnd2 bnd2
>>
>> disp(bnd2(1))
>>
>> cfg        = [];
>> cfg.method ='dipoli';
>> vol2        = ft_prepare_headmodel(cfg, segmentedmri2);
>>
>> save vol2 vol2
>>
>> disp(vol2)
>>
>> vol2 = ft_convert_units(vol2, 'cm');
>>
>>
>> figure;
>> ft_plot_mesh(vol2.bnd(1),'facecolor','none'); %scalp
>> figure;
>> ft_plot_mesh(vol2.bnd(2),'facecolor','none'); %skull
>> figure;
>> ft_plot_mesh(vol2.bnd(3),'facecolor','none'); %brain
>>
>> ft_plot_mesh(vol2.bnd(1), 'facecolor',[0.2 0.2 0.2], 'facealpha', 0.3,
>> 'edgecolor', [1 1 1], 'edgealpha', 0.05);
>> hold on;
>> ft_plot_mesh(vol2.bnd(2),'edgecolor','none','facealpha',0.4);
>> hold on;
>> ft_plot_mesh(vol2.bnd(3),'edgecolor','none','facecolor',[0.4 0.6 0.4]);
>>
>> elec2       = ft_read_sens('standard_1020.elc');   % may you need to
>> define the path to the file
>>
>> disp(elec2)
>>
>> elec2 = ft_convert_units(elec2, 'cm');
>>
>> % load volume conduction model
>> load vol2;
>> figure;
>> % head surface (scalp)
>> ft_plot_mesh(vol2.bnd(1),
>> 'edgecolor','none','facealpha',0.8,'facecolor',[0.6 0.6 0.8]);
>> hold on;
>> % electrodes
>> ft_plot_sens(elec2,'style', 'sk');
>>
>>
>> mri2 = ft_convert_units(mri2, 'cm');
>>
>> nas=mri2.hdr.fiducial.mri.nas;
>> lpa=mri2.hdr.fiducial.mri.lpa;
>> rpa=mri2.hdr.fiducial.mri.rpa;
>>
>> transm=mri2.transform;
>>
>> nas=warp_apply(transm,nas, 'homogenous');
>> lpa=warp_apply(transm,lpa, 'homogenous');
>> rpa=warp_apply(transm,rpa, 'homogenous');
>>
>> fid.chanpos       = [nas; lpa; rpa];       % ctf-coordinates of fiducials
>> fid.label         = {'Nz','LPA','RPA'};    % same labels as in elec
>> fid.unit          = 'cm';                  % same units as mri
>>
>> % alignment
>> cfg               = [];
>> cfg.method        = 'fiducial';
>> cfg.template      = fid;                   % see above
>> cfg.elec          = elec2;
>> cfg.fiducial      = {'Nz', 'LPA', 'RPA'};  % labels of fiducials in fid
>> and in elec
>> elec_aligned2      = ft_electroderealign(cfg);
>>
>> save elec_aligned2 elec_aligned2;
>> % elec_aligned2 = ft_convert_units(elec_aligned2, 'cm');
>> figure;
>> ft_plot_sens(elec_aligned2,'style','sk');
>> hold on;
>> ft_plot_mesh(vol2.bnd(1),'facealpha', 0.85, 'edgecolor', 'none',
>> 'facecolor', [0.65 0.65 0.65]); %scalp
>>
>> cfg           = [];
>> cfg.method    = 'interactive';
>> cfg.elec      = elec_aligned2;
>> cfg.headshape = vol2.bnd(1);
>> elec_aligned2  = ft_electroderealign(cfg);
>>
>>
>> *%%%%% and here I am struggling: I can not get any of the above files to*
>> *%%%%% work together: vol or vol2, elec_aligned2, sourcespace etc.*
>>
>> vol = ft_convert_units(vol, 'cm');
>> elec_aligned2 = ft_convert_units(elec_aligned2, 'cm');
>> cfg = [];
>> cfg.elec      = elec_aligned2;                     % sensor positions
>> cfg.channel       = 'all';                   % the used channels
>> cfg.grid.pos = sourcespace.pnt;              % source points
>> cfg.grid.inside = 1:size(sourcespace.pnt,1); % all source points are
>> inside of the brain
>> cfg.vol = vol;
>> cfg.normalize       = 'yes';% volume conduction model
>> leadfield = ft_prepare_leadfield(cfg);
>>
>> save leadfield leadfield;
>>
>> clear all;
>> load('GA1.mat')
>> load('GA2.mat')
>> load leadfield;
>> load vol2;
>> load elec_aligned2;
>>
>>
>> cfg        = [];
>> cfg.method = 'mne';
>> cfg.elec = elec_aligned2;
>> cfg.grid   = leadfield;
>> cfg.vol    = vol;
>> cfg.mne.prewhiten = 'yes';
>> cfg.mne.lambda    = 3;
>> cfg.mne.scalesourcecov = 'yes';
>> cfg.mne.normalize = 'yes';
>> sourceCERT0  = ft_sourceanalysis(cfg, GA1);
>> sourceCERT3 = ft_sourceanalysis(cfg, GA2);
>>
>> _______________________________________________
>> fieldtrip mailing list
>> fieldtrip at donders.ru.nl
>> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>
>
> _______________________________________________
> fieldtrip mailing list
> fieldtrip at donders.ru.nl
> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
>
>
> _______________________________________________
> fieldtrip mailing list
> fieldtrip at donders.ru.nl
> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140223/d6eb6edf/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: logo_Signatur.png
Type: image/png
Size: 3435 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140223/d6eb6edf/attachment-0002.png>


More information about the fieldtrip mailing list