Home > functions > job > job_view_cortex_dir > job_view_cortex_plot.m

job_view_cortex_plot

PURPOSE ^

job_view_cortex_plot( key )

SYNOPSIS ^

function job_view_cortex_plot( key )

DESCRIPTION ^

 job_view_cortex_plot( key )

 脳モデル表示汎用インターフェイス


 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 job_view_cortex_plot( key )
0002 % job_view_cortex_plot( key )
0003 %
0004 % 脳モデル表示汎用インターフェイス
0005 %
0006 %
0007 % Copyright (C) 2011, ATR All Rights Reserved.
0008 % License : New BSD License(see VBMEG_LICENSE.txt)
0009 
0010 H = get( gcf, 'UserData' );
0011 
0012 brain = get( H.braindata, 'UserData' );
0013 act = get( H.actdata, 'UserData' );
0014 area = get( H.areadata, 'UserData' );
0015 selection = get( H.selectdata, 'UserData' );
0016 param = get( H.paramdata, 'UserData' );
0017 
0018 % モデルの選択
0019 switch param.model_type
0020  case 'original'
0021   V = brain.V;
0022  case 'inflate'
0023   V = brain.Vinflate;
0024 end
0025 
0026 % 右脳/左脳/両側 の選択
0027 switch param.LRflg
0028  case 'L'
0029   F = brain.F.F3L;
0030  case 'R'
0031   F = brain.F.F3R;
0032  case 'LR'
0033   F = brain.F.F3;
0034 end
0035 
0036 % マスクの生成 ( マスクに含まれる頂点(を持つ面)のみを表示 )
0037 if isempty(area.masking)
0038   mask = [1:length(brain.V)];  % マスクが無ければ全体表示
0039 else
0040   mask = unique( [ area.source(area.masking).Vi ] );
0041 end
0042 
0043 %===  脳モデルの表示  ================================================
0044 switch key
0045 
0046  case 'brain'
0047   cla;
0048   job_view_cortex_plot_brain_model( V, F, brain.S, mask, param );
0049   job_view_cortex_plot_brain_act_area( V, F, brain.Va, act, area,...
0050                        mask, param, key );
0051   job_view_cortex_plot_brain_selected( V, F, selection.Vi, mask, param );
0052   selected = get( H.activation_plotted_list, 'Value' );
0053   job_view_cortex_plot_brain_act_highlight( act, param,...
0054                         act.plotted( selected ) );
0055   selected = get( H.area_plotted_list, 'Value' );
0056   job_view_cortex_plot_brain_area_highlight( V, F, area, mask, param,...
0057                          area.plotted( selected ) );
0058   
0059  case { 'act', 'area' }
0060   job_view_cortex_plot_brain_act_area( V, F, brain.Va, act, area,...
0061                        mask, param, key );
0062   job_view_cortex_plot_brain_selected( V, F, selection.Vi, mask, param );
0063   selected = get( H.activation_plotted_list, 'Value' );
0064   job_view_cortex_plot_brain_act_highlight( act, param,...
0065                         act.plotted( selected ) );
0066   selected = get( H.area_plotted_list, 'Value' );
0067   job_view_cortex_plot_brain_area_highlight( V, F, area, mask, param,...
0068                          area.plotted( selected ) );
0069   
0070  case 'selection'
0071   job_view_cortex_plot_brain_selected( V, F, selection.Vi, mask, param );
0072   selected = get( H.activation_plotted_list, 'Value' );
0073   job_view_cortex_plot_brain_act_highlight( act, param,...
0074                         act.plotted( selected ) );
0075   selected = get( H.area_plotted_list, 'Value' );
0076   job_view_cortex_plot_brain_area_highlight( V, F, area, mask, param,...
0077                          area.plotted( selected ) );
0078   
0079  case 'highlight act'
0080   selected = get( H.activation_plotted_list, 'Value' );
0081   job_view_cortex_plot_brain_act_highlight( act,...
0082                         param, act.plotted( selected ) );
0083 
0084  case 'highlight area'
0085   selected = get( H.area_plotted_list, 'Value' );
0086   job_view_cortex_plot_brain_area_highlight( V, F, area, mask, param,...
0087                          area.plotted( selected ) );
0088 
0089 end
0090 
0091 material dull;
0092 lighting phong;
0093 
0094 % マウスの機能を再評価
0095 job_view_cortex_callback( 'mouse func' );
0096 
0097 
0098 
0099 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0100 %%%% 脳モデルの描画
0101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0102 
0103 function job_view_cortex_plot_brain_model( V, F, S, mask, param )
0104 %
0105 % V : 頂点データ
0106 % F : 面データ
0107 % S : 頂点が溝であるかどうかの論理配列
0108 % mask : 表示すべき頂点インデックス
0109 % param : パラメタ色々。ここで使うのは...
0110 %     param.brain_color : モデルの描画色
0111 %     param.sulcus_visibility: 溝に色をつけるかどうか( visible or invisible )
0112 %     param.sulcus_color     : 溝の描画色( true color )
0113 %     param.lighting         : ライティングをするかどうか( on or off )
0114 %
0115 
0116 % 面を選択
0117 FF = vb_patch_select2(mask,F,length(V));
0118 
0119 switch param.model_type
0120  case 'original'
0121   patch( 'Faces', FF, 'Vertices', V, 'FaceColor', param.brain_color,...
0122      'EdgeColor', 'none', 'Tag', 'brain', 'Clipping', 'on' );
0123  case 'inflate'
0124   switch param.sulcus_visibility
0125    case 'visible'
0126     colors = ( ones(length(V),1) - S' ) * param.brain_color...
0127           + S' * param.sulcus_color; 
0128     patch( 'Faces', FF, 'Vertices', V, 'FaceColor', 'interp',...
0129        'EdgeColor', 'none', 'FaceVertexCData', colors,...
0130        'Tag', 'brain', 'Clipping', 'on' );
0131    case 'invisible'
0132     patch( 'Faces', FF, 'Vertices', V, 'FaceColor', param.brain_color,...
0133        'EdgeColor', 'none', 'Tag', 'brain', 'Clipping', 'on' );
0134   end
0135 end
0136   
0137 switch param.lighting
0138  case 'on'
0139   lightangle( 0, 0 );
0140   lightangle( 0, 180 );
0141 end
0142 
0143 
0144 
0145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0146 %%%% 脳活動/脳領域の描画
0147 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0148 
0149 function job_view_cortex_plot_brain_act_area( V, F, Va, act, area, mask, param, key )
0150 %
0151 % param.act_area_priority ( 脳活動と脳領域のどちらを上に表示するか)
0152 % による振り分け
0153 %
0154 
0155 switch param.act_area_priority
0156  case 'activation'
0157   switch key
0158    case 'act'
0159     job_view_cortex_plot_brain_activation( V, F, Va, act, mask, param );
0160    case { 'brain', 'area' }
0161     job_view_cortex_plot_brain_area( V, F, area, mask, param );
0162     job_view_cortex_plot_brain_activation( V, F, Va, act, mask, param );
0163   end
0164  case 'area'
0165   switch key
0166    case { 'brain', 'act' }
0167     job_view_cortex_plot_brain_area( V, F, area, mask, param );
0168     job_view_cortex_plot_brain_activation( V, F, Va, act, mask, param );
0169    case 'area'
0170     job_view_cortex_plot_brain_area( V, F, area, mask, param );
0171   end
0172 end
0173 
0174 
0175 
0176 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0177 %%%% 脳活動の描画
0178 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0179 
0180 function job_view_cortex_plot_brain_activation( V, F, Va, act, mask, param )
0181 %
0182 % V    : 頂点データ ( Nv × 3 )
0183 % F    : 面データ ( Nf × 3 )
0184 % Va   : 各頂点の活動面積 ( Nv × 1 )
0185 % act  : 活動データ構造体
0186 % mask : 表示すべき頂点のインデックス ( Nm × 1 )
0187 % param.act_normalize  : 活動強度を正規化するかどうか
0188 %     'no'       --- 正規化しない, デフォルト
0189 %     'meshsize' --- 脳モデルのメッシュサイズで正規化
0190 % param.act_relative_mode  : 活動強度の最大絶対値の計算法
0191 %     'all'  --- .act.matファイル中のすべてのデータの最大絶対値
0192 %     'each' --- 表示中のデータの最大絶対値, デフォルト
0193 % param.act_min_mode  : 描画する活動強度の最小絶対値の設定方法
0194 %     'absolute' --- 即値で指定
0195 %     'relative' --- 最大絶対値に対する割合で指定, デフォルト
0196 % param.act_min  : 描画する活動強度の最小絶対値
0197 %     param.act_min_mode = 'absolute' の場合は即値
0198 %     param.act_min_mode = 'relative' の場合は最大絶対値に対する割合
0199 %     ( デフォルトは0.1 )
0200 % param.act_sign_mode         :
0201 % param.act_colormap_max_mode :
0202 % param.act_colormap_max      : カラー軸の設定
0203 %     act_sing_mode = 'signed'   なら、カラー軸の範囲は [ -cmax, cmax ]
0204 %     act_sing_mode = 'unsigned' なら、カラー軸の範囲は [ 0, cmax ]
0205 %     ただし、cmaxは、act_colormap_max_mode が、
0206 %         'absolute' なら、cmax = act_colormap_max
0207 %         'relative' なら、cmax = act_colormap_max × 最大絶対値
0208 %     デフォルトは、
0209 %     act_sign_mode = 'unsigned'
0210 %     act_colormap_max_mode = 'relative'
0211 %     act_colormap_max = 1
0212 % param.act_colormap_type  : カラーマップのタイプ
0213 %     'jet' --- jet タイプ, デフォルト
0214 %     'hot' --- hot タイプ
0215 % param.paint  : 活動強度, 領域, 選択領域の描画方法
0216 %     'patch' --- patch(面)で描画
0217 %     'dot'   --- plot(点)で描画
0218 % param.markersize  : 点描画時のマーカーの大きさ
0219 %     スカラ値 ( デフォルトは 1 )
0220 %
0221 
0222 delete( findobj( gca, 'Tag', 'act' ) );
0223 
0224 if isempty( act.plotted ); return; end;
0225 
0226 % 最大絶対値の計算
0227 switch param.act_relative_mode
0228  case 'each'
0229   Jabsmax = max( abs( [ act.source(act.plotted).J ] ) );
0230  case 'all'
0231   Jabsmax = max( abs( [ act.source(act.candidate).J ] ) );
0232 end
0233 
0234 % 各活動強度データについて描画
0235 for id = act.plotted
0236 
0237   J = act.source(id).J;
0238 
0239   %%%%% 活動の正規化 %%%%%
0240   switch param.act_normalize
0241    case 'meshsize'
0242     J = J ./ Va;
0243   end
0244 
0245   %%%%% 表示すべき頂点の選択  %%%%%
0246   % マスキング : mask に含まれる頂点と F に含まれる頂点の共通部分
0247   ind = intersect( mask, unique(F(:)) );
0248   % 最小描画活動強度による選択
0249   switch param.act_min_mode
0250    case 'absolute'
0251     ind = intersect( ind, find( abs(J) >= param.act_min ) );
0252    case 'relative'
0253     ind = intersect( ind, find( abs(J) >= Jabsmax * param.act_min ) );
0254   end
0255 
0256   %%%%% カラーマップ設定 %%%%%
0257   switch param.act_colormap_max_mode
0258    case 'absolute'
0259     cmax = param.act_colormap_max;
0260    case 'relative'
0261     cmax = Jabsmax * param.act_colormap_max;
0262   end
0263 
0264   switch param.act_colormap_type
0265    case 'hot'
0266     colormap(hot);
0267    case 'jet'
0268     colormap(jet);
0269   end
0270 
0271   %%%%% 絶対値表示/符号付き表示の切換え *****
0272   switch param.act_sign_mode
0273    case 'signed'
0274     caxis( [ -cmax cmax ] );
0275    case 'unsigned'
0276     J = abs(J);
0277     caxis( [ 0 cmax ] );
0278   end
0279 
0280   %%%%% 描画 %%%%%
0281   switch param.paint
0282    case 'dot'
0283     tmp = scatter3( V(ind,1), V(ind,2), V(ind,3), 1, J(ind), '.', 'filled' );
0284     set( tmp, 'MarkerSize', param.markersize, 'Tag', 'act', 'UserData', id,...
0285           'HitTest', 'off', 'Clipping', 'on' );
0286    case 'patch'
0287     FF = vb_patch_select2(ind,F,length(V));  
0288     patch( 'Faces', FF, 'Vertices', V, 'FaceColor', 'interp',...
0289        'FaceVertexCData', J', 'EdgeColor', 'none', 'FaceAlpha', 0.99,...
0290        'Tag', 'act', 'UserData', id, 'HitTest', 'off', 'Clipping', 'on' );
0291   end
0292   
0293 end
0294 
0295 
0296 
0297 
0298 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0299 %%%% 脳領域の描画
0300 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0301 
0302 function job_view_cortex_plot_brain_area( V, F, area, mask, param )
0303 %
0304 % V    : 頂点データ ( Nv × 3 )
0305 % F    : 面データ ( Nf × 3 )
0306 % area : 活動データ構造体
0307 % mask : 表示すべき頂点のインデックス ( Nm × 1 )
0308 % param.area_alpha  : 領域表示の透明度
0309 %     0.01 〜 0.99 のスカラ値 ( デフォルトは 0.4 )
0310 % param.paint  : 活動強度, 領域, 選択領域の描画方法
0311 %     'patch' --- patch(面)で描画
0312 %     'dot'   --- plot(点)で描画
0313 % param.markersize  : 点描画時のマーカーの大きさ
0314 %     スカラ値 ( デフォルトは 1 )
0315 %
0316 
0317 delete( findobj( gca, 'Tag', 'area' ) );
0318 
0319 if isempty( area.plotted ); return; end;
0320 
0321 area_colors = [ 1 0 0; 0 1 0; 0 0 1; 1 1 0; 1 0 1; 0 1 1;
0322         1 1 0.5; 0.5 0 0; 0 0.5 1; 0.5 1 0; 1 0.5 1; 0 0 0.5;
0323         1 0.5 0; 0 1 0.5; 0.5 0 1; 0 0.5 0; 0.5 1 1; 1 0 0.5;
0324         1 0.5 0.5; 0 0.5 0.5; 0.5 1 0.5;
0325         0.5 0 0.5; 0.5 0.5 1; 0.5 0.5 0 ];
0326 
0327 for id = area.plotted
0328   
0329   ind = intersect( area.source(id).Vi, mask );
0330 
0331   % F に含まれない頂点のカットオフ
0332   ind = intersect( ind, unique(F) );
0333 
0334   color = area_colors(1+mod(id-1,length(area_colors)),:);
0335 
0336   % 描画
0337   switch param.paint
0338    case 'dot'
0339     plot3( V(ind,1), V(ind,2), V(ind,3), '.',...
0340        'MarkerFaceColor', color, 'MarkerEdgeColor', color,...
0341        'MarkerSize', param.markersize, 'Tag', 'area', 'UserData', id,...
0342        'HitTest', 'off', 'Clipping', 'on' );
0343    case 'patch'
0344     FF = vb_patch_select2( ind, F, length(V) );
0345     patch( 'Faces', FF, 'Vertices', V,...
0346        'FaceColor', color, 'EdgeColor', 'none', 'FaceLighting', 'none',...
0347        'FaceAlpha', param.area_alpha, 'Tag', 'area', 'UserData', id,...
0348        'HitTest', 'off', 'Clipping', 'on' );
0349   end
0350 
0351   % 文字表示 ?????
0352 
0353 end
0354 
0355 
0356 
0357 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0358 %%%% ハイライトの描画
0359 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0360 
0361 function job_view_cortex_plot_brain_act_highlight( act, param, selected )
0362 %
0363 % param.act_show_highlight  : 活動強度のハイライト(Plot List内の選択時強調)
0364 %     'on'  --- ハイライトあり, デフォルト
0365 %     'off' --- ハイライトなし
0366 %     ハイライトされたもの以外が透明に表示される
0367 % param.act_non_highlight_alpha  : ハイライトされたもの以外の活動強度の透明度
0368 %     0.01 〜 0.99 のスカラ値 ( デフォルトは 0.5 )
0369 %
0370 
0371 if isempty( selected ); return; end;
0372 if strcmp( param.act_show_highlight, 'off' ); return; end;
0373 
0374 for id = act.plotted
0375   if ismember( id, selected )
0376     set( findobj( gca, 'Tag', 'act', 'UserData', id ), 'FaceAlpha', 0.99 );
0377   else
0378     set( findobj( gca, 'Tag', 'act', 'UserData', id ),...
0379      'FaceAlpha', param.act_non_highlight_alpha );
0380   end
0381 end
0382 
0383 
0384 function job_view_cortex_plot_brain_area_highlight( V, F, area, mask,...
0385                             param, selected )
0386 %
0387 % param.area_show_highlight  : 領域のハイライト(Plot List内の選択時強調)
0388 %     'on'  --- ハイライトあり, デフォルト
0389 %     'off' --- ハイライトなし
0390 %
0391 
0392 delete( findobj( 'Tag', 'area_highlight' ) );
0393 
0394 if isempty( area.plotted ) | isempty( selected ); return; end;
0395 if strcmp( param.area_show_highlight, 'off' ); return; end;
0396 
0397 Vx = V(:,1); Vy = V(:,2); Vz = V(:,3);
0398 
0399 for id = selected
0400   % エッジの抽出
0401   Vi = intersect( area.source(id).Vi, mask );
0402   FF = vb_patch_select2( Vi, F, length(V) );
0403   FL = [ FF(:,1), FF(:,2); FF(:,2), FF(:,3); FF(:,3), FF(:,1) ];
0404   FL_inv = [ FL(:,2), FL(:,1) ];
0405   FL = setdiff( FL, FL_inv, 'rows' );
0406   [ FL_unq, I, J ] = unique( FL, 'rows' );
0407   edge = setdiff( FL_unq, FL( setdiff( [1:size(FL,1)], I ), : ), 'rows' );
0408   %エッジの描画
0409 %
0410 %   next = sparse( edge(:,1), edge(:,2), ones(length(edge),1), length(V), length(V), length(edge) );
0411 %   [X,Y] = gplot( next, V, '-' );
0412 %   line( X, Y, 'Color', [0.3,0.3,0.3], 'Tag', 'area_highlight', 'UserData', id );
0413 %
0414 %   Se = mat2cell( edge, ones(1,length(edge)), [2] );
0415 %   for i = 1 : length(Se)
0416 %     for j = i + 1 : length(Se)
0417 %       e1 = Se{i}; e2 = Se{j};
0418 %       if e1(1) == e2(1)
0419 %     Se{j} = [ e1(length(e1):2), e2 ];
0420 %     Se{i} = [];
0421 %     break;
0422 %       elseif e1(1) == e2(length(e2))
0423 %     Se{j} = [ e2, e1(2:length(e1)) ];
0424 %     Se{i} = [];
0425 %     break;
0426 %       elseif e1(length(e1)) == e2(1)
0427 %     Se{j} = [ e1(1:length(e1)-1), e2 ];
0428 %     Se{i} = [];
0429 %     break;
0430 %       elseif e1(length(e1)) == e2(length(e2))
0431 %     Se{j} = [ e1(1:length(e1)-1), e2 ];
0432 %     Se{i} = [];
0433 %     break;
0434 %       end
0435 %     end
0436 %   end
0437 %   for i = 1 : length(Se)
0438 %     if ~isempty(Se{i})
0439 %       e = Se{i};
0440 %       line( Vx(e), Vy(e), Vz(e), 'Color', [0.3,0.3,0.3],...
0441 %         'Tag', 'area_highlight', 'UserData', id );
0442 %     end
0443 %   end
0444 %
0445   line( Vx(edge'), Vy(edge'), Vz(edge'), 'Color', [0.3,0.3,0.3],...
0446     'Tag', 'area_highlight', 'UserData', id );
0447 end
0448 
0449 
0450 
0451 
0452 
0453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0454 %%%% 選択領域の描画
0455 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0456 
0457 function job_view_cortex_plot_brain_selected( V, F, Vi, mask, param )
0458 %
0459 % param.selection_color  : 領域選択時の色
0460 %     TrueColor ( デフォルトは [ 1 1 1 ] )
0461 % param.paint  : 活動強度, 領域, 選択領域の描画方法
0462 %     'patch' --- patch(面)で描画
0463 %     'dot'   --- plot(点)で描画
0464 % param.markersize  : 点描画時のマーカーの大きさ
0465 %     スカラ値 ( デフォルトは 1 )
0466 %
0467 
0468 delete( findobj( gca, 'Tag', 'selected' ) );
0469 
0470 if isempty( Vi )
0471   return;
0472 end
0473 
0474 ind = intersect( Vi, mask );
0475 
0476 % F に含まれない頂点のカットオフ
0477 Vi = intersect( ind, unique(F) );
0478 
0479 color = param.selection_color;
0480 
0481 % 描画
0482 if param.paint == 1
0483   plot3( V(Vi,1), V(Vi,2), V(Vi,3), '.',...
0484      'MarkerFaceColor', color, 'MarkerEdgeColor', color,...
0485      'MarkerSize', param.markersize, 'Tag', 'selected',...
0486      'HitTest', 'off', 'CLipping', 'on' );
0487 else
0488   FF = vb_patch_select2( ind, F, length(V) );
0489   patch( 'Faces', FF, 'Vertices', V,...
0490      'FaceColor', color, 'EdgeColor', 'none', 'FaceAlpha', 0.99,...
0491      'Tag', 'selected', 'HitTest', 'off', 'Clipping', 'on' );
0492 end
0493 
0494 
0495 
0496 
0497 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0498 % 雑ルーチン
0499 function Fnew = vb_patch_select2(Vix,F,Nvertex)
0500 Itrans = zeros(Nvertex,1);
0501 Itrans(Vix) = 1;
0502 Fnew = Itrans(F);
0503 ix = find(sum(Fnew,2));
0504 Fnew = F(ix,:);

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