function out=conn_importspm(spmfiles) % Imports experiment info from SPM.mat files % global CONN_x; if nargin>0, if ~iscell(spmfiles),spmfiles=cellstr(spmfiles);end nsubjects=length(spmfiles); if nsubjects~=CONN_x.Setup.nsubjects, CONN_x.Setup.nsubjects=conn_merge(CONN_x.Setup.nsubjects,nsubjects); end for nsub=1:nsubjects, filename=fliplr(deblank(fliplr(deblank(spmfiles{nsub})))); CONN_x.Setup.spm{nsub}=conn_file(filename); end end %CONN_x.Setup.nsessions=zeros(1,CONN_x.Setup.nsubjects); changed=0;err=0; for nsub=1:CONN_x.Setup.nsubjects, if ~isempty(CONN_x.Setup.spm{nsub}{1}), %try, spmfile=load(CONN_x.Setup.spm{nsub}{1}); if isfield(spmfile.SPM,'xBF')&&isfield(spmfile.SPM.xBF,'UNITS'), units=spmfile.SPM.xBF.UNITS; if strcmp(units,'scans'), units=1; elseif strcmp(units,'secs'), units=2; else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': invalid SPM.xBF.UNITS value (assuming scans)']); err=err+1; end else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.xBF.UNITS not found (assuming scans)']); units=1; err=err+1; end if isfield(spmfile.SPM,'xY')&&isfield(spmfile.SPM.xY,'RT'), CONN_x.Setup.RT=spmfile.SPM.xY.RT; else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.xY.RT not found (leaving unchanged)']); err=err+1; end if ~isfield(spmfile.SPM,'nscan'), disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.nscan not found (stopped importing for this subject)']); err=err+1; else, nsess=length(spmfile.SPM.nscan); CONN_x.Setup.nsessions(nsub)=nsess; for nses=1:nsess, idx=spmfile.SPM.Sess(nses).row; filename=fliplr(deblank(fliplr(deblank(spmfile.SPM.xY.P(idx,:))))); switch(filesep),case '\',idx=find(filename=='/');case '/',idx=find(filename=='\');end; filename(idx)=filesep; n=0; while n<size(filename,1), ok=conn_existfile(filename(n+1,:)); if ok, n=n+1; else if changed, fullnamematch=strvcat(fliplr(fullname1),fliplr(fullname2)); m=sum(cumsum(fullnamematch(1,:)~=fullnamematch(2,:))==0); m1=max(0,length(fullname1)-m); m2=max(0,length(fullname2)-m); %filename=strvcat(filename(1:n,:),[repmat(fullname2(1:m2),[size(filename,1)-n,1]),filename(n+1:end,m1+1:end)]); filenamet=strvcat(filename(1:n,:),[fullname2(1:m2),filename(n+1,m1+1:end)],filename(n+2:end,:)); if ~conn_existfile(filenamet(n+1,:)), askthis=1; else try disp(['conn_importspm: updating reference from ',deblank(filename(n+1,:)),' to ',deblank(filenamet(n+1,:))]); [V,str,icon]=conn_getinfo(deblank(filenamet(n+1,:))); askthis=0;filename=filenamet; catch askthis=1; end end else askthis=1; end if askthis, disp(['conn_importspm: file ',deblank(filename(n+1,:)),' not found']); fullname1=deblank(filename(n+1,:)); [pathname1,name1,ext1,num1]=spm_fileparts(fullname1); name2=''; while ~strcmp(name2,[name1,ext1]) disp(['File not found: ',name1,ext1]); [name2,pathname2]=uigetfile(['*',ext1],['File not found: ',name1,ext1],['*',name1,ext1]); end if all(name2==0), filename=[]; break; end fullname2=fullfile(pathname2,[name2,num1]); changed=1; fullnamematch=strvcat(fliplr(fullname1),fliplr(fullname2)); m=sum(cumsum(fullnamematch(1,:)~=fullnamematch(2,:))==0); m1=max(0,length(fullname1)-m); m2=max(0,length(fullname2)-m); filename=strvcat(filename(1:n,:),[fullname2(1:m2),filename(n+1,m1+1:end)],filename(n+2:end,:)); end end end [filename1_path,filename1_name,filename1_ext,filename1_num]=spm_fileparts(filename(1,:)); filename1=fullfile(filename1_path,[filename1_name,filename1_ext]); [V,str,icon]=conn_getinfo(filename); CONN_x.Setup.functional{nsub}{nses}={filename,str,icon}; CONN_x.Setup.nscans{nsub}{nses}=numel(V); if isfield(CONN_x.Setup','spmascovariate')&&CONN_x.Setup.spmascovariate if isfield(spmfile.SPM.Sess(nses),'col')&&~isempty(spmfile.SPM.Sess(nses).col) name='SPM effects'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.xX.X(spmfile.SPM.Sess(nses).row,spmfile.SPM.Sess(nses).col)}; end if isfield(spmfile.SPM.Sess(nses),'C')&&~isempty(spmfile.SPM.Sess(nses).C.C) name='SPM covariates'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.Sess(nses).C.C}; elseif ~isempty(dir(conn_prepend('rp_',filename1,'.txt'))), name='realignment'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('rp_',filename1,'.txt')); end else nconditions=length(spmfile.SPM.Sess(nses).U); for ncondition=1:nconditions, name=spmfile.SPM.Sess(nses).U(ncondition).name{1}; idx=strmatch(name,CONN_x.Setup.conditions.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.conditions.names); CONN_x.Setup.conditions.names{end+1}=' '; end CONN_x.Setup.conditions.names{idx}=name; if units==2, CONN_x.Setup.conditions.values{nsub}{idx}{nses}{1}=spmfile.SPM.Sess(nses).U(ncondition).ons; CONN_x.Setup.conditions.values{nsub}{idx}{nses}{2}=spmfile.SPM.Sess(nses).U(ncondition).dur; else, CONN_x.Setup.conditions.values{nsub}{idx}{nses}{1}=(spmfile.SPM.Sess(nses).U(ncondition).ons-0)*CONN_x.Setup.RT; CONN_x.Setup.conditions.values{nsub}{idx}{nses}{2}=spmfile.SPM.Sess(nses).U(ncondition).dur*CONN_x.Setup.RT; end end if isfield(spmfile.SPM.Sess(nses),'C')&&~isempty(spmfile.SPM.Sess(nses).C.C) name='SPM covariates'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.Sess(nses).C.C}; elseif ~isempty(dir(conn_prepend('rp_',filename1,'.txt'))), name='realignment'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('rp_',filename1,'.txt')); end if ~isempty(dir(conn_prepend('art_regresion_outliers_',filename1,'.mat'))), name='ART covariates'; idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact'); if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end CONN_x.Setup.l1covariates.names{idx}=name; CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('art_regresion_outliers_',filename1,'.mat')); end end end if nsub==CONN_x.Setup.nsubjects, % fills possible empty conditions for each subject/session nconditions=length(CONN_x.Setup.conditions.names)-1; for nsub2=1:nsub, nsess=CONN_x.Setup.nsessions(nsub2); for ncondition=1:nconditions for nses=1:nsess if numel(CONN_x.Setup.conditions.values{nsub2})<ncondition||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition})<nses||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses})<1, CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses}{1}=[]; end if numel(CONN_x.Setup.conditions.values{nsub2})<ncondition||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition})<nses||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses})<2, CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses}{2}=[]; end end end end end end %catch, % disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': unexpected error (stopped importing for this subject)']); % err=err+1; % disp(lasterr); %end end end if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, if ~err, uiwait(msgbox([num2str(CONN_x.Setup.nsubjects),' subjects imported with no errors'],'Done')); else, uiwait(msgbox(['Import finished with ',num2str(err),' errors'],'WARNING!')); end end if nargout,out=CONN_x;end end function out=conn_existfile(filename) [filepath,filename,fileext,filenum]=spm_fileparts(deblank(filename)); try out=spm_existfile(fullfile(filepath,[filename,fileext])); catch out=~isempty(dir(fullfile(filepath,[filename,fileext]))); end end