📄 bfm_get3_datamat.m
字号:
%BFM_GET_DATAMAT will create the Event Related or Blocked fMRI datamat
%
% Usage: bfm_get_datamat(sessionFile, run_idx, brain_mask, ...
% sd_thresh, ignore_slices, normalize_volume_mean, ...
% num_skipped_scans, merge_across_runs_flg, ...
% behavdata, behavname)
%
% Input:
% sessionFile: the name of file that contains the session information.
% brain_mask: a matrix, with same size as the IMG files, defines the
% brain region. Any element larger than 0 is treated as
% part of the brain region.
% coord_thresh: threshold to generate compute the brain region
% [default: 0.15];
% ignored_slices: a vector specifies the number of slices which should
% (optional) be skipped to generate the datamat. [default: []]
% num_skipped_scans: (optional) [default: num_skipped_scans = 0]
% run_idx: (optional) [default: run_idx contains all the runs]
% The indices of runs that will be used to generate st_datamat.
% merge_across_runs_flg: 1 - merge the same condition across all runs
% (optional) to become one row of the ST datamat
% 0 - merge the same condition only within a run
% [default: merge_across_runs_flg = 1]
%
% See also FMRI_GEN_DATAMAT, FMRI_GEN_ST_DATAMAT
%
% the following paramater is removed:
%
% sd_thresh: maximum standard deviation (s.d.) for the brain voxels. Any
% (optional) voxels with s.d. greater than this value will be removed to
% avoid the inclusion of venous and sinus. [default: 2];
%
% called by FMRI_CREATE_DATAMAT_UI
%
% Modified on 12-May-2003 by Jimmy Shen
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function bfm_get_datamat(sessionFile, run_idx, varargin)
progress_hdl = rri_progress_ui('initialize');
brain_mask_file = '';
brain_mask = [];
coord_thresh = [];
sd_thresh = 2;
ignore_slices = [];
normalize_volume_mean = 0;
num_skipped_scans = 0;
mask_dims = [];
if (nargin == 2),
use_brain_mask = 0;
elseif (nargin >= 2),
if (ischar(varargin{1})) , % use predefined brain region
use_brain_mask = 1;
brain_mask_file = varargin{1};
brain_mask = rri_load_img(brain_mask_file); % use brain mask file
mask_dims = size(brain_mask);
else
use_brain_mask = 0; % compute brain region from the data
coord_thresh = varargin{1};
end;
if (nargin >= 4)
sd_thresh = varargin{2};
end;
if (nargin >= 5)
ignore_slices = varargin{3};
end;
if (nargin >= 6)
normalize_volume_mean = varargin{4};
end;
if (nargin >= 7)
num_skipped_scans = varargin{5};
end;
if (nargin >= 8)
merge_across_runs_flg = varargin{6};
end;
if (nargin >= 9)
behavdata = varargin{7};
end;
if (nargin >= 10)
behavname = varargin{8};
end;
if (nargin >= 11)
session_win_hdl = varargin{9};
end;
if (nargin >= 12)
normalize_signal_mean = varargin{10};
end;
if (nargin >= 13)
ConsiderAllVoxels = varargin{11};
end;
if (nargin >= 14)
SingleSubject = varargin{12};
end;
if (nargin >= 15)
orient = varargin{13};
end;
end
create_datamat_info.brain_mask_file = brain_mask_file;
create_datamat_info.brain_coord_thresh = coord_thresh;
create_datamat_info.num_skipped_scans = num_skipped_scans;
create_datamat_info.run_idx = run_idx;
create_datamat_info.ignore_slices = ignore_slices;
create_datamat_info.normalize_volume_mean = normalize_volume_mean;
create_datamat_info.normalize_with_baseline = normalize_signal_mean;
create_datamat_info.merge_across_runs = merge_across_runs_flg;
load(sessionFile); % load the session information
pls_data_path = session_info.pls_data_path;
datamat_prefix = session_info.datamat_prefix;
% save temp data into datamat_file
%
% fname = sprintf('%s_run.mat',datamat_prefix);
% datamat_file = fullfile(pls_data_path,fname);
curr = pwd;
if isempty(curr)
curr = filesep;
end
if (sessionFile ~= filesep)
sessionFile = fullfile(curr,sessionFile);
end;
% get stuff from session_info first
%
cond_baseline = session_info.condition_baseline;
num_conds = session_info.num_conditions;
% get maximum number of onsets
%
max_onsets = 0;
for i = run_idx
run_info = session_info.run(i);
tmp = find_max_onsets(run_info);
if tmp > max_onsets
max_onsets = tmp;
end
end
% get image files path/file name <for read only one image file>
%
data_path = run_info.data_path;
flist = run_info.data_files;
img_file = fullfile(data_path,flist{1});
if ~isempty(orient) & ~isempty(orient.orient_pattern)
dims = orient.dims;
voxel_size = orient.voxel_size;
origin = orient.origin;
else
[dims,voxel_size,origin] = rri_imginfo(img_file);
end
dims = [dims(1) dims(2) 1 dims(3)];
if (use_brain_mask==1) & ~isequal(dims,mask_dims),
close(progress_hdl);
errmsg ='ERROR: Dimensions of the data do not match that of the brain mask!';
errordlg(errmsg,'Brain Mask Error');
waitfor(gcf);
return;
end;
% runs included
%
num_runs = session_info.num_runs;
if ~exist('run_idx','var') | isempty(run_idx),
run_idx = [1:num_runs];
else
num_runs = length(run_idx);
end;
% default is merge_across_runs
%
if ~exist('merge_across_runs_flg','var') | isempty(merge_across_runs_flg),
merge_across_runs_flg = 1;
end;
% skipped scans handling
%
if ~exist('num_skipped_scans','var') | isempty(num_skipped_scans)
num_skipped_scans = 0;
end;
% ignored slices handling
%
if ~exist('ignore_slices','var') | isempty(ignore_slices)
s_idx = [1:dims(4)]; % handle all slices
else
idx = zeros(1,dims(4));
idx(ignore_slices) = 1;
s_idx = find(s_idx == 0);
end;
if (use_brain_mask == 1) % coords from brain_mask
coords = find( brain_mask(:) > 0)';
if ~isempty(ignore_slices) % skip the slices if any
m = zeros(dims);
m(coords) = 1;
m(:,:,:,s_idx);
coords = find(m == 1)';
end;
end;
num_voxels = prod(dims);
num_cols = num_voxels;
if (use_brain_mask == 0)
coords = zeros(1, num_voxels); % initial st_coords
end
datamat = []; % st datamat before coords
st_datamat = []; % st datamat
st_evt_list = [];
st_evt_cnt = [];
% create step for progress bar
%
progress_step = 1 / (num_runs * num_conds * max_onsets);
for i = run_idx
run_info = session_info.run(i);
% get image files path/file name
%
data_path = run_info.data_path;
flist = run_info.data_files;
num_files = length(flist);
for j = 1:num_conds
num_onsets = length(run_info.blk_onsets{j});
% extract the datamat scans that matches the current condition
%
row_idx = 0;
num_onsets = length(run_info.blk_onsets{j});
if SingleSubject
evt_datamat = [];
else
evt_datamat = zeros(1,num_cols);
end
rri_progress_ui(progress_hdl, '', ...
sprintf('Creating datamat for run#%d condition#%d ... ',i,j));
for k = 1:num_onsets
blk_size = run_info.blk_length{j}(k);
start_scan = floor(run_info.blk_onsets{j}(k) - num_skipped_scans) + 1;
end_scan = start_scan + blk_size - 1;
if isempty(cond_baseline)
baseline_start = start_scan;
baseline_end = baseline_start;
else
baseline_info = cond_baseline{j};
baseline_start = start_scan + baseline_info(1);
baseline_end = baseline_start+baseline_info(2)-1;
end;
if (start_scan <= 0) | (num_files < end_scan) % out of bound
disp(sprintf('Scans %03d for the condition %d of run%d are not included due to out of bound',floor(run_info.blk_onsets{j}(k)),j,run_idx(i)));
elseif (baseline_start <= 0)
disp(sprintf('Scans %03d for the condition %d of run%d are not included due to out of bound baseline',floor(run_info.blk_onsets{j}(k)),j,run_idx(i)));
else
% read in image files
%
dataset = zeros(length([start_scan:end_scan]), num_voxels);
for scan = start_scan:end_scan
img_file = [data_path filesep flist{scan}];
img = rri_load_img(img_file);
if ~isempty(orient) & ~isempty(orient.orient_pattern)
img = img(orient.orient_pattern);
img = reshape(img,dims);
end
img = img(:,:,:,s_idx);
dataset(scan - start_scan + 1,:) = img(:)';
end;
tmp_datamat = dataset;
% find brain voxel coords for each onset, and
% accumulated to find common coords for all onsets
%
if (use_brain_mask == 0)
coords = coords + find_onset_coords(dataset,coord_thresh,ConsiderAllVoxels);
end
if (normalize_volume_mean == 1)
if (use_brain_mask == 0)
mean_dataset = dataset(:,find(coords == 0));
else
mean_dataset = dataset(:,coords);
end
mean_dataset = mean(mean_dataset, 2);
mean_dataset = mean_dataset(:,ones(1,num_voxels));
dataset = dataset ./ mean_dataset;
end
tmp_datamat = mean(dataset,1);
% read in baseline_signals image files
%
dataset = zeros(length([baseline_start:baseline_end]), num_voxels);
for scan = baseline_start:baseline_end
img_file = [data_path filesep flist{scan}];
img = rri_load_img(img_file);
if ~isempty(orient) & ~isempty(orient.orient_pattern)
img = img(orient.orient_pattern);
img = reshape(img,dims);
end
img = img(:,:,:,s_idx);
dataset(scan - baseline_start + 1,:) = img(:)';
end;
if (normalize_volume_mean == 1)
if (use_brain_mask == 0)
mean_dataset = dataset(:,find(coords == 0));
else
mean_dataset = dataset(:,coords);
end
mean_dataset = mean(mean_dataset, 2);
mean_dataset = mean_dataset(:,ones(1,num_voxels));
dataset = dataset ./ mean_dataset;
end
baseline_signals = mean(dataset,1);
% repmat for win_size of rows
%
% baseline_signals = baseline_signals(ones(1,win_size),:);
% if 0, make it less significant, so it can be removed later
%
zero_baseline_idx = find(baseline_signals==0);
baseline_signals(zero_baseline_idx) = 99999;
if normalize_signal_mean
tmp_datamat = ...
(tmp_datamat - baseline_signals ) * 100 ./ baseline_signals;
end
tmp_datamat(zero_baseline_idx) = 0; %99999
row_idx = row_idx + 1;
if SingleSubject
evt_datamat = [evt_datamat; tmp_datamat];
else
% evt_datamat(row_idx,:) = tmp_datamat; % reshape(tmp_datamat,[1 num_cols]);
evt_datamat = evt_datamat + tmp_datamat;
end
stp = (i-1)*num_conds*max_onsets + (j-1)*max_onsets + k;
rri_progress_ui(progress_hdl, '', stp * progress_step);
end;
end; % for num_onsets
if (merge_across_runs_flg == 0 & row_idx == 0),
close(progress_hdl);
errmsg = sprintf('No onsets for condition #%d in the run #%d',j,i);
errordlg(['ERROR: ' errmsg],'Generating ST Datamat Error');
waitfor(gcf);
return;
end;
% Generate the spatial/temporal datamat from evt_datamat
% depending on 'across run' or 'within run'
%
if (row_idx ~= 0), % some stimuli for the current condition
if (merge_across_runs_flg == 0) % merge data within run only
if SingleSubject
st_evt_list = [st_evt_list j*ones(1, size(evt_datamat,1))];
datamat = [datamat; evt_datamat];
else
st_evt_list = [st_evt_list j];
datamat = [datamat; evt_datamat / num_onsets];
end
else
if isempty(st_evt_list)
idx = [];
else
idx = find(st_evt_list == j);
end;
if isempty(idx), % new event
st_evt_list = [st_evt_list j];
st_evt_cnt = [st_evt_cnt row_idx];
if SingleSubject
datamat = [datamat; evt_datamat(:)'];
else
datamat = [datamat; evt_datamat];
end
else
st_evt_cnt(idx) = st_evt_cnt(idx) + row_idx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -