[FieldTrip] source interpolate - tmp = interpmat*tmp; inner matrix must agree
Russell G Port
russgport at gmail.com
Sun Mar 10 02:38:44 CET 2013
Hi Fieldtrippers,
I have a slight issue that I was hoping someone can help with. I have some
CTF data, that I was trying to perform DICS beamforming and then source
interpolation on. I am trying to beamform to the source of gamma frequency
in the right hemisphere, comparing pre and post stimuli. Heres the basic
script:
*People can skip the first part of code, I included it as possibly useful
information for this plead
*
%%%%% Data has already been preprocessed and timelocked%%%%%%
load('processed_data_500Hz.mat')
load('timelock_data_500Hz.mat')
%%%% following the beamforming tutorial %%%%%%%
%%%%%%%%%%%%%split and combine%%%%%%%%%%%%%
cfg = [];
cfg.toilim = baseline;
cfg.channel=channel
total_bsl = ft_redefinetrial(cfg, data);
cfg = [];
cfg.toilim = interest;
cfg.channel=channel
total_interest = ft_redefinetrial(cfg, data);
cfg = [];
total_cmb = ft_appenddata(cfg, total_bsl, total_interest);
total_cmb.trialinfo = [zeros(length(total_bsl.trial), 1);
ones(length(total_interest.trial), 1)];
%%%%%%%%%%%%%cross spectrial density for dics and tf for common
filter%%%%%%%%%%%%%%
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'powandcsd';
cfg.tapsmofrq = 25;
cfg.foilim = 55;
freqPre_total = ft_freqanalysis(cfg, total_bsl);
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'powandcsd';
cfg.tapsmofrq = 25;
cfg.foilim = 55;
freqPost_total = ft_freqanalysis(cfg, total_interest);
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'powandcsd';
cfg.tapsmofrq = 25;
cfg.foilim = 55;
freqALL_total = ft_freqanalysis(cfg, total_cmb);
%%%%%%%%%%%%%%%%%%%%%%%% calc leadfield %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
T=ft_read_mri('R128_V2.mri')
cfg.fiducial.nas = T.hdr.fiducial.mri.nas
cfg.fiducial.lpa = T.hdr.fiducial.mri.lpa
cfg.fiducial.rpa = T.hdr.fiducial.mri.rpa
cfg.method = 'fiducial'
cfg.coordsys = 'ctf'
[mri] = ft_volumerealign(cfg, T)
cfg = [];
cfg.coordsys = 'ctf'; % the MRI is expressed in the CTF coordinate system,
see below
segmentedmri = ft_volumesegment(cfg, mri);
cfg = [];
cfg.method = 'singleshell';
hdm = ft_prepare_headmodel(cfg, segmentedmri);
vol = ft_convert_units(hdm, 'cm');
%%%%%%%%%%%%%%%
cfg = [];
cfg.grad = freqPost_total.grad;
cfg.vol = vol;
cfg.reducerank = 2;
cfg.channel = 'MR'
[grid] = ft_prepare_leadfield(cfg);
*Upto this point everything works. My volume conduction model, grads, and
grid looks good when verified visually...
I then compute the common filter and apply it to the beamforming of each
condition*
%%%%%%%%%%%%%%%%%%%%% computer common filter%%%%%%%%%%%
cfg = [];
cfg.method = 'dics';
cfg.grad = freqALL_total.grad;
cfg.keeptrials = 'yes';
cfg.frequency = freqALL_total.freq;
cfg.grid = grid;
cfg.vol = vol;
cfg.dics.projectnoise = 'yes';
cfg.dics.lambda = '5%';
cfg.dics.keepfilter = 'yes';
cfg.dics.realfilter = 'yes';
cfg.channel = 'MR'
sourceAll = ft_sourceanalysis(cfg, freqALL_total);
%%%%%%%%%%%%%%%%%% source for bsl + interest %%%%%%%%%%%%%
cfg.grid.filter = sourceAll.avg.filter;
cfg.grid = grid;
sourcePre_con = ft_sourceanalysis(cfg, freqPre_total );
sourcePost_con = ft_sourceanalysis(cfg, freqPost_total);
%%%%%%%%%% Calc difference %%%%%%%%%%%%%%%%%
sourceDiff = sourcePost_con;
sourceDiff.avg.pow = (sourcePost_con.avg.pow - sourcePre_con.avg.pow) ./
sourcePre_con.avg.pow;
*Heres where it falls apart, because I try to source interpolate*
%%%%%%%%%%%%%%%%%%%%% graph time %%%%%%%%%%%%%%%%%%
% slicemri = ft_volumereslice([], mri);
% % mri = ft_volumereslice([],segmentedmri) %%* didnt appear to help with
the current problem
*
cfg = [];
cfg.downsample = 2;
cfg.parameter = 'avg.pow';
cfg.coordsys = 'ctf';
cfg.channel = 'MR'
source_diffInt = ft_sourceinterpolate(cfg, sourceDiff , mri); &&& I also
tried segmentedmri, but no difference
It works until it reachs line 237; tmp = interpmat*tmp; where there is
the matrixs are mismatch (interpmat is a 16777216(256x256x256) x642
matrix, and tmp is a 1 * 642 matrix. From my basic skills I gather that tmp
is sourceDiff.avg.pow (the power difference for each leadfield point).
interpmat is the interpolation matrix return by
interpmat = interp_ungridded(functional.pos *(position of the leadfield
locations)*, pos (mri voxels), 'projmethod', cfg.interpmethod (*nearest*),
'sphereradius', cfg.sphereradius) (0.*05*);
what I get out of this is a 16777216(*256x256x256* voxels) x642 *(leadfield
position)* matrix*. *it then undergoes interpmat(~anatomical.inside(:), :)
= 0. My *anatomical.inside is all voxels (all of the 256 x 256 x 256
matrix= 1), as a result of the defaults in ft_checkdata*.
When I try to find the minimum value in this matrix I get (via
min(interpmat) = All zero sparse: 1-by-642
I think what is supposed to happen is that the interpmat is a matrix that
relates meg to mri space, and as such then mutlipling with a vector that
represents the power in meg space, I can see how that would get points of
power in mri space. Though this must be wrong since the math is not
allowed.... I cannot see where I went off the beaten track. It seems as if
other people have not had this problem.
Sorry for the bother,
Russ Port
Graduate Student @ Upenn
P.S. thanks to anyone who tries to help in advance...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20130309/6dc83001/attachment-0001.html>
More information about the fieldtrip
mailing list