function varargout = spm_atlas(action,varargin) % Atlas multi-function % FORMAT xA = spm_atlas('load',atlas) % FORMAT L = spm_atlas('list') % FORMAT [S,sts] = spm_atlas('select',xA,label) % FORMAT Q = spm_atlas('query',xA,XYZmm) % FORMAT [Q,P] = spm_atlas('query',xA,xY) % FORMAT VM = spm_atlas('mask',xA,label,opt) % FORMAT V = spm_atlas('prob',xA,label) % FORMAT V = spm_atlas('maxprob',xA,thresh) % FORMAT D = spm_atlas('dir') % % FORMAT url = spm_atlas('weblink',XYZmm,website) % FORMAT labels = spm_atlas('import_labels',labelfile,fmt) % FORMAT spm_atlas('save_labels',labelfile,labels) %__________________________________________________________________________ % Copyright (C) 2013-2015 Wellcome Trust Centre for Neuroimaging % Guillaume Flandin % $Id: spm_atlas.m 6656 2015-12-24 16:49:52Z guillaume $ if ~nargin, action = 'load'; end %========================================================================== switch lower(action), case 'dir' %========================================================================== % FORMAT D = spm_atlas('dir') %-Return list of directories potentially containing atlas files d = {... fullfile(spm('Dir'),'tpm');... fullfile(spm('Dir'),'atlas');... }; varargout = { d }; %========================================================================== case 'def' %========================================================================== % FORMAT def = spm_atlas('def') %-Return link to atlas definition file [unused] def = 'http://www.fil.ion.ucl.ac.uk/spm/ext/atlas.xml'; varargout = { def }; %========================================================================== case 'load' %========================================================================== % FORMAT xA = spm_atlas('load',atlas) %-Load atlas if isempty(varargin) || isempty(varargin{1}) [atlas,sts] = spm_atlas('select'); if ~sts, varargout = {[]}; return; end else atlas = varargin{1}; end if isstruct(atlas), varargout = { atlas }; return; end %-Read Description switch spm_file(atlas,'ext') case 'xml' T = convert(xmltree(atlas)); xA.info = T.header; xA.info = rmfield(xA.info,'images'); xA.info.files.labels = atlas; xA.info.files.images = spm_file(T.header.images.imagefile,'path',spm_file(atlas,'fpath')); xA.VA = spm_vol(xA.info.files.images); idx = cellfun(@(x) str2double(x.index),T.data.label,'UniformOutput',false); name = cellfun(@(x) x.name,T.data.label,'UniformOutput',false); xA.labels = struct('name',name,'index',idx); case {'nii','img'} descfile = spm_file(atlas,'ext','xml'); if spm_existfile(descfile) xA = spm_atlas('load',descfile); else xA.info.name = spm_file(atlas,'basename'); xA.info.files.images = atlas; xA.VA = spm_vol(atlas); % assume a single image is a label image if numel(xA.VA) == 1 xA.info.type = 'label'; l = unique(spm_read_vols(xA.VA)); % discard 0/NaN/Inf? else xA.info.type = 'probabilistic'; l = 1:numel(xA.VA); end for i=1:numel(l) xA.labels(i) = struct('name',sprintf('Label %04d (%d)',i,l(i)),'index',l(i)); end end otherwise list = spm_atlas('list','installed'); idx = find(ismember(lower({list.name}),lower(atlas))); if numel(idx) == 1 xA = preloaded(list(idx).name); if isempty(xA) xA = spm_atlas('load',list(idx).file); preloaded(list(idx).name,xA); end elseif numel(idx) > 1 error('Two or more atlases share the same name.'); else error('Unknown atlas "%s".',atlas); end end varargout = { xA }; %========================================================================== case 'list' %========================================================================== % FORMAT L = spm_atlas('list',{'installed','available'}) %-Return list of installed or available atlases if isempty(varargin), varargin = {'installed'}; end switch lower(varargin{1}) case 'installed' L = atlas_list_installed(varargin{2:end}); case 'available' atlaslist = spm_atlas('def'); if ismember(atlaslist(1:4),{'http','file'}) [s, sts] = urlread(atlaslist); if ~sts, error('Cannot access "%s".',atlaslist); end atlaslist = s; elseif ~spm_existfile(atlaslist) error('Cannot open "%s".',atlaslist); end L = convert(xmltree(atlaslist)); otherwise error('Unknown option.'); end varargout = { L }; %========================================================================== case 'select' %========================================================================== % FORMAT [S,sts] = spm_atlas('select',xA,label) %-Select atlas or labels S = ''; if isempty(varargin) d = spm_atlas('Dir'); d = d{1}; [S,sts] = spm_select(1, {'image','xml'},... 'Select Atlas...', {}, d); if ~sts, varargout = { S, sts }; return; end else xA = spm_atlas('load',varargin{1}); if numel(varargin) == 1 [sel,sts] = listdlg(... 'ListString',{xA.labels.name},... 'SelectionMode','multiple',... 'ListSize', [400 300],... 'Name','Select label(s)',... 'PromptString',sprintf('Labels from %s atlas:',xA.info.name)); if ~sts, varargout = { S, sts }; return; end S = {xA.labels(sel).name}; else sts = true; S = filter_labels(xA,varargin{2}); end end varargout = { S, sts }; %========================================================================== case 'query' %========================================================================== % FORMAT Q = spm_atlas('query',xA,XYZmm) % FORMAT [Q,P] = spm_atlas('query',xA,xY) %-Atlas query xA = spm_atlas('load',varargin{1}); if nargin > 2, xY = varargin{2}; else xY = struct; end unknown = 'Unknown'; if numel(xA.VA) == 1 % or xA.info.type contains type definition if isnumeric(xY) && size(xY,2) == 1 %-peak XYZmm = xY; XYZ = xA.VA.mat\[XYZmm;1]; vpeak = spm_sample_vol(xA.VA,XYZ(1),XYZ(2),XYZ(3),0); j = [xA.labels.index] == vpeak; if any(j) == 1 Q = xA.labels(j).name; else Q = unknown; end varargout = { Q }; if nargout > 1, varargout = { {Q}, 100 }; end else %-cluster v = spm_summarise(xA.VA,xY); vu = unique(v); vun = histc(v,vu); [vun,is] = sort(vun(:),1,'descend'); vu = vu(is); for j=1:numel(vu) k = [xA.labels.index] == vu(j); if any(k) == 1 Q{j} = xA.labels(k).name; else Q{j} = unknown; end P(j) = 100*vun(j)/numel(v); end varargout = { Q, P }; end else P = {xA.labels.name}; if isnumeric(xY) %-peak XYZmm = xY; XYZ = xA.VA(1).mat\[XYZmm;1]; Q = spm_get_data(xA.VA,XYZ); % which interp to use? varargout = { Q, P }; else %-cluster v = spm_summarise(xA.VA,xY); v = mean(v,2); varargout = { v, P }; end end %========================================================================== case 'mask' %========================================================================== % FORMAT VM = spm_atlas('mask',xA,label,opt) %-Return (binary) mask for given labels if nargin < 2, xA = ''; else xA = varargin{1}; end xA = spm_atlas('load',xA); if nargin < 3 || isempty(varargin{2}), label = spm_atlas('select',xA); else label = varargin{2}; end label = filter_labels(xA,label); if numel(xA.VA) == 1 % or xA.info.type contains type definition if nargin < 4 || isempty(varargin{3}), opt = 'binary'; else opt = lower(varargin{3}); end VM = struct(... 'fname', [xA.info.name '_mask' spm_file_ext],... 'dim', xA.VA(1).dim,... 'dt', [spm_type('uint16') spm_platform('bigend')],... 'mat', xA.VA(1).mat,... 'n', 1,... 'pinfo', [1 0 0]',... 'descrip', sprintf('%s mask',xA.info.name)); if strcmp(opt,'binary') VM.dat = false(VM.dim); else VM.dat = uint16(zeros(VM.dim)); end D = spm_read_vols(xA.VA); for i=1:numel(label) j = find(ismember({xA.labels.name},label{i})); for k=1:numel(j) idx = xA.labels(j(k)).index; if strcmp(opt,'binary') VM.dat = VM.dat | (D == idx); elseif strcmp(opt,'atlas') VM.dat(D == idx) = i; elseif strcmp(opt,'preserve') VM.dat(D == idx) = idx; else error('Unknown option.'); end end end VM.dat = uint16(VM.dat); else if nargin < 4, thresh = 0.5; else thresh = varargin{3}; end VM = spm_atlas('prob',xA,label); VM.dt(1) = spm_type('uint8'); VM.dat = uint8(VM.dat > thresh); end varargout = { VM }; % The output mask can be saved to disk with: % VM = spm_write_vol(VM,VM.dat); % VM = rmfield(VM,'dat'); %========================================================================== case 'maxprob' %========================================================================== % FORMAT V = spm_atlas('maxprob',xA,thresh) if nargin < 2, xA = ''; else xA = varargin{1}; end xA = spm_atlas('load',xA); if nargin < 3 || isempty(varargin{2}), thresh = 0; else thresh = varargin{2}; end typ = 'int16'; V = struct(... 'fname', [xA.info.name '_maxprob_thresh' num2str(thresh) spm_file_ext],... 'dim', xA.VA(1).dim,... 'dt', [spm_type(typ) spm_platform('bigend')],... 'mat', xA.VA(1).mat,... 'n', 1,... 'pinfo', [1 0 0]',... 'descrip', sprintf('%s mask',xA.info.name)); V.dat = zeros(V.dim); for i=1:V.dim(3) Y = zeros(V.dim(1),V.dim(2),numel(xA.VA)); for j=1:numel(xA.VA) Y(:,:,j) = spm_slice_vol(xA.VA(j),spm_matrix([0 0 i]),V.dim(1:2),0); end [Y,V.dat(:,:,i)] = max(Y,[],3); V.dat(:,:,i) = V.dat(:,:,i) .* (Y > thresh); end V.dat = feval(cell2mat(spm_type(typ,'conv')),V.dat); varargout = { V }; %========================================================================== case 'prob' %========================================================================== % FORMAT V = spm_atlas('prob',xA,label) if nargin < 2, xA = ''; else xA = varargin{1}; end xA = spm_atlas('load',xA); if nargin < 3, label = spm_atlas('select',xA); else label = varargin{2}; end [label,idx] = filter_labels(xA,label); if numel(idx) == 1 descrip = label{1}; else descrip = sprintf('%s prob',xA.info.name); end V = struct(... 'fname', [xA.info.name '_prob' spm_file_ext],... 'dim', xA.VA(1).dim,... 'dt', [spm_type('float32') spm_platform('bigend')],... 'mat', xA.VA(1).mat,... 'n', 1,... 'pinfo', [1 0 0]',... 'descrip', descrip); V.dat = zeros(V.dim); for i=1:numel(idx) V.dat = V.dat + spm_read_vols(xA.VA(idx(i))); end V.dat = single(V.dat); varargout = { V }; %========================================================================== case 'install' %========================================================================== % FORMAT sts = spm_atlas('install',A) %-Install Atlas if isempty(varargin) h = atlas_figure('SPM Atlases'); H = getappdata(h,'Hbrowser'); if ispc, s = '/'; else s = ''; end localurl = @(f) sprintf(['file://' s strrep(spm('Dir'),'\','/') '/help/' f]); tpl = spm_file_template(fullfile(spm('Dir'),'help'),'keep'); tpl = tpl.file('TPL_ATLAS','spm_atlas.tpl'); tpl = tpl.block('TPL_ATLAS','loading','load'); tpl = tpl.block('TPL_ATLAS','listing','list'); tpl = tpl.block('listing','atlas','atl'); tpl = tpl.var('SPM',spm('Ver')); tpl = tpl.var('SPM_CSS',localurl('spm.css')); tpl = tpl.var('IMG_LOADING',localurl('images/loading.gif')); tpl = tpl.var('TXT_LOADING','Loading description of atlases...'); tpl = tpl.parse('load','loading',0); tpl = tpl.var('list',''); tpl = tpl.parse('OUT','TPL_ATLAS'); html = get(tpl,'OUT'); spm_browser(html,H); try L = spm_atlas('List','Available'); catch tpl = tpl.var('TXT_LOADING','Cannot access atlases description.'); tpl = tpl.var('IMG_LOADING',''); tpl = tpl.parse('load','loading',0); tpl = tpl.parse('OUT','TPL_ATLAS'); html = get(tpl,'OUT'); spm_browser(html,H); varargout = { false }; return; end tpl = tpl.var('load',''); tpl = tpl.var('tbx',''); for i=1:numel(L.atlas) tpl = tpl.var('ATLAS_URL',L.atlas{i}.website); tpl = tpl.var('ATLAS_NAME',L.atlas{i}.name); tpl = tpl.var('ATLAS_ID',L.atlas{i}.name); if isstruct(L.atlas{i}.maintainer) L.atlas{i}.maintainer = {L.atlas{i}.maintainer}; end for j=1:numel(L.atlas{i}.maintainer) tpl = tpl.var('ATLAS_AUTHOR',L.atlas{i}.maintainer{j}.name); tpl = tpl.var('ATLAS_EMAIL',L.atlas{i}.maintainer{j}.email); end tpl = tpl.var('ATLAS_SUMMARY',L.atlas{i}.description); tpl = tpl.parse('atl','atlas',1); end tpl = tpl.parse('list','listing',0); tpl = tpl.parse('OUT','TPL_ATLAS'); html = get(tpl,'OUT'); spm_browser(html,H); varargout = { true }; return; else A = varargin{1}; if ~(nargin == 3 && strcmpi(varargin{2},'-force')) AI = spm_atlas('list','installed'); if ismember(A,{AI.name}) warning('Atlas "%s" is already installed.',A); varargout = { true }; return; end end AA = spm_atlas('list','available'); for i=1:numel(AA.atlas) if strcmp(A,AA.atlas{i}.name) url = AA.atlas{i}.download; if isempty(url) if spm_platform('desktop') str = sprintf('%s',url,url); else str = url; end fprintf(['Atlas "%s" is only available through website:\n' ... ' ' str '\n'], A); if ~spm('CmdLine'), web(url,'-browser'); end varargout = { false }; return; else %-Check folder permissions %------------------------------------------------------ dest = spm_atlas('Dir'); dest = dest{end}; [sts, attrb] = fileattrib(dest); if ~sts, error('"%s"\n%s',dest,attrb); end if ~attrb.UserWrite error('No write access to "%s".\nMaybe use "%s" instead.',... dest, strrep(userpath,pathsep,'')); end %-Download atlas archive %------------------------------------------------------ tmpfile = [tempname(dest) '.zip']; try F = urlwrite(url,tmpfile); catch l = lasterror; switch l.identifier case 'MATLAB:urlwrite:ConnectionFailed' error('Could not access URL "%s".',url); case 'MATLAB:urlwrite:InvalidOutputLocation' error('Could not create output file "%s".',tmpfile); otherwise rethrow(l); end end %-Unzip archive in destination folder %------------------------------------------------------ try FS = unzip(F,dest); catch spm_unlink(F); error('Error when unpackig atlas archive'); end %-Delete atlas archive %------------------------------------------------------ spm_unlink(F); %-Display _README.txt if present %------------------------------------------------------ fprintf('Atlas "%s" installed.',A); idx = find(~cellfun('isempty',... regexpi(FS,sprintf('%s_README.txt$',A)))); if ~isempty(idx) type(FS{idx(1)}); end % Refresh list of installed atlases. spm_atlas('list','installed','-refresh'); varargout = { true }; return; end end end warning('Cannot find atlas "%s".',A); varargout = { false }; return; end %========================================================================== case 'weblink' %========================================================================== % FORMAT url = spm_atlas('weblink',XYZmm,website) %-Return URL for coordinates query XYZmm = varargin{1}; if nargin < 3, website = ''; else website = varargin{2}; end switch lower(website) case '' url = ''; case 'brede' %-Brede Database - Talairach coordinate search url = 'http://neuro.imm.dtu.dk/cgi-bin/brede_loc_query.pl?q=%d+%d+%d'; case 'neurosynth' %-Neurosynth - structure-to-function mappings url = 'http://neurosynth.org/locations/%d_%d_%d'; otherwise error('Unknown website "%s".',website); end url = sprintf(url,XYZmm); varargout = { url }; %========================================================================== case 'import_labels' %========================================================================== % FORMAT labels = spm_atlas('import_labels',labelfile,fmt) %-Read labels stored in other formats if isempty(varargin) || isempty(varargin{1}) [labelfile,sts] = spm_select(1,'any','Select labels file...'); if ~sts, varargout = { struct }; return; end else labelfile = varargin{1}; end if nargin < 3 fmt = 'default'; else fmt = varargin{2}; end labels = read_labels(labelfile,fmt); varargout = { labels }; %========================================================================== case 'save_labels' %========================================================================== % FORMAT spm_atlas('save_labels',labelfile,labels) %-Save labels to file if isempty(varargin) || isempty(varargin{1}) labelfile = 'labels.txt'; else labelfile = varargin{1}; end if nargin < 3 labels = spm_atlas('import_labels'); else labels = varargin{2}; end save_labels(labelfile,labels); %========================================================================== otherwise %========================================================================== error('Unknown action.'); end %========================================================================== % FUNCTION labels = read_labels(labelfile,fmt) %========================================================================== function labels = read_labels(labelfile,fmt) fid = fopen(labelfile,'rt'); if fid == -1, error('Cannot open atlas labels: "%s".',labelfile); end try switch lower(fmt) case 'default' % Default % Key Long Name L = textscan(fid,'%d %s','Delimiter','','ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{1})); case 'aal' % AAL % ShortName Long_Name Key L = textscan(fid,'%s %s %d','ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{3})); case 'freesurfer' % FreeSurfer % Key Long-Name Red Green Blue Alpha L = textscan(fid,'%d %s %d %d %d %d','CommentStyle','#','ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{1})); case 'brainvisa' % Brainvisa % Key, X, Y, Z, Red, Green, Blue, Acronym, Short Name L = textscan(fid,'%d %f %f %f %d %d %d %s %s','Delimiter',',','HeaderLines',1,'ReturnOnError',false); labels = struct('name',L{9},'index',num2cell(L{1})); case 'talairach' % Talairach % Key Long Name L = textscan(fid,'%d %s','Delimiter','\t','ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{1})); % MRIcron JHU-WhiteMatter % Key Long_Name % L = textscan(fid,'%d %s','Delimiter','\t','ReturnOnError',false); % labels = {{} L{2} L{1}}; % MRIcron Brodmann % labels = {{} cellfun(@(x) sprintf('Brodmann %d',x),num2cell(1:52),'UniformOutput',0) (1:52)}; case 'wfu_pickatlas' % WFU PickAtlas % Key Long Name * L = textscan(fid,'%d %s %*[^\n]','Delimiter','\t','CommentStyle',{'[' ']'},'ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{1})); case 'hammers_mith' % Hammers_mith % Long_Name * L = textscan(fid,'%s','Delimiter',',','HeaderLines',2,'MultipleDelimsAsOne',1,'ReturnOnError',false); labels = struct('name',L{1}(1:end-2),'index',num2cell((1:numel(L{1})-2)')); case 'cerebellum' % Joern's Cerebellum MNIsegment-MRICroN % Key Long_Name ??? L = textscan(fid,'%d %s %d','Delimiter',' ','ReturnOnError',false); labels = struct('name',L{2},'index',num2cell(L{1})); case 'fsl' % FSL % XML: X = xmltree(labelfile); I = find(X,'/atlas/data/label'); for i=1:numel(I) labels(i).name = get(X,children(X,I(i)),'value'); A = attributes(X,'get',I(i)); A = [A{:}]; labels(i).index = str2double(A(strcmp({A.key},'index')).val) + 1; % + 1? end case 'itk-snap' % Colin 27: ITK-SNAP Label Description File % Key Red Green Blue Alpha Vis Idx "Long Name" L = textscan(fid,'%d %d %d %d %d %d %d "%[^"]"','CommentStyle','#','ReturnOnError',false); labels = struct('name',L{8},'index',num2cell(L{1})); otherwise error('Unknown label file format.'); end catch fclose(fid); error('Cannot read atlas labels in: "%s".',labelfile); end fclose(fid); %========================================================================== % FUNCTION save_labels(labelfile,labels) %========================================================================== function save_labels(labelfile,labels) switch spm_file(labelfile,'ext') case 'txt' fid = fopen(labelfile,'wt'); if fid == -1, error('Cannot write file "%s".',labelfile); end for i=1:numel(labels) fprintf(fid,'%d %s\n',labels(i).index,labels(i).name); end fclose(fid); case 'xml' % t = xmltree; % t = set(t,root(t),'name','atlas'); % t = attributes(t,'add',root(t),'version','2.0'); % [t,hdr] = add(t,root(t),'element','header'); % [t,nam] = add(t,hdr,'element','name'); % t = add(t,nam,'chardata',''); % [t,typ] = add(t,hdr,'element','type'); % t = add(t,typ,'chardata',''); % [t,img] = add(t,hdr,'element','images'); % [t,imf] = add(t,img,'element','imagefile'); % t = add(t,imf,'chardata',''); % %[t,ims] = add(t,img,'element','summaryimagefile'); % %t = add(t,ims,'chardata',''); % [t,uid] = add(t,root(t),'element','data'); % for i=1:numel(labels) % [t,lab] = add(t,uid,'element','label'); % t = add(t,lab,'chardata',labels(i).name); % t = attributes(t,'add',lab,'index',num2str(labels(i).index)); % %t = attributes(t,'add',lab,'x',num2str(0)); % %t = attributes(t,'add',lab,'y',num2str(0)); % %t = attributes(t,'add',lab,'z',num2str(0)); % end % save(t,labelfile); fid = fopen(labelfile,'wt'); if fid == -1, error('Cannot write file "%s".',labelfile); end fprintf(fid,'\n'); fprintf(fid,'\n'); fprintf(fid,'\t
\n'); fprintf(fid,'\t\t%s\n',spm_file(labelfile,'basename')); fprintf(fid,'\t\t%s\n','1.0'); fprintf(fid,'\t\t%s\n',spm_file(labelfile,'basename')); fprintf(fid,'\t\t%s\n',''); fprintf(fid,'\t\t%s\n',''); fprintf(fid,'\t\tMNI\n'); fprintf(fid,'\t\t%s\n','Label'); % or 'Probabilistic' fprintf(fid,'\t\t\n'); fprintf(fid,'\t\t\t%s\n',spm_file(labelfile,'path','','ext',spm_file_ext)); fprintf(fid,'\t\t\n'); fprintf(fid,'\t
\n'); fprintf(fid,'\t\n'); for i=1:numel(labels) fprintf(fid,'\t\t\n',... labels(i).index,labels(i).name); end fprintf(fid,'\t\n'); fprintf(fid,'
\n'); fclose(fid); otherwise error('Unknown label file format.'); end %========================================================================== % FUNCTION [labels,i] = filter_labels(xA,labels) %========================================================================== function [labels,i] = filter_labels(xA,labels) % calls to 'intersect' should use 'stable' option and handle repetitions if isnumeric(labels) [unused,idx] = intersect([xA.labels.index],labels); labels = {xA.labels(idx).name}; elseif isstruct(labels) labels = {labels.name}; elseif ~iscellstr(labels) idx = ~cellfun(@isempty,regexp({xA.labels.name},labels)); labels = {xA.labels(idx).name}; end [labels,i] = intersect({xA.labels.name},labels); %========================================================================== % FUNCTION L = atlas_list_installed(refresh) %========================================================================== function L = atlas_list_installed(refresh) persistent atlas_list if nargin && strcmpi(refresh,'-refresh'), atlas_list = []; end if isempty(atlas_list) atlas_list = struct('file',{},'name',{}); d = spm_atlas('Dir'); for i=1:numel(d) L = spm_select('FPList',d{i},'^.*\.xml$'); if isempty(L), L = {}; else L = cellstr(L); end for j=1:numel(L) A.file = L{j}; A.name = spm_file(L{j},'basename'); if strncmp(A.name,'labels_',7), A.name = A.name(8:end); end atlas_list(end+1) = A; end end end L = atlas_list; %========================================================================== % FUNCTION xA = preloaded(atlas) %========================================================================== function xA = preloaded(atlas,xA) persistent pl_atlas persistent pl_xA if isempty(pl_atlas), pl_atlas = {}; end if isempty(pl_xA), pl_xA = {}; end i = find(ismember(pl_atlas,atlas)); if nargin == 1 if isempty(i) xA = []; else xA = pl_xA{i}; end else if isempty(i) pl_atlas = [pl_atlas atlas]; pl_xA = [pl_xA {xA}]; else pl_xA{i} = xA; end end %========================================================================== % FUNCTION atlas_figure %========================================================================== function h = atlas_figure(name) if ~nargin, name = 'Atlases'; end h = spm_figure('FindWin','SPMatlas'); if ~isempty(h), set(h,'Name',name); return; end h = figure(... 'MenuBar', 'none',... 'NumberTitle', 'off',... 'Name', name,... 'Resize', 'off',... 'Toolbar', 'none',... 'Tag', 'SPMatlas',... 'WindowStyle', 'Normal',... %'Modal' 'Color', [1 1 1],... 'Visible', 'off'); pos = get(h,'Position'); pos([3 4]) = [350 400]; set(h,'Position',pos); [H, HC] = spm_browser('',h,[2 2 pos(3)-4 pos(4)-4],'html'); setappdata(h,'Hbrowser',H); setappdata(h,'HCbrowser',HC); set(h,'Resize','on','ResizeFcn',@atlas_figure_resize); set(h,'Visible','on'); %========================================================================== % FUNCTION atlas_resize(obj,evt,varargin) %========================================================================== function atlas_figure_resize(obj,evt,varargin) old_units = get(obj,'Units'); set(obj, 'Units','pixels'); figpos = get(obj,'Position'); H = getappdata(obj,'HCbrowser'); set(H, 'pos',[2 2 figpos(3)-4 figpos(4)-4]); set(obj, 'Units',old_units);