[FieldTrip] problem with EEG source reconstruction

Zizlsperger Leopold zizlsperger at gmail.com
Sun Feb 23 13:14:37 CET 2014


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 Processing
> Neurosurgical 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 leadfields
> 
> Error 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140223/677f36dc/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/677f36dc/attachment-0002.png>


More information about the fieldtrip mailing list