SPM8PreProcessing - Meg Wiki

Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment
Finzd thee wrang lelters ino eacuh wosrd

location: SPM8PreProcessing

Pre-Processing MEG Data in SPM8

This script will epoch and average your MEG data. Filtering is optional.

The "chanfile" is a Matlab mat-file containing an array "label" that contains labels for each channel in the data file, i.e. e.g. label{1} = 'MEG0113', label{2} = 'MEG0112', ..., label{307} = 'EEG001', ..., label{380} = 'STI101'.

% Root OUTPUT DIRECTORY (e.g. '/imaging/meg.ryan/data')
bwd = '/MyDataDir/'

% File Containing CHANNEL INFORMATION for MEG and EEG (e.g.
% '/imaging/meg.ryan/Batch/chan_select_MEG_EEG_STI101.mat')
chanfile = 'MyChanFile';

% Specify (multiple) SUBJECTs)
cnt = 0;

cnt = cnt + 1;
subjects{cnt} = {'meg10_1000', '101224'};               % IDs e.g. as in /megdata/cbu/...
blocksin{cnt} = {'block1_raw_sss', 'block2_raw_sss'};   % as named after Maxfilter

cnt = cnt+1;
subjects{cnt} = {'meg10_1001', '101231'};               % IDs e.g. as in /megdata/cbu/...
blocksin{cnt} = {'block1_raw_sss', 'block2_raw_sss'};   % as named after Maxfilter

eog_thr = [100e-6];     % EOG artefact THRESHOLD (in Volts)

epoch  = [-100 300];    % EPOCH for averaging (milliseconds)

% Define EVENT INFORMATION
con_values = [1:3];                             % Trigger codes of interest (integers)
con_labels = {'CondA', 'CondB', 'Control'};     % Labels of conditions corresponding to trigger codes
 
offset = 0;             % OFFSET between trigger and stimulus presentation, e.g. projector delay (milliseconds)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  The rest should run smoothly...   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cd(bwd) % change to working directory

nr_sbjs = length(subjects); % number of subjects

Ncons      = length(con_values);
for c=1:Ncons
    con_trigs{c} = 'STI101_up'; % look for rising signal in trigger channel for event times
end   

efile = {};

for ss = 1:nr_sbjs,
    
    nr_sess = length( blocksin{ss} );
    
    clear S D;
    
    swd = fullfile(bwd,subjects{ss}{1},subjects{ss}{2});
    fprintf(1, 'Subject: %s\n', swd);
    try
        eval(sprintf('!mkdir %s',swd))
    end
    cd(swd)
    
    for ses = 1:nr_sess

        rawfile  = fullfile(bwd,subjects{ss}{1},subjects{ss}{2},sprintf('%s.fif',blocksin{ss}{ses}));

        fprintf(1, 'Processing %s\n', rawfile);


        S = [];
        S.dataset  = rawfile;
        S.outfile  = sprintf('spm8_%s',spm_str_manip(rawfile,'rt')); %_%s',filestem,maxflag)

        tmp = load(chanfile);
        S.channels = tmp.label;

        D = spm_eeg_convert(S);
        
        %   spm_eeg_convert_ui(S);  % if want to use GUI

        % Below are other defaults
        %  S.blocksize = 3276800;
        %  S.datatype = 'float32-le';
        %  S.timewindow = [1 5];
        %  S.inputformat = [];
        %  S.eventpadding = 0;
        %  S.saveorigheader = 0;
        %  S.continuous = 1;
        %  S.checkboundary = 1;
        %  S.usetrials = 1;  % SPM will define trials from datafile

        ch = find(strcmp(D.chanlabels,'STI101'));
        D(ch,:,:) = D(ch,:,:)/10^7;   % Downscale trigger channel so easier to see EOG when display "Other" channels

        % If you want to filter data in SPM8:
        %  S = [];
        %  S.D = D.fname;
        %  S.filter.type = 'butterworth';
        %  S.filter.order = 5;
        %  S.filter.band = 'bandpass';
        %  S.filter.PHz = [0.1 40];
        %  D = spm_eeg_filter(S);

        S = [];
        S.dataset  = D.fname;
        S.pretrig  = epoch(1);
        S.posttrig = epoch(2);
        S.save = 0;  % saved anyway (if S.save=1, then prompts for new filename!)
        %  S.reviewtrials = 1;  % enable if you want to check before converting
        S.reviewtrials = 0;

        for c = 1:length(con_values)
            S.trialdef(c).conditionlabel = con_labels{c};
            S.trialdef(c).eventtype      = 'STI101_up';
            S.trialdef(c).eventvalue     = con_values(c);
            S.trialdef(c).trlshift       = offset(c);
            % If used binary coding (1,2,4,8...) then could read STI001, STI002, etc
            % S.trialdef(c).eventtype  = sprintf('STI00%d_up',c);
            % S.trialdef(c).eventvalue = 5;
        end

        [trl, con, S] = spm_eeg_definetrial(S);
        
        S = [];
        S.D = D.fname;
        S.epochinfo.trl = trl;
        S.epochinfo.conditionlabels = con;
        S.bc = 1;
        D = spm_eeg_epochs(S);

        efile{ses} = D.fname;

    end % of ses loop



    %%% Concatenation of sessions

    S=[];
    S.D = strvcat(efile);
    S.recode = 'same';
    D = spm_eeg_merge(S);

    %%% Artifact rejection

    S = []; S.D = D.fname;

    S.methods(1).fun = 'flat';
    S.methods(1).channels = 'MEG';
    S.methods(1).settings.threshold = 0;
    S.methods(1).settings.seqlength = 4;

    S.methods(end+1).fun = 'flat';
    S.methods(end).channels = 'EEG';
    S.methods(end).settings.threshold = 0;
    S.methods(end).settings.seqlength = 4;

    %  S.methods(end+1).fun = 'peak2peak';
    S.methods(end+1).fun = 'threshchan';
    S.methods(end).channels = 'EOG';
    S.methods(end).settings.threshold = eog_thr(ss);

    % S.methods(end+1).fun = 'threshchan';
    % S.methods(end).channels = 'MEG';
    % S.methods(end).settings.threshold = meg_thr(ss);
    % 
    % S.methods(end+1).fun = 'threshchan';
    % S.methods(end).channels = 'EEG';
    % S.methods(end).settings.threshold = eeg_thr(ss);

    D = spm_eeg_artefact(S);

    nbadchan(ss) = length(D.badchannels);
    nrejects(ss) = sum(D.reject);

    %%% Average

    D = condlist(D,con_labels);  % redefine condition order for weight epochs below
    D.save;

    preavg = D.fname;
    S=[]; S.D = preavg;
    S.robust = 0;
    D = spm_eeg_average(S);
    nevents(ss,:) = D.repl;

    S=[]; S.D = D.fname;
    S.refchan = 'average';
    D = spm_eeg_reref_eeg(S);

    save batch_params rawfile efile nbadchan nrejects nevents

end % of subjects loop

return