Home > functions > tool_box > mri_toolbox > mri_point_select_dir > vb_mri_point_select.m

vb_mri_point_select

PURPOSE ^

vb_mri_point_select - create and navigate ortho views of Analyze 7.5 volume

SYNOPSIS ^

function [ varargout ] = vb_mri_point_select(avw,parent,command)

DESCRIPTION ^

 vb_mri_point_select - create and navigate ortho views of Analyze 7.5 volume
 
 [ avw ] = vb_mri_point_select([avw], [parent], [command])
 
 avw - a struct, created by avw_read; if omitted, a gui file locator will
 prompt for a .hdr file.
 
 parent  - an optional handle to the gui that calls this gui, useful for
 updating the UserData field of the parent. The avw structure may be
 returned to the parent, if possible.
 
 command - an optional string, such as 'init' or various callback
 commands, 'init' is the default.
 
 The navigation is by sliders, mouse clicks and arrow keys.  Right mouse
 clicks on any ortho-view will show a command menu, for simple block
 region of interest (ROI) calculations, image zoom, and save image.  The
 ROI calculations are returned into avw.stats.
 
 Fiducial points can be selected, which are returned into 'avw.fiducials'
 in the base workspace. These points are given in several coordinate
 frameworks (voxels, mm, and meters), with values given relative to an
 origin located at the "center" of the MRI volume (see avw_center, which
 returns abs and corner values, abs used here).
 
 The AC location can be selected and the values are returned into 'avw.ac'
 in the base workspace. These points are given in voxels, mm & meters; for
 the latter, the values are given as offsets from the "center" of the MRI
 volume (see avw_center).
 
 +X is right (R), +Y is anterior (A), +Z is superior (S), the default RAS
 orientation of the Analyze 7.5 format.  The coordinate system is right
 handed.  

 Example of loading and viewing the SPM T1 template:
 avw = avw_read('T1')
 avw = vb_mri_point_select(avw);
 
 Similarly, just 'mri_point_select' can be typed at the command prompt and you can
 use the gui file locator to select any .hdr file.

 See also, avw_read, avw_img_read, avw_hdr_read

 This program was created based on avw_view by Darren.Weber_at_flinders.edu.au

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function [ varargout ] = vb_mri_point_select(avw,parent,command)
0002 % vb_mri_point_select - create and navigate ortho views of Analyze 7.5 volume
0003 %
0004 % [ avw ] = vb_mri_point_select([avw], [parent], [command])
0005 %
0006 % avw - a struct, created by avw_read; if omitted, a gui file locator will
0007 % prompt for a .hdr file.
0008 %
0009 % parent  - an optional handle to the gui that calls this gui, useful for
0010 % updating the UserData field of the parent. The avw structure may be
0011 % returned to the parent, if possible.
0012 %
0013 % command - an optional string, such as 'init' or various callback
0014 % commands, 'init' is the default.
0015 %
0016 % The navigation is by sliders, mouse clicks and arrow keys.  Right mouse
0017 % clicks on any ortho-view will show a command menu, for simple block
0018 % region of interest (ROI) calculations, image zoom, and save image.  The
0019 % ROI calculations are returned into avw.stats.
0020 %
0021 % Fiducial points can be selected, which are returned into 'avw.fiducials'
0022 % in the base workspace. These points are given in several coordinate
0023 % frameworks (voxels, mm, and meters), with values given relative to an
0024 % origin located at the "center" of the MRI volume (see avw_center, which
0025 % returns abs and corner values, abs used here).
0026 %
0027 % The AC location can be selected and the values are returned into 'avw.ac'
0028 % in the base workspace. These points are given in voxels, mm & meters; for
0029 % the latter, the values are given as offsets from the "center" of the MRI
0030 % volume (see avw_center).
0031 %
0032 % +X is right (R), +Y is anterior (A), +Z is superior (S), the default RAS
0033 % orientation of the Analyze 7.5 format.  The coordinate system is right
0034 % handed.
0035 %
0036 % Example of loading and viewing the SPM T1 template:
0037 % avw = avw_read('T1')
0038 % avw = vb_mri_point_select(avw);
0039 %
0040 % Similarly, just 'mri_point_select' can be typed at the command prompt and you can
0041 % use the gui file locator to select any .hdr file.
0042 %
0043 % See also, avw_read, avw_img_read, avw_hdr_read
0044 %
0045 % This program was created based on avw_view by Darren.Weber_at_flinders.edu.au
0046 
0047 % $Revision: 1202 $ $Date:: 2010-10-19 10:58:59 +0900#$
0048 
0049 % Licence:  GNU GPL, no express or implied warranties
0050 % History:  change display coordinate from radiological(LAS) to neurological.
0051 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0052 global vbmeg_inst;
0053 
0054 if gcbf,
0055     AVWVIEW = get(gcf,'Userdata');
0056 end
0057 
0058 if ~exist('command','var'), command = 'init'; end
0059 
0060 command = lower(command);
0061 
0062 % Check for specific keys and assign command
0063 if strcmp(command, 'keypress'),
0064   
0065   cc = get(AVWVIEW.gui,'CurrentCharacter');
0066   cc = double(cc);
0067   if cc,
0068     switch cc,
0069 %      case 27, command = 'quit';  % ESC
0070       case 28, command = 'left';  % left
0071       case 29, command = 'right'; % right
0072       case 30, command = 'up';    % up
0073       case 31, command = 'down';  % down
0074       case 127, command = 'left'; 
0075       otherwise, return;  % all other keys
0076     end
0077   end
0078 end
0079 
0080 switch command,
0081     
0082   case 'init',
0083     
0084     if ~exist('avw','var'),
0085       avw = avw_read_ras;% modified by Masa-aki Sato
0086     end
0087     
0088     if nargin == 0,
0089       AVWVIEW = init(avw);
0090     elseif isempty(inputname(1)),
0091       AVWVIEW = init(avw);
0092     else
0093       AVWVIEW = init(avw,inputname(1));
0094     end
0095     
0096     AVWVIEW = set_coordinates(AVWVIEW);
0097 
0098     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0099     
0100   case 'update'
0101     AVWVIEW = axial_update(AVWVIEW);
0102     AVWVIEW = coronal_update(AVWVIEW);
0103     AVWVIEW = sagittal_update(AVWVIEW);
0104 
0105     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0106     
0107   case 'coordinates',
0108     
0109     AVWVIEW = set_coordinates(AVWVIEW);
0110     AVWVIEW = axial_update(AVWVIEW);
0111     AVWVIEW = coronal_update(AVWVIEW);
0112     AVWVIEW = sagittal_update(AVWVIEW);    
0113     
0114     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0115     
0116   case 'crosshairs',
0117     
0118     AVWVIEW = set_crosshairs(AVWVIEW);
0119     
0120     
0121   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0122   
0123   case {'axial_image','coronal_image','sagittal_image'},
0124     
0125     switch command,
0126       case 'axial_image',    AVWVIEW.view = 'axi'; axi_update = 0; cor_update = 1; sag_update = 1;
0127       case 'coronal_image',  AVWVIEW.view = 'cor'; axi_update = 1; cor_update = 0; sag_update = 1;
0128       case 'sagittal_image', AVWVIEW.view = 'sag'; axi_update = 1; cor_update = 1; sag_update = 0;
0129     end
0130     
0131     AVWVIEW = get_current_position(AVWVIEW);
0132     
0133     if axi_update,
0134         AVWVIEW = axial_update(AVWVIEW);
0135     end
0136     if cor_update,
0137         AVWVIEW = coronal_update(AVWVIEW);
0138     end;
0139     if sag_update,
0140         AVWVIEW = sagittal_update(AVWVIEW);
0141     end;
0142     
0143     set_display_values(AVWVIEW);
0144     
0145     AVWVIEW = set_crosshairs(AVWVIEW);
0146     
0147     
0148     
0149     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0150     
0151   case {'axial_slider','coronal_slider','sagittal_slider'},
0152     
0153     switch command,
0154       
0155       case 'axial_slider',
0156         AVWVIEW.view = 'axi';
0157         AVWVIEW = get_slider_position(AVWVIEW);
0158         AVWVIEW = axial_update(AVWVIEW);
0159         
0160       case 'coronal_slider',
0161         AVWVIEW.view = 'cor';
0162         AVWVIEW = get_slider_position(AVWVIEW);
0163         AVWVIEW = coronal_update(AVWVIEW);
0164         
0165       case 'sagittal_slider',
0166         AVWVIEW.view = 'sag';
0167         AVWVIEW = get_slider_position(AVWVIEW);
0168         AVWVIEW = sagittal_update(AVWVIEW);
0169     end
0170     
0171     set_display_values(AVWVIEW);
0172     
0173     AVWVIEW = set_crosshairs(AVWVIEW);
0174     
0175     
0176     
0177     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0178     
0179   case {'left','right','up','down'},
0180     
0181     AVWVIEW = get_slider_position(AVWVIEW);
0182     axi_update = 0; cor_update = 0; sag_update = 0;
0183 
0184     % what axes are we in?
0185     if isequal(gca, AVWVIEW.handles.axial_axes),
0186       switch command,
0187         case 'left',
0188           % decrease sagittal slice
0189           if AVWVIEW.slices.sag > 1,
0190             AVWVIEW.slices.sag = AVWVIEW.slices.sag - 1;
0191             sag_update = 1;
0192           end
0193         case 'right',
0194           % increase sagittal slice
0195           if AVWVIEW.slices.sag < AVWVIEW.xdim,
0196             AVWVIEW.slices.sag = AVWVIEW.slices.sag + 1;
0197             sag_update = 1;
0198           end
0199         case 'up',
0200           % increase coronal slice
0201           if AVWVIEW.slices.cor < AVWVIEW.ydim,
0202             AVWVIEW.slices.cor = AVWVIEW.slices.cor + 1;
0203             cor_update = 1;
0204           end
0205         case 'down',
0206           % decrease coronal slice
0207           if AVWVIEW.slices.cor > 1,
0208             AVWVIEW.slices.cor = AVWVIEW.slices.cor - 1;
0209             cor_update = 1;
0210           end
0211       end
0212     end
0213     
0214     if isequal(gca, AVWVIEW.handles.coronal_axes),
0215       switch command,
0216         case 'left',
0217           % decrease sagittal slice
0218           if AVWVIEW.slices.sag > 1,
0219             AVWVIEW.slices.sag = AVWVIEW.slices.sag - 1;
0220             sag_update = 1;
0221           end
0222         case 'right',
0223           % increase sagittal slice
0224           if AVWVIEW.slices.sag < AVWVIEW.xdim,
0225             AVWVIEW.slices.sag = AVWVIEW.slices.sag + 1;
0226             sag_update = 1;
0227           end
0228         case 'up',
0229           % increase axial slice
0230           if AVWVIEW.slices.axi < AVWVIEW.zdim,
0231             AVWVIEW.slices.axi = AVWVIEW.slices.axi + 1;
0232             axi_update = 1;
0233           end
0234         case 'down',
0235           % decrease axial slice
0236           if AVWVIEW.slices.axi > 1,
0237             AVWVIEW.slices.axi = AVWVIEW.slices.axi - 1;
0238             axi_update = 1;
0239           end
0240       end
0241     end
0242     
0243     if isequal(gca, AVWVIEW.handles.sagittal_axes),
0244       switch command,
0245         case 'left',
0246           % decrease sagittal slice
0247           if AVWVIEW.slices.cor > 1,
0248             AVWVIEW.slices.cor = AVWVIEW.slices.cor - 1;
0249             cor_update = 1;
0250           end
0251         case 'right',
0252           % increase sagittal slice
0253           if AVWVIEW.slices.cor < AVWVIEW.ydim,
0254             AVWVIEW.slices.cor = AVWVIEW.slices.cor + 1;
0255             cor_update = 1;
0256           end
0257         case 'up',
0258           % increase axial slice
0259           if AVWVIEW.slices.axi < AVWVIEW.zdim,
0260             AVWVIEW.slices.axi = AVWVIEW.slices.axi + 1;
0261             axi_update = 1;
0262           end
0263         case 'down',
0264           % decrease axial slice
0265           if AVWVIEW.slices.axi > 1,
0266             AVWVIEW.slices.axi = AVWVIEW.slices.axi - 1;
0267             axi_update = 1;
0268           end
0269       end
0270     end
0271     
0272     % sagittal slider update
0273     set(AVWVIEW.handles.sagittal_slider,'Value',AVWVIEW.slices.sag);
0274     set(AVWVIEW.handles.sagittal_sliderN,'String',num2str(AVWVIEW.slices.sag));
0275     set(AVWVIEW.handles.sagittal_sliderN,'Value',AVWVIEW.slices.sag);
0276 
0277     % coronal slider update
0278     set(AVWVIEW.handles.coronal_slider,'Value',AVWVIEW.slices.cor);
0279     set(AVWVIEW.handles.coronal_sliderN,'String',num2str(AVWVIEW.slices.cor));
0280     set(AVWVIEW.handles.coronal_sliderN,'Value',AVWVIEW.slices.cor);
0281 
0282     % axial slider update
0283     set(AVWVIEW.handles.axial_slider,'Value',AVWVIEW.slices.axi);
0284     set(AVWVIEW.handles.axial_sliderN,'String',num2str(AVWVIEW.slices.axi));
0285     set(AVWVIEW.handles.axial_sliderN,'Value',AVWVIEW.slices.axi);
0286 
0287     % update crosshair
0288     AVWVIEW = set_crosshairs(AVWVIEW);
0289 
0290     if axi_update
0291         AVWVIEW = axial_update(AVWVIEW);
0292     end
0293     if cor_update
0294         AVWVIEW = coronal_update(AVWVIEW);
0295     end
0296     if sag_update
0297         AVWVIEW = sagittal_update(AVWVIEW);
0298     end
0299     
0300     
0301     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0302     
0303 case {'add_point', 'remove_point', 'listbox_clicked'}
0304      switch(command)
0305         case 'add_point'
0306             def   = vb_define_mri_point_select;
0307 
0308             prompt = {'Enter the point name : '};
0309             dlgTitle = 'Input point name';
0310             contents = def.POINT_NAME_LIST;
0311             [selection, IsOK] = listdlg('PromptString', prompt, ...
0312                                         'SelectionMode', 'single', ...
0313                                         'ListString', contents);
0314             point_name = [];
0315             if IsOK
0316                 if strcmp(contents{selection}, def.STR_OTHER)
0317                     point_name = inputdlg(prompt, dlgTitle, 1);
0318                     if ~isempty(point_name)
0319                         point_name = point_name{1};
0320                     end
0321                 else
0322                     point_name = contents{selection};
0323                 end
0324             end
0325             if ~isempty(point_name)
0326                 AVWVIEW = slices2metric(AVWVIEW);
0327                 [AVWVIEW.point_list, result] =...
0328                     vb_mps_pointlist_add_point(AVWVIEW.point_list, point_name, AVWVIEW.imgXYZ);
0329                 if result == false
0330                     errordlg('The name overlaps.', 'error');
0331                     return;
0332                 end
0333                 update_point_list(AVWVIEW);
0334                 NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
0335                 set(AVWVIEW.handles.save_point_listbox, 'Value', NPoints);
0336             end
0337         case 'remove_point'
0338             if vb_mps_pointlist_get_pointnum(AVWVIEW.point_list) == 0
0339                 return;
0340             end
0341             ix = get(AVWVIEW.handles.save_point_listbox, 'Value');
0342             for k=1:length(ix)
0343                 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, ix(k));
0344                 AVWVIEW.point_list = vb_mps_pointlist_delete_point(AVWVIEW.point_list, name);
0345             end
0346             update_point_list(AVWVIEW);            
0347         case 'listbox_clicked'
0348             lineNo = get(AVWVIEW.handles.save_point_listbox, 'Value');
0349             AVWVIEW = change_listbox_line(AVWVIEW, lineNo);
0350     end        
0351     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0352     
0353     
0354     
0355     
0356     
0357     
0358     
0359   case {'roi_9','roi_7','roi_5','roi_3'},
0360     
0361     position = [ AVWVIEW.slices.sag, AVWVIEW.slices.cor, AVWVIEW.slices.axi ];
0362     
0363     shape.type = 'block';
0364     if findstr(command,'9'), shape.size = [9,9,9]; end
0365     if findstr(command,'7'), shape.size = [7,7,7]; end
0366     if findstr(command,'5'), shape.size = [5,5,5]; end
0367     if findstr(command,'3'), shape.size = [3,3,3]; end
0368     
0369     stats.roi = avw_roi(AVWVIEW.avw,position,shape);
0370     
0371     AVWVIEW.avw.stats = avw_stats(stats);
0372     
0373     
0374     
0375     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0376     
0377   case {'nasion','rpa','lpa','ac'},
0378     
0379     % return voxel coordinates into AVWVIEW.imgXYZ
0380     AVWVIEW = slices2metric(AVWVIEW);
0381     
0382     if get(AVWVIEW.handles.coord,'value') == 2,
0383       format = '%7.3f %7.3f %7.3f';
0384       imgXYZ = AVWVIEW.imgXYZ.mm;
0385       string = sprintf('%7.3f %7.3f %7.3f',imgXYZ);
0386     elseif get(AVWVIEW.handles.coord,'value') == 3,
0387       format = '%7.3f %7.3f %7.3f';
0388       imgXYZ = AVWVIEW.imgXYZ.meters;
0389       string = sprintf('%7.3f %7.3f %7.3f',imgXYZ);
0390     else
0391       imgXYZ = AVWVIEW.imgXYZ.voxels;
0392       string = sprintf('%7.0f %7.0f %7.0f',imgXYZ);
0393     end;
0394     
0395     switch command,
0396       case 'nasion',
0397         set(AVWVIEW.handles.nasion,'String',string);
0398         AVWVIEW.avw.fiducials.nasion.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0399         AVWVIEW.avw.fiducials.nasion.meters(1,:) = AVWVIEW.imgXYZ.meters;
0400         AVWVIEW.avw.fiducials.nasion.mm(1,:)     = AVWVIEW.imgXYZ.mm;
0401       case 'rpa',
0402         set(AVWVIEW.handles.rpa,'String',string);
0403         AVWVIEW.avw.fiducials.rpa.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0404         AVWVIEW.avw.fiducials.rpa.meters(1,:) = AVWVIEW.imgXYZ.meters;
0405         AVWVIEW.avw.fiducials.rpa.mm(1,:)     = AVWVIEW.imgXYZ.mm;
0406       case 'lpa',
0407         set(AVWVIEW.handles.lpa,'String',string);
0408         AVWVIEW.avw.fiducials.lpa.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0409         AVWVIEW.avw.fiducials.lpa.meters(1,:) = AVWVIEW.imgXYZ.meters;
0410         AVWVIEW.avw.fiducials.lpa.mm(1,:)     = AVWVIEW.imgXYZ.mm;
0411       case 'ac',
0412         set(AVWVIEW.handles.ac,'String',string);
0413         AVWVIEW.avw.ac.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0414         AVWVIEW.avw.ac.meters(1,:) = AVWVIEW.imgXYZ.meters;
0415         AVWVIEW.avw.ac.mm(1,:) = AVWVIEW.imgXYZ.mm;
0416     end
0417     
0418     
0419     
0420     
0421     
0422     
0423     
0424     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0425     
0426   case 'flip',
0427     
0428     % flip X dim here...
0429     AVWVIEW.avw.img = flipdim(AVWVIEW.avw.img,1);
0430     
0431     if isfield(AVWVIEW.handles,'axial_image'),
0432       Saxi = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0433       set(AVWVIEW.handles.axial_image,'CData',Saxi');
0434     end;
0435     if isfield(AVWVIEW.handles,'coronal_image'),
0436       Scor = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0437       set(AVWVIEW.handles.coronal_image,'CData',Scor');
0438     end;
0439     if isfield(AVWVIEW.handles,'sagittal_image'),
0440       Ssag = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0441       set(AVWVIEW.handles.sagittal_image,'CData',Ssag');
0442     end;
0443     
0444     flipStatus = get(AVWVIEW.handles.flipStatus,'string');
0445     if strmatch(flipStatus,'R>>L (radiological)'),
0446       flipStatus = 'L>>R (neurological)';
0447     else
0448       flipStatus = 'R>>L (radiological)';
0449     end;
0450     set(AVWVIEW.handles.flipStatus,'string',flipStatus);
0451     
0452     
0453     
0454     
0455     
0456     
0457     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0458     
0459   case {'brighter','dimmer','setclimit'},
0460     
0461     switch command,
0462       case 'brighter',
0463         AVWVIEW.clim = AVWVIEW.clim .* 0.9;
0464       case 'dimmer',
0465         AVWVIEW.clim = AVWVIEW.clim .* 1.1;
0466       case 'setclimit',
0467         clim = get(AVWVIEW.handles.clim,'string');
0468         AVWVIEW.clim(2) = str2num(clim);
0469     end
0470     climString = sprintf('%05.2f',AVWVIEW.clim(2));
0471     set(AVWVIEW.handles.clim,'string',climString);
0472     
0473     if isfield(AVWVIEW.handles,'axial_image'),
0474       set(AVWVIEW.handles.axial_axes,'Clim',AVWVIEW.clim);
0475     end;
0476     if isfield(AVWVIEW.handles,'coronal_image'),
0477       set(AVWVIEW.handles.coronal_axes,'Clim',AVWVIEW.clim);
0478     end;
0479     if isfield(AVWVIEW.handles,'sagittal_image'),
0480       set(AVWVIEW.handles.sagittal_axes,'Clim',AVWVIEW.clim);
0481     end;
0482     
0483     
0484     
0485     
0486     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0487     
0488   case 'contrast'
0489     
0490     if isfield(AVWVIEW.handles,'axial_image'),
0491       X = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0492       AVWVIEW.cmap = contrast(X);
0493       colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0494     end;
0495     if isfield(AVWVIEW.handles,'coronal_image'),
0496       X = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0497       AVWVIEW.cmap = contrast(X);
0498       colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0499     end;
0500     if isfield(AVWVIEW.handles,'sagittal_image'),
0501       X = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0502       AVWVIEW.cmap = contrast(X);
0503       colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0504     end;
0505     
0506     
0507     
0508     
0509     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0510     
0511   case 'setcmap'
0512     
0513     cmapIndex = get(AVWVIEW.handles.cmap,'value');
0514     cmapString = get(AVWVIEW.handles.cmap,'string');
0515     
0516     AVWVIEW.cmapString = cmapString{cmapIndex};
0517     
0518     if isfield(AVWVIEW.handles,'axial_image'),
0519       AVWVIEW.cmap = colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmapString);
0520     end;
0521     if isfield(AVWVIEW.handles,'coronal_image'),
0522       AVWVIEW.cmap = colormap(AVWVIEW.handles.coronal_axes,AVWVIEW.cmapString);
0523     end;
0524     if isfield(AVWVIEW.handles,'sagittal_image'),
0525       AVWVIEW.cmap = colormap(AVWVIEW.handles.sagittal_axes,AVWVIEW.cmapString);
0526     end;
0527     
0528     
0529     
0530     
0531     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0532     
0533   case 'histogram',
0534     
0535     avw = AVWVIEW.avw;
0536     
0537     % would be nice to use bins that reflect
0538     % the bits per pixel, but it seems to take
0539     % forever for a 16 bit image, otherwise
0540     % use this code:
0541     %     %check the bits per pixel of avw
0542     %     bitpix = avw.hdr.dime.bitpix;
0543     %     % set the bins according to the data type
0544     %     if bitpix <= 8, bins = 0:255; end
0545     %     if bitpix > 8,  bins = 0:65535; end
0546     
0547     %bins = linspace(0,intensity_max,255);
0548     
0549     intensity_min = min(min(min(avw.img)));
0550     intensity_max = max(max(max(avw.img)));
0551     
0552     bins = intensity_min:intensity_max;
0553     
0554     fprintf('...calculating histogram for %d bins.\n',length(bins));
0555     
0556     for i=1:size(avw.img,3),
0557       n = hist(avw.img(:,:,i), bins);
0558       if i == 1,
0559         intensity_volume = sum(n,2);
0560       else
0561         intensity_slice = sum(n,2);
0562         intensity_volume = intensity_volume + intensity_slice;
0563       end
0564     end
0565     figure('name','intensity histogram');
0566     bar(bins,intensity_volume);
0567     
0568     
0569     
0570     
0571     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0572     
0573   case 'zoom'
0574     
0575     x = AVWVIEW.slices.sag;
0576     y = AVWVIEW.slices.cor;
0577     z = AVWVIEW.slices.axi;
0578     
0579     switch AVWVIEW.view,
0580       case 'axi',
0581         slice = rot90(AVWVIEW.avw.img(:,:,z));
0582       case 'cor',
0583         slice = rot90(squeeze(AVWVIEW.avw.img(:,y,:)));
0584       case 'sag',
0585         slice = rot90(squeeze(AVWVIEW.avw.img(x,:,:)));
0586     end
0587     
0588     figure;
0589     imagesc(slice,AVWVIEW.clim); 
0590     colormap(gray); axis off; zoom on;
0591     daspect(AVWVIEW.daspect);
0592     
0593     
0594     
0595     
0596     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0597     
0598   case 'save_image',
0599     
0600     [filename, pathname] = uiputfile(...
0601       { '*.png','PNG Files (*.png)'; ...
0602         '*.jpg','JPG Files (*.jpg)'; ...
0603         '*.ppm;*.pgm;*.pbm','Portable Anymap (*.ppm,*.pgm,*.pbm)'; ...
0604         '*.*',  'All Files (*.*)'}, ...
0605       'IMWrite to file');
0606     
0607     if filename,
0608       
0609       x = AVWVIEW.slices.sag;
0610       y = AVWVIEW.slices.cor;
0611       z = AVWVIEW.slices.axi;
0612       
0613       pixelsPerMM = 1 ./ double(AVWVIEW.avw.hdr.dime.pixdim(2:4));
0614       pixelsPerMeter = pixelsPerMM .* 1000;
0615       
0616       switch AVWVIEW.view,
0617         case 'axi',
0618           slice = rot90(AVWVIEW.avw.img(:,:,z));
0619           xresolution = pixelsPerMeter(1);
0620           yresolution = pixelsPerMeter(2);
0621         case 'cor',
0622           slice = rot90(squeeze(AVWVIEW.avw.img(:,y,:)));
0623           xresolution = pixelsPerMeter(1);
0624           yresolution = pixelsPerMeter(3);
0625         case 'sag',
0626           slice = rot90(squeeze(AVWVIEW.avw.img(x,:,:)));
0627           xresolution = pixelsPerMeter(2);
0628           yresolution = pixelsPerMeter(3);
0629       end
0630       
0631       % scale the image values to between 0-1 for imwrite
0632       % (initially used max of slice, but actually want to
0633       % use the scaled intensity from the gui).
0634       %maxValue = max(max(slice));
0635       %scaledSlice = slice ./ maxValue;
0636       scaledSlice = slice ./ AVWVIEW.clim(2);
0637       
0638       % RGB = ind2rgb(X,map) converts the matrix X and corresponding
0639       % colormap map to RGB (truecolor)
0640       
0641       file = [pathname,filename];
0642       fprintf('saving to:...%s\n',file);
0643       
0644       %Most of the supported image file formats store uint8 data.
0645       %PNG and TIFF formats additionally support uint16 data. For
0646       %grayscale and RGB images, if the data array is double, the
0647       %assumed dynamic range is [0,1]. The data array is automatically
0648       %scaled by 255 before being written as uint8. If the data array
0649       %is uint8 or uint16, it is written without scaling as uint8 or
0650       %uint16, respectively.
0651       
0652       [pathname,filename,ext] = fileparts([pathname,filename]);
0653       
0654       switch ext,
0655       
0656         case '.png',
0657           %imwrite(uint8(image),colormap,file,format);
0658           %imwrite(slice,colormap(gray),file,format,...
0659           
0660           %     'XResolution'  A scalar indicating the number of
0661           %                    pixels/unit in the horizontal direction
0662           %
0663           %     'YResolution'  A scalar indicating the number of
0664           %                    pixels/unit in the vertical direction
0665           %
0666           %     'ResolutionUnit' Either 'unknown' or 'meter'
0667           format = 'png';
0668           imwrite(scaledSlice,file,format,...
0669             'BitDepth',16,'ResolutionUnit','meter',...
0670             'XResolution',xresolution,...
0671             'YResolution',yresolution);
0672           
0673         case '.jpg',
0674           format = 'jpg';
0675           imwrite(scaledSlice,file,format);
0676         case {'.ppm','.pgm','.pbm'},
0677           format = ext(2:end);
0678           imwrite(scaledSlice,file,format);
0679         otherwise
0680           fprintf('...cannot write %s image files\n',ext);
0681       end
0682     end
0683     
0684     
0685     
0686     
0687     
0688   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0689     
0690   case 'save',
0691     % try to assign back into the input struct
0692     if ~isempty(AVWVIEW.invarname),
0693       fprintf('...returning data to base workspace struct ''%s''\n',AVWVIEW.invarname);
0694       assignin('base',AVWVIEW.invarname,AVWVIEW.avw);
0695     elseif evalin('base','exist(''mri'',''var'')'),
0696       fprintf('...returning data to base workspace struct ''mri''\n');
0697       string = ['AVWVIEW = get(', num2str(AVWVIEW.gui),...
0698           ',''Userdata''); mri.data = AVWVIEW.avw; clear AVWVIEW;'];
0699       evalin('base',string);
0700     else
0701       fprintf('...returning data into base workspace struct ''avw''\n');
0702       assignin('base','avw',AVWVIEW.avw);
0703     end
0704 
0705     %
0706     % --- Output MPS file
0707     %
0708     h = file_dialog;
0709     h = set(h, 'current_dir', pwd);
0710     h = set(h, 'file_extensions', {'.mps.mat'});
0711     h = set(h, 'save_mode', 1);
0712     [pname, fname]  = visible(h);
0713 
0714     if length(pname) == 0
0715        disp('filename not specified.')
0716     else
0717         write = true;
0718         output_file = fullfile(pname, fname{1});
0719         if exist(output_file, 'file')
0720             res = questdlg('file is already exist. overwrite?', 'Confirm', ...
0721                         'Yes', 'No',...
0722                         'Yes');
0723             if strcmp(res, 'No')
0724                 write = false;
0725             end
0726         end
0727         
0728         if write
0729             AVWVIEW.mps_fileio = ...
0730                vb_mps_fileio_set_pointlist(AVWVIEW.mps_fileio, AVWVIEW.point_list);
0731             if vb_mps_fileio_write(AVWVIEW.mps_fileio, output_file) == FAILURE
0732                 errordlg('mps file save failed.', 'error');
0733             else
0734                 msgbox('mps file was saved.', 'confirm');
0735             end
0736         end
0737     end
0738     %    close gcbf;
0739     
0740   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0741 
0742   case 'load'
0743     %
0744     % --- Read MPS file
0745     %
0746     h = file_dialog;
0747     h = set(h, 'current_dir', pwd);
0748     h = set(h, 'file_extensions', {'.mps.mat'});
0749     h = set(h, 'save_mode', 0);
0750     [pname, fname]  = visible(h);
0751 
0752     if length(pname) == 0
0753        disp('filename not specified.')
0754     else
0755       input_file = fullfile(pname, fname{1});
0756       AVWVIEW.mps_fileio = vb_mps_fileio_read(AVWVIEW.mps_fileio, input_file);
0757       AVWVIEW.point_list = vb_mps_fileio_get_pointlist(AVWVIEW.mps_fileio);
0758       update_point_list(AVWVIEW);
0759       set(AVWVIEW.handles.save_point_listbox, 'Value', 1);
0760       AVWVIEW = change_listbox_line(AVWVIEW, 1);
0761   end
0762       
0763   
0764   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0765   
0766   case 'close',
0767       %
0768       % --- Make return data
0769       %
0770       global vbmeg_inst;
0771       const = vbmeg_inst.const;
0772 
0773       NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
0774       analyze_info = vb_mps_fileio_get_analyze_info(AVWVIEW.mps_fileio);
0775       Vdim = vb_analyze_info_get_voxdim(analyze_info);
0776       Vsize = vb_analyze_info_get_voxsize(analyze_info);
0777 
0778       % data initialize
0779       point_selected = struct;
0780       point_selected.coord_type = const.COORDINATE_SPM_RIGHT_M;
0781       point_selected.name = cell(NPoints, 1);
0782       point_selected.pos  = zeros(NPoints, 3);
0783       point_base = cell(NPoints, 1);
0784 
0785       for k=1:NPoints
0786           % Coordinate convert(Analyze right to SPM_Right_m)
0787           [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, k);
0788           p_spm_right_m = vb_analyze_right_to_spm_right(point.voxels, Vdim, Vsize);
0789           point_selected.name{k} = name;
0790           point_selected.pos(k, :)  = p_spm_right_m;
0791 
0792           % Base data
0793           point_base{k}.name  = name;
0794           point_base{k}.point = point;
0795       end
0796       AVWVIEW.avw.point_selected = point_selected;
0797       AVWVIEW.avw.point_base = point_base;
0798       
0799       %
0800       % --- Return data to base workspace
0801       %
0802       fprintf('...returning data into base workspace struct ''avw''\n');
0803       assignin('base','avw',AVWVIEW.avw);
0804       close gcbf;
0805       
0806   otherwise,
0807 end
0808   
0809 switch command,
0810   case 'save',
0811   case 'close',
0812   otherwise,
0813     set(AVWVIEW.gui,'UserData',AVWVIEW);
0814 end
0815 
0816 if nargout > 0,
0817   varargout{1} = AVWVIEW.avw;
0818 end
0819 
0820 return
0821 
0822 
0823 
0824 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0825 % SUBFUNCTIONS
0826 
0827 
0828 
0829 
0830 
0831 
0832 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0833 function AVWVIEW = axial_update(AVWVIEW)
0834 
0835 if isfield(AVWVIEW.handles,'axial_image'),
0836     Saxi = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0837     set(AVWVIEW.handles.axial_image,'CData',Saxi');
0838 end
0839 if isfield(AVWVIEW.handles,'axial_sliderN'),
0840     set(AVWVIEW.handles.axial_sliderN,'String',num2str(AVWVIEW.slices.axi));
0841     set(AVWVIEW.handles.axial_sliderN,'Value',AVWVIEW.slices.axi);
0842 end
0843 if isfield(AVWVIEW.handles,'axial_slider'),
0844     set(AVWVIEW.handles.axial_slider,'Value',AVWVIEW.slices.axi);
0845 end;
0846 
0847 [space, space_name] = get_coordinate_space(AVWVIEW);
0848 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'z', ...
0849                                          AVWVIEW.slices.axi, ...
0850                                          space_name);
0851 
0852 return
0853 
0854 
0855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0856 function AVWVIEW = coronal_update(AVWVIEW)
0857 
0858 if isfield(AVWVIEW.handles,'coronal_image'),
0859     Scor = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0860     set(AVWVIEW.handles.coronal_image,'CData',Scor');
0861 end
0862 if isfield(AVWVIEW.handles,'coronal_sliderN'),
0863     set(AVWVIEW.handles.coronal_sliderN,'String',num2str(AVWVIEW.slices.cor));
0864     set(AVWVIEW.handles.coronal_sliderN,'Value',AVWVIEW.slices.cor);
0865 end
0866 if isfield(AVWVIEW.handles,'coronal_slider'),
0867     set(AVWVIEW.handles.coronal_slider,'Value',AVWVIEW.slices.cor);
0868 end;
0869 
0870 [space, space_name] = get_coordinate_space(AVWVIEW);
0871 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'y', ...
0872                                          AVWVIEW.slices.cor, ...
0873                                          space_name);
0874 
0875 return
0876 
0877 
0878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0879 function AVWVIEW = sagittal_update(AVWVIEW)
0880 
0881 if isfield(AVWVIEW.handles,'sagittal_image'),
0882     Ssag = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0883     set(AVWVIEW.handles.sagittal_image,'CData',Ssag');
0884 end
0885 if isfield(AVWVIEW.handles,'sagittal_sliderN'),
0886     set(AVWVIEW.handles.sagittal_sliderN,'String',num2str(AVWVIEW.slices.sag));
0887     set(AVWVIEW.handles.sagittal_sliderN,'Value',AVWVIEW.slices.sag);
0888 end
0889 if isfield(AVWVIEW.handles,'sagittal_slider'),
0890     set(AVWVIEW.handles.sagittal_slider,'Value',AVWVIEW.slices.sag);
0891 end;
0892 
0893 [space, space_name] = get_coordinate_space(AVWVIEW);
0894 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'x', ...
0895                                          AVWVIEW.slices.sag, ...
0896                                          space_name);
0897 
0898 return
0899 
0900 
0901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0902 function AVWVIEW = set_crosshairs(AVWVIEW)
0903 
0904 fig = figure(AVWVIEW.gui);
0905 current_axes = get(fig, 'CurrentAxes');
0906 
0907 [AVWVIEW, metric] = slices2metric(AVWVIEW);
0908 
0909 if isfield(AVWVIEW.handles,'axial_axes'),
0910   set(fig, 'CurrentAxes', AVWVIEW.handles.axial_axes);
0911   
0912   x_value = [metric.sag metric.sag];
0913   y_value = [metric.cor metric.cor];
0914 
0915   AVWVIEW.handles.axial_xlim = get(AVWVIEW.handles.axial_axes,'Xlim');
0916   AVWVIEW.handles.axial_ylim = get(AVWVIEW.handles.axial_axes,'Ylim');
0917   set(AVWVIEW.handles.axial_xline, 'Xdata', x_value,'Ydata',AVWVIEW.handles.axial_ylim);
0918   set(AVWVIEW.handles.axial_yline, 'Ydata', y_value,'Xdata',AVWVIEW.handles.axial_xlim);
0919   set(AVWVIEW.handles.axial_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0920   set(AVWVIEW.handles.axial_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0921 
0922   if get(AVWVIEW.handles.crosshairs,'value'),
0923     set(AVWVIEW.handles.axial_xline,'visible','on');
0924     set(AVWVIEW.handles.axial_yline,'visible','on');
0925   else
0926     set(AVWVIEW.handles.axial_xline,'visible','off');
0927     set(AVWVIEW.handles.axial_yline,'visible','off');
0928   end
0929   
0930 end
0931 
0932 if isfield(AVWVIEW.handles,'coronal_axes'),
0933   set(fig, 'CurrentAxes', AVWVIEW.handles.coronal_axes);
0934 
0935   x_value = [metric.sag metric.sag];
0936   y_value = [metric.axi metric.axi];
0937 
0938   AVWVIEW.handles.coronal_xlim = get(AVWVIEW.handles.coronal_axes,'Xlim');
0939   AVWVIEW.handles.coronal_ylim = get(AVWVIEW.handles.coronal_axes,'Ylim');
0940   set(AVWVIEW.handles.coronal_xline, 'Xdata',x_value,'Ydata',AVWVIEW.handles.coronal_ylim);
0941   set(AVWVIEW.handles.coronal_yline, 'Ydata',y_value,'Xdata',AVWVIEW.handles.coronal_xlim);
0942   set(AVWVIEW.handles.coronal_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0943   set(AVWVIEW.handles.coronal_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0944   
0945   
0946   if get(AVWVIEW.handles.crosshairs,'value'),
0947     set(AVWVIEW.handles.coronal_xline,'visible','on');
0948     set(AVWVIEW.handles.coronal_yline,'visible','on');
0949   else
0950     set(AVWVIEW.handles.coronal_xline,'visible','off');
0951     set(AVWVIEW.handles.coronal_yline,'visible','off');
0952   end
0953   
0954 end
0955 
0956 if isfield(AVWVIEW.handles,'sagittal_axes'),
0957   set(fig, 'CurrentAxes', AVWVIEW.handles.sagittal_axes);
0958 
0959   x_value = [metric.cor metric.cor];
0960   y_value = [metric.axi metric.axi];
0961 
0962   AVWVIEW.handles.sagittal_xlim = get(AVWVIEW.handles.sagittal_axes,'Xlim');
0963   AVWVIEW.handles.sagittal_ylim = get(AVWVIEW.handles.sagittal_axes,'Ylim');
0964   set(AVWVIEW.handles.sagittal_xline, 'Xdata',x_value,'Ydata',AVWVIEW.handles.sagittal_ylim);
0965   set(AVWVIEW.handles.sagittal_yline, 'Ydata',y_value,'Xdata',AVWVIEW.handles.sagittal_xlim);
0966   set(AVWVIEW.handles.sagittal_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0967   set(AVWVIEW.handles.sagittal_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0968   
0969   if get(AVWVIEW.handles.crosshairs,'value'),
0970     set(AVWVIEW.handles.sagittal_xline,'visible','on');
0971     set(AVWVIEW.handles.sagittal_yline,'visible','on');
0972   else
0973     set(AVWVIEW.handles.sagittal_xline,'visible','off');
0974     set(AVWVIEW.handles.sagittal_yline,'visible','off');
0975   end
0976  
0977 end
0978 
0979 set(fig, 'CurrentAxes', current_axes);
0980 
0981 return
0982 
0983 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0984 function AVWVIEW = set_coordinates(AVWVIEW)
0985 
0986 % set the axis coordinates to voxels, mm or meters
0987 
0988 s = size(AVWVIEW.avw.img);
0989 if length(s) > 0, xdim = s(1); else xdim = 1; end
0990 if length(s) > 1, ydim = s(2); else ydim = 1; end
0991 if length(s) > 2, zdim = s(3); else zdim = 1; end
0992 
0993 % initialise for voxel coordinates
0994 xpixdim = double(AVWVIEW.avw.hdr.dime.pixdim(2));
0995 ypixdim = double(AVWVIEW.avw.hdr.dime.pixdim(3));
0996 zpixdim = double(AVWVIEW.avw.hdr.dime.pixdim(4));
0997 xdata = [0 xdim];
0998 ydata = [0 ydim];
0999 zdata = [0 zdim];
1000 
1001 aspect = 1./AVWVIEW.daspect; %AVWVIEW.avw.hdr.dime.pixdim(2:4);
1002 
1003 
1004 if get_coordinate_space(AVWVIEW) == COORDINATE_MM,    % mm
1005   xdata = xdata .* xpixdim;
1006   ydata = ydata .* ypixdim;
1007   zdata = zdata .* zpixdim;
1008   aspect = [1 1 1];
1009 end
1010 
1011 if get_coordinate_space(AVWVIEW) == COORDINATE_M,    % meters
1012   xpixdim = xpixdim / 1000;
1013   ypixdim = ypixdim / 1000;
1014   zpixdim = zpixdim / 1000;
1015   xdata = xdata .* xpixdim;
1016   ydata = ydata .* ypixdim;
1017   zdata = zdata .* zpixdim;
1018   aspect = [1 1 1];
1019 end
1020 
1021 
1022 if isfield(AVWVIEW.handles,'axial_image'),
1023   set(AVWVIEW.handles.axial_axes,'Xlim',xdata);
1024   set(AVWVIEW.handles.axial_axes,'Ylim',ydata);
1025   set(AVWVIEW.handles.axial_axes,'Zlim',zdata);
1026   set(AVWVIEW.handles.axial_image,'Xdata',xdata);
1027   set(AVWVIEW.handles.axial_image,'Ydata',ydata);
1028   daspect(AVWVIEW.handles.axial_axes,aspect([1 2 3]));
1029 end;
1030 if isfield(AVWVIEW.handles,'coronal_image'),
1031   set(AVWVIEW.handles.coronal_axes,'Xlim',xdata);
1032   set(AVWVIEW.handles.coronal_axes,'Ylim',zdata);
1033   set(AVWVIEW.handles.coronal_axes,'Zlim',ydata);
1034   set(AVWVIEW.handles.coronal_image,'Xdata',xdata);
1035   set(AVWVIEW.handles.coronal_image,'Ydata',zdata);
1036   daspect(AVWVIEW.handles.coronal_axes,aspect([1 3 2]));
1037 end;
1038 if isfield(AVWVIEW.handles,'sagittal_image'),
1039   set(AVWVIEW.handles.sagittal_axes,'Xlim',ydata);
1040   set(AVWVIEW.handles.sagittal_axes,'Ylim',zdata);
1041   set(AVWVIEW.handles.sagittal_axes,'Zlim',xdata);
1042   set(AVWVIEW.handles.sagittal_image,'Xdata',ydata);
1043   set(AVWVIEW.handles.sagittal_image,'Ydata',zdata);
1044   daspect(AVWVIEW.handles.sagittal_axes,aspect([2 3 1]));
1045 end;
1046 
1047 set_display_values(AVWVIEW);
1048 update_point_list(AVWVIEW);
1049 set_crosshairs(AVWVIEW);
1050 
1051 return
1052 
1053 
1054 
1055 
1056 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1057 function AVWVIEW = get_current_position(AVWVIEW)
1058 
1059 %[AVWVIEW, metric] = slices2metric(AVWVIEW);
1060 
1061 if get_coordinate_space(AVWVIEW) == COORDINATE_M
1062     devide = 1000;
1063 else
1064     devide = 1;
1065 end
1066 
1067 switch AVWVIEW.view,
1068   case 'sag',
1069     currentpoint = get(get(AVWVIEW.handles.sagittal_image,'Parent'),'CurrentPoint');
1070     metric.cor = currentpoint(1,1);
1071     metric.axi = currentpoint(1,2);
1072     metric.sag = get(AVWVIEW.handles.sagittal_slider,'Value') / devide;
1073   case 'cor',
1074     currentpoint = get(get(AVWVIEW.handles.coronal_image,'Parent'),'CurrentPoint');
1075     metric.sag = currentpoint(2,1);
1076     metric.axi = currentpoint(2,2);
1077     metric.cor = get(AVWVIEW.handles.coronal_slider,'Value') / devide;
1078   case 'axi',
1079     currentpoint = get(get(AVWVIEW.handles.axial_image,'Parent'),'CurrentPoint');
1080     metric.sag = currentpoint(2,1);
1081     metric.cor = currentpoint(2,2);
1082     metric.axi = get(AVWVIEW.handles.axial_slider,'Value') / devide;
1083 end
1084 
1085 AVWVIEW = metric2slices(AVWVIEW,metric);
1086 AVWVIEW = check_slices(AVWVIEW);
1087 
1088 return
1089 
1090 
1091 
1092 
1093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1094 function AVWVIEW = get_slider_position(AVWVIEW)
1095 
1096 [AVWVIEW.slices.sag,AVWVIEW.slices.cor,AVWVIEW.slices.axi] = deal(0);
1097 
1098 if isfield(AVWVIEW.handles,'sagittal_slider'),
1099   if ishandle(AVWVIEW.handles.sagittal_slider),
1100     AVWVIEW.slices.sag = round(get(AVWVIEW.handles.sagittal_slider,'Value'));
1101   end
1102 end
1103 if AVWVIEW.slices.sag == 0,
1104   if isfield(AVWVIEW.handles,'sagittal_sliderN'),
1105     if ishandle(AVWVIEW.handles.sagittal_sliderN),
1106       AVWVIEW.slices.sag = round(get(AVWVIEW.handles.sagittal_sliderN,'Value'));
1107     end
1108   end
1109 end
1110 
1111 if isfield(AVWVIEW.handles,'coronal_slider'),
1112   if ishandle(AVWVIEW.handles.coronal_slider),
1113     AVWVIEW.slices.cor = round(get(AVWVIEW.handles.coronal_slider,'Value'));
1114   end
1115 end
1116 if AVWVIEW.slices.cor == 0,
1117   if isfield(AVWVIEW.handles,'coronal_sliderN'),
1118     if ishandle(AVWVIEW.handles.coronal_sliderN),
1119       AVWVIEW.slices.cor = round(get(AVWVIEW.handles.coronal_sliderN,'Value'));
1120     end
1121   end
1122 end
1123 
1124 if isfield(AVWVIEW.handles,'axial_slider'),
1125   if ishandle(AVWVIEW.handles.axial_slider),
1126     AVWVIEW.slices.axi = round(get(AVWVIEW.handles.axial_slider,'Value'));
1127   end
1128 end
1129 if AVWVIEW.slices.axi == 0,
1130   if isfield(AVWVIEW.handles,'axial_sliderN'),
1131     if ishandle(AVWVIEW.handles.axial_sliderN),
1132       AVWVIEW.slices.axi = round(get(AVWVIEW.handles.axial_sliderN,'Value'));
1133     end
1134   end
1135 end
1136 
1137 AVWVIEW = check_slices(AVWVIEW);
1138 
1139 return
1140 
1141 
1142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1143 function AVWVIEW = check_slices(AVWVIEW)
1144 
1145 adjust = 0;
1146 
1147 [ SagSize, CorSize, AxiSize ] = size(AVWVIEW.avw.img);
1148 
1149 if AVWVIEW.slices.sag > SagSize,
1150     AVWVIEW.slices.sag = SagSize;
1151     adjust = 1;
1152 end;
1153 if AVWVIEW.slices.sag < 1,
1154     AVWVIEW.slices.sag = 1;
1155     adjust = 1;
1156 end;
1157 if AVWVIEW.slices.cor > CorSize,
1158     AVWVIEW.slices.cor = CorSize;
1159     adjust = 1;
1160 end;
1161 if AVWVIEW.slices.cor < 1,
1162     AVWVIEW.slices.cor = 1;
1163     adjust = 1;
1164 end;
1165 if AVWVIEW.slices.axi > AxiSize,
1166     AVWVIEW.slices.axi = AxiSize;
1167     adjust = 1;
1168 end;
1169 if AVWVIEW.slices.axi < 1,
1170     AVWVIEW.slices.axi = 1;
1171     adjust = 1;
1172 end;
1173 
1174 if adjust,
1175     AVWVIEW = slices2metric(AVWVIEW);
1176 end
1177 
1178 return
1179 
1180 
1181 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1182 function set_display_values(AVWVIEW)
1183 
1184 % get coordinates of selected voxel and the image intensity there
1185 
1186 sag = AVWVIEW.slices.sag;
1187 cor = AVWVIEW.slices.cor;
1188 axi = AVWVIEW.slices.axi;
1189 
1190 imgvalue = AVWVIEW.avw.img(sag,cor,axi);
1191 
1192 set(AVWVIEW.handles.imval,'String',sprintf('%7.2f',imgvalue));
1193 set(AVWVIEW.handles.imval,'Value',imgvalue);
1194 
1195 % Now update the image position text for the selected voxel
1196 
1197 [AVWVIEW, metric] = slices2metric(AVWVIEW);
1198 sag = metric.sag;
1199 cor = metric.cor;
1200 axi = metric.axi;
1201 
1202 [string] = get_display_unit_string(AVWVIEW, AVWVIEW.imgXYZ);
1203 
1204 set(AVWVIEW.handles.impos,'String',string);
1205 set(AVWVIEW.handles.impos,'Value',[sag,cor,axi]);
1206 
1207 return
1208 
1209 
1210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1211 function [AVWVIEW,metric] = slices2metric(AVWVIEW)
1212 
1213 AVWVIEW.imgXYZ.voxels = [AVWVIEW.slices.sag,AVWVIEW.slices.cor,AVWVIEW.slices.axi];
1214 AVWVIEW.imgXYZ.meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
1215 AVWVIEW.imgXYZ.mm     = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
1216 
1217 if get_coordinate_space(AVWVIEW) == COORDINATE_MM,
1218   % using mm
1219   img_mm = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
1220   metric.axi = img_mm(3);
1221   metric.cor = img_mm(2);
1222   metric.sag = img_mm(1);
1223 elseif get_coordinate_space(AVWVIEW) == COORDINATE_M,
1224   % using meters
1225   img_meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
1226   metric.axi = img_meters(3);
1227   metric.cor = img_meters(2);
1228   metric.sag = img_meters(1);
1229 elseif get_coordinate_space(AVWVIEW) == COORDINATE_VOXEL
1230   % voxels
1231   metric.axi = AVWVIEW.slices.axi;
1232   metric.cor = AVWVIEW.slices.cor;
1233   metric.sag = AVWVIEW.slices.sag;
1234 end;
1235 
1236 return
1237 
1238 
1239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1240 function AVWVIEW = metric2slices(AVWVIEW,metric)
1241 
1242 coord_space = get_coordinate_space(AVWVIEW);
1243 
1244 switch(coord_space)
1245   case COORDINATE_MM
1246       xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2));
1247       ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3));
1248       zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4));
1249       AVWVIEW.slices.axi = round(metric.axi / zpix);
1250       AVWVIEW.slices.cor = round(metric.cor / ypix);
1251       AVWVIEW.slices.sag = round(metric.sag / xpix);
1252   case COORDINATE_M
1253       xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2)) / 1000;
1254       ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3)) / 1000;
1255       zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4)) / 1000;
1256       AVWVIEW.slices.axi = round(metric.axi / zpix);
1257       AVWVIEW.slices.cor = round(metric.cor / ypix);
1258       AVWVIEW.slices.sag = round(metric.sag / xpix);
1259   case COORDINATE_VOXEL
1260       AVWVIEW.slices.axi = round(metric.axi);
1261       AVWVIEW.slices.cor = round(metric.cor);
1262       AVWVIEW.slices.sag = round(metric.sag);
1263 end
1264 
1265 return
1266 
1267 
1268 
1269 
1270 
1271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1272 function AVWVIEW = init(avw,invarname)
1273 
1274 % try to keep track of the input struct
1275 if exist('invarname','var'),
1276   if ~isempty(invarname),
1277     AVWVIEW.invarname = invarname;
1278   else
1279     AVWVIEW.invarname = '';
1280   end
1281 else
1282   AVWVIEW.invarname = '';
1283 end
1284 
1285 % GUI General Parameters
1286 GUIwidth  = 1;
1287 GUIheight = 1/3;
1288 
1289 version = '[$Revision: 1202 $]';
1290 name = sprintf('vb_mri_point_select [v%s]',version(12:16));
1291 
1292 if isfield(avw,'fileprefix'),
1293   if ~isempty(avw.fileprefix),
1294     format = strcat('%+',sprintf('%d',length(avw.fileprefix)+1),'s');
1295     name = strcat(name,' - ',sprintf(format,avw.fileprefix));
1296   end
1297 end
1298 
1299 % The Zbuffer provides smooth slice animations (OpenGL is no good)
1300 GUI = figure('Name',name,'Tag','AVWVIEW','units','Normalized',...
1301   'BackingStore','off',...
1302   'NumberTitle','off','color',[0 0 0],...
1303   'MenuBar','figure','Position',[0 0.1 1.0 0.8],...
1304   'Renderer','zbuffer','Interruptible', 'off', 'BusyAction', 'queue');
1305 
1306 movegui(GUI,'center');
1307 
1308 set(GUI,'KeyPressFcn','vb_mri_point_select([],[],''keypress'');');
1309 
1310 AVWVIEW.gui = GUI;
1311 Font.FontName   = 'Helvetica';
1312 Font.FontUnits  = 'Pixels';
1313 Font.FontSize   = 15;
1314 Font.FontWeight = 'normal';
1315 Font.FontAngle  = 'normal';
1316 
1317 
1318 AVWVIEW.shading = 'flat';
1319 shading(AVWVIEW.shading)
1320 
1321 %     % determine the datatype of avw.img
1322 %     switch double(avw.hdr.dime.bitpix),
1323 %     case 1,
1324 %         fprintf('...converting avw.img to uint8 for viewing only.\n\n');
1325 %         avw.img = uint8(avw.img);
1326 %     case 8,
1327 %         fprintf('...converting avw.img to uint8 for viewing only.\n\n');
1328 %         avw.img = uint8(avw.img);
1329 %     case 16,
1330 %         fprintf('...converting avw.img to uint16 for viewing only.\n\n');
1331 %         avw.img = uint16(avw.img);
1332 %     case {32,64},
1333 %         % make sure it is double, not single
1334 %         avw.img = double(avw.img);
1335 %     otherwise,
1336 %         % do nothing, leave it as is
1337 %     end
1338 
1339 
1340 % calculate image stats
1341 intensityMean = mean(mean(mean(avw.img)));
1342 intensityMeanRobust = mean(mean(mean(avw.img(find(avw.img)))));
1343 intensityStdev = std(std(std(avw.img)));
1344 
1345 intensityMax = max(max(max(avw.img)));
1346 
1347 % try to adjust for large intensity extremes
1348 if intensityMax > 255,
1349   % got 16 bit data, at least
1350   adjust = 0.5;
1351 else
1352   adjust = 0.9;
1353 end
1354 %AVWVIEW.clim = [0 (intensityMeanRobust + (10 * intensityStdev)) ];
1355 AVWVIEW.clim = [0 (intensityMax * adjust)];
1356 
1357 
1358 
1359 AVWVIEW.xdim = size(avw.img,1);
1360 AVWVIEW.ydim = size(avw.img,2);
1361 AVWVIEW.zdim = size(avw.img,3);
1362 
1363 AVWVIEW.slices.sag = 1;
1364 AVWVIEW.slices.cor = 1;
1365 AVWVIEW.slices.axi = 1;
1366 if AVWVIEW.xdim > 1, AVWVIEW.slices.sag = floor(AVWVIEW.xdim/2); end
1367 if AVWVIEW.ydim > 1, AVWVIEW.slices.cor = floor(AVWVIEW.ydim/2); end
1368 if AVWVIEW.zdim > 1, AVWVIEW.slices.axi = floor(AVWVIEW.zdim/2); end
1369 
1370 % store the volume center for later reference when
1371 % calculating fiducial locations
1372 center = avw_center(avw);
1373 AVWVIEW.center = center.abs.voxels;
1374 
1375 % set the default origin at the center
1376 AVWVIEW.origin  = AVWVIEW.center;
1377 
1378 AVWVIEW.pixdim = double(avw.hdr.dime.pixdim(2:4));
1379 
1380 AVWVIEW.scale2mm     = AVWVIEW.pixdim;          % vol scale in mm
1381 AVWVIEW.scale2meters = AVWVIEW.pixdim ./ 1000;  % vol scale in meters
1382 AVWVIEW.daspect      = AVWVIEW.pixdim ./ min(AVWVIEW.pixdim);
1383 
1384 xPlotSize = 0.38;
1385 yPlotSize = 0.38;
1386 
1387 AVWVIEW.cmapString = 'gray';
1388 
1389 AVWVIEW.cmap = colormap(AVWVIEW.cmapString);
1390 
1391 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1392 %
1393 % --- Selected PointList Initalize
1394 %
1395 AVWVIEW.mps_fileio = vb_mps_fileio_new([avw.fileprefix, '.hdr']);
1396 AVWVIEW.point_list = vb_mps_pointlist_new;
1397 
1398 % Convert if SPM_Right_m pos inputted.
1399 if isfield(avw, 'point_spm_right_m')
1400     Vdim = [AVWVIEW.xdim, AVWVIEW.ydim, AVWVIEW.zdim];
1401     Vsize = AVWVIEW.pixdim;
1402 
1403     for k=1:length(avw.point_spm_right_m.name)
1404         name = avw.point_spm_right_m.name{k};
1405         point.voxels = ...
1406             vb_spm_right_to_analyze_right(avw.point_spm_right_m.pos(k, :),...
1407                                        Vdim, Vsize);
1408         point.mm = ...
1409             vb_spm_right_to_analyze_right_mm(avw.point_spm_right_m.pos(k, :),...
1410                                        Vdim, Vsize);
1411         point.meters = point.mm .* 0.001;
1412 
1413         [AVWVIEW.point_list, result] =...
1414             vb_mps_pointlist_add_point(AVWVIEW.point_list, ...
1415                                     name, ...
1416                                     point);
1417     end
1418 end
1419 
1420 %
1421 % --- Layer model information
1422 %
1423 if isfield(avw, 'display_factor')
1424     AVWVIEW.display_factor = avw.display_factor;
1425 end
1426 
1427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1428 % Axial Slice
1429 if AVWVIEW.xdim > 1 & AVWVIEW.ydim > 1,
1430   
1431   handles.axial_subplot = subplot('position',[0.075 0.075 xPlotSize yPlotSize]);
1432   
1433 %  avw.img = flipdim(avw.img,1);
1434 % add hayashi change default coordinate left handed to right handed.
1435 
1436   Saxial = squeeze(avw.img(:,:,AVWVIEW.slices.axi));
1437   
1438   %handles.axial_image = pcolor(double(Saxial)); colormap(gray); shading interp
1439   %pcolor(Saxial'); colormap(gray); shading flat
1440   
1441   %surf(avw.img(:,:,20)','edgecolor','none'); view(2); axis tight; colormap(flipdim(gray,1)); colorbar
1442   %surf(avw.img(:,:,20)','edgecolor','none'); view(2); axis tight; colormap(gray)
1443   %image(avw.img(:,:,20)'); axis image; colormap(gray)
1444   %imagesc(avw.img(:,:,20)'); axis image; colormap(gray)
1445   
1446   %handles.axial_image = image('Cdata',Saxial','CDataMapping','scaled',...
1447   %    'XData',[0 xdim],'YData',[0 ydim]);
1448   
1449   handles.axial_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.ydim],Saxial',AVWVIEW.clim);
1450   
1451   handles.axial_axes = gca;
1452   set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1453     'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1454   
1455   title('Axial','Color',[1 1 1])
1456   ylabel('Y')
1457   xlabel('Left ----- X ----- Right')
1458 %xlabel('(Right <<) X (>> Left)'); % default radiological orientation for Analyze
1459   %xlabel('(Left <<) X (>> Right)')
1460   
1461   % This callback navigates with mouse button click
1462   set(handles.axial_image,'ButtonDownFcn','vb_mri_point_select([],[],''axial_image'');');
1463   
1464   GUIheight = 0.48;
1465   
1466   if AVWVIEW.zdim > 1,
1467     slider_step(1) = 1/(AVWVIEW.zdim);
1468     slider_step(2) = 1/(AVWVIEW.zdim);
1469     handles.axial_slider = uicontrol('Parent',GUI,'Style','slider',...
1470       'Units','Normalized', Font, ...
1471       'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1472       'BusyAction','cancel',...
1473       'Interruptible', 'off', ...
1474       'TooltipString','Axial slice navigation',...
1475       'Min',1,'Max',AVWVIEW.zdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.axi,...
1476       'Callback','vb_mri_point_select([],[],''axial_slider'');');
1477   end
1478   handles.axial_sliderN = uicontrol('Parent',GUI,'Style','text',...
1479     'Units','Normalized', Font, ...
1480     'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1481     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1482     'BusyAction','queue',...
1483     'TooltipString','Axial slice number',...
1484     'String',num2str(AVWVIEW.slices.axi),'Value',AVWVIEW.slices.axi);
1485   handles.axial_sliderT = uicontrol('Parent',GUI,'Style','text',...
1486     'Units','Normalized', Font, ...
1487     'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1488     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1489     'BusyAction','queue',...
1490     'TooltipString','Axial slice navigation',...
1491     'String','Axial');
1492   
1493   handles.axial_xlim = get(handles.axial_axes,'Xlim');
1494   handles.axial_ylim = get(handles.axial_axes,'Ylim');
1495   handles.axial_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1496                             'Ydata',handles.axial_ylim, ...
1497                             'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1498   handles.axial_yline = line('Ydata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1499                             'Xdata',handles.axial_xlim, ...
1500                             'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1501   set(handles.axial_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1502   set(handles.axial_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1503   
1504 end
1505 
1506 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1507 
1508 % Coronal Slice
1509 if AVWVIEW.xdim > 1 & AVWVIEW.zdim > 1,
1510   
1511   handles.coronal_subplot = subplot('position',[0.075 0.575 xPlotSize yPlotSize]);
1512   
1513   Scor = squeeze(avw.img(:,AVWVIEW.slices.cor,:));
1514   handles.coronal_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.zdim],Scor',AVWVIEW.clim);
1515   handles.coronal_axes = gca;
1516   set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1517     'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1518   
1519   %xlabel('(Left <<) X (>> Right)')
1520   %xlabel('(Right <<) X (>> Left)')
1521   xlabel('Left ----- X ----- Right')
1522   ylabel('Z')
1523   title('Coronal','Color',[1 1 1])
1524   
1525   % This callback navigates with left click
1526   set(handles.coronal_image,'ButtonDownFcn','vb_mri_point_select([],[],''coronal_image'');');
1527   
1528   GUIheight = GUIheight - 0.04;
1529   
1530   if AVWVIEW.ydim > 1,
1531     slider_step(1) = 1/(AVWVIEW.ydim);
1532     slider_step(2) = 1/(AVWVIEW.ydim);
1533     handles.coronal_slider = uicontrol('Parent',GUI,'Style','slider',...
1534       'Units','Normalized', Font, ...
1535       'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1536       'BusyAction','cancel',...
1537       'Interruptible', 'off', ...
1538       'TooltipString','Coronal slice navigation',...
1539       'Min',1,'Max',AVWVIEW.ydim,'SliderStep',slider_step,'Value',AVWVIEW.slices.cor,...
1540       'Callback','vb_mri_point_select([],[],''coronal_slider'');');
1541   end
1542   handles.coronal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1543     'Units','Normalized', Font, ...
1544     'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1545     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1546     'BusyAction','queue',...
1547     'TooltipString','Coronal slice number',...
1548     'String',num2str(AVWVIEW.slices.cor),'Value',AVWVIEW.slices.cor);
1549   handles.coronal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1550     'Units','Normalized', Font, ...
1551     'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1552     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1553     'BusyAction','queue',...
1554     'TooltipString','Coronal slice navigation',...
1555     'String','Coronal');
1556   
1557   handles.coronal_xlim = get(handles.coronal_axes,'Xlim');
1558   handles.coronal_ylim = get(handles.coronal_axes,'Ylim');
1559   handles.coronal_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1560                                'Ydata',handles.coronal_ylim, ...
1561                                'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1562   handles.coronal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1563                                'Xdata',handles.coronal_xlim, ...
1564                                'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1565   set(handles.coronal_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1566   set(handles.coronal_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1567   
1568 end
1569 
1570 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1571 
1572 % Sagittal Slice
1573 if AVWVIEW.ydim > 1 & AVWVIEW.zdim > 1,
1574   
1575   handles.sagittal_subplot = subplot('position',[0.575 0.575 xPlotSize yPlotSize]);
1576   
1577   Ssag = squeeze(avw.img(AVWVIEW.slices.sag,:,:));
1578   handles.sagittal_image = imagesc([0,AVWVIEW.ydim],[0,AVWVIEW.zdim],Ssag',AVWVIEW.clim);
1579   
1580   handles.sagittal_axes = gca;
1581   set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1582     'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1583   
1584   xlabel('Y')
1585   ylabel('Z')
1586   title('Sagittal','Color',[1 1 1])
1587   
1588   % This callback navigates with mouse click
1589   set(handles.sagittal_image,'ButtonDownFcn','vb_mri_point_select([],[],''sagittal_image'');');
1590   
1591   GUIheight = GUIheight - 0.04;
1592   
1593   if AVWVIEW.xdim > 1,
1594     slider_step(1) = 1/(AVWVIEW.xdim);
1595     slider_step(2) = 1/(AVWVIEW.xdim);
1596     handles.sagittal_slider = uicontrol('Parent',GUI,'Style','slider',...
1597       'Units','Normalized', Font, ...
1598       'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1599       'BusyAction','cancel',...
1600       'Interruptible', 'off', ...
1601       'TooltipString','Sagittal slice navigation',...
1602       'Min',1,'Max',AVWVIEW.xdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.sag,...
1603       'Callback','vb_mri_point_select([],[],''sagittal_slider'');');
1604   end
1605   handles.sagittal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1606     'Units','Normalized', Font, ...
1607     'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1608     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1609     'BusyAction','queue',...
1610     'TooltipString','Sagittal slice number',...
1611     'String',num2str(AVWVIEW.slices.sag),'Value',AVWVIEW.slices.sag);
1612   handles.sagittal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1613     'Units','Normalized', Font, ...
1614     'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1615     'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1616     'BusyAction','queue',...
1617     'TooltipString','Sagittal slice navigation',...
1618     'String','Sagittal');
1619   
1620   handles.sagittal_xlim = get(handles.sagittal_axes,'Xlim');
1621   handles.sagittal_ylim = get(handles.sagittal_axes,'Ylim');
1622   handles.sagittal_xline = line('Xdata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1623                                 'Ydata',handles.sagittal_ylim, ...
1624                                 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1625   handles.sagittal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1626                                 'Xdata',handles.sagittal_xlim, ...
1627                                 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1628   set(handles.sagittal_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1629   set(handles.sagittal_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1630   
1631 end
1632 
1633 
1634 
1635 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1636 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1637 % Image Contex Menus
1638 
1639 menu=uicontextmenu;
1640 
1641 % enable right click access to ROI tools
1642 roi = uimenu(menu,'Label','ROI');
1643 uimenu(roi,'Label','ROI (9x9x9 block)','Callback','vb_mri_point_select([],[],''roi_9'');');
1644 uimenu(roi,'Label','ROI (7x7x7 block)','Callback','vb_mri_point_select([],[],''roi_7'');');
1645 uimenu(roi,'Label','ROI (5x5x5 block)','Callback','vb_mri_point_select([],[],''roi_5'');');
1646 uimenu(roi,'Label','ROI (3x3x3 block)','Callback','vb_mri_point_select([],[],''roi_3'');');
1647 
1648 % save image to graphics file
1649 uimenu(menu,'Label','Save Image','Callback','vb_mri_point_select([],[],''save_image'');');
1650 
1651 % zoom image to new figure
1652 uimenu(menu,'Label','Zoom Image','Callback','vb_mri_point_select([],[],''zoom'');');
1653 
1654 if isfield(handles,'axial_image'),
1655   if isempty(get(handles.axial_image,'uicontextmenu')),
1656     set(handles.axial_image,'uicontextmenu',menu);
1657   end
1658 end
1659 if isfield(handles,'coronal_image'),
1660   if isempty(get(handles.coronal_image,'uicontextmenu')),
1661     set(handles.coronal_image,'uicontextmenu',menu);
1662   end
1663 end
1664 if isfield(handles,'sagittal_image'),
1665   if isempty(get(handles.sagittal_image,'uicontextmenu')),
1666     set(handles.sagittal_image,'uicontextmenu',menu);
1667   end
1668 end
1669 
1670 
1671 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1672 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1673 
1674 % Flip status
1675 GUIheight = GUIheight - 0.04;
1676 
1677 handles.flip = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1678   'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1679   'BackgroundColor', [0 0 0],...
1680   'ForegroundColor', [1 1 1],...
1681   'BusyAction','queue',...
1682   'TooltipString','Flip Left and Right (viewer only, see also avw_flip).',...
1683   'String','Flip Status');
1684 %  'Callback','vb_mri_point_select([],[],''flip'');');
1685 handles.flipStatus = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1686   'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1687   'BackgroundColor', [0 0 0],...
1688   'ForegroundColor', [1 1 1],...
1689   'BusyAction','queue',...
1690   'TooltipString','Flipped Status',...
1691   'String','L>>R (neurological)');
1692 
1693 
1694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1696 
1697 % Image Intensity at Mouse Click
1698 
1699 GUIheight = GUIheight - 0.04;
1700 
1701 handles.Timval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1702   'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1703   'BackgroundColor', [0 0 0],...
1704   'ForegroundColor', [1 1 1],...
1705   'BusyAction','queue',...
1706   'String','Image Intensity');
1707 handles.imval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1708   'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1709   'BackgroundColor', [0 0 0],...
1710   'ForegroundColor', [1 1 1],...
1711   'BusyAction','queue',...
1712   'String','x','Value',0);
1713 
1714 % Image Position at Mouse Click
1715 
1716 GUIheight = GUIheight - 0.04;
1717 
1718 LABEL_WIDTH = 0.1;
1719 LABEL_HEIGHT = 0.03;
1720 LABEL_LEFT = 0.55;
1721 handles.Timpos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1722   'Position',[LABEL_LEFT, GUIheight, LABEL_WIDTH, LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1723   'BackgroundColor', [0 0 0],...
1724   'ForegroundColor', [1 1 1],...
1725   'BusyAction','queue',...
1726   'String','Image Position');
1727 
1728 POS_WIDTH = 0.15;
1729 POS_HEIGHT = 0.03;
1730 POS_LEFT = LABEL_LEFT + LABEL_WIDTH;
1731 handles.impos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1732   'Position',[POS_LEFT, GUIheight, POS_WIDTH, POS_HEIGHT],...
1733   'HorizontalAlignment', 'right',...
1734   'BackgroundColor', [0 0 0],...
1735   'ForegroundColor', [1 1 1],...
1736   'BusyAction','queue',...
1737   'String','xyz','Value',[0 0 0]);
1738 
1739 
1740 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1741 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1742 
1743 
1744 GUIheight = GUIheight - 0.04;
1745 LABEL_WIDTH = 0.1;
1746 LABEL_HEIGHT = 0.03;
1747 handles.Tpoint = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1748   'Position',[.55 GUIheight LABEL_WIDTH LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1749   'BackgroundColor', [0 0 0],...
1750   'ForegroundColor', [1 1 1],...
1751   'BusyAction','queue',...
1752   'String','Save Points');
1753 
1754 LISTBOX_WIDTH  = 0.22;
1755 LISTBOX_HEIGHT = 0.15;
1756 LISTBOX_LEFT   = 0.55 + LABEL_WIDTH;
1757 
1758 Font2 = Font;
1759 Font2.FontName   = 'FixedWidth';
1760 handles.save_point_listbox = uicontrol('Parent',GUI,'Style','listbox','Units','Normalized', Font2, ...
1761   'Position',[LISTBOX_LEFT, GUIheight-LISTBOX_HEIGHT+LABEL_HEIGHT, LISTBOX_WIDTH, LISTBOX_HEIGHT],...
1762   'HorizontalAlignment', 'right',...
1763   'BackgroundColor', [0 0 0],...
1764   'ForegroundColor', [1 1 1],...
1765   'BusyAction','queue',...
1766   'String','', ...
1767   'Callback','');
1768 
1769 POS_ADD_WIDTH = 0.08;
1770 POS_ADD_HEIGHT = 0.03;
1771 POS_ADD_LEFT = POS_LEFT + POS_WIDTH + 0.08; % 0.08 is margin
1772 handles.impos_add = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1773   'Position',[POS_ADD_LEFT, GUIheight, POS_ADD_WIDTH, POS_ADD_HEIGHT],...
1774   'HorizontalAlignment', 'center',...
1775   'BackgroundColor', [.3 .3 .3],...
1776   'ForegroundColor', [0 0 0],...
1777   'BusyAction','queue',...
1778   'String','get point',...
1779   'Callback','vb_mri_point_select([],[],''add_point'');');
1780 
1781 REMOVE_PUSH_WIDTH = 0.08;
1782 REMOVE_PUSH_HEIGHT = 0.03;
1783 REMOVE_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01; % 0.01 is margin
1784 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1785   'Position',[REMOVE_PUSH_LEFT, GUIheight - (REMOVE_PUSH_HEIGHT + 0.01),  ...
1786                                 REMOVE_PUSH_WIDTH, REMOVE_PUSH_HEIGHT],...
1787   'HorizontalAlignment', 'center',...
1788   'BackgroundColor', [.3 .3 .3],...
1789   'ForegroundColor', [0 0 0],...
1790   'BusyAction','queue',...
1791   'String','remove point',...
1792   'Callback','vb_mri_point_select([],[],''remove_point'');');
1793 
1794 POINT_SHOW_PUSH_WIDTH = 0.08;
1795 POINT_SHOW_PUSH_HEIGHT = 0.03;
1796 POINT_SHOW_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01; % 0.01 is margin
1797 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1798   'Position',[POINT_SHOW_PUSH_LEFT, ...
1799               GUIheight - (REMOVE_PUSH_HEIGHT + POINT_SHOW_PUSH_HEIGHT + 0.02),  ...
1800               POINT_SHOW_PUSH_WIDTH, POINT_SHOW_PUSH_HEIGHT],...
1801   'HorizontalAlignment', 'center',...
1802   'BackgroundColor', [.3 .3 .3],...
1803   'ForegroundColor', [0 0 0],...
1804   'BusyAction','queue',...
1805   'String','check point',...
1806   'Callback','vb_mri_point_select([],[],''listbox_clicked'');');
1807 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1809 
1810 %GUIheight = GUIheight - 0.04;
1811 
1812 %handles.contrast = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1813 %  'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1814 %  'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1815 %  'BusyAction','queue',...
1816 %  'TooltipString','Auto contrast with gray colormap',...
1817 %  'String','Auto Contrast',...
1818 %  'Callback','vb_mri_point_select([],[],''contrast'');');
1819 
1820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1821 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1822 
1823 GUIheight = GUIheight - LISTBOX_HEIGHT - 0.01; % 0.01 is margin
1824 
1825 handles.dimmer = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1826   'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1827   'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1828   'BusyAction','queue',...
1829   'TooltipString','Dim by 1%',...
1830   'String','Dimmer',...
1831   'Callback','vb_mri_point_select([],[],''dimmer'');');
1832 
1833 handles.brighter = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1834   'Position',[.65 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1835   'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1836   'BusyAction','queue',...
1837   'TooltipString','Brighten by 1%',...
1838   'String','Brighter',...
1839   'Callback','vb_mri_point_select([],[],''brighter'');');
1840 
1841 handles.clim = uicontrol('Parent',GUI,'Style','edit','Units','Normalized', Font, ...
1842   'Position',[.75 GUIheight .06 .03], 'HorizontalAlignment', 'right',...
1843   'BackgroundColor', [0 0 0],...
1844   'ForegroundColor', [1 1 1],...
1845   'BusyAction','queue',...
1846   'TooltipString','Image intensity Climit (inverse brightness)',...
1847   'String',num2str(AVWVIEW.clim(2)),...
1848   'Callback','vb_mri_point_select([],[],''setClimit'');');
1849 
1850 handles.cmap = uicontrol('Parent',GUI,'Style','popup','Units','Normalized', Font, ...
1851   'Position',[.82 GUIheight .06 .03], 'HorizontalAlignment', 'left',...
1852   'BackgroundColor', [0 0 0],...
1853   'ForegroundColor', [1 1 1],...
1854   'BusyAction','queue',...
1855   'TooltipString','Color Map',...
1856   'String',{'gray','bone','copper','hot','cool','spring','summer','autumn','winter','hsv','jet'},...
1857   'Callback','vb_mri_point_select([],[],''setCmap'');');
1858 
1859 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1861 
1862 GUIheight = 0.46;
1863 
1864 handles.crosshairs = uicontrol('Parent',GUI,'Style','checkbox','Units','Normalized', Font, ...
1865   'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1866   'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1867   'BusyAction','queue',...
1868   'TooltipString','Toggle Crosshairs on/off',...
1869   'String','Crosshairs','Value',1,...
1870   'Callback','vb_mri_point_select([],[],''crosshairs'');');
1871 
1872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1873 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1874 
1875 GUIheight = GUIheight - 0.04;
1876 
1877 handles.histogram = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1878   'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1879   'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1880   'BusyAction','queue',...
1881   'TooltipString','Histogram of Volume Intensity',...
1882   'String','Histogram',...
1883   'Callback','vb_mri_point_select([],[],''histogram'');');
1884 
1885 
1886 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1887 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1888 
1889 GUIheight = GUIheight - 0.04;
1890 
1891 handles.coord = uicontrol('Parent',GUI,'Style','popupmenu','Units','Normalized', Font, ...
1892   'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1893   'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1894   'BusyAction','queue',...
1895   'TooltipString','Voxel or Mensurated Axis Coordinates',...
1896   'String',{'Voxels','mm','meters'},...
1897   'Callback','vb_mri_point_select([],[],''coordinates'');');
1898 
1899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1900 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1901 
1902 Font.FontWeight = 'bold';
1903 
1904 % Save: Save points
1905 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1906  'Position',[.65 .01 .10 .05],...
1907  'String','Load ',...
1908  'BusyAction','queue',...
1909  'BackgroundColor',[0.0 0.5 0.0],...
1910  'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1911  'Callback','vb_mri_point_select([],[],''load'');');
1912 
1913 % Save: Save points
1914 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1915  'Position',[.76 .01 .10 .05],...
1916  'String','Save ',...
1917  'BusyAction','queue',...
1918  'BackgroundColor',[0.0 0.5 0.0],...
1919  'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1920  'Callback','vb_mri_point_select([],[],''save'');');
1921 
1922 % Close: application end
1923 handles.Bclose = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1924   'Position',[.87 .01 .10 .05],...
1925   'String','OK','BusyAction','queue',...
1926   'BackgroundColor',[0.0 0.5 0.0],...
1927   'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1928   'Callback','vb_mri_point_select([],[],''close'');');
1929 
1930 
1931 % Update the gui_struct handles for this gui
1932 if exist('parent','var'), AVWVIEW.parent.gui = parent; end
1933 AVWVIEW.avw = avw;
1934 AVWVIEW.handles = handles;
1935 set(AVWVIEW.gui,'Userdata',AVWVIEW);
1936 set(AVWVIEW.gui,'HandleVisibility','on');
1937 
1938 % update layer display
1939 AVWVIEW = axial_update(AVWVIEW);
1940 AVWVIEW = coronal_update(AVWVIEW);
1941 AVWVIEW = sagittal_update(AVWVIEW);
1942 
1943 % update point list
1944 update_point_list(AVWVIEW);
1945 
1946 return
1947 
1948 
1949 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1950 function slice_img(avw)
1951 
1952 figure
1953 xslice = 128;
1954 slice = squeeze( avw.img(xslice,:,:) );
1955 imagesc(slice); axis image; colormap('gray')
1956 figure
1957 yslice = 128;
1958 slice = squeeze( avw.img(:,yslice,:) );
1959 imagesc(slice); axis image; colormap('gray')
1960 figure
1961 zslice = 128;
1962 slice = squeeze( avw.img(:,:,zslice) );
1963 imagesc(slice); axis image; colormap('gray')
1964 
1965 return
1966 
1967 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1968 
1969 function update_point_list(AVWVIEW)
1970 
1971     
1972     NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
1973 
1974     ListBoxStr = cell(NPoints);
1975     point_str  = cell(NPoints);
1976     name_list  = cell(NPoints);
1977     Nlen_max   = 0;
1978 
1979     for k=1:NPoints
1980         [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, k);
1981         [string] = get_display_unit_string(AVWVIEW, point);
1982         name_list{k} = name;
1983         point_str{k} = string;
1984         name_len = length(name);
1985         % get maximam pointname length
1986         if name_len > Nlen_max
1987             Nlen_max = name_len;
1988         end
1989     end
1990     Nlen_max_str = num2str(Nlen_max);
1991     for k=1:NPoints
1992         ListBoxStr{k} = sprintf(['%-' Nlen_max_str 's : %s'], name_list{k}, point_str{k});
1993     end
1994 
1995     set(AVWVIEW.handles.save_point_listbox, 'String', ListBoxStr);
1996     cur_focus = get(AVWVIEW.handles.save_point_listbox, 'Value');
1997     focus = NPoints;
1998     
1999     if NPoints == 0
2000         focus = 1;
2001         set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2002     elseif cur_focus > NPoints
2003         focus = NPoints;
2004         set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2005     end
2006 
2007 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2008 
2009 function [string] = get_display_unit_string(AVWVIEW, imgXYZ)
2010 % get string formatted by GUI coordinate setting.
2011 
2012     %
2013     switch(get_coordinate_space(AVWVIEW))
2014         case COORDINATE_MM
2015             format = '%7.3f %7.3f %7.3f';
2016             coord = imgXYZ.mm;
2017             string = sprintf('%7.3f %7.3f %7.3f', coord);
2018         case COORDINATE_M
2019             format = '%7.3f %7.3f %7.3f';
2020             coord = imgXYZ.meters;
2021             string = sprintf('%7.3f %7.3f %7.3f', coord);
2022         case COORDINATE_VOXEL
2023             coord = imgXYZ.voxels;
2024             string = sprintf('%7.0f %7.0f %7.0f', coord);
2025     end
2026 
2027 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2028 function [metric] = get_metric(AVWVIEW, imgXYZ)
2029     switch(get_coordinate_space(AVWVIEW))
2030         case COORDINATE_MM
2031             coord = imgXYZ.mm;
2032         case COORDINATE_M
2033             coord = imgXYZ.meters;
2034         case COORDINATE_VOXEL
2035             coord = imgXYZ.voxels;
2036     end
2037     
2038     metric.sag = coord(1);
2039     metric.cor = coord(2);
2040     metric.axi = coord(3);
2041 
2042 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2043 function [AVWVIEW] = change_listbox_line(AVWVIEW, lineNo)
2044 % change screen by listbox selected point.
2045 
2046     [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, lineNo);
2047     [metric] = get_metric(AVWVIEW, point);
2048     AVWVIEW = metric2slices(AVWVIEW, metric);
2049     AVWVIEW = axial_update(AVWVIEW);
2050     AVWVIEW = coronal_update(AVWVIEW);
2051     AVWVIEW = sagittal_update(AVWVIEW);
2052     set_display_values(AVWVIEW);
2053     AVWVIEW = set_crosshairs(AVWVIEW);
2054 
2055 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2056 function [space, string] = get_coordinate_space(AVWVIEW)
2057     coordinate_space_setting = get(AVWVIEW.handles.coord,'value');
2058     
2059     switch(coordinate_space_setting)
2060         case 1
2061             space = COORDINATE_VOXEL;
2062             string  = 'VOXEL';
2063         case 2
2064             space = COORDINATE_MM;
2065             string = 'MM';
2066         case 3
2067             space = COORDINATE_M;
2068             string = 'M';
2069     end
2070 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2071 
2072 %
2073 % --- Definition
2074 %
2075 function [value] = COORDINATE_VOXEL
2076     value = 1;
2077 function [value] = COORDINATE_MM
2078     value = 2;
2079 function [value] = COORDINATE_M
2080     value = 3;
2081

Generated on Tue 27-Aug-2013 11:46:04 by m2html © 2005