0001 function err = job_view_cortex_selection( action, target1, target2 )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 H = get( gcf, 'UserData' );
0017 braindata = get( H.braindata, 'UserData' );
0018 actdata = get( H.actdata, 'UserData' );
0019 areadata = get( H.areadata, 'UserData' );
0020 selectdata = get( H.selectdata, 'UserData' );
0021 param = get( H.paramdata, 'UserData' );
0022
0023
0024 switch action
0025
0026 case 'undo'
0027
0028 if isempty( selectdata.history ); err = 1; return; end
0029 switch selectdata.history(1).flag
0030 case 'add'
0031 selectdata.Vi = setdiff( selectdata.Vi, selectdata.history(1).Vi );
0032 case 'delete'
0033 selectdata.Vi = union( selectdata.Vi, selectdata.history(1).Vi );
0034 end
0035 selectdata.history = selectdata.history( 2:length(selectdata.history) );
0036 set( H.selectdata, 'UserData', selectdata );
0037
0038
0039 case 'clear'
0040
0041 if isempty( selectdata.Vi ); err = 1; return; end
0042 newhistory.flag = 'delete';
0043 newhistory.Vi = selectdata.Vi;
0044 selectdata.Vi = [];
0045 if length( selectdata.history ) < param.selection_undo_length
0046 selectdata.history = [ newhistory, selectdata.history ];
0047 else
0048 selectdata.history = [ newhistory,...
0049 selectdata.history(1:length(selectdata.history)-1) ];
0050 end
0051 set( H.selectdata, 'UserData', selectdata );
0052
0053
0054 case 'register'
0055
0056 if isempty(areadata.masking)
0057 mask = [1:length(braindata.V)];
0058 else
0059 mask = unique( [ areadata.source(areadata.masking).Vi ] );
0060 end
0061 ind = intersect( selectdata.Vi, mask );
0062 if ~isempty( ind )
0063 areaname = inputdlg( 'Enter Area Name', 'Area Register', 1 );
0064 if isempty(areaname) | isempty(areaname{1})
0065 err = 1; return;
0066 end
0067 sourceindmax = length(areadata.source) + 1;
0068 areadata.source(sourceindmax).Vi = ind;
0069 areadata.source(sourceindmax).key = areaname{1};
0070 areadata.candidate = [ areadata.candidate, sourceindmax ];
0071 end
0072 set( H.areadata, 'UserData', areadata );
0073
0074
0075 otherwise
0076
0077
0078
0079 Vi_select = [];
0080
0081 switch target1
0082
0083 case 'act'
0084 switch param.act_relative_mode
0085 case 'each'
0086 Jabsmax = max( abs( [ actdata.source(actdata.plotted).J ] ) );
0087 case 'all'
0088 Jabsmax = max( abs( [ actdata.source(actdata.candidate).J ] ) );
0089 end
0090 for id = actdata.plotted
0091 J = actdata.source(id).J;
0092 switch param.act_normalize
0093 case 'meshsize'
0094 J = J ./ braindata.Va;
0095 end
0096 switch param.act_min_mode
0097 case 'absolute'
0098 ind = find( abs(J) >= param.act_min );
0099 case 'relative'
0100 ind = find( abs(J) >= Jabsmax * param.act_min );
0101 end
0102 switch target2
0103 case 'union'
0104 Vi_select = union( Vi_select, ind );
0105 case 'intersect'
0106 if id == actdata.plotted(1)
0107 Vi_select = ind;
0108 else
0109 Vi_select = intersect( Vi_select, ind );
0110 end
0111 end
0112 end
0113
0114
0115 case 'area'
0116
0117 switch target2
0118 case 'union'
0119 Vi_select = unique( [ areadata.source(areadata.plotted).Vi ] );
0120 case 'intersect'
0121 Vi_select =areadata.source(areadata.plotted(1)).Vi;
0122 for i = areadata.plotted(2:length(areadata.plotted))
0123 Vi_select = intersect( Vi_select, areadata.source(i).Vi );
0124 end
0125 end
0126
0127 case 'mouse'
0128 radius = param.selection_radius;
0129 [ Ps Vs ] = select3d;
0130 switch param.model_type
0131 case 'original'
0132 V = braindata.V;
0133 case 'inflate'
0134 V = braindata.Vinflate;
0135 end
0136 distance = sum( ( V - ones( length(V), 1 ) * Vs' ) .^ 2, 2 );
0137 Vi = find( distance == 0 );
0138 nextind = find( braindata.nextVd{Vi} <= radius * 10^(-3) );
0139 Vi_select = braindata.nextVi{Vi}(nextind);
0140
0141 case 'dilation'
0142 radius = param.dilation_erosion_radius;
0143 Vflag = zeros(1,length(braindata.V));
0144 Vflag(selectdata.Vi) = 1;
0145 for i = selectdata.Vi
0146 nextind = find( braindata.nextVd{i} <= radius * 10^(-3) );
0147 Vflag(braindata.nextVi{i}(nextind)) = 1;
0148 end
0149 Vi_select = find( Vflag == 1 );
0150
0151 case 'erosion'
0152 radius = param.dilation_erosion_radius;
0153 Vflag = ones(1,length(braindata.V));
0154 Vflag(selectdata.Vi) = 0;
0155 for i = find( Vflag )
0156 nextind = find( braindata.nextVd{i} <= radius * 10^(-3) );
0157 Vflag(braindata.nextVi{i}(nextind)) = 1;
0158 end
0159 Vi_select = intersect( find( Vflag == 1 ), selectdata.Vi );
0160
0161 end
0162
0163
0164
0165
0166 switch action
0167 case 'add'
0168 Vi_select = setdiff( Vi_select, selectdata.Vi );
0169 if isempty( Vi_select ); err = 1; return; end;
0170 selectdata.Vi = union( selectdata.Vi, Vi_select );
0171 newhistory.flag = 'add';
0172 case 'delete'
0173 Vi_select = intersect( Vi_select, selectdata.Vi );
0174 if isempty( Vi_select ); err = 1; return; end;
0175 selectdata.Vi = setdiff( selectdata.Vi, Vi_select );
0176 newhistory.flag = 'delete';
0177 end
0178
0179 newhistory.Vi = Vi_select;
0180 if length( selectdata.history ) < param.selection_undo_length
0181 selectdata.history = [ newhistory, selectdata.history ];
0182 else
0183 selectdata.history = [ newhistory,...
0184 selectdata.history(1:length(selectdata.history)-1) ];
0185 end
0186 set( H.selectdata, 'UserData', selectdata );
0187
0188
0189 end
0190
0191
0192 err = 0;