⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 batch_create_datamat.m

📁 绝对经典,老外制作的功能强大的matlab实现PLS_TOOBOX
💻 M
📖 第 1 页 / 共 3 页
字号:
function batch_create_datamat(fid)

   session.prefix = '';				% all
   session.dataset_path = '';			% struct
   session.brain_region = '';			% all but erp
   session.win_size = 8;			% fmri
   session.across_run = 1;			% mri
   session.single_subj = 0;			% mri
   session.normalize = '';			% struct

   session.cond_name = {};			% all
   session.cond_filter = {};			% struct
   ref_scan_onset = [];				% mri
   num_ref_scan = [];				% mri

   subj_file = {};				% erp, pet, struct
   session.subject = {};			% erp, pet, struct
   session.subj_name = {};			% struct, (erp, pet)
   session.subj_files = {};			% erp, pet, struct
   session.img_ext = '*.img';			% pet, struct
   session.chan_in_col = 0;			% erp

   session.prestim = 0;				% erp
   session.interval = 2;			% erp
   session.chan_order = [];			% erp
   system_class = 1;				% erp
   system_type = 1;				% erp
   binary_vendor = '';				% erp
   binary_endian = 'ieee-le';			% erp

   session.data_files = {};			% mri
   session.data_path = {};			% mri
   session.file_pattern = {};			% mri
   event_onsets = {};				% fmri
   block_onsets = {};				% bfm
   block_length = {};				% bfm

   wrongbatch = 0;

   while ~feof(fid)

      tmp = fgetl(fid);

      if ischar(tmp) & ~isempty(tmp)
         tmp = strrep(tmp, char(9), ' ');
         tmp = deblank(fliplr(deblank(fliplr(tmp))));
      end

      while ~feof(fid) & (isempty(tmp) | isnumeric(tmp) | strcmpi(tmp(1), '%'))
         tmp = fgetl(fid);

         if ischar(tmp) & ~isempty(tmp)
            tmp = strrep(tmp, char(9), ' ');
            tmp = deblank(fliplr(deblank(fliplr(tmp))));
         end
      end

      if ischar(tmp) & ~isempty(tmp)
         [tok rem] = strtok(tmp);

         if ~isempty(rem)
            [rem junk] = strtok(rem, '%');
            rem = deblank(fliplr(deblank(fliplr(rem))));
         end
      else
         tok = '';
      end

      switch tok
      case 'prefix'
         if isempty(rem), wrongbatch = 1; end;
         session.prefix = rem;
      case 'dataset_path'
         if isempty(rem), wrongbatch = 1; end;
         session.dataset_path = rem;
      case 'brain_region'
         if isempty(rem), wrongbatch = 1; end;

         if isempty(str2num(rem))
            session.brain_region = rem;
         else
            session.brain_region = str2num(rem);
         end
      case 'win_size'
         session.win_size = str2num(rem);
         if isempty(session.win_size), session.win_size = 8; end;
      case 'across_run'
         session.across_run = str2num(rem);
         if isempty(session.across_run), session.across_run = 1; end;
      case 'single_subj'
         session.single_subj = str2num(rem);
         if isempty(session.single_subj), session.single_subj = 0; end;
      case 'cond_name'
         if isempty(rem), wrongbatch = 1; end;
         session.cond_name = [session.cond_name {rem}];
      case 'cond_filter'
         if isempty(rem), wrongbatch = 1; end;
         session.cond_filter = [session.cond_filter {rem}];
      case 'ref_scan_onset'
         rem = str2num(rem);
         if isempty(rem), rem = 0; end;
         ref_scan_onset = [ref_scan_onset rem];
      case 'num_ref_scan'
         rem = str2num(rem);
         if isempty(rem), rem = 1; end;
         num_ref_scan = [num_ref_scan rem];
      case 'data_files'
         session.data_files = [session.data_files {rem}];
      case 'event_onsets'
         if isempty(rem), wrongbatch = 1; end;
         event_onsets = [event_onsets {str2num(rem)}];
      case 'block_onsets'
         if isempty(rem), wrongbatch = 1; end;
         block_onsets = [block_onsets {str2num(rem)}];
      case 'block_length'
         if isempty(rem), wrongbatch = 1; end;
         block_length = [block_length {str2num(rem)}];
      case 'prestim'
         session.prestim = str2num(rem);
         if isempty(session.prestim), session.prestim = 0; end;
      case 'interval'
         session.interval = str2num(rem);
         if isempty(session.interval), session.interval = 2; end;
      case 'chan_order'
         if isempty(rem), wrongbatch = 1; end;
         session.chan_order = str2num(rem);
      case 'system_class'
         system_class = str2num(rem);
         if isempty(system_class), system_class = 1; end;
      case 'system_type'
         system_type = str2num(rem);
         if isempty(system_type), system_type = 1; end;
      case 'binary_vendor'
         binary_vendor = rem;
         if ~strcmpi(binary_vendor, 'NeuroScan') & ...
		~strcmpi(binary_vendor, 'ANT') & ...
		~strcmpi(binary_vendor, 'EGI')
            binary_vendor = '';
         end
      case 'binary_endian'
         binary_endian = rem;
         if ~strcmpi(binary_endian, 'ieee-be') & ~strcmpi(binary_endian, 'b') ...
	& ~strcmpi(binary_endian, 'ieee-le.l64') & ~strcmpi(binary_endian, 'a') ...
	& ~strcmpi(binary_endian, 'ieee-be.l64') & ~strcmpi(binary_endian, 's') ...
	& ~strcmpi(binary_endian, 'vaxd') & ~strcmpi(binary_endian, 'd') ...
	& ~strcmpi(binary_endian, 'vaxg') & ~strcmpi(binary_endian, 'g') ...
	& ~strcmpi(binary_endian, 'cray') & ~strcmpi(binary_endian, 'c') ...
	& ~strcmpi(binary_endian, 'native') & ~strcmpi(binary_endian, 'n')
            binary_endian = 'ieee-le';
         end
      case 'chan_in_col'
         session.chan_in_col = str2num(rem);
         if isempty(session.chan_in_col), session.chan_in_col = 0; end;
      case 'subj_name'
         if isempty(rem), wrongbatch = 1; end;
         session.subj_name = [session.subj_name {rem}];
      case 'subj_file'
         if isempty(rem), wrongbatch = 1; end;
         subj_file = [subj_file {rem}];
      case 'normalize'
         if isempty(rem), wrongbatch = 1; end;
         session.normalize = str2num(rem);
      end
   end

   fclose(fid);

   if wrongbatch
      error('There is error(s) in batch file, please read ''UserGuide.htm'' for help');
   end  

   session.num_cond = length(session.cond_name);

   if ~isempty(event_onsets)					% fmri

      if wrongbatch | isempty(session.data_files)
         error('There is error(s) in batch file, please read ''UserGuide.htm'' for help');
      end

      session.num_run = length(session.data_files);

      for i = 1:session.num_run
         [session.data_path{i} session.file_pattern{i}] ...
				= rri_fileparts(session.data_files{i});

         for j = 1:session.num_cond
            session.evt_onsets{i}{j} = event_onsets{(i-1)*session.num_cond+j}(:);
         end
      end

      for i = 1:session.num_cond
         session.baseline{i} = [ref_scan_onset(i) num_ref_scan(i)];
      end

      create_fmri_datamat(session);

   elseif ~isempty(block_onsets)				% bfm

      if wrongbatch | isempty(session.data_files)
         error('There is error(s) in batch file, please read ''UserGuide.htm'' for help');
      end

      session.num_run = length(session.data_files);

      for i = 1:session.num_run
         [session.data_path{i} session.file_pattern{i}] ...
				= rri_fileparts(session.data_files{i});

         for j = 1:session.num_cond
            session.blk_onsets{i}{j} = block_onsets{(i-1)*session.num_cond+j}(:);
            session.blk_length{i}{j} = block_length{(i-1)*session.num_cond+j}(:);
         end
      end

      for i = 1:session.num_cond
         session.baseline{i} = [ref_scan_onset(i) num_ref_scan(i)];
      end

      create_bfm_datamat(session);

   elseif ~isempty(session.chan_order)				% erp

      if isempty(binary_vendor)
         session.eeg_format = [];
      else
         session.eeg_format.vendor = binary_vendor;
         session.eeg_format.machineformat = binary_endian;
      end

      session.system.class = system_class;
      session.system.type = system_type;
      session.num_subj = round(length(subj_file) / session.num_cond);
      session.subj_files = cell(session.num_cond, session.num_subj);

      for i = 1:session.num_cond
         for j = 1:session.num_subj
            [session.subject{j} session.subj_files{i,j}] = ...
		rri_fileparts(subj_file{(i-1)*session.num_subj+j});
         end
      end

      for j = 1:session.num_subj
         [tmp subj_name] = rri_fileparts(session.subject{j});
         session.subj_name = [session.subj_name {subj_name}];
      end

      create_erp_datamat(session)

   elseif ~isempty(session.dataset_path)			% struct

      session.num_subj = round(length(subj_file) / session.num_cond);
      session.subj_files = cell(session.num_cond, session.num_subj);

      for i = 1:session.num_cond
         for j = 1:session.num_subj
            [junk session.subj_files{i,j}] = ...
		rri_fileparts(subj_file{(i-1)*session.num_subj+j});
         end
      end

      subject = session.subj_files(1,:);

      %  replace pattern with '*'
      %
      [p f] = fileparts(session.cond_filter{1});
      f = strrep(f, '*', '');			% remove * in pattern
      subject = strrep(subject, f, '*');	% replace with '*'

      %  replace '.nii' or '.img' with '.*'
      %
      subject = strrep(subject, '.nii', '.*');
      subject = strrep(subject, '.img', '.*');
      session.subject = subject;

      subject = session.subj_files{1,1};
      [p f e] = fileparts(subject);
      session.img_ext = ['*' e];

      create_struct_datamat(session)

   else								% pet

      session.num_subj = round(length(subj_file) / session.num_cond);
      session.subj_files = cell(session.num_cond, session.num_subj);

      for i = 1:session.num_cond
         for j = 1:session.num_subj
            [session.subject{j} session.subj_files{i,j}] = ...
		rri_fileparts(subj_file{(i-1)*session.num_subj+j});
         end
      end

      for j = 1:session.num_subj
         [tmp subj_name] = rri_fileparts(session.subject{j});
         session.subj_name = [session.subj_name {subj_name}];
      end

      subject = session.subj_files{1,1};
      [p f e] = fileparts(subject);
      session.img_ext = ['*' e];

      create_pet_datamat(session)

   end

   return;					% batch_create_datamat


%---------------------------------------------------------------------------
function create_fmri_datamat(session)

   if exist('plslog.m','file')
      plslog('Batch create fMRI datamat');
   end

   session_info.description = '';
   session_info.pls_data_path = pwd;
   session_info.datamat_prefix = session.prefix;

   if session.across_run
      session_info.num_conditions = session.num_cond;
      session_info.condition = session.cond_name;
      session_info.condition_baseline = session.baseline;
   else
      session_info.num_conditions = session.num_run * session.num_cond;

      for i = 1:session.num_run
         for j = 1:session.num_cond
            session_info.condition{ (i-1)*session.num_cond + j } = ...
		[ 'Run' num2str(i) session.cond_name{j} ];
         end
      end

      session_info.condition_baseline = ...
	repmat(session.baseline, [session.num_run 1]);
      session_info.condition_baseline = session_info.condition_baseline';
      session_info.condition_baseline = [session_info.condition_baseline(:)]';
   end

   session_info.num_conditions0 = session.num_cond;
   session_info.condition0 = session.cond_name;
   session_info.condition_baseline0 = session.baseline;
   session_info.num_runs = session.num_run;

   for i = 1:session.num_run
      file_lst = dir(session.data_files{i});
      flist = {file_lst.name};
      flist = flist(:);

      session_info.run(i).num_scans = 0;

      for j = 1:length(flist)
         session_info.run(i).num_scans = session_info.run(i).num_scans + ...
		get_nii_frame(fullfile(session.data_path{i}, flist{j}));
      end

      session_info.run(i).data_path = session.data_path{i};
      session_info.run(i).data_files = flist;
      session_info.run(i).file_pattern = session.file_pattern{i};
      session_info.run(i).evt_onsets = session.evt_onsets{i};
   end

   session_info.across_run = session.across_run;
   session_info.behavname_all = {};
   session_info.behavdata_all = [];
   session_info.behavname_each = {};
   session_info.behavdata_each = [];
   session_info.behavname_all_single = {};
   session_info.behavdata_all_single = [];
   session_info.behavname_each_single = {};
   session_info.behavdata_each_single = [];

   create_ver = plsgui_vernum;
   filename = [session.prefix '_fMRIsession.mat'];
   session_file = fullfile(session_info.pls_data_path, filename);

   if(exist(session_file, 'file')==2)
      disp(['WARNING: File ',filename,' is overwritten.']);
   end

   try
      save (session_file, 'session_info','create_ver');
   catch
      msg = sprintf('Cannot save session information to ''%s'' ',filename);
      error(msg);
   end;

   %  create datamat
   %  ==============

   if isnumeric(session.brain_region)
      options.UseBrainRegionFile = 0;
      options.BrainRegionFile = [];
      options.Threshold = session.brain_region;
   else
      options.UseBrainRegionFile = 1;
      options.BrainRegionFile = session.brain_region;
      options.Threshold = [];
   end

   orient = [];
   progress_hdl = rri_progress_status('create', ['Processing "' session_file '"']);

   options.RunsIncluded = 1:session.num_run;
   options.MaxStdDev = 4;
   options.SliceIgnored = [];
   options.NormalizeVolumeMean = 0;
   options.NumScansSkipped = 0;
   options.TemporalWindowSize = session.win_size;
   options.MergeDataAcrossRuns = session.across_run;
   options.BehavData = [];
   options.BehavName = {};
   options.session_win_hdl = [];
   options.NormalizeSignalMean = 1;
   options.ConsiderAllVoxels = 0;
   options.SingleSubject = session.single_subj;

   if (options.UseBrainRegionFile == 1)
      fmri_get_datamat(session_file,options.RunsIncluded, ...
					options.BrainRegionFile, ...
             				options.MaxStdDev, ...
					options.SliceIgnored, ...
					options.NormalizeVolumeMean, ...
					options.NumScansSkipped, ...
					options.TemporalWindowSize, ...
					options.MergeDataAcrossRuns, ...
					options.BehavData, ...
					options.BehavName, ...
					options.session_win_hdl, ...
					options.NormalizeSignalMean, ...
					options.ConsiderAllVoxels, ...
					options.SingleSubject, ...
					orient, 1);
   else
      fmri_get_datamat(session_file,options.RunsIncluded, ...
					options.Threshold, ...
					options.MaxStdDev, ...
					options.SliceIgnored, ...
					options.NormalizeVolumeMean, ...
					options.NumScansSkipped, ...
					options.TemporalWindowSize, ...
					options.MergeDataAcrossRuns, ...
					options.BehavData, ...
					options.BehavName, ...
					options.session_win_hdl, ...
					options.NormalizeSignalMean, ...
					options.ConsiderAllVoxels, ...
					options.SingleSubject, ...
					orient, 1);
   end

   return;					% create_fmri_datamat


%---------------------------------------------------------------------------
function create_bfm_datamat(session)

   if exist('plslog.m','file')
      plslog('Batch create BfMRI datamat');
   end

   session_info.description = '';
   session_info.pls_data_path = pwd;
   session_info.datamat_prefix = session.prefix;

   if session.across_run
      session_info.num_conditions = session.num_cond;
      session_info.condition = session.cond_name;
      session_info.condition_baseline = session.baseline;
   else
      session_info.num_conditions = session.num_run * session.num_cond;

      for i = 1:session.num_run
         for j = 1:session.num_cond
            session_info.condition{ (i-1)*session.num_cond + j } = ...
		[ 'Run' num2str(i) session.cond_name{j} ];
         end
      end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -