Home > functions > gui > preAnalysis > leadfield > pa_leadfield_util.m

pa_leadfield_util

PURPOSE ^

This function is subcontracting function of leadfield GUI.

SYNOPSIS ^

function [varargout] = pa_leadfield_util(fig, command, parm)

DESCRIPTION ^

 This function is subcontracting function of leadfield GUI.
 [USAGE]
    [varargout] = pa_leadfield_util(<fig>, <command> [,parm]);
 [IN]
        fig : figure handle of leadfield gui.
    command : utility type
       parm : other parameters
 [OUT]
    varargout{n}: return value
           @command : 'get_basis_mode'  ==> BASIS_MODE
           @command : 'get_bem_mode'    ==> BEM_MODE
           @command : 'get_normal_mode' ==> NORMAL_MODE

 Copyright (C) 2011, ATR All Rights Reserved.
 License : New BSD License(see VBMEG_LICENSE.txt)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function [varargout] = pa_leadfield_util(fig, command, parm)
0002 % This function is subcontracting function of leadfield GUI.
0003 % [USAGE]
0004 %    [varargout] = pa_leadfield_util(<fig>, <command> [,parm]);
0005 % [IN]
0006 %        fig : figure handle of leadfield gui.
0007 %    command : utility type
0008 %       parm : other parameters
0009 % [OUT]
0010 %    varargout{n}: return value
0011 %           @command : 'get_basis_mode'  ==> BASIS_MODE
0012 %           @command : 'get_bem_mode'    ==> BEM_MODE
0013 %           @command : 'get_normal_mode' ==> NORMAL_MODE
0014 %
0015 % Copyright (C) 2011, ATR All Rights Reserved.
0016 % License : New BSD License(see VBMEG_LICENSE.txt)
0017 
0018 %
0019 % --- Previous check
0020 %
0021 if ~exist('fig', 'var') || isempty(fig) || ~ishandle(fig)
0022     error('invalid figure was specified.');
0023 end
0024 if ~exist('command', 'var') || isempty(command)
0025     error('invalid command was specified.');
0026 end
0027 
0028 %
0029 % --- Main Procedure
0030 %
0031 
0032 % load data(@see pa_leadfield_create)
0033 data = guidata(fig);
0034 
0035 switch(command)
0036     case 'update_output_fname'
0037         update_output_fname(data.H);
0038     case 'update_exec_push_status'
0039         update_exec_push_status(data.H);
0040     case 'set_basis_mode'
0041         set_basis_mode(parm, data.H);
0042     case 'get_basis_mode'
0043         % return const basis mode number
0044         varargout{1} = get_basis_mode(data.H);
0045     case 'set_bem_mode'
0046         set_bem_mode(parm, data.H);
0047     case 'get_bem_mode'
0048         % return const bem mode number
0049         varargout{1} = get_bem_mode(data.H);
0050     case 'set_normal_mode'
0051         set_normal_mode(parm, data.H);
0052     case 'get_normal_mode'
0053         % return const normal mode number
0054         varargout{1} = get_normal_mode(data.H);
0055     case 'exec_leadfield'
0056         exec_leadfield(data);
0057     case 'reset_parameter'
0058         reset_parameter(data.H);
0059     case 'check_model'
0060         check_model(data.H);
0061 end
0062 
0063 % save data
0064 guidata(fig, data);
0065 
0066 function update_output_fname(H)
0067 % This function makes output filename and sets filename to GUI.
0068 % [IN]
0069 %    H : GUI component handles
0070 % [OUT]
0071 %    none
0072 
0073     global vbmeg_inst;
0074     define = vbmeg_inst.const;
0075 
0076     save_dir = get(H.save_dir_edit, 'String');
0077 
0078     keyword     = get(H.keyword_edit, 'String');
0079     megmat_file = get(H.megmat_file_edit, 'String');
0080 
0081 %    [path name ext] = fileparts(str);
0082     [fpath, fname, fext] = vb_get_file_parts(megmat_file);
0083 
0084     base_name = [fname, fext];
0085     dot_ix = strfind(base_name, '.');
0086     if ~isempty(dot_ix)
0087         base_name = base_name(1:dot_ix(end-1)-1);
0088     end
0089 
0090     %make basis filename
0091     if isempty(keyword)
0092         basis_file = [save_dir, filesep, base_name, define.BASIS_EXTENSION];
0093     else
0094         basis_file = [save_dir, filesep, base_name, '_', keyword, define.BASIS_EXTENSION];
0095     end
0096     
0097     set(H.basis_file_edit, 'String', basis_file);
0098 
0099 function update_exec_push_status(H)
0100 % This function changes Exec button status.(clickable or not)
0101 % [IN]
0102 %    H : GUI component handles
0103 % [OUT]
0104 %    none
0105 
0106     global vbmeg_inst;
0107     define = vbmeg_inst.const;
0108 
0109     if ~isempty(get(H.megmat_file_edit, 'String')) & ...
0110        ~isempty(get(H.brain_file_edit, 'String')) & ...
0111        ~isempty(get(H.save_dir_edit, 'String')) & ...
0112        ~isempty(get(H.basis_file_edit, 'String'))
0113 
0114         % Head file check.
0115         mode = get_bem_mode(H);
0116         if (mode == define.BASIS_MEG_BEM) || ...
0117            (mode == define.BASIS_EEG_BEM) || ...
0118            (mode == define.BASIS_MEG_HARMONICS)
0119             if isempty(get(H.head_file_edit, 'String'))
0120                 set(H.exec_push, 'Enable', 'off');
0121                 return;
0122             end
0123         end
0124 
0125         % Head center check.
0126         if (mode == define.BASIS_MEG_SPHERE) || ...
0127            (mode == define.BASIS_EEG_SPHERE)
0128            if isempty(get(H.center_head_edit, 'String'))
0129                set(H.exec_push, 'Enable', 'off');
0130                return;
0131            end
0132         end
0133 
0134         % Sphere radius check.
0135         if (mode == define.BASIS_EEG_SPHERE)
0136             if isempty(get(H.sphere_radius_edit, 'String'))
0137                set(H.exec_push, 'Enable', 'off');
0138                return;
0139            end
0140         end
0141 
0142         % Conductivity check
0143         if (mode == define.BASIS_EEG_SPHERE) || ...
0144            (mode == define.BASIS_EEG_BEM)
0145             if isempty(get(H.conductivity_edit, 'String'))
0146                set(H.exec_push, 'Enable', 'off');
0147                return;
0148            end
0149         end
0150 
0151         set(H.exec_push, 'Enable', 'on');
0152     else
0153         set(H.exec_push, 'Enable', 'off');
0154     end
0155 
0156 function set_basis_mode(mode, H)
0157 % This function sets GUI basis mode.
0158 % (basis_mode ---> GUI popup value)
0159 % [IN]
0160 %    mode : basis mode
0161 %       H : GUI component handles
0162 % [OUT]
0163 %    none
0164 %
0165     global vbmeg_inst;
0166     define = vbmeg_inst.const;
0167 
0168     if mode == define.CURRENT_NORMAL
0169         value = 1;
0170     elseif mode == define.CURRENT_TANGENT
0171         value = 2;
0172     elseif mode == define.CURRENT_3D
0173         value = 3;
0174     else
0175         disp('Illigal usage:set_basis_mode().');
0176     end
0177 
0178     set(H.BasisMode_popup, 'Value', value);
0179 
0180 function mode = get_basis_mode(H)
0181 % This function returns basis mode.
0182 % (GUI popup value ---> basis_mode)
0183 % [IN]
0184 %    H : GUI component handles
0185 % [OUT]
0186 %    mode : basis mode
0187 %
0188     global vbmeg_inst;
0189     define = vbmeg_inst.const;
0190 
0191     value = get(H.BasisMode_popup, 'Value');
0192     if value == 1
0193         mode = define.CURRENT_NORMAL;
0194     elseif value == 2
0195         mode = define.CURRENT_TANGENT;
0196     elseif value == 3
0197         mode = define.CURRENT_3D;
0198     else
0199         disp('Invalid Basis mode!!');
0200     end
0201 
0202 function set_bem_mode(mode, H)
0203 % This function sets GUI bem mode.
0204 % (bem_mode ---> GUI popup value)
0205 % [IN]
0206 %    mode : bem mode
0207 %       H : GUI component handles
0208 % [OUT]
0209 %    none
0210 %
0211     global vbmeg_inst;
0212     define = vbmeg_inst.const;
0213 
0214     gui_set_head_center(H, 'off');
0215     gui_set_headfile(H, 'off');
0216     gui_set_conductivity(H, 'off');
0217     gui_set_sphere_radius(H, 'off');
0218 
0219     if mode == define.BASIS_MEG_SPHERE
0220         value = 1;
0221         gui_set_head_center(H, 'on');
0222     elseif mode == define.BASIS_MEG_BEM
0223         value = 2;
0224         gui_set_headfile(H, 'on');
0225     elseif mode == define.BASIS_MEG_HARMONICS
0226         value =  3;
0227         gui_set_headfile(H, 'on');
0228     elseif mode == define.BASIS_EEG_SPHERE
0229         value = 4;
0230         gui_set_head_center(H, 'on');
0231         gui_set_sphere_radius(H, 'on');
0232         gui_set_conductivity(H, 'on');
0233     elseif mode == define.BASIS_EEG_BEM
0234         value = 5;
0235         gui_set_headfile(H, 'on');
0236         gui_set_conductivity(H, 'on');
0237     else
0238         disp('Illigal usage : set_bem_mode().');
0239     end
0240     set(H.BemMode_popup, 'Value', value);
0241 
0242 function gui_set_sphere_radius(H, on_off)
0243     set(H.sphere_radius_label, 'Enable', on_off);
0244     set(H.sphere_radius_edit, 'Enable', on_off);
0245 
0246 function gui_set_head_center(H, on_off)
0247     set(H.center_head_label, 'Enable', on_off);
0248     set(H.center_head_edit, 'Enable', on_off);
0249     set(H.center_head_push, 'Enable', on_off);
0250 
0251 function gui_set_conductivity(H, on_off)
0252     set(H.conductivity_label, 'Enable', on_off);
0253     set(H.conductivity_edit, 'Enable', on_off);
0254 
0255 function gui_set_headfile(H, on_off)
0256     set(H.headfile_label, 'Enable', on_off);
0257     set(H.head_file_edit, 'Enable', on_off);
0258     set(H.head_file_push, 'Enable', on_off);
0259 
0260 function mode = get_bem_mode(H)
0261 % This function returns bem mode.
0262 % (GUI popup value ---> bem_mode)
0263 % [IN]
0264 %    H : GUI component handles
0265 % [OUT]
0266 %    mode : bem mode
0267 %
0268     global vbmeg_inst;
0269     define = vbmeg_inst.const;
0270 
0271     value = get(H.BemMode_popup, 'Value');
0272     
0273     if value == 1
0274         mode = define.BASIS_MEG_SPHERE;
0275     elseif value == 2
0276         mode = define.BASIS_MEG_BEM;
0277     elseif value == 3
0278         mode = define.BASIS_MEG_HARMONICS;
0279     elseif value == 4
0280         mode = define.BASIS_EEG_SPHERE;
0281     elseif value == 5
0282         mode = define.BASIS_EEG_BEM;
0283     else
0284         disp('Invalid bem mode!!');
0285     end
0286 
0287 function set_normal_mode(mode, H)
0288 % This function sets GUI normal mode.
0289 % (normal_mode ---> GUI popup value)
0290 % [IN]
0291 %    mode : normal mode
0292 %       H : GUI component handles
0293 % [OUT]
0294 %    none
0295 %
0296     global vbmeg_inst;
0297     define = vbmeg_inst.const;
0298 
0299     if mode == define.NORMAL_ADJACENT_MEAN
0300         value = 1;
0301     elseif mode == define.NORMAL_NEIGHBOR_MEAN
0302         value = 2;
0303     else
0304         disp('Illigal usage : set_normal_mode().');
0305     end
0306 
0307     set(H.NormalMode_popup, 'Value', value);
0308 
0309 function mode = get_normal_mode(H)
0310 % This function returns normal_mode by constant value.
0311 % (GUI popup value ---> normal_mode)
0312 % [IN]
0313 %    H : GUI component handles
0314 % [OUT]
0315 %    mode : normal mode
0316 %
0317     global vbmeg_inst;
0318     define = vbmeg_inst.const;
0319 
0320     value = get(H.NormalMode_popup, 'Value');
0321 
0322     if value == 1
0323         mode = define.NORMAL_ADJACENT_MEAN;
0324     elseif value == 2
0325         mode = define.NORMAL_NEIGHBOR_MEAN;
0326     else
0327         disp('Illigal usage : get_normal_mode().');
0328     end
0329 
0330 function exec_leadfield(data)
0331 % This function execute vb_job_leadfield with set parameter.
0332 % [IN]
0333 %    data : data of leafield gui(@see pa_leadfield_create)
0334 % [OUT]
0335 %    none
0336 
0337     H = data.H; % component handles
0338     
0339     %%%%%%%%%%%%%%%%%%%%
0340     % Parameter setting
0341     %%%%%%%%%%%%%%%%%%%%
0342     % project root directory
0343     proj_root = get(H.prjroot_edit, 'String');
0344 
0345     % advanced parameters are set here.
0346     basis_parm = data.basis_parm;
0347 
0348     % MEG-MAT file
0349     basis_parm.meg_file   = get(H.megmat_file_edit, 'String');
0350 
0351     % BRAIN file
0352     basis_parm.brain_file = get(H.brain_file_edit, 'String');
0353     
0354     % AREA file
0355     basis_parm.area_file  = get(H.area_file_edit, 'String');
0356 
0357     % HEAD file
0358     basis_parm.head_file  = get(H.head_file_edit, 'String');
0359 
0360     % MEG/EEG device name
0361     basis_parm.device     = [];
0362 
0363     % Center of the head
0364     basis_parm.Vcenter    = eval([ '[', get(H.center_head_edit, 'String'), ']' ]);
0365     
0366     % bem_mode: LF計算法
0367     %  MEG
0368     %      BASIS_MEG_SPHERE    : MEG 球モデル  (Sarvasの式)
0369     %      BASIS_MEG_BEM       : MEG ポテンシャル一次近似、ガラーキン法、面電流
0370     %      BASIS_MEG_HARMONICS : MEG 球面関数展開
0371     %  EEG
0372     %      BASIS_EEG_SPHERE    : EEG 3層球モデル
0373     %      BASIS_EEG_BEM       : EEG ポテンシャル一次近似、ガラーキン法
0374     basis_parm.bem_mode   = get_bem_mode(H);
0375 
0376     % Basis_mode : number of independent curent direction
0377     %       CURRENT_NORMAL  :  current vextor = xx(n,:)
0378     %       CURRENT_TANGENT :  current vextor = orthogonal vectors to V(n,:)
0379     %       CURRENT_3D      :  current vextor = x, y, z -direction
0380     basis_parm.Basis_mode = get_basis_mode(H);
0381 
0382     % normal_mode: Average mode for normal direction
0383     %       NORMAL_ADJACENT_MEAN  = 0;  % 隣接点の法線平均
0384     %       NORMAL_NEIGHBOR_MEAN  = 1;  % BV脳モデル近傍点の法線平均
0385     basis_parm.normal_mode = get_normal_mode(H);
0386 
0387     % Conductivity
0388     basis_parm.sigma = eval([ '[', get(H.conductivity_edit, 'String'), ']' ]);
0389     
0390     % Sphere Radius
0391     basis_parm.radius = eval([ '[', get(H.sphere_radius_edit, 'String'), ']' ]);
0392 
0393     % BASIS file(output)
0394     basis_parm.basis_file = get(H.basis_file_edit, 'String');
0395 
0396     % keyword
0397     basis_parm.keyword    = get(H.keyword_edit, 'String');
0398 
0399     % Comment
0400     basis_parm.comment    = get(H.comment_edit, 'String');
0401 
0402     %
0403     % --- Advanced parameters
0404     %
0405     basis_parm.area_key = get(H.areakey_edit, 'String');
0406     
0407     err_code = vb_basisparm_check(basis_parm, proj_root);
0408     
0409     if err_code == 0
0410         %%%%%%%%%%%%%%%%%%%%
0411         % execute job
0412         %%%%%%%%%%%%%%%%%%%%
0413         str = get(H.exec_push, 'String');
0414         set(H.exec_push, 'String', 'Processing...');
0415         pause(0.01);%for label string update
0416         vb_job_leadfield(proj_root, basis_parm);
0417         set(H.exec_push, 'String', 'Exec');
0418     else
0419         % Show error reason.
0420         err_table =  ...
0421             {1, 'basis_parm is empty.';
0422              2, 'Project root directory is not specified.';
0423              4, 'Cortical model file is invalid.';
0424              8, 'MEG/EEG file is invalid.';
0425              16, 'Normal mode is invalid.';
0426              32, 'Basis mode is invalid.';
0427              64, 'Cortical area file or AreaID is invalid. ';
0428              128 sprintf('%s\n%s', 'Coordinate type of sensor is invalid.', ...
0429                          'Did you specify POS-MAT file when MEG/EEG file was made?')};
0430         for k=1:size(err_table)
0431             if bitand(err_code, err_table{k, 1})
0432                 errordlg(err_table{k, 2}, 'error');
0433                 return;
0434             end
0435         end
0436     end
0437 
0438 function reset_parameter(H)
0439 % This function resets brain GUI.
0440 % [IN]
0441 %    H : GUI component handles
0442 % [OUT]
0443 %    none
0444 
0445     parm = vb_set_basis_parm;
0446     pa_leadfield_set_parm(H.figure, parm);
0447 %     set(H.megmat_file_edit ,'String', '');
0448 %     set(H.brain_file_edit ,'String', '');
0449 %     set(H.area_file_edit ,'String', '');
0450 %     set(H.head_file_edit ,'String', '');
0451 %     set(H.areakey_edit, 'String', '');
0452 %     set(H.keyword_edit ,'String', '');
0453 %     set(H.comment_edit ,'String', '');
0454 %     set(H.save_dir_edit ,'String', '');
0455 %     set(H.basis_file_edit ,'String', '');
0456 %
0457 %     set(H.BemMode_popup, 'Value', 1);
0458 %     set(H.BasisMode_popup, 'Value', 1);
0459 %     set(H.NormalMode_popup, 'Value', 2);
0460     
0461 function check_model(H)
0462 % This function display forward model.
0463 % [IN]
0464 %    H:
0465 % [OUT]
0466 %    none
0467 
0468 global vbmeg_inst;
0469 define = vbmeg_inst.const;
0470 
0471 % move to some default parameter set in future
0472 head_color = [0.9 0.8 0.8; 0.9 0.9 1.0; 1.0 0.8 0.8; ...
0473               1.0 0.8 0.8; 1.0 0.8 0.8; 1.0 0.8 0.8];
0474 brain_color = [0.8 0.8 0.8];
0475 falpha = [0.3 0.2 0.1 0.1];
0476 
0477 % Project root directory
0478 proj_root = get(H.prjroot_edit, 'String');
0479 
0480 % MEG-MAT file
0481 meg_file   = get(H.megmat_file_edit, 'String');
0482 
0483 % BRAIN file
0484 brain_file = get(H.brain_file_edit, 'String');
0485     
0486 % HEAD file
0487 head_file  = get(H.head_file_edit, 'String');
0488 
0489 % Leadfield calculation method
0490 bem_mode = get_bem_mode(H);
0491 
0492 if isempty(proj_root), return; end
0493 
0494 flag = 0;
0495 
0496 if ~isempty(brain_file)
0497   figure; hold on; flag = 1;
0498   [V,F] = vb_load_cortex([proj_root '/' brain_file]);
0499   patch('Faces',F.F3,'Vertices',V,'FaceColor',brain_color,...
0500     'EdgeColor',brain_color*0.8);
0501 end
0502 
0503 if ~isempty(meg_file)
0504   if ~flag, figure; hold on; flag = 1; end
0505   pick = vb_load_sensor([proj_root '/' meg_file]);
0506   plot3(pick(:,1),pick(:,2),pick(:,3),'b.');
0507 end
0508 
0509 if bem_mode == define.BASIS_MEG_SPHERE
0510   % MEG球モデルを表示
0511 elseif bem_mode == define.BASIS_EEG_SPHERE
0512   % EEG球モデルを表示
0513 elseif ~isempty(head_file)
0514   if ~flag, figure; hold on; flag = 1; end
0515   head_file = [proj_root '/' head_file];
0516   Nlayer = vb_head_get_layer_num(head_file);
0517   
0518   for l=1:Nlayer
0519     headinfo = vb_head_get_specified_headinfo(head_file,l);
0520     patch('Faces',headinfo.Fhead,'Vertices',headinfo.Vhead,...
0521           'FaceColor',head_color(l,:),'EdgeColor','none',...
0522           'FaceAlpha',falpha(l));
0523   end
0524 end
0525 
0526 if flag==1, 
0527   axis equal;
0528   axis tight;
0529   xlabel('X [m]');
0530   ylabel('Y [m]');
0531   zlabel('Z [m]'); 
0532 end

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