Home > marsbar > marsbar.m

marsbar

PURPOSE ^

Startup, callback and utility routine for Marsbar

SYNOPSIS ^

function varargout=marsbar(varargin)

DESCRIPTION ^

 Startup, callback and utility routine for Marsbar

 MarsBaR: Marseille Boite a Regions d'interet 
          Marseille Region of Interest Toolbox 

 MarsBaR (the collection of files listed by contents.m) is copyright under
 the GNU general public license.  Please see mars_licence.man for details.
 
 Marsbar written and copyright claimed by 
 Jean-Luc Anton, Matthew Brett, Jean-Baptiste Poline, Romain Valabregue 

 Portions of the code rely heavily on (or are copied from) SPM
 (http://www.fil.ion.ucl.ac.uk/spm), which is also released under the GNU
 public licence.  Many thanks the SPM authors: (John Ashburner, Karl Friston,
 Andrew Holmes et al, and of course our own Jean-Baptiste).

 This software is MarsBaRWare. It is written in the hope that it is
 helpful; if you find it so, please let us know by sending a Mars bar to:
 The Jean-Luc confectionery collection, Centre IRMf, CHU La Timone, 264,
 Rue Saint Pierre 13385 Marseille Cedex 05, France
 
 If you find that it actively hinders your work, do send an
 elderly sardine to the same address.

 Please visit our friends at The Visible Mars Bar project:
 http://totl.net/VisibleMars

 $Id$

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function varargout=marsbar(varargin) 
0002 % Startup, callback and utility routine for Marsbar
0003 %
0004 % MarsBaR: Marseille Boite a Regions d'interet
0005 %          Marseille Region of Interest Toolbox
0006 %
0007 % MarsBaR (the collection of files listed by contents.m) is copyright under
0008 % the GNU general public license.  Please see mars_licence.man for details.
0009 %
0010 % Marsbar written and copyright claimed by
0011 % Jean-Luc Anton, Matthew Brett, Jean-Baptiste Poline, Romain Valabregue
0012 %
0013 % Portions of the code rely heavily on (or are copied from) SPM
0014 % (http://www.fil.ion.ucl.ac.uk/spm), which is also released under the GNU
0015 % public licence.  Many thanks the SPM authors: (John Ashburner, Karl Friston,
0016 % Andrew Holmes et al, and of course our own Jean-Baptiste).
0017 %
0018 % This software is MarsBaRWare. It is written in the hope that it is
0019 % helpful; if you find it so, please let us know by sending a Mars bar to:
0020 % The Jean-Luc confectionery collection, Centre IRMf, CHU La Timone, 264,
0021 % Rue Saint Pierre 13385 Marseille Cedex 05, France
0022 %
0023 % If you find that it actively hinders your work, do send an
0024 % elderly sardine to the same address.
0025 %
0026 % Please visit our friends at The Visible Mars Bar project:
0027 % http://totl.net/VisibleMars
0028 %
0029 % $Id$
0030 
0031 % Programmer's help
0032 % -----------------
0033 % For a list of the functions implemented here, try
0034 % grep "^case " marsbar.m
0035   
0036 % Marsbar version
0037 MBver = '0.43';  % Bugfix release for SPM8 and earlier
0038 
0039 % Various working variables in global variable structure
0040 global MARS;
0041 
0042 %-Format arguments
0043 %-----------------------------------------------------------------------
0044 if nargin == 0, Action='Startup'; else, Action = varargin{1}; end
0045 
0046 %=======================================================================
0047 switch lower(Action), case 'startup'                     %-Start marsbar
0048 %=======================================================================
0049 
0050 %-Turn on warning messages for debugging
0051 warning backtrace
0052 
0053 % splash screen once per session
0054 splashf = ~marsbar('is_started');
0055 
0056 % promote spm directory to top of path, read defaults
0057 marsbar('on');
0058 
0059 % Workaround for bizarre linux uigetfile problem: see
0060 % http://www.mathworks.com/support/bugreports/details.html?rp=259878
0061 % (or search Mathworks support for uigetfile linux
0062 mlv = version; mlv = str2num(mlv(1:3));
0063 if mlv >= 7 & strcmp(computer, 'GLNX86')
0064   if usejava('jvm')
0065     setappdata(0,'UseNativeSystemDialogs',false)
0066   else
0067     warning(['Matlab 7, linux, no java, please see FAQ for '...
0068          'information on problems with file selection dialogs']);
0069   end
0070 end
0071 
0072 %-Open startup window, set window defaults
0073 %-----------------------------------------------------------------------
0074 S = get(0,'ScreenSize');
0075 if all(S==1), error('Can''t open any graphics windows...'), end
0076 PF = spm_platform('fonts');
0077 
0078 % Splash screen
0079 %------------------------------------------
0080 if splashf
0081   marsbar('splash');
0082 end
0083 
0084 %-Draw marsbar window
0085 %-----------------------------------------------------------------------
0086 Fmenu = marsbar('CreateMenuWin','off');
0087 
0088 %-Reveal windows
0089 %-----------------------------------------------------------------------
0090 set([Fmenu],'Visible','on')
0091 
0092 %=======================================================================
0093 case 'on'                                           %-Initialise MarsBaR
0094 %=======================================================================
0095 
0096 % promote spm replacement directory
0097 % remove incorrect spm replacement directories
0098 mbpath = fileparts(which('marsbar.m'));
0099 spmV = mars_utils('spm_version');
0100 m_spm_paths = {'spm99', 'spm2', 'spm5'};
0101 v_path = lower(spmV);
0102 % spm8 is effectively identical to spm5 for marsbar
0103 if strcmp(v_path, 'spm8')
0104     v_path = 'spm5';
0105 end
0106 w_s = warning;
0107 warning off
0108 for p = m_spm_paths(~ismember(m_spm_paths, v_path))
0109   rmpath(fullfile(mbpath, char(p)))
0110 end
0111 warning(w_s)
0112 MARS.ADDPATHS = {fullfile(mbpath, v_path)};
0113 addpath(MARS.ADDPATHS{:}, '-begin');
0114 fprintf('MarsBaR analysis functions prepended to path\n');
0115 
0116 % check SPM defaults are loaded
0117 mars_veropts('defaults');
0118 
0119 % set up the ARMOIRE stuff
0120 % see marmoire help for details
0121 if isfield(MARS, 'ARMOIRE')
0122   o = MARS.ARMOIRE; 
0123 else
0124   o = marmoire;
0125 end
0126 
0127 spm_design_filter = mars_veropts('design_filter_spec');
0128 filter_specs  = {[spm_design_filter(1,:);...
0129           {'*_mdes.mat','MarsBaR: *_mdes.mat'}; ...
0130           spm_design_filter(2:end,:)], ...
0131          {'*_mdata.mat','MarsBaR data file (*_mdata.mat)'},...
0132          {'*_mres.mat', 'MarsBaR results (*_mres.mat)'}};
0133 
0134 o = add_if_absent(o, 'def_design', ...
0135           struct('default_file_name', 'untitled_mdes.mat',...      
0136              'filter_spec', {filter_specs{1}},...
0137              'title', 'Default design',...
0138              'set_action','mars_arm_call(''set_design'',o,item,old_o)'));
0139 o = add_if_absent(o, 'roi_data',...
0140           struct('default_file_name', 'untitled_mdata.mat',...
0141              'filter_spec', {filter_specs{2}},...
0142              'title', 'ROI data',...
0143              'set_action','mars_arm_call(''set_data'',o,item,old_o)'));
0144 o = add_if_absent(o, 'est_design',...
0145           struct('default_file_name', 'untitled_mres.mat',...
0146              'filter_spec', {filter_specs{3}},...
0147              'title', 'MarsBaR estimated design',...
0148              'set_action', 'mars_arm_call(''set_results'',o,item,old_o)'));
0149 MARS.ARMOIRE = o;
0150 
0151 % and workspace
0152 if ~isfield(MARS, 'WORKSPACE'), MARS.WORKSPACE = []; end
0153 
0154 % read any necessary defaults
0155 if ~mars_struct('isthere', MARS, 'OPTIONS')
0156   loadf = 1;
0157   MARS.OPTIONS = [];
0158 else
0159   loadf = 0;
0160 end
0161 [mbdefs sourcestr] = mars_options('Defaults');
0162 MARS.OPTIONS = mars_options('fill',MARS.OPTIONS, mbdefs);
0163 mars_options('put');
0164 if loadf
0165   fprintf('Loaded MarsBaR defaults from %s\n',sourcestr);
0166 end
0167 
0168 % Add very very odd fix for maroi object path problem
0169 % and matlab 7.1 (at least)
0170 % Don't ask why this is needed - I don't know.
0171 maroi;
0172 
0173 %=======================================================================
0174 case 'off'                                              %-Unload MarsBaR
0175 %=======================================================================
0176 % res = marsbar('Off')
0177 %-----------------------------------------------------------------------
0178 varargout = {0};
0179 
0180 % leave if no signs of marsbar
0181 if ~marsbar('is_started'), return, end
0182 
0183 % save outstanding information
0184 btn = mars_arm('save_ui', 'all', struct('ync', 1, 'no_no_save', 1));
0185 if btn == -1, varargout = {-1}; return, end % cancel
0186 
0187 % remove marsbar added directories
0188 rmpath(MARS.ADDPATHS{:});
0189 fprintf('MarsBaR analysis functions removed from path\n');
0190 
0191 %=======================================================================
0192 case 'quit'                                        %-Quit MarsBaR window
0193 %=======================================================================
0194 % marsbar('Quit')
0195 %-----------------------------------------------------------------------
0196 
0197 % do path stuff, save any pending changes
0198 if marsbar('off') == -1, return, end % check for cancel
0199 
0200 % leave if no signs of MARSBAR
0201 if ~marsbar('is_started'), return, end
0202 
0203 %-Close any existing 'MarsBaR' 'Tag'ged windows
0204 delete(spm_figure('FindWin','MarsBaR'))
0205 fprintf('Au revoir...\n\n')
0206 
0207 %=======================================================================
0208 case 'is_started'        %-returns 1 if MarsBaR GUI has been initialized
0209 %=======================================================================
0210 % tf  = marsbar('is_started')
0211 varargout = {~isempty(MARS)};
0212 
0213 %=======================================================================
0214 case 'cfgfile'                                  %-finds MarsBaR cfg file
0215 %=======================================================================
0216 % cfgfn  = marsbar('cfgfile')
0217 cfgfile = 'marsbarcfg.mat';
0218 varargout = {which(cfgfile), cfgfile}; 
0219 
0220 %=======================================================================
0221 case 'createmenuwin'                          %-Draw MarsBaR menu window
0222 %=======================================================================
0223 % Fmenu = marsbar('CreateMenuWin',Vis)
0224 if nargin<2, Vis='on'; else, Vis=varargin{2}; end
0225 
0226 %-Close any existing 'MarsBaR' 'Tag'ged windows
0227 delete(spm_figure('FindWin','MarsBaR'))
0228 
0229 % Version etc info
0230 [MBver,MBc] = marsbar('Ver');
0231 
0232 %-Get size and scalings and create Menu window
0233 %-----------------------------------------------------------------------
0234 WS   = spm('WinScale');                %-Window scaling factors
0235 FS   = spm('FontSizes');            %-Scaled font sizes
0236 PF   = spm_platform('fonts');            %-Font names (for this platform)
0237 Rect = [50 600 300 275];               %-Raw size menu window rectangle
0238 bno = 6; bgno = bno+1;
0239 bgapr = 0.25;
0240 bh = Rect(4) / (bno + bgno*bgapr);      % Button height
0241 gh = bh * bgapr;                        % Button gap
0242 by = fliplr(cumsum([0 ones(1, bno-1)*(bh+gh)])+gh);
0243 bx = Rect(3)*0.1;
0244 bw = Rect(3)*0.8;
0245 Fmenu = figure('IntegerHandle','off',...
0246     'Name',sprintf('%s',MBc),...
0247     'NumberTitle','off',...
0248     'Tag','MarsBaR',...
0249     'Position',Rect.*WS,...
0250     'Resize','off',...
0251     'Color',[1 1 1]*.8,...
0252     'UserData',struct('MBver',MBver,'MBc',MBc),...
0253     'MenuBar','none',...
0254     'DefaultTextFontName',PF.helvetica,...
0255     'DefaultTextFontSize',FS(12),...
0256     'DefaultUicontrolFontName',PF.helvetica,...
0257     'DefaultUicontrolFontSize',FS(12),...
0258     'DefaultUicontrolInterruptible','on',...
0259     'Renderer','painters',...
0260     'Visible','off');
0261 
0262 %-Objects with Callbacks - main MarsBaR routines
0263 %=======================================================================
0264 
0265 funcs = {'mars_display_roi(''display'');',...
0266      'mars_blob_ui;',...
0267      'marsbar(''buildroi'');',...
0268      'marsbar(''transform'');',...
0269      'marsbar(''import_rois'');',...
0270      'marsbar(''export_rois'');'};
0271 
0272 uicontrol(Fmenu,'Style','PopUp',...
0273       'String',['ROI definition',...
0274             '|View...'...
0275             '|Get SPM cluster(s)...'...
0276             '|Build...',...
0277             '|Transform...',...
0278             '|Import...',...
0279             '|Export...'],...
0280       'Position',[bx by(1) bw bh].*WS,...
0281       'ToolTipString','Draw / build / combine ROIs...',...
0282       'CallBack','spm(''PopUpCB'',gcbo)',...
0283       'UserData',funcs);
0284 
0285 % Design menu
0286 fw_st = 'struct(''force'', 1, ''warn_empty'', 1)';
0287 funcs = {...
0288     'marsbar(''make_design'', ''pet'');',...
0289     'marsbar(''make_design'', ''fmri'');',...
0290     'marsbar(''make_design'', ''basic'');',...
0291     'marsbar(''design_report'')',...
0292     'marsbar(''design_filter'')',...
0293     'marsbar(''add_images'')',...
0294     'marsbar(''edit_filter'')',...
0295     'marsbar(''check_images'')',...
0296     'marsbar(''list_images'')',...
0297     'marsbar(''ana_cd'')',...
0298     'marsbar(''ana_desmooth'')',...
0299     'marsbar(''def_from_est'')',...
0300     'marsbar(''set_def'')',...
0301     ['mars_arm(''save_ui'', ''def_design'', ' fw_st ');'],...
0302     'mars_arm(''show_summary'', ''def_design'')'};
0303 
0304 uicontrol(Fmenu,'Style','PopUp',...
0305       'String',['Design...'...
0306             '|PET models',...
0307             '|FMRI models',...
0308             '|Basic models',...
0309             '|Explore',...
0310             '|Frequencies (event+data)',...
0311             '|Add images to FMRI design',...
0312             '|Add/edit filter for FMRI design',...    
0313             '|Check image names in design',...
0314             '|List image names to console',...
0315             '|Change design path to images',...
0316             '|Convert to unsmoothed',...
0317             '|Set design from estimated',...
0318             '|Set design from file',...
0319             '|Save design to file',...
0320             '|Show default design summary'],...
0321       'Position',[bx by(2) bw bh].*WS,...
0322       'ToolTipString','Set/specify design...',...
0323       'CallBack','spm(''PopUpCB'',gcbo)',...
0324       'UserData',funcs);
0325 
0326 % Data menu
0327 funcs = {'marsbar(''extract_data'', ''default'');',...
0328      'marsbar(''extract_data'', ''full'');',...
0329      'marsbar(''set_defregion'');',...
0330      'marsbar(''plot_data'', ''raw'');',...
0331      'marsbar(''plot_data'', ''full'');',...
0332      'marsbar(''import_data'');',...
0333      'marsbar(''export_data'');',...
0334      'marsbar(''split_data'');',...
0335      'marsbar(''join_data'');',...
0336      'mars_arm(''set_ui'', ''roi_data'');',...
0337      ['mars_arm(''save_ui'', ''roi_data'', ' fw_st ');'],...
0338      'mars_arm(''show_summary'', ''roi_data'')'};
0339 
0340 uicontrol(Fmenu,'Style','PopUp',...
0341       'String',['Data...'...
0342             '|Extract ROI data (default)',...
0343             '|Extract ROI data (full options)',...
0344             '|Default region...',...
0345             '|Plot data (simple)',...
0346             '|Plot data (full)',...            
0347             '|Import data',...
0348             '|Export data',...
0349             '|Split regions into files',...
0350             '|Merge data files',...
0351             '|Set data from file',...
0352             '|Save data to file',...
0353             '|Show data summary'],...
0354       'Position',[bx by(3) bw bh].*WS,...
0355       'ToolTipString','Extract/set/save data...',...
0356       'CallBack','spm(''PopUpCB'',gcbo)',...
0357       'UserData',funcs);
0358 
0359 % results menu
0360 funcs = {...
0361     'marsbar(''estimate'');',...
0362     'marsbar(''merge_contrasts'');',...
0363     'marsbar(''refresh_contrasts'');',...
0364     'marsbar(''add_trial_f'');',...
0365     'marsbar(''set_defcon'');',...
0366     'marsbar(''set_defregion'');',...
0367     'marsbar(''plot_residuals'');',...
0368     'marsbar(''spm_graph'');',...
0369     'marsbar(''stat_table'');',...
0370     'marsbar(''signal_change'');',...
0371     'marsbar(''fitted_events'');',...
0372     'marsbar(''fir_events'');',...
0373     'marsbar(''add_events_by_name'');',...
0374     'marsbar(''set_results'');',...
0375     ['mars_arm(''save_ui'', ''est_design'', ' fw_st ');'],...
0376     'mars_arm(''show_summary'', ''est_design'')'};
0377 
0378 uicontrol(Fmenu,'Style','PopUp',...
0379       'String',['Results...'...
0380             '|Estimate results',...
0381             '|Import contrasts',...
0382             '|Refresh F contrasts',...
0383             '|Add trial-specific F',...
0384             '|Default contrast...',...
0385             '|Default region...',...
0386             '|Plot residuals',...
0387             '|MarsBaR SPM graph',...
0388             '|Statistic table',...
0389             '|% signal change',...
0390             '|Fitted event time course',...
0391             '|FIR event time course',...            
0392             '|Add event types by name',...
0393             '|Set results from file',...
0394             '|Save results to file',...
0395             '|Show estimated design summary'],...
0396       'Position',[bx by(4) bw bh].*WS,...
0397       'ToolTipString','Write/display contrasts...',...
0398       'CallBack','spm(''PopUpCB'',gcbo)',...
0399       'UserData',funcs);
0400 
0401 % options menu
0402 funcs = {['global MARS; '...
0403      'MARS.OPTIONS=mars_options(''edit'');mars_options(''put'');'],...
0404      ['global MARS; '...
0405       '[MARS.OPTIONS str]=mars_options(''defaults'');' ...
0406       'mars_options(''put''); '...
0407       'fprintf(''Defaults loaded from %s\n'', str)'],...
0408      ['global MARS; '...
0409       '[MARS.OPTIONS str]=mars_options(''basedefaults'');' ...
0410       'mars_options(''put''); '...
0411       'fprintf(''Defaults loaded from %s\n'', str)'],...
0412      ['global MARS; '...
0413       'MARS.OPTIONS=mars_options(''load'');mars_options(''put'');'],...
0414      'mars_options(''save'');'...
0415     };
0416      
0417 uicontrol(Fmenu,'Style','PopUp',...
0418       'String',['Options...'...
0419             '|Edit options'...
0420             '|Restore defaults'...
0421             '|Base defaults',...
0422             '|Set options from file'...
0423             '|Save options to file'],...
0424       'Position',[bx by(5) bw bh].*WS,...
0425       'ToolTipString','Load/save/edit MarsBaR options',...
0426       'CallBack','spm(''PopUpCB'',gcbo)',...
0427       'UserData',funcs);
0428 
0429 % quit button
0430 uicontrol(Fmenu,'String','Quit',...
0431       'Position',[bx by(6) bw bh].*WS,...
0432       'ToolTipString','exit MarsBaR',...
0433       'ForeGroundColor','r',...
0434       'Interruptible','off',...
0435       'CallBack','marsbar(''Quit'')');
0436 
0437 % Set quit action if MarsBaR window is closed
0438 %-----------------------------------------------------------------------
0439 set(Fmenu,'CloseRequestFcn','marsbar(''Quit'')')
0440 set(Fmenu,'Visible',Vis)
0441 
0442 varargout = {Fmenu};
0443 
0444 %=======================================================================
0445 case {'ver', 'version'}                         %-Return MarsBaR version
0446 %=======================================================================
0447 % [v [,banner]] = marsbar('Ver')
0448 %-----------------------------------------------------------------------
0449 varargout = {MBver, 'MarsBaR - Marseille ROI toolbox'};
0450 
0451 %=======================================================================
0452 case 'splash'                                       %-show splash screen
0453 %=======================================================================
0454 % marsbar('splash')
0455 %-----------------------------------------------------------------------
0456 % Shows splash screen
0457 WS   = spm('WinScale');        %-Window scaling factors
0458 [X,map] = imread('marsbar.jpg');
0459 aspct = size(X,1) / size(X,2);
0460 ww = 400;
0461 srect = [200 300 ww ww*aspct] .* WS;   %-Scaled size splash rectangle
0462 h = figure('visible','off',...
0463        'menubar','none',...
0464        'numbertitle','off',...
0465        'name','Welcome to MarsBaR',...
0466        'pos',srect);
0467 im = image(X);
0468 colormap(map);
0469 ax = get(im, 'Parent');
0470 axis off;
0471 axis image;
0472 axis tight;
0473 set(ax,'plotboxaspectratiomode','manual',...
0474        'unit','pixels',...
0475        'pos',[0 0 srect(3:4)]);
0476 set(h,'visible','on');
0477 pause(3);
0478 close(h);
0479  
0480 %=======================================================================
0481 case 'buildroi'                                     %-build and save ROI
0482 %=======================================================================
0483 % o = marsbar('buildroi')
0484 %-----------------------------------------------------------------------
0485 % build and save object
0486 varargout = {[]};
0487 o = mars_build_roi;
0488 if ~isempty(o)
0489   varargout = {marsbar('saveroi', o)};
0490 end
0491 
0492 %=======================================================================
0493 case 'transform'                                        %-transform ROIs
0494 %=======================================================================
0495 % marsbar('transform')
0496 %-----------------------------------------------------------------------
0497 marsbar('mars_menu', 'Transform ROI', 'Transform:', ...
0498     {{'combinerois'},{'flip_lr'}},...
0499     {'Combine ROIs','Flip L/R'});
0500 
0501 %=======================================================================
0502 case 'import_rois'                                       %- import ROIs!
0503 %=======================================================================
0504 % marsbar('import_rois')
0505 %-----------------------------------------------------------------------
0506 
0507 marsbar('mars_menu', 'Import ROIs', 'Import ROIs from:',...
0508     {{'img2rois','c'},...
0509      {'img2rois','i'}},...
0510     {'cluster image',...
0511      'number labelled ROI image'});
0512 
0513 %=======================================================================
0514 case 'export_rois'                                         %-export ROIs
0515 %=======================================================================
0516 % marsbar('export_rois')
0517 %-----------------------------------------------------------------------
0518 
0519 marsbar('mars_menu', 'Export ROI(s)', 'Export ROI(s) to:',...
0520     {{'roi_as_image'},...
0521      {'rois2img', 'c'},...
0522      {'rois2img', 'i'}},...
0523     {'image', 'cluster image',...
0524     'number labelled ROI image'});
0525 
0526 %=======================================================================
0527 case 'img2rois'                                       %-import ROI image
0528 %=======================================================================
0529 %  marsbar('img2rois', roi_type)
0530 %-----------------------------------------------------------------------
0531 
0532 if nargin < 2
0533   roi_type = 'c'; % default is cluster image
0534 else
0535   roi_type = varargin{2};
0536 end
0537 mars_img2rois('','','',roi_type);
0538 
0539 %=======================================================================
0540 case 'rois2img'                                       %-export ROI image
0541 %=======================================================================
0542 %  marsbar('roi2img', roi_type)
0543 %-----------------------------------------------------------------------
0544 
0545 if nargin < 2
0546   roi_type = 'c'; % default is cluster image
0547 else
0548   roi_type = varargin{2};
0549 end
0550 mars_rois2img('','','',roi_type);
0551 
0552 %=======================================================================
0553 case 'saveroi'                                                %-save ROI
0554 %=======================================================================
0555 % o = marsbar('saveroi', obj, flags)
0556 %-----------------------------------------------------------------------
0557 % flags will usually be empty, or one or more characters from
0558 % 'n'   do not ask for label or description
0559 % 'l'   use label to make filename, rather than source field
0560 
0561 if nargin < 2 | isempty(varargin{2})
0562   return
0563 end
0564 if nargin < 3
0565   flags = '';
0566 else
0567   flags = varargin{3};
0568 end
0569 if isempty(flags), flags = ' '; end
0570 o = varargin{2};
0571 varargout = {[]};
0572 
0573 % Label, description
0574 if ~any(flags=='n')
0575   d = spm_input('Description of ROI', '+1', 's', descrip(o));
0576   o = descrip(o,d);
0577   l = spm_input('Label for ROI', '+1', 's', label(o));
0578   o = label(o,l);
0579 end
0580 
0581 fn = source(o);
0582 if isempty(fn) | any(flags=='l')
0583   fn = maroi('filename', mars_utils('str2fname', label(o)));
0584 end
0585 
0586 f_f = ['*' maroi('classdata', 'fileend')];
0587 [f p] = mars_uifile('put', ...
0588             {f_f, ['ROI files (' f_f ')']},...
0589             'File name for ROI', fn);
0590 if any(f~=0)
0591   roi_fname = maroi('filename', fullfile(p, f));
0592   try
0593     varargout = {saveroi(o, roi_fname)};
0594   catch
0595     warning([lasterr ' Error saving ROI to file ' roi_fname])
0596   end
0597 end
0598 
0599 %=======================================================================
0600 case 'combinerois'                                        %-combine ROIs
0601 %=======================================================================
0602 % marsbar('combinerois')
0603 %-----------------------------------------------------------------------
0604 roilist = spm_get(Inf,['*' maroi('classdata', 'fileend')], ...
0605           'Select ROI(s) to combine');
0606 if isempty(roilist)
0607   return
0608 end
0609 roilist = maroi('load_cell', roilist);
0610 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Combine ROIs');
0611 spm_input('(r1 & r2) & ~r3',1,'d','Example function:');
0612 func = spm_input('Function to combine ROIs', '+1', 's', '');
0613 if isempty(func), retnrn, end
0614 for i = 1:length(roilist)
0615   eval(sprintf('r%d = roilist{%d};', i, i));
0616 end
0617 try
0618   eval(['o=' func ';']);
0619 catch
0620   warning(['Hmm, probem with function ' func ': ' lasterr]);
0621   return
0622 end
0623 if isempty(o)
0624   warning('Empty object resulted');
0625   return
0626 end
0627 if is_empty_roi(o)
0628   warning('No volume resulted for ROI');
0629   return
0630 end
0631 
0632 % save ROI
0633 if isa(o, 'maroi')
0634   o = label(o, func);
0635   o = marsbar('saveroi', o); 
0636   if ~isempty(o)
0637     fprintf('\nSaved ROI as %s\n', source(o));
0638   end
0639 else
0640   warning(sprintf('\nNo ROI resulted from function %s...\n', func));
0641 end
0642 
0643 %=======================================================================
0644 case 'flip_lr'                                          %-flip roi L<->R
0645 %=======================================================================
0646 % marsbar('flip_lr')
0647 %-----------------------------------------------------------------------
0648 roilist = spm_get([0 1],['*' maroi('classdata', 'fileend')],...
0649           'Select ROI to flip L/R');
0650 if isempty(roilist)
0651   return
0652 end
0653 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Flip ROI L<->R');
0654 o = maroi('load', roilist);
0655 o = flip_lr(o);
0656 
0657 % save ROI
0658 o = marsbar('saveroi', o, 'l'); 
0659 fprintf('\nSaved ROI as %s\n', source(o));
0660 
0661 %=======================================================================
0662 case 'show_volume'                  %- shows ROI volume in mm to console
0663 %=======================================================================
0664 % marsbar('show_volume')
0665 %-----------------------------------------------------------------------
0666 roi_names = spm_get([0 Inf], '*roi.mat', 'Select ROIs tp get volume');
0667 if isempty(roi_names),return,end
0668 rois = maroi('load_cell', roi_names);
0669 for i = 1:size(rois, 1)
0670   fprintf('Volume of %s: %6.2f\n', source(rois{i}), volume(rois{i}));
0671 end
0672 return
0673 
0674 %=======================================================================
0675 case 'roi_as_image'                               %- writes ROI as image
0676 %=======================================================================
0677 % marsbar('roi_as_image')
0678 %-----------------------------------------------------------------------
0679 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Write ROI to image');
0680 
0681 roi = spm_get([0 1], '*roi.mat', 'Select ROI to write');
0682 if isempty(roi),return,end
0683 [pn fn ext] = fileparts(roi);
0684 roi = maroi('load', roi);
0685 
0686 % space of object
0687 spopts = {'spacebase','image'};
0688 splabs =  {'Base space for ROIs','From image'};
0689 if has_space(roi)
0690   spopts = {spopts{:} 'native'};
0691   splabs = {splabs{:} 'ROI native space'};
0692 end
0693 spo = spm_input('Space for ROI image', '+1', 'm',splabs,...
0694         spopts, 1);
0695 switch char(spo)
0696  case 'spacebase'
0697    sp = maroi('classdata', 'spacebase');
0698  case 'image'
0699   img = spm_get([0 1], mars_veropts('get_img_ext'), 'Image defining space');
0700   if isempty(img),return,end
0701   sp = mars_space(img);
0702  case 'native'
0703   sp = [];
0704 end
0705 
0706 % remove ROI file ending
0707 gend = maroi('classdata', 'fileend');
0708 lg = length(gend);
0709 f2 = [fn ext];
0710 if length(f2)>=lg & strcmp(gend, [f2(end - lg +1 : end)])
0711   f2 = f2(1:end-lg);
0712 else
0713   f2 = fn;
0714 end
0715 
0716 fname = mars_utils('get_img_name', f2);
0717 if isempty(fname), return, end
0718 save_as_image(roi, fname, sp);
0719 fprintf('Saved ROI as %s\n',fname);
0720 
0721 %=======================================================================
0722 case 'attach_image'                          %- attaches image to ROI(s)
0723 %=======================================================================
0724 % marsbar('attach_image' [,img [,roilist]])
0725 %-----------------------------------------------------------------------
0726 if nargin < 2
0727   V = spm_get([0 1], mars_veropts('get_img_ext'), 'Image to attach');
0728   if isempty(V), return, end
0729 else
0730   V = varargin{1};
0731 end
0732 if nargin < 3
0733   rois = spm_get([0 Inf], ['*' maroi('classdata', 'fileend')], ...
0734          'Select ROIs to attach image to');
0735   
0736   if isempty(rois), return, end
0737 else
0738   rois = varargin{2};
0739 end
0740 if ischar(V), V = spm_vol(V); end
0741 for i = 1:size(rois, 1)
0742   n = deblank(rois(i,:));
0743   try 
0744     r = maroi('load', n);
0745   catch
0746     r = []
0747     if ~strmatch(lasterr, 'Cant map image file.')
0748       error(lasterr);
0749     end
0750   end
0751   if isempty(r)
0752     continue
0753   end
0754   if ~isa(r, 'maroi_image')
0755     fprintf('ROI %s is not an image ROI - ignored\n', n);
0756     continue
0757   end
0758 
0759   r = vol(r, V);
0760   saveroi(r, n);
0761   fprintf('Saved ROI %s, attached to image %s\n',...
0762       n, V.fname)
0763 end
0764 return
0765 
0766 %=======================================================================
0767 case 'make_design'                       %-runs design creation routines
0768 %=======================================================================
0769 % marsbar('make_design', des_type)
0770 %-----------------------------------------------------------------------
0771 if nargin < 2
0772   des_type = 'basic';
0773 else
0774   des_type = varargin{2};
0775 end
0776 if sf_prev_save('def_design') == -1, return, end
0777 D = ui_build(mars_veropts('default_design'), des_type);
0778 mars_arm('set', 'def_design', D);
0779 marsbar('design_report');
0780 
0781 %=======================================================================
0782 case 'list_images'                     %-lists image files in SPM design
0783 %=======================================================================
0784 % marsbar('list_images')
0785 %-----------------------------------------------------------------------
0786 marsD = mars_arm('get', 'def_design');
0787 if isempty(marsD), return, end;
0788 if has_images(marsD)
0789   P = image_names(marsD);
0790   strvcat(P{:})
0791 else
0792   disp('Design does not contain images');
0793 end
0794 
0795 %=======================================================================
0796 case 'check_images'                   %-checks image files in SPM design
0797 %=======================================================================
0798 % marsbar('check_images')
0799 %-----------------------------------------------------------------------
0800 marsD = mars_arm('get', 'def_design');
0801 if isempty(marsD), return, end;
0802 if ~has_images(marsD)
0803   disp('Design does not contain images');
0804   return
0805 end
0806 
0807 P = image_names(marsD);
0808 P = strvcat(P{:});
0809 ok_f = 1;
0810 for i = 1:size(P, 1)
0811   fname = deblank(P(i,:));
0812   if ~exist(fname, 'file');
0813     fprintf('Image %d: %s does not exist\n', i, fname);
0814     ok_f = 0;
0815   end
0816 end
0817 if ok_f
0818   disp('All images in design appear to exist');
0819 end
0820 
0821 %=======================================================================
0822 case 'ana_cd'                      %-changes path to files in SPM design
0823 %=======================================================================
0824 % marsbar('ana_cd')
0825 %-----------------------------------------------------------------------
0826 marsD = mars_arm('get', 'def_design');
0827 if isempty(marsD), return, end;
0828 
0829 % Setup input window
0830 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Change image path in design', 0);
0831 
0832 % root path shown in output window
0833 P = image_names(marsD);
0834 P = strvcat(P{:});
0835 root_names = spm_str_manip(P, 'H');
0836 spm_input(deblank(root_names(1,:)),1,'d','Common path is:');
0837 
0838 % new root
0839 newpath = spm_get([-1 0], '', 'New directory root for files');
0840 if isempty(newpath), return, end
0841 
0842 % do
0843 marsD = cd_images(marsD, newpath);
0844 mars_arm('set', 'def_design', marsD);
0845 
0846 %=======================================================================
0847 case 'ana_desmooth'           %-makes new SPM design for unsmoothed data
0848 %=======================================================================
0849 % marsbar('ana_desmooth')
0850 %-----------------------------------------------------------------------
0851 marsD = mars_arm('get', 'def_design');
0852 if isempty(marsD), return, end;
0853 marsD = prefix_images(marsD, 'remove', 's');
0854 mars_arm('set', 'def_design', marsD);
0855 disp('Done');
0856 
0857 %=======================================================================
0858 case 'add_images'                            %-add images to FMRI design
0859 %=======================================================================
0860 % marsbar('add_images')
0861 %-----------------------------------------------------------------------
0862 marsD = mars_arm('get', 'def_design');
0863 if isempty(marsD), return, end
0864 if ~is_fmri(marsD), return, end
0865 marsD = fill(marsD, {'images'});
0866 mars_arm('update', 'def_design', marsD);
0867 mars_arm('set_param', 'def_design', 'file_name', '');
0868 mars_arm('show_summary', 'def_design');
0869 
0870 %=======================================================================
0871 case 'edit_filter'                   %-add / edit filter for FMRI design
0872 %=======================================================================
0873 % marsbar('edit_filter')
0874 %-----------------------------------------------------------------------
0875 marsD = mars_arm('get', 'def_design');
0876 if isempty(marsD), return, end
0877 if ~is_fmri(marsD), return, end
0878 tmp = {'filter'};
0879 if ~strcmp(type(marsD), 'SPM99'), tmp = [tmp {'autocorr'}]; end
0880 marsD = fill(marsD, tmp);
0881 mars_arm('update', 'def_design', marsD);
0882 mars_arm('set_param', 'def_design', 'file_name', '');
0883 mars_arm('show_summary', 'def_design');
0884 
0885 %=======================================================================
0886 case 'def_from_est'          %-sets default design from estimated design
0887 %=======================================================================
0888 % marsbar('def_from_est')
0889 %-----------------------------------------------------------------------
0890 marsE = mars_arm('get', 'est_design');
0891 if isempty(marsE), return, end;
0892 errf = mars_arm('set', 'def_design', marsE);
0893 if ~errf, marsbar('design_report'); end
0894 
0895 %=======================================================================
0896 case 'set_def'                           %-sets default design using GUI
0897 %=======================================================================
0898 % marsbar('set_def')
0899 %-----------------------------------------------------------------------
0900 if mars_arm('set_ui', 'def_design'), return, end
0901 marsbar('design_report');
0902 
0903 %=======================================================================
0904 case 'design_report'                         %-does explore design thing
0905 %=======================================================================
0906 % marsbar('design_report')
0907 %-----------------------------------------------------------------------
0908 marsD = mars_arm('get', 'def_design');
0909 if isempty(marsD), return, end;
0910 spm('FnUIsetup','Explore design', 0);
0911 
0912 fprintf('%-40s: ','Design reporting');
0913 ui_report(marsD, 'DesMtx');
0914 ui_report(marsD, 'DesRepUI');
0915 fprintf('%30s\n','...done');
0916 
0917 %=======================================================================
0918 case 'design_filter'                      %-shows FFT of data and design
0919 %=======================================================================
0920 % marsbar('design_filter')
0921 %-----------------------------------------------------------------------
0922 marsD = mars_arm('get', 'def_design');
0923 if isempty(marsD), return, end;
0924 marsY = mars_arm('get', 'roi_data');
0925 if isempty(marsY), return, end
0926 % If the design and data didn't match, the design will have been cleared
0927 if mars_arm('isempty', 'def_design')
0928   error('Need data and design with matching number of rows');
0929 end
0930 ui_ft_design_data(marsD, marsY);
0931 
0932 %=======================================================================
0933 case 'extract_data'                       % gets data maybe using design
0934 %=======================================================================
0935 % marsY = marsbar('extract_data'[, roi_list [, 'full'|'default']]);
0936 
0937 if nargin < 2
0938   etype = 'default';
0939 else
0940   etype = varargin{2};
0941 end
0942 if nargin < 3
0943   roi_list = '';
0944 else
0945   roi_list = varargin{3};
0946 end
0947 
0948 varargout = {[]};
0949 
0950 % Check for save of current data
0951 if sf_prev_save('roi_data') == -1, return, end
0952 if isempty(roi_list)
0953   roi_list = spm_get(Inf,'*roi.mat','Select ROI(s) to extract data for');
0954 end
0955 if isempty(roi_list), return, end
0956 
0957 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Extract data', 0);
0958 
0959 if strcmp(etype, 'default')
0960   marsD = mars_arm('get', 'def_design');
0961   if isempty(marsD), return, end;
0962   if ~has_images(marsD),
0963     marsD = fill(marsD, 'images');
0964     mars_arm('update', 'def_design', marsD);
0965   end
0966   VY = marsD;
0967   row = block_rows(marsD);
0968 else  % full options extraction
0969   % question for design
0970   
0971   marsD = [];
0972   if spm_input('Use SPM design?', '+1', 'b', 'Yes|No', [1 0], 1)
0973     marsD = mars_arm('get', 'def_design');
0974     if ~has_images(marsD),
0975       marsD = fill(marsD, 'images');
0976       mars_arm('update', 'def_design', marsD);
0977     end
0978   end
0979   [VY row] = mars_image_scaling(marsD);
0980 end
0981 
0982 % Summary function
0983 sumfunc = sf_get_sumfunc(MARS.OPTIONS.statistics.sumfunc);
0984 
0985 % ROI names to objects
0986 o = maroi('load_cell', roi_list);
0987 
0988 % Do data extraction
0989 marsY = get_marsy(o{:}, VY, sumfunc, 'v');
0990 marsY = block_rows(marsY, row);
0991 if ~n_regions(marsY)
0992   msgbox('No data returned','Data extraction', 'warn');
0993   return
0994 end
0995 
0996 % set into armoire, and display
0997 mars_arm('set', 'roi_data', marsY);
0998 mars_arm('show_summary', 'roi_data');
0999 
1000 varargout = {marsY};
1001 
1002 %=======================================================================
1003 case 'plot_data'                                       %- it plots data!
1004 %=======================================================================
1005 % marsbar('plot_data', p_type)
1006 %-----------------------------------------------------------------------
1007 % p_type     - plot type: one of 'raw','acf','fft','all' or 'full'
1008 % where 'full' results in a options to filter and choice of plot
1009 
1010 if nargin < 2
1011   p_type = [];
1012 else
1013   p_type = varargin{2};
1014 end
1015 if isempty(p_type)
1016   p_type = 'full';
1017 end
1018 marsY = mars_arm('get', 'roi_data');
1019 if isempty(marsY), return, end
1020 
1021 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Plot data', 0);
1022 if strcmp(p_type, 'full')
1023   if ~mars_arm('isempty', 'def_design')
1024     D = mars_arm('get', 'def_design');
1025     if isempty(D), return, end
1026     if has_filter(D)
1027       if spm_input('Use design filter?', '+1', 'y/n', [1 0], 1)
1028     flags = {};
1029     if has_whitener(D) 
1030       if ~spm_input('Use whitening filter?', '+1', 'y/n', [1 0], 1)
1031         flags = 'no_whitening';
1032       end
1033     end
1034     marsY = apply_filter(D, marsY, flags);
1035       end
1036     end
1037   end
1038   p_type = char(spm_input('Type of plot', '+1', 'm', ...
1039              'All|Time course|FFT|ACF', ...
1040              {'all','raw','fft','acf'}));
1041 end
1042 
1043 ns  = region_name(marsY);
1044 rno = mars_struct('getifthere', MARS, 'WORKSPACE', 'default_region');
1045 if ~isempty(rno)
1046   fprintf('Using default region: %s\n', ns{rno});
1047 end
1048 ui_plot(marsY, struct('types', p_type, 'r_nos', rno));
1049 
1050 %=======================================================================
1051 case 'import_data'                                    %- it imports data
1052 %=======================================================================
1053 % marsbar('import_data')
1054 %-----------------------------------------------------------------------
1055 
1056 % Check for save of current dataa
1057 if sf_prev_save('roi_data') == -1, return, end
1058 
1059 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Import data', 0);
1060 
1061 r_f = spm_input('Import what?', '+1', 'm', ...
1062         ['Sample time courses for one region'...
1063          '|Summary time course(s) for region(s)'],...
1064         [1 0], 2);
1065 
1066 Ls =         ['Matlab workspace' ...
1067          '|Text file',...
1068          '|Lotus spreadsheet'];,...
1069 Os =            {'matlab','txt','wk1'};
1070 
1071 if ~isempty(which('xlsread'))
1072   Ls = [Ls  '|Excel spreadsheet'];
1073   Os = [Os {'xls'}];
1074 end
1075 
1076 src = spm_input('Import fron?', '+1', 'm', Ls, Os, 1);
1077   
1078 switch src{1}
1079  case 'matlab'
1080   Y = spm_input('Matlab expression', '+1', 'e');
1081   fn = 'Matlab input';
1082   pn_fn = lower(fn);
1083  case 'txt'
1084   [fn, pn] = mars_uifile('get',  ...
1085       {'*.txt;*.dat;*.csv', 'Text files (*.txt, *.dat, *.csv)'; ...
1086        '*.*',                   'All Files (*.*)'}, ...
1087       'Select a text file');
1088   if isequal(fn,0), return, end
1089   pn_fn = fullfile(pn, fn);
1090   Y = spm_load(pn_fn);
1091  case 'wk1'
1092   [fn, pn] = mars_uifile('get',  ...
1093       {'*.wk1', 'Lotus spreadsheet files (*.wk1)'; ...
1094        '*.*',                   'All Files (*.*)'}, ...
1095       'Select a Lotus file');
1096   if isequal(fn,0), return, end
1097   pn_fn = fullfile(pn, fn);
1098   Y = wk1read(pn_fn);
1099  case 'xls'
1100   [fn, pn] = mars_uifile('get',  ...
1101       {'*.xls', 'Excel spreadsheet files (*.xls)'; ...
1102        '*.*',                   'All Files (*.*)'}, ...
1103       'Select an Excel file');
1104   if isequal(fn,0), return, end
1105   pn_fn = fullfile(pn, fn);
1106   Y = xlsread(pn_fn);
1107  otherwise
1108   error('Strange source');
1109 end
1110 if r_f   % region data
1111   s_f = sf_get_sumfunc(MARS.OPTIONS.statistics.sumfunc);
1112   r_st = struct('name', fn,...
1113         'descrip', pn_fn);
1114   s_st = struct('descrip', ['Region data loaded from ' pn_fn],...
1115         'sumfunc', s_f);
1116   marsY = marsy({Y},r_st, s_st);
1117   pref = '';  % Region name prefix not used, as names are set
1118 else     % summary data
1119   s_st = struct('descrip', ['Summary data loaded from ' pn_fn]);
1120   marsY = marsy(Y, '', s_st);
1121   pref = spm_input('Prefix for region names', '+1', 's', [fn '_']);
1122 end
1123 
1124 % Names
1125 stop_f = 0;
1126 ns = region_name(marsY, [], [], pref);
1127 spm_input('Return name with spaces only to abort entry','+1','d');
1128 for r = 1:length(ns)
1129   ns{r} = spm_input(...
1130       sprintf('Name for region %d', r),...
1131       '+1', 's', ns{r});
1132   if all(ns{r}==' '), stop_f = 1; break, end
1133 end
1134 if ~stop_f
1135   marsY = region_name(marsY, [], ns);
1136 end
1137 
1138 mars_arm('set', 'roi_data', marsY);
1139 mars_arm('show_summary', 'roi_data');
1140 disp(['Data loaded from ' pn_fn]);
1141 
1142 %=======================================================================
1143 case 'export_data'                                            %- exports
1144 %=======================================================================
1145 % marsbar('export_data')
1146 %-----------------------------------------------------------------------
1147 marsY = mars_arm('get', 'roi_data');
1148 if isempty(marsY), return, end
1149 
1150 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Export data', 0);
1151 
1152 r_f = spm_input('Export what?', '+1', 'm', ...
1153         ['Sample time courses for one region'...
1154          '|Summary time course(s) for region(s)'],...
1155         [1 0], 2);
1156 
1157 Ls =         ['Matlab workspace' ...
1158          '|Text file',...
1159          '|Lotus spreadsheet'];,...
1160 Os =            {'matlab','txt','wk1'};
1161 
1162 if ~isempty(which('xlswrite'))
1163   xls_write = 1;
1164 elseif ~isempty(which('xlswrite5'))
1165   xls_write = 2;
1166 else
1167   xls_write = 0;
1168 end
1169 
1170 if xls_write
1171   Ls = [Ls  '|Excel spreadsheet'];
1172   Os = [Os {'xls'}];
1173 end
1174 
1175 src = spm_input('Export to?', '+1', 'm', Ls, Os, 1);
1176 
1177 if r_f
1178   rno = marsbar('get_region', region_name(marsY));
1179   Y = region_data(marsY, rno);
1180   Y = Y{1};
1181 else
1182   Y = summary_data(marsY);
1183 end
1184 
1185 switch src{1}
1186  case 'matlab'
1187   str = '';
1188   while ~mars_utils('is_valid_varname', str)
1189     str = spm_input('Matlab variable name', '+1', 's');
1190     if isempty(str), return, end
1191   end
1192   assignin('base', str, Y);
1193   fn = ['Matlab variable: ' str];
1194  case 'txt'
1195   [fn, pn] = mars_uifile('put',  ...
1196       {'*.txt;*.dat;*.csv', 'Text files (*.txt, *.dat, *.csv)'; ...
1197        '*.*',                   'All Files (*.*)'}, ...
1198       'Text file name');
1199   if isequal(fn,0), return, end
1200   save(fullfile(pn,fn), 'Y', '-ascii');
1201  case 'wk1'
1202   [fn, pn] = mars_uifile('put',  ...
1203       {'*.wk1', 'Lotus spreadsheet files (*.wk1)'; ...
1204        '*.*',                   'All Files (*.*)'}, ...
1205       'Lotus spreadsheet file');
1206   if isequal(fn,0), return, end
1207   wk1write(fullfile(pn,fn), Y);
1208  case 'xls'
1209   [fn, pn] = mars_uifile('put',  ...
1210       {'*.xls', 'Excel spreadsheet files (*.xls)'; ...
1211        '*.*',                   'All Files (*.*)'}, ...
1212       'Excel spreadsheet file');
1213   if isequal(fn,0), return, end
1214   if xls_write == 1
1215     xlswrite(fullfile(pn,fn), Y);
1216   else
1217     xlswrite5(fullfile(pn,fn), Y);
1218   end
1219  otherwise
1220   error('Strange source');
1221 end
1222 disp(['Data saved to ' fn]);
1223 
1224 %=======================================================================
1225 case 'split_data'                %- splits data into one file per region
1226 %=======================================================================
1227 % marsbar('split_data')
1228 %-----------------------------------------------------------------------
1229 marsY = mars_arm('get', 'roi_data');
1230 if isempty(marsY), return, end
1231 if n_regions(marsY) == 1
1232   disp('Only one region in ROI data');
1233   return
1234 end
1235 
1236 % Setup input window
1237 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Split regions to files', 0);
1238 
1239 d = spm_get([-1 0], '', 'New directory root for files');
1240 if isempty(d), return, end
1241 
1242 def_f = summary_descrip(marsY);
1243 if ~isempty(def_f)
1244   def_f = mars_utils('str2fname', def_f);
1245 end
1246 f = spm_input('Root filename for regions', '+1', 's', def_f);
1247 f = mars_utils('str2fname', f);
1248 mYarr = split(marsY);
1249 for i = 1:length(mYarr)
1250   fname = fullfile(d, sprintf('%s_region_%d_mdata.mat', f, i));
1251   savestruct(mYarr(i), fname);
1252   fprintf('Saved region %d as %s\n', i, fname);
1253 end
1254 
1255 %=======================================================================
1256 case 'join_data'                %- joins many data files into one object
1257 %=======================================================================
1258 % marsbar('join_data')
1259 %-----------------------------------------------------------------------
1260 
1261 % Check save of current data first
1262 if sf_prev_save('roi_data') == -1, return, end
1263 
1264 P = spm_get([0 Inf], '*_mdata.mat', 'Select data files to join');
1265 
1266 if isempty(P), return, end
1267 for i = 1:size(P,1)
1268   d_o{i} = marsy(deblank(P(i,:)));
1269 end
1270 marsY = join(d_o{:});
1271 mars_arm('set', 'roi_data', marsY);
1272 mars_arm('show_summary', 'roi_data');
1273 disp(P)
1274 disp('Files merged and set as current data')
1275 
1276 %=======================================================================
1277 case 'estimate'                                       %-Estimates design
1278 %=======================================================================
1279 % marsbar('estimate')
1280 %-----------------------------------------------------------------------
1281 % Sequence is bit complex here, as setting the design may clear the ROI
1282 % data, and setting the ROI data may clear the default design, if they
1283 % have different numbers of rows
1284 marsD= mars_arm('get', 'def_design');
1285 if isempty(marsD), return, end
1286 marsY = mars_arm('get', 'roi_data');
1287 if isempty(marsY), return, end
1288 if mars_arm('isempty', 'def_design')
1289   error('Need design and data with matching number of rows');
1290 end
1291 if sf_prev_save('est_design') == -1, return, end
1292 if ~can_mars_estimate(marsD)
1293   marsD = fill(marsD, 'for_estimation');
1294   mars_arm('update', 'def_design', marsD);
1295 end
1296 marsRes = estimate(marsD, marsY, struct(...
1297     'redo_covar', 1, 'redo_whitening', 1));
1298 mars_arm('set', 'est_design', marsRes);
1299 mars_arm('show_summary', 'est_design');
1300 
1301 %=======================================================================
1302 case 'set_results'          %-sets estimated design into global stucture
1303 %=======================================================================
1304 % donef = marsbar('set_results')
1305 %-----------------------------------------------------------------------
1306 % Set results, put results ROI data into roi_data container
1307 
1308 varargout = {0};
1309 
1310 % Check if there's anything we don't want to write over
1311 if sf_prev_save('est_design') == -1, return, end
1312 if sf_prev_save('roi_data') == -1, return, end
1313 
1314 % Do set
1315 mars_arm('set_ui', 'est_design');
1316 if mars_arm('isempty', 'est_design'), return, end
1317 
1318 % Get design, set ROI data
1319 marsRes = mars_arm('get', 'est_design');
1320 mars_arm('set', 'roi_data', get_data(marsRes));
1321 
1322 % Clear default contrast
1323 if mars_struct('isthere', MARS, 'WORKSPACE', 'default_contrast')
1324   MARS.WORKSPACE.default_contrast = [];
1325   fprintf('Reset of estimated design, cleared default contrast...\n');
1326 end
1327 
1328 % Report on design
1329 fprintf('%-40s: ','Design reporting');
1330 ui_report(marsRes, 'DesMtx');
1331 ui_report(marsRes, 'DesRepUI');
1332 fprintf('%30s\n','...done');
1333 
1334 varargout = {1};
1335 return
1336 
1337 %=======================================================================
1338 case 'plot_residuals'                  %-plots residuals from estimation
1339 %=======================================================================
1340 % marsbar('plot_residuals')
1341 %-----------------------------------------------------------------------
1342 marsRes = mars_arm('get', 'est_design');
1343 if isempty(marsRes), return, end
1344 Y = residuals(marsRes);
1345 ns  = region_name(Y);
1346 rno = mars_struct('getifthere', MARS, 'WORKSPACE', 'default_region');
1347 if ~isempty(rno)
1348   fprintf('Using default region: %s\n', ns{rno});
1349 end
1350 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Plot residuals', 1);
1351 p_type = char(spm_input('Type of plot', '+1', 'm', ...
1352             'All|Time course|FFT|ACF', ...
1353             {'all','raw','fft','acf'}));
1354 ui_plot(Y, struct('types', p_type, 'r_nos', rno));
1355 
1356 %=======================================================================
1357 case 'set_defcon'                                 %-set default contrast
1358 %=======================================================================
1359 % Ic = marsbar('set_defcon')
1360 %-----------------------------------------------------------------------
1361 varargout = {[]};
1362 marsRes = mars_arm('get', 'est_design');
1363 if isempty(marsRes), return, end
1364 
1365 % Setup input window
1366 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Default contrast', 0);
1367 Ic = mars_struct('getifthere',MARS, 'WORKSPACE', 'default_contrast');
1368 if isempty(Ic)
1369   cname = '[Not set]';
1370 else 
1371   xCon = get_contrasts(marsRes);
1372   cname = xCon(Ic).name; 
1373 end
1374 spm_input(cname, 1, 'd', 'Default contrast');
1375 opts = {'Quit', 'Set new default'};
1376 if ~isempty(Ic), opts = [opts {'Clear default contrast'}]; end
1377 switch spm_input('What to do?', '+1', 'm', opts, [1:length(opts)], 1);
1378  case 1
1379  case 2
1380   [Ic marsRes changef] = ui_get_contrasts(marsRes, 'T|F',1,...
1381              'Select default contrast','',1);
1382   if changef
1383     mars_arm('update', 'est_design', marsRes);
1384   end
1385  case 3
1386   Ic = [];
1387 end
1388 MARS.WORKSPACE.default_contrast = Ic;
1389 varargout = {Ic};
1390 
1391 %=======================================================================
1392 case 'set_defregion'                                %-set default region
1393 %=======================================================================
1394 % rno = marsbar('set_defregion')
1395 %-----------------------------------------------------------------------
1396 varargout = {[]};
1397 marsY = mars_arm('get', 'roi_data');
1398 if isempty(marsY), return, end
1399 ns = region_name(marsY);
1400 if length(ns) == 1
1401   disp('Only one region in data');
1402   MARS.WORKSPACE.default_region = 1;
1403   varargout = {1};
1404   return
1405 end
1406 
1407 % Setup input window
1408 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Default region', 0);
1409 rno = mars_struct('getifthere',MARS, 'WORKSPACE', 'default_region');
1410 if isempty(rno), rname = '[Not set]'; else rname = ns{rno}; end
1411 spm_input(rname, 1, 'd', 'Default region:');
1412 opts = {'Quit', 'Set new default'};
1413 if ~isempty(rno), opts = [opts {'Clear default region'}]; end
1414 switch spm_input('What to do?', '+1', 'm', opts, [1:length(opts)], 1);
1415  case 1
1416  case 2
1417   rno = marsbar('get_region', ns);
1418   disp(['Default region set to: ' ns{rno}]); 
1419  case 3
1420   rno = [];
1421 end
1422 MARS.WORKSPACE.default_region = rno;
1423 varargout = {rno};
1424 
1425 %=======================================================================
1426 case 'get_region'                                  %-ui to select region
1427 %=======================================================================
1428 % select region from list box / input
1429 % rno = marsbar('get_region', names, prompt)
1430 % names is cell array of strings identifying regions
1431 % prompt is prompt string
1432 %-----------------------------------------------------------------------
1433 
1434 if nargin < 2
1435   error('Need region names to select from');
1436 else
1437   names = varargin{2};
1438 end
1439 if nargin < 3
1440   prompt = 'Select region';
1441 else
1442   prompt = varargin{3};
1443 end
1444 
1445 % maximum no of items in list box
1446 maxlist = 200;
1447 if length(names) > maxlist
1448   % text input, maybe
1449   error('Too many regions');
1450 end
1451 if length(names) == 1
1452   rno = 1;
1453 elseif isempty(names)
1454   rno = []
1455 else
1456   % listbox
1457   rno = spm_input(prompt, '+1', 'm', names);  
1458 end
1459 varargout = {rno};
1460 
1461 %=======================================================================
1462 case 'spm_graph'                                         %-run spm_graph
1463 %=======================================================================
1464 % marsbar('spm_graph')
1465 %-----------------------------------------------------------------------
1466 marsRes = mars_arm('get', 'est_design');
1467 if isempty(marsRes), return, end
1468 
1469 % Setup input window
1470 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Mars SPM graph', 1);
1471 
1472 ns  = region_name(get_data(marsRes));
1473 rno = mars_struct('getifthere', MARS, 'WORKSPACE', 'default_region');
1474 if ~isempty(rno)
1475   fprintf('Using default region: %s\n', ns{rno});
1476 else
1477   rno = marsbar('get_region', ns, 'Select region to plot');
1478 end
1479 
1480 Ic = mars_struct('getifthere', MARS, 'WORKSPACE', 'default_contrast');
1481 if ~isempty(Ic)
1482   xCon = get_contrasts(marsRes);
1483   fprintf('Using default contrast: %s\n', xCon(Ic).name);
1484 end
1485 
1486 % Variables returned in field names to allow differences
1487 % in return variables between versions of spm_graph
1488 [r_st marsRes changef] = mars_spm_graph(marsRes, rno, Ic);
1489 
1490 % Dump field names to global workspace as variables
1491 fns = fieldnames(r_st);
1492 for f = 1:length(fns)
1493   assignin('base', fns{f}, getfield(r_st, fns{f}));
1494 end
1495 
1496 % Store if changed
1497 if changef
1498   mars_arm('update', 'est_design', marsRes); 
1499 end
1500 
1501 %=======================================================================
1502 case 'stat_table'                                       %-run stat_table
1503 %=======================================================================
1504 % marsbar('stat_table')
1505 %-----------------------------------------------------------------------
1506 marsRes = mars_arm('get', 'est_design');
1507 if isempty(marsRes), return, end
1508 Ic = mars_struct('getifthere', MARS, 'WORKSPACE', 'default_contrast');
1509 if ~isempty(Ic)
1510   xCon = get_contrasts(marsRes);
1511   fprintf('Using default contrast: %s\n', xCon(Ic).name);
1512 end
1513 [strs marsS marsRes changef] = ... 
1514     stat_table(marsRes, Ic);
1515 disp(char(strs));
1516 assignin('base', 'marsS', marsS);
1517 if changef
1518   mars_arm('update', 'est_design', marsRes); 
1519 end
1520 
1521 %=======================================================================
1522 case 'signal_change'                             % percent signal change
1523 %=======================================================================
1524 % marsbar('signal_change')
1525 %-----------------------------------------------------------------------
1526 marsRes = mars_arm('get', 'est_design');
1527 if isempty(marsRes), return, end
1528 if ~is_fmri(marsRes)
1529   fprintf('Need FMRI design for %% signal change\n');
1530   return
1531 end
1532 
1533 % Setup input window
1534 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Percent signal change', 0);
1535 
1536 [marsRes ic status] = ui_event_types(marsRes);
1537 if (status==0), return, end
1538 if (status>1), mars_arm('update', 'est_design', marsRes); end
1539 if isempty(ic), return, end
1540 
1541 dur       = spm_input('Event duration', '+1', 'e', 0);
1542 
1543 % Choose event difference function
1544 diff_func = mars_struct('getifthere', MARS, 'OPTIONS', ...
1545             'events', 'diff_func');
1546 if isempty(diff_func), diff_func = 'max abs'; 
1547 elseif strcmp(diff_func, 'window')
1548   spm_input('Event signal change window...', '+1','d', mfilename);
1549   times = spm_input('Mean signal between times', ...
1550             '+1', 'r', [4 6], 2, [0 dur+32]);
1551   other_args = {times, bf_dt(marsRes)};
1552 else
1553   other_args = {};
1554 end
1555 
1556 ic_len    = length(ic);
1557 et = event_types(marsRes);
1558 for i = 1:ic_len
1559   pc(i,:) = event_signal(marsRes, et(ic(i)).e_spec, dur,  ...
1560              diff_func, ...
1561              other_args{:});
1562 end
1563 rns       = region_name(get_data(marsRes));
1564 disp('Sort-of % signal change');
1565 disp(sprintf('Duration: %3.2f seconds', dur));
1566 for i = 1:ic_len
1567   disp(['Event: ' et(ic(i)).name]);
1568   for r = 1:length(rns)
1569     disp(sprintf('Region: %40s; %5.3f', rns{r}, pc(i, r)));
1570   end
1571 end
1572 assignin('base', 'pc', pc);
1573 
1574 %=======================================================================
1575 case 'fitted_events'                    % show fitted event time courses
1576 %=======================================================================
1577 % marsbar('fitted_events')
1578 %-----------------------------------------------------------------------
1579 marsRes = mars_arm('get', 'est_design');
1580 if isempty(marsRes), return, end
1581 if ~is_fmri(marsRes)
1582   fprintf('Need FMRI design for fitted event time courses\n');
1583   return
1584 end
1585 
1586 % Setup input window
1587 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Fitted events', 1);
1588 
1589 [marsRes ic status] = ui_event_types(marsRes);
1590 if (status==0), return, end
1591 if (status>1), mars_arm('update', 'est_design', marsRes); end
1592 if isempty(ic), return, end
1593 
1594 dur       = spm_input('Event duration', '+1', 'e', 0);
1595 ic_len    = length(ic);
1596 et = event_types(marsRes);
1597 for i = 1:ic_len
1598   [tc{i} dt] = event_fitted(marsRes, et(ic(i)).e_spec, dur);
1599 end
1600 
1601 if ic_len > 8
1602   warning('Too many event types to plot, plotting first 8');
1603   ic_len = 8;
1604 end
1605 
1606 figure(Fgraph);
1607 if ic_len > 1, p_cols = 2; else p_cols = 1; end
1608 p_rows = ceil(ic_len / p_cols);
1609 last_row_starts = (p_rows-1) * p_cols + 1;
1610 for i = 1:ic_len
1611   t = tc{i};
1612   secs = ([1:size(t, 1)]-1) * dt;
1613   subplot(p_rows, p_cols, i);
1614   plot(secs, t);
1615   title(et(ic(i)).name);
1616   if i >= last_row_starts, xlabel('Seconds'); end
1617   if rem(i-1, p_cols)==0, ylabel('Signal change'); end
1618 end
1619 
1620 legend(region_name(get_data(marsRes)));
1621 
1622 assignin('base', 'time_courses', tc);
1623 assignin('base', 'dt', dt);
1624 
1625 %=======================================================================
1626 case 'fir_events'                                  % show FIR for events
1627 %=======================================================================
1628 % marsbar('fir_events')
1629 %-----------------------------------------------------------------------
1630 marsRes = mars_arm('get', 'est_design');
1631 if isempty(marsRes), return, end
1632 if ~is_fmri(marsRes)
1633   fprintf('Need FMRI design for FIR event time courses\n');
1634   return
1635 end
1636 
1637 % Setup input window
1638 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','FIR for events', 1);
1639 
1640 [marsRes ic status] = ui_event_types(marsRes);
1641 if (status==0), return, end
1642 if (status>1), mars_arm('update', 'est_design', marsRes); end
1643 if isempty(ic), return, end
1644 
1645 et = event_types(marsRes);
1646 ic_len = length(ic);
1647 
1648 % Single or stacked?
1649 % If all the events have zero duration, the model is already single, and
1650 % there is no point in asking.  If any of the durations are different
1651 % across events, then the single model is invalid.
1652 d_a = []; opts = []; 
1653 for i = 1:ic_len
1654   e_spec = et(ic(i)).e_spec;
1655   for j = 1:size(e_spec, 2)
1656     [o d] = event_onsets(marsRes, e_spec(:, j));
1657     d_a = [d_a; d];
1658   end
1659 end
1660 if any(d_a) & ~any(diff(d_a))
1661   if spm_input('FIR type', '+1','m',...
1662            'Single|Stacked', [1 0], 1)
1663     opts.single = 1;
1664   end
1665 end
1666 if spm_input('Signal units', '+1','m',...
1667          'Percent|Beta units', [1 0], 1)
1668   opts.percent = 1;
1669 end
1670 
1671 bin_length = spm_input('Bin length (secs)', '+1', 'e', tr(marsRes));
1672 def_bin_no = round(25/bin_length);
1673 bin_no     = spm_input('No of bins', '+1', 'e', def_bin_no);
1674 
1675 for i = 1:ic_len
1676   tc{i} = event_fitted_fir(marsRes, ...
1677                et(ic(i)).e_spec, ...
1678                bin_length, ...
1679                bin_no, ...
1680                opts);
1681 end
1682 
1683 if ic_len > 8
1684   warning('Too many event types to plot, plotting first 8');
1685   ic_len = 8;
1686 end
1687 
1688 figure(Fgraph);
1689 if ic_len > 1, p_cols = 2; else p_cols = 1; end
1690 p_rows = ceil(ic_len / p_cols);
1691 last_row_starts = (p_rows-1) * p_cols + 1;
1692 secs = ([1:bin_no]-1) * bin_length + bin_length/2;
1693 for i = 1:ic_len
1694   t = tc{i};
1695   subplot(p_rows, p_cols, i);
1696   plot(secs, t);
1697   title(et(ic(i)).name);
1698   if i >= last_row_starts, xlabel('Seconds'); end
1699   if rem(i-1, p_cols)==0, ylabel('Signal change'); end
1700 end
1701 legend(region_name(get_data(marsRes)));
1702 
1703 assignin('base', 'time_courses', tc);
1704 assignin('base', 'bin_length', bin_length);
1705 assignin('base', 'bin_no', bin_no);
1706 
1707 %=======================================================================
1708 case 'add_events_by_name'  %-make event types from events with same name
1709 %=======================================================================
1710 % marsbar(''add_events_by_name')
1711 %-----------------------------------------------------------------------
1712 D = mars_arm('get', 'est_design');
1713 if isempty(D), return, end
1714 if ~is_fmri(D)
1715   disp('Can only add event types to FMRI designs');
1716   return
1717 end
1718 et = event_types(D);
1719 et = [et event_types_named(D)];
1720 D  = event_types(D, et);
1721 mars_arm('update', 'est_design', D);
1722  
1723 %=======================================================================
1724 case 'merge_contrasts'                                %-import contrasts
1725 %=======================================================================
1726 % marsbar('merge_contrasts')
1727 %-----------------------------------------------------------------------
1728 D = mars_arm('get', 'est_design');
1729 if isempty(D), return, end
1730 filter_spec = {...
1731     'SPM.mat','SPM: SPM.mat';...
1732     '*_mres.mat','MarsBaR: *_mres.mat';...
1733     '*x?on.mat','xCon.mat file'};
1734 [fn pn] = mars_uifile('get', ...
1735     filter_spec, ...
1736     'Source design/contrast file...');
1737 if isequal(fn,0) | isequal(pn,0), return, end
1738 fname = fullfile(pn, fn);
1739 D2 = mardo(fname);
1740 
1741 % has this got contrasts?
1742 if ~has_contrasts(D2)
1743   error(['Cannot find contrasts in design/contrast file ' fname]);
1744 end
1745   
1746 % now try to trap case of contrast only file
1747 if ~is_valid(D2)
1748   D2 = get_contrasts(D2);
1749 end
1750 
1751 [D Ic changef] = add_contrasts(D, D2, 'ui');
1752 disp('Done');
1753 if changef
1754   mars_arm('update', 'est_design', D);
1755 end
1756 
1757 %=======================================================================
1758 case 'refresh_contrasts'                             %-refresh contrasts
1759 %=======================================================================
1760 % marsbar('refresh_contrasts')
1761 %-----------------------------------------------------------------------
1762 D = mars_arm('get', 'est_design');
1763 if isempty(D), return, end
1764 D = refresh_contrasts(D);
1765 disp('Refreshed contrasts');
1766 mars_arm('update', 'est_design', D);
1767 
1768 %=======================================================================
1769 case 'add_trial_f'            %-add trial-specific F contrasts to design
1770 %=======================================================================
1771 % marsbar('add_trial_f')
1772 %-----------------------------------------------------------------------
1773 D = mars_arm('get', 'est_design');
1774 if isempty(D), return, end
1775 if ~is_fmri(D)
1776   disp('Can only add trial specific F contrasts for FMRI designs');
1777   return
1778 end
1779 [D changef] = add_trial_f(D);
1780 disp('Done');
1781 if changef
1782   mars_arm('update', 'est_design', D);
1783 end
1784  
1785 %=======================================================================
1786 case 'error_log'                  %- makes file to help debugging errors
1787 %=======================================================================
1788 % fname = marsbar('error_log', fname);
1789 %-----------------------------------------------------------------------
1790 if nargin < 2
1791   fname = 'error_log.mat';
1792 else
1793   fname = varargin{2};
1794 end
1795 
1796 e_log = struct('last_error', lasterr, ...
1797            'm_ver', marsbar('ver'),...
1798            'mars', MARS);
1799 savestruct(fname, e_log);
1800 if ~isempty(which('zip'))
1801   zip([fname '.zip'], fname);
1802   fname = [fname '.zip'];
1803 end
1804 disp(['Saved error log as ' fname]);
1805 
1806 %=======================================================================
1807 case 'mars_menu'                     %-menu selection of marsbar actions
1808 %=======================================================================
1809 % marsbar('mars_menu',tstr,pstr,tasks_str,tasks)
1810 %-----------------------------------------------------------------------
1811 
1812 [tstr pstr optfields optlabs] = deal(varargin{2:5}); 
1813 if nargin < 6
1814   optargs = cell(1, length(optfields));
1815 else
1816   optargs = varargin{6};
1817 end
1818 
1819 [Finter,Fgraph,CmdLine] = spm('FnUIsetup',tstr);
1820 of_end = length(optfields)+1;
1821 my_task = spm_input(pstr, '+1', 'm',...
1822           {optlabs{:} 'Quit'},...
1823           [1:of_end],of_end);
1824 if my_task == of_end, return, end
1825 marsbar(optfields{my_task}{:});
1826 
1827 %=======================================================================
1828 otherwise                                        %-Unknown action string
1829 %=======================================================================
1830 error('Unknown action string')
1831 
1832 %=======================================================================
1833 end
1834 return
1835 
1836 % subfunctions
1837 function sum_func = sf_get_sumfunc(sum_func)
1838 if strcmp(sum_func, 'ask')
1839   sum_func = char(spm_input('Summary function', '+1','m',...
1840                'Mean|Weighted mean|Median|1st eigenvector',...
1841                {'mean','wtmean','median','eigen1'}, 1));
1842 end
1843 
1844 function btn = sf_prev_save(obj_name)
1845 btn = mars_arm('save_ui', obj_name, ...
1846            struct('ync', 1, ...
1847               'no_no_save', 1, ...
1848               'prompt_prefix', 'previous '));
1849 % If answer is 'No', then flag that we don't need to save
1850 if btn == 0
1851   mars_arm('set_param', obj_name, 'has_changed', 0);
1852 end
1853 return
1854

Generated on Sat 19-Nov-2011 16:12:40 by m2html © 2005