123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- function D = spm_eeg_contrast(S)
- % Compute contrasts over trials or trial types
- % FORMAT D = spm_eeg_contrast(S)
- %
- % S - optional input struct
- % fields of S:
- % D - filename of EEG mat-file with epoched data
- % c - contrast matrix, each row computes a contrast of the data
- % label - cell array of labels for the contrasts, the same size as
- % number of rows in c
- % weighted - flag whether average should be weighted by number of
- % replications (yes (1), no (0))
- % prefix - prefix for the output file [default: 'w']
- %
- % Output:
- % D - EEG data struct (also written to disk)
- %__________________________________________________________________________
- %
- % spm_eeg_contrast computes contrasts of data, over epochs of data. The
- % input is a single MEEG file. The argument c must have dimensions
- % Ncontrasts X Nepochs, where Ncontrasts is the number of contrasts and
- % Nepochs the number of epochs, i.e. each row of c contains one contrast
- % vector. The output is a M/EEG file with Ncontrasts epochs. The typical
- % use is to compute, for display purposes, contrasts like the difference or
- % interaction between trial types in channel space.
- %__________________________________________________________________________
- % Copyright (C) 2008-2017 Wellcome Trust Centre for Neuroimaging
- % Stefan Kiebel, Rik Henson
- % $Id: spm_eeg_contrast.m 7132 2017-07-10 16:22:58Z guillaume $
- SVNrev = '$Rev: 7132 $';
- %-Startup
- %--------------------------------------------------------------------------
- spm('FnBanner', mfilename, SVNrev);
- spm('FigName','M/EEG Contrast'); spm('Pointer','Watch');
- %-Get MEEG object
- %--------------------------------------------------------------------------
- if ~isfield(S, 'prefix'), S.prefix = 'w'; end
- if ~isfield(S, 'weighted'), S.weighted = 0; end
- if ~(isfield(S, 'c') && isfield(S, 'label') && numel(S.label)==size(S.c, 1))
- error('Invalid contrast specification.');
- end
- D = spm_eeg_load(S.D);
-
- %-Compute contrasts
- %--------------------------------------------------------------------------
- c = S.c;
- Ncontrasts = size(c, 1);
- % Pad with zeros as in the contrast manager
- if size(c, 2) ~= D.ntrials
- error('The number of columns in the contrast matrix does not match the number of trials.');
- end
- if ~isempty(D.repl)
- weighted = S.weighted;
- else
- weighted = 0;
- end
- if strncmp(D.transformtype, 'TF', 2)
- Dnew = clone(D, [S.prefix fname(D)], [D.nchannels D.nfrequencies D.nsamples Ncontrasts]);
- else
- Dnew = clone(D, [S.prefix fname(D)],[D.nchannels D.nsamples Ncontrasts]);
- end
- spm_progress_bar('Init', Ncontrasts, 'Contrasts computed');
- if Ncontrasts > 100, Ibar = floor(linspace(1, Ncontrasts, 100));
- else Ibar = 1:Ncontrasts; end
- for i = 1:Ncontrasts
- if weighted
- p = find(c(i,:) == 1);
- if ~isempty(p)
- r = D.repl(p);
- c(i,p) = r/sum(r);
- end
- p = find(c(i,:) == -1);
- if ~isempty(p)
- r = D.repl(p);
- c(i,p) = -r/sum(r);
- end
- end
- disp(['Contrast ', mat2str(i),': ', mat2str(c(i,:),3)])
- if strncmp(D.transformtype, 'TF', 2)
- d = zeros(D.nchannels, D.nfrequencies, D.nsamples);
- for j = 1:D.nchannels
- for f = 1:D.nfrequencies
- d(j, f, :) = c(i,:) * spm_squeeze(D(j, f, :, :), [1 2 4])';
- end
- end
- Dnew(1:Dnew.nchannels, 1:D.nfrequencies, 1:Dnew.nsamples, i) = d;
- else
- d = zeros(D.nchannels, D.nsamples);
- for j = 1:D.nchannels
- d(j, :) = c(i,:) * squeeze(D(j, :, :))';
- end
- Dnew(1:Dnew.nchannels, 1:Dnew.nsamples, i) = d;
- end
-
- newrepl(i) = sum(D.repl(find(c(i,:)~=0)));
- if any(Ibar == i), spm_progress_bar('Set', i); end
- end
- spm_progress_bar('Clear');
- %-
- %--------------------------------------------------------------------------
- Dnew = conditions(Dnew, ':', S.label);
- Dnew = trialonset(Dnew, ':', []);
- Dnew = trialtag(Dnew, ':', []);
- Dnew = badtrials(Dnew, ':', 0);
- Dnew = repl(Dnew, ':', newrepl);
- Dnew = type(Dnew, 'evoked');
- % remove previous source reconsructions
- if isfield(Dnew,'inv')
- Dnew = rmfield(Dnew,'inv');
- end
- %-Save new M/EEG data
- %--------------------------------------------------------------------------
- D = Dnew;
- D = D.history('spm_eeg_contrast', S);
- save(D);
- %-Cleanup
- %--------------------------------------------------------------------------
- spm('FigName','M/EEG Contrast: done'); spm('Pointer','Arrow');
|