0001 function [varargout] = pa_leadfield_util(fig, command, parm)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
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
0030
0031
0032
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
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
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
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
0064 guidata(fig, data);
0065
0066 function update_output_fname(H)
0067
0068
0069
0070
0071
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
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
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
0101
0102
0103
0104
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
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
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
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
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
0158
0159
0160
0161
0162
0163
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
0182
0183
0184
0185
0186
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
0204
0205
0206
0207
0208
0209
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
0262
0263
0264
0265
0266
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
0289
0290
0291
0292
0293
0294
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
0311
0312
0313
0314
0315
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
0332
0333
0334
0335
0336
0337 H = data.H;
0338
0339
0340
0341
0342
0343 proj_root = get(H.prjroot_edit, 'String');
0344
0345
0346 basis_parm = data.basis_parm;
0347
0348
0349 basis_parm.meg_file = get(H.megmat_file_edit, 'String');
0350
0351
0352 basis_parm.brain_file = get(H.brain_file_edit, 'String');
0353
0354
0355 basis_parm.area_file = get(H.area_file_edit, 'String');
0356
0357
0358 basis_parm.head_file = get(H.head_file_edit, 'String');
0359
0360
0361 basis_parm.device = [];
0362
0363
0364 basis_parm.Vcenter = eval([ '[', get(H.center_head_edit, 'String'), ']' ]);
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374 basis_parm.bem_mode = get_bem_mode(H);
0375
0376
0377
0378
0379
0380 basis_parm.Basis_mode = get_basis_mode(H);
0381
0382
0383
0384
0385 basis_parm.normal_mode = get_normal_mode(H);
0386
0387
0388 basis_parm.sigma = eval([ '[', get(H.conductivity_edit, 'String'), ']' ]);
0389
0390
0391 basis_parm.radius = eval([ '[', get(H.sphere_radius_edit, 'String'), ']' ]);
0392
0393
0394 basis_parm.basis_file = get(H.basis_file_edit, 'String');
0395
0396
0397 basis_parm.keyword = get(H.keyword_edit, 'String');
0398
0399
0400 basis_parm.comment = get(H.comment_edit, 'String');
0401
0402
0403
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
0412
0413 str = get(H.exec_push, 'String');
0414 set(H.exec_push, 'String', 'Processing...');
0415 pause(0.01);
0416 vb_job_leadfield(proj_root, basis_parm);
0417 set(H.exec_push, 'String', 'Exec');
0418 else
0419
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
0440
0441
0442
0443
0444
0445 parm = vb_set_basis_parm;
0446 pa_leadfield_set_parm(H.figure, parm);
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461 function check_model(H)
0462
0463
0464
0465
0466
0467
0468 global vbmeg_inst;
0469 define = vbmeg_inst.const;
0470
0471
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
0478 proj_root = get(H.prjroot_edit, 'String');
0479
0480
0481 meg_file = get(H.megmat_file_edit, 'String');
0482
0483
0484 brain_file = get(H.brain_file_edit, 'String');
0485
0486
0487 head_file = get(H.head_file_edit, 'String');
0488
0489
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
0511 elseif bem_mode == define.BASIS_EEG_SPHERE
0512
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