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