SPM8PreProcessing - Meg Wiki

Please enter your password of your account at the remote wiki below.
/!\ You should trust both wikis because the password could be read by the particular administrators.

Clear message
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