StandardSensorArray - 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
Type the missing letters from: He's no ded, he's jus resing hs eys

Revision 2 as of 2009-03-16 18:27:32

location: StandardSensorArray

Compute average sensor array

The following Matlab code will produce the average sensor array from a list of input files, and select the input file which is closest to the average (which I would recommend to use for interpolation). As input files, you can for example specify the on-line averages for your subjects.


% From a list of fiff-files (e.g. on-line average files), compute the one % with average sensor transformation, and find the input file which is % closest to the average (according to both translation and rotation parameters) % file list should be specified in cell array "files{}" % output file should be specified in string "file_out" % both average file "_avg.fif" and file closest to it will be written % if not output file specified, output will be written to current working directory % OH, March 2009

addpath /opt/mne/matlab/toolbox/; % fiff read/write tools

if exist('file_out')~=1, % if not output file specified: write to current working directory

  • cwd = pwd; file_out = fullfile( cwd, 'FIFF4TRANS.fif' );

end;

if exist('files')~=1, % you can specify a list of files here (e.g. on-line averages for all subjects in your study)

  • files = {'/fullpath/file4subj1.fif', ...
    • '/fullpath/file4subj2.fif', ... '/fullpath/file4subj3.fif'};

end;

fid = fopen(file_out, 'a'); % check if output can be written if fid == -1,

  • fprintf(1, 'Cannot access output file %s\n', file_out); return;

end; fclose(fid);

nr_files = length(files); epoch_gm = [0]; trans_gm = [0]; for f = 1:nr_files, % read all files and average all that's relevant

  • fprintf(1, '%s\n', files{f}); data = fiff_read_evoked(files{f}); epoch_gm = epoch_gm + data.evoked.epochs; % average MEG data epoch trans_gm = trans_gm + data.info.dev_head_t.trans; % average sensor transformation matrix all_trans(:,:,f) = data.info.dev_head_t.trans; % remember individual transformations

end; epoch_gm = epoch_gm/nr_files; trans_gm = trans_gm/nr_files;

data_new = data; data_new.evoked.epoch = epoch_gm; data_new.info.dev_head_t.trans = trans_gm;

[thispath, thisfile,thisext,thisversn] = fileparts(file_out); file_out_avg = fullfile(thispath, [thisfile '_avg' thisext]); fiff_write_evoked(file_out_avg, data_new); % Write average coordinate transformation

% find input file that is closest to average... for f = 1:nr_files,

  • diff_trans_t = all_trans(1:3,4,f) - trans_gm(1:3,4); % translation difference diff_trans_r = all_trans(1:3,1:3,f) - trans_gm(1:3,1:3); % rotation difference norm_t(f) = norm( diff_trans_t ); norm_r(f) = norm( diff_trans_r );

end;

[y_t, i_t] = sort( norm_t ); % sort according to translation difference [y_r, i_r] = sort( norm_r ); % sort according to rotation difference

for f = 1:nr_files, % combine the two sorted lists

  • rank_t(f) = find( (i_t-f)==0 ); % rank for translation rank_r(f) = find( (i_r-f)==0 ); % rank for rotation avg_rank(f) = (rank_t(f) + rank_r(f))/2; [min_val, min_file] = min( avg_rank ); % best average rank

end;

min_file = files{min_file}; % filename for file with best average rank

fprintf('\nThe winner is... %s\n', min_file);

copyfile(min_file, file_out); % copy file with best average rank to output file

% The end of this