0001 function varargout=marsbar(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 MBver = '0.43';
0038
0039
0040 global MARS;
0041
0042
0043
0044 if nargin == 0, Action='Startup'; else, Action = varargin{1}; end
0045
0046
0047 switch lower(Action), case 'startup'
0048
0049
0050
0051 warning backtrace
0052
0053
0054 splashf = ~marsbar('is_started');
0055
0056
0057 marsbar('on');
0058
0059
0060
0061
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
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
0079
0080 if splashf
0081 marsbar('splash');
0082 end
0083
0084
0085
0086 Fmenu = marsbar('CreateMenuWin','off');
0087
0088
0089
0090 set([Fmenu],'Visible','on')
0091
0092
0093 case 'on'
0094
0095
0096
0097
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
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
0117 mars_veropts('defaults');
0118
0119
0120
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
0152 if ~isfield(MARS, 'WORKSPACE'), MARS.WORKSPACE = []; end
0153
0154
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
0169
0170
0171 maroi;
0172
0173
0174 case 'off'
0175
0176
0177
0178 varargout = {0};
0179
0180
0181 if ~marsbar('is_started'), return, end
0182
0183
0184 btn = mars_arm('save_ui', 'all', struct('ync', 1, 'no_no_save', 1));
0185 if btn == -1, varargout = {-1}; return, end
0186
0187
0188 rmpath(MARS.ADDPATHS{:});
0189 fprintf('MarsBaR analysis functions removed from path\n');
0190
0191
0192 case 'quit'
0193
0194
0195
0196
0197
0198 if marsbar('off') == -1, return, end
0199
0200
0201 if ~marsbar('is_started'), return, end
0202
0203
0204 delete(spm_figure('FindWin','MarsBaR'))
0205 fprintf('Au revoir...\n\n')
0206
0207
0208 case 'is_started'
0209
0210
0211 varargout = {~isempty(MARS)};
0212
0213
0214 case 'cfgfile'
0215
0216
0217 cfgfile = 'marsbarcfg.mat';
0218 varargout = {which(cfgfile), cfgfile};
0219
0220
0221 case 'createmenuwin'
0222
0223
0224 if nargin<2, Vis='on'; else, Vis=varargin{2}; end
0225
0226
0227 delete(spm_figure('FindWin','MarsBaR'))
0228
0229
0230 [MBver,MBc] = marsbar('Ver');
0231
0232
0233
0234 WS = spm('WinScale');
0235 FS = spm('FontSizes');
0236 PF = spm_platform('fonts');
0237 Rect = [50 600 300 275];
0238 bno = 6; bgno = bno+1;
0239 bgapr = 0.25;
0240 bh = Rect(4) / (bno + bgno*bgapr);
0241 gh = bh * bgapr;
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
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
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
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
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
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
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
0438
0439 set(Fmenu,'CloseRequestFcn','marsbar(''Quit'')')
0440 set(Fmenu,'Visible',Vis)
0441
0442 varargout = {Fmenu};
0443
0444
0445 case {'ver', 'version'}
0446
0447
0448
0449 varargout = {MBver, 'MarsBaR - Marseille ROI toolbox'};
0450
0451
0452 case 'splash'
0453
0454
0455
0456
0457 WS = spm('WinScale');
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;
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'
0482
0483
0484
0485
0486 varargout = {[]};
0487 o = mars_build_roi;
0488 if ~isempty(o)
0489 varargout = {marsbar('saveroi', o)};
0490 end
0491
0492
0493 case 'transform'
0494
0495
0496
0497 marsbar('mars_menu', 'Transform ROI', 'Transform:', ...
0498 {{'combinerois'},{'flip_lr'}},...
0499 {'Combine ROIs','Flip L/R'});
0500
0501
0502 case 'import_rois'
0503
0504
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'
0515
0516
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'
0528
0529
0530
0531
0532 if nargin < 2
0533 roi_type = 'c';
0534 else
0535 roi_type = varargin{2};
0536 end
0537 mars_img2rois('','','',roi_type);
0538
0539
0540 case 'rois2img'
0541
0542
0543
0544
0545 if nargin < 2
0546 roi_type = 'c';
0547 else
0548 roi_type = varargin{2};
0549 end
0550 mars_rois2img('','','',roi_type);
0551
0552
0553 case 'saveroi'
0554
0555
0556
0557
0558
0559
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
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'
0601
0602
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
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'
0645
0646
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
0658 o = marsbar('saveroi', o, 'l');
0659 fprintf('\nSaved ROI as %s\n', source(o));
0660
0661
0662 case 'show_volume'
0663
0664
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'
0676
0677
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
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
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'
0723
0724
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'
0768
0769
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'
0783
0784
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'
0797
0798
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'
0823
0824
0825
0826 marsD = mars_arm('get', 'def_design');
0827 if isempty(marsD), return, end;
0828
0829
0830 [Finter,Fgraph,CmdLine] = spm('FnUIsetup','Change image path in design', 0);
0831
0832
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
0839 newpath = spm_get([-1 0], '', 'New directory root for files');
0840 if isempty(newpath), return, end
0841
0842
0843 marsD = cd_images(marsD, newpath);
0844 mars_arm('set', 'def_design', marsD);
0845
0846
0847 case 'ana_desmooth'
0848
0849
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'
0859
0860
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'
0872
0873
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'
0887
0888
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'
0897
0898
0899
0900 if mars_arm('set_ui', 'def_design'), return, end
0901 marsbar('design_report');
0902
0903
0904 case 'design_report'
0905
0906
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'
0919
0920
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
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'
0934
0935
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
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
0969
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
0983 sumfunc = sf_get_sumfunc(MARS.OPTIONS.statistics.sumfunc);
0984
0985
0986 o = maroi('load_cell', roi_list);
0987
0988
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
0997 mars_arm('set', 'roi_data', marsY);
0998 mars_arm('show_summary', 'roi_data');
0999
1000 varargout = {marsY};
1001
1002
1003 case 'plot_data'
1004
1005
1006
1007
1008
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'
1052
1053
1054
1055
1056
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
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 = '';
1118 else
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
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'
1144
1145
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'
1226
1227
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
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'
1257
1258
1259
1260
1261
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'
1278
1279
1280
1281
1282
1283
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'
1303
1304
1305
1306
1307
1308 varargout = {0};
1309
1310
1311 if sf_prev_save('est_design') == -1, return, end
1312 if sf_prev_save('roi_data') == -1, return, end
1313
1314
1315 mars_arm('set_ui', 'est_design');
1316 if mars_arm('isempty', 'est_design'), return, end
1317
1318
1319 marsRes = mars_arm('get', 'est_design');
1320 mars_arm('set', 'roi_data', get_data(marsRes));
1321
1322
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
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'
1339
1340
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'
1358
1359
1360
1361 varargout = {[]};
1362 marsRes = mars_arm('get', 'est_design');
1363 if isempty(marsRes), return, end
1364
1365
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'
1393
1394
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
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'
1427
1428
1429
1430
1431
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
1446 maxlist = 200;
1447 if length(names) > maxlist
1448
1449 error('Too many regions');
1450 end
1451 if length(names) == 1
1452 rno = 1;
1453 elseif isempty(names)
1454 rno = []
1455 else
1456
1457 rno = spm_input(prompt, '+1', 'm', names);
1458 end
1459 varargout = {rno};
1460
1461
1462 case 'spm_graph'
1463
1464
1465
1466 marsRes = mars_arm('get', 'est_design');
1467 if isempty(marsRes), return, end
1468
1469
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
1487
1488 [r_st marsRes changef] = mars_spm_graph(marsRes, rno, Ic);
1489
1490
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
1497 if changef
1498 mars_arm('update', 'est_design', marsRes);
1499 end
1500
1501
1502 case 'stat_table'
1503
1504
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'
1523
1524
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
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
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'
1576
1577
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
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'
1627
1628
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
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
1649
1650
1651
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'
1709
1710
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'
1725
1726
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
1742 if ~has_contrasts(D2)
1743 error(['Cannot find contrasts in design/contrast file ' fname]);
1744 end
1745
1746
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'
1759
1760
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'
1770
1771
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'
1787
1788
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'
1808
1809
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
1829
1830 error('Unknown action string')
1831
1832
1833 end
1834 return
1835
1836
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
1850 if btn == 0
1851 mars_arm('set_param', obj_name, 'has_changed', 0);
1852 end
1853 return
1854