Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F103590739
spm_eeg_combineplanar.m
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Mar 3, 05:19
Size
6 KB
Mime Type
text/plain
Expires
Wed, Mar 5, 05:19 (1 d, 13 h)
Engine
blob
Format
Raw Data
Handle
24620319
Attached To
R6832 iCAPs public
spm_eeg_combineplanar.m
View Options
function D = spm_eeg_combineplanar(S)
% Combine data from MEGPLANAR sensors
% FORMAT D = spm_eeg_combineplanar(S)
%
% S - optional input struct
% fields of S:
% D - MEEG object or filename
% mode -
% 'append' - add combined channels to the origal channels
% 'replace' - replace MEGPLANAR with combined [default]
% 'replacemeg' - replace all MEG channels with combined but
% keep non-MEG
% 'keep' - only write out the combined channels
%
% prefix - prefix for the output file [default: 'P']
%
% Output:
% D - MEEG object (also written on disk)
%
%__________________________________________________________________________
% Copyright (C) 2008-2017 Wellcome Trust Centre for Neuroimaging
% Vladimir Litvak
% $Id: spm_eeg_combineplanar.m 7132 2017-07-10 16:22:58Z guillaume $
SVNrev = '$Rev: 7132 $';
%-Startup
%--------------------------------------------------------------------------
spm('FnBanner', mfilename, SVNrev);
spm('FigName','MEG Combine planar'); spm('Pointer','Watch');
if ~isfield(S, 'prefix'), S.prefix = 'P'; end
if ~isfield(S, 'mode'), S.mode = 'replace'; end
D = spm_eeg_load(S.D);
isTF = strncmpi(D.transformtype,'TF',2);
chanset = spm_eeg_planarchannelset(D.chanlabels);
chanind = [];
labelnew = {};
for i = 1:size(chanset, 1)
cind = D.indchannel(chanset(i, 1:2));
if length(cind) == 2
chanind = [chanind cind];
labelnew = [labelnew; chanset(i, end)];
end
end
megind = D.indchantype('MEG');
planarind = D.indchantype('MEGPLANAR');
% add a row of zeros;
chanind(3, end) = 0;
copyind = [];
switch S.mode
case 'append'
copyind = 1:D.nchannels;
copyind = [copyind; copyind];
chanind(3, :) = (D.nchannels+1):(D.nchannels+size(chanind, 2));
case {'replace', 'replacemeg'}
ind = 1;
for i = 1:D.nchannels
if any(i == planarind)
k = find((chanind(1, :) == i) | (chanind(2, :) == i));
if ~isempty(k) && (chanind(3, k) == 0)
chanind(3, k) = ind;
ind = ind + 1;
end
elseif isequal(S.mode, 'replace') || ~any(i == megind)
copyind = [copyind [i ind]'];
ind = ind + 1;
end
end
case 'keep'
copyind = [];
chanind(3, :) = 1:size(chanind, 2);
end
if isempty(copyind)
Nchannels = max(chanind(3, :));
else
Nchannels = max([chanind(3, :), copyind(2, :)]);
end
%-Generate new MEEG object with new files
%--------------------------------------------------------------------------
if isTF
Dnew = clone(D, [S.prefix fname(D)], [Nchannels D.nfrequencies D.nsamples D.ntrials], 1);
else
Dnew = clone(D, [S.prefix fname(D)], [Nchannels D.nsamples D.ntrials], 1);
end
if strcmp(D.type, 'continuous')
%-Continuous data
%----------------------------------------------------------------------
blksz = D.fsample;
blknum = floor(D.nsamples/blksz);
spm_progress_bar('Init', blknum, 'Data blocks processed');
if blknum > 100, Ibar = floor(linspace(1, blknum,100));
else Ibar = 1:blknum; end
if isTF
i = 1;
while 1
if i<=blknum
Iblock = ((i-1)*blksz + 1):(i*blksz);
elseif (i == (blknum + 1)) && blknum*blksz < D.nsamples
Iblock = (blknum*blksz + 1):D.nsamples;
else
break;
end
planar1 = D(chanind(1, :), :, Iblock);
planar2 = D(chanind(2, :), :, Iblock);
Dnew(chanind(3, :), :, Iblock) = planar1 + planar2;
if ~isempty(copyind)
Dnew(copyind(2, :), :, Iblock) = D(copyind(1, :), :, Iblock);
end
if any(Ibar == i), spm_progress_bar('Set', i); end
i = i+1;
end
else
i = 1;
while 1
if i<=blknum
Iblock = ((i-1)*blksz + 1):(i*blksz);
elseif (i == (blknum + 1)) && blknum*blksz < D.nsamples
Iblock = (blknum*blksz + 1):D.nsamples;
else
break;
end
planar1 = D(chanind(1, :), Iblock);
planar2 = D(chanind(2, :), Iblock);
Dnew(chanind(3, :), Iblock) = sqrt(planar1.^2 + planar2.^2);
if ~isempty(copyind)
Dnew(copyind(2, :), Iblock) = D(copyind(1, :), Iblock);
end
if any(Ibar == i), spm_progress_bar('Set', i); end
i = i+1;
end
end
else
%-Epoched data
%----------------------------------------------------------------------
spm_progress_bar('Init', D.ntrials, 'Trials processed');
if D.ntrials > 100, Ibar = floor(linspace(1, D.ntrials, 100));
else Ibar = 1:D.ntrials; end
if isTF
for i=1:D.ntrials
planar1 = D(chanind(1, :), :, :, i);
planar2 = D(chanind(2, :), :, :, i);
Dnew(chanind(3, :),:, :, i) = planar1 + planar2;
if ~isempty(copyind)
Dnew(copyind(2, :), :, :, i) = D(copyind(1, :), :, :, i);
end
if any(Ibar == i), spm_progress_bar('Set', i); end
end
else
for i=1:D.ntrials
planar1 = D(chanind(1, :), :, i);
planar2 = D(chanind(2, :), :, i);
Dnew(chanind(3, :), :, i) = sqrt(planar1.^2 + planar2.^2);
if ~isempty(copyind)
Dnew(copyind(2, :), :, i) = D(copyind(1, :), :, i);
end
if any(Ibar == i), spm_progress_bar('Set', i); end
end
end
end
spm_progress_bar('Clear');
Dnew = chanlabels(Dnew, chanind(3, :), labelnew);
Dnew = badchannels(Dnew, chanind(3, :), badchannels(D, chanind(1, :)) | badchannels(D, chanind(2, :)));
Dnew = chantype(Dnew, chanind(3, :), 'MEGCOMB');
Dnew = units(Dnew, chanind(3, :), units(D, chanind(1, :)));
Dnew = coor2D(Dnew, chanind(3, :), 0.5*(coor2D(D, chanind(1,:))+coor2D(D, chanind(1,:))));
if ~isempty(copyind)
Dnew = chanlabels(Dnew, copyind(2, :), D.chanlabels(copyind(1, :)));
Dnew = badchannels(Dnew, copyind(2, :), badchannels(D, copyind(1, :)));
Dnew = chantype(Dnew, copyind(2, :), D.chantype(copyind(1, :)));
Dnew = units(Dnew, copyind(2, :), D.units(copyind(1, :)));
Dnew = coor2D(Dnew, copyind(2, :),coor2D(D, copyind(1, :)));
end
%-Save the new M/EEG dataset
%--------------------------------------------------------------------------
Dnew = Dnew.history(mfilename, S);
save(Dnew);
D = Dnew;
%-Cleanup
%--------------------------------------------------------------------------
fprintf('%-40s: %30s\n','Completed',spm('time')); %-#
spm('FigName','MEG Combine planar: done'); spm('Pointer','Arrow');
Event Timeline
Log In to Comment