[FieldTrip] problem with EEG source reconstruction

Chaitanya Srinivas chaitanya.pro at gmail.com
Sat Feb 22 15:38:25 CET 2014


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: Inline image 1]*
*Best Regards*


*Chaitanya Srinivas Lanka Wiss. Mitarbeiter
                                      *

*PhD StudentFunctional 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140222/890db52d/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 23195 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140222/890db52d/attachment-0002.png>


More information about the fieldtrip mailing list