function makeThresholdTester(mfn) %get the user to experiment with a threshold setting before %applying it to the whole window %"{NAME}" indicates code that has been commented out or changed %based on the assumption that there is only one set of element %labels (ie element names). %Note: the "thresholdTester" was more accurately renamed as the %"Parameter Explorer" in my thesis and the user testing %instructions. global theVars; selectedVerb = getVerbID(mfn); if(isempty(selectedVerb)) %the user clicked cancel return; end; index=find(strcmp(theVars(mfn).allFullNames,selectedVerb{1})); %make the data structure to hold the variables assoc with this ttester myttIndex = getNextAvailableTTindex(mfn); theVars(mfn).thresholdTesters(myttIndex).verbIndex = index; theVars(mfn).thresholdTesters(myttIndex).currentThreshold = theVars(mfn).visThreshold; theVars(mfn).thresholdTesters(myttIndex).fromValue =1; theVars(mfn).thresholdTesters(myttIndex).toValue = -1; theVars(mfn).thresholdTesters(myttIndex).simTypeID = theVars(mfn).simMode; theVars(mfn).thresholdTesters(myttIndex).stopflag=0; %{NAME} %theVars(mfn).thresholdTesters(myttIndex).nameTypeID = theVars(mfn).fni; theVars(mfn).thresholdTesters(myttIndex).theaxishandle = 0; theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle = 0; theVars(mfn).thresholdTesters(myttIndex).clickQueryTextHandle = 0; theVars(mfn).thresholdTesters(myttIndex).rangeDisplayHandle = 0; theVars(mfn).thresholdTesters(myttIndex).patchhandles = []; theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn = []; theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff = []; theVars(mfn).thresholdTesters(myttIndex).buttonHandleList = []; theVars(mfn).thresholdTesters(myttIndex).tables = {}; theVars(mfn).thresholdTesters(myttIndex).animIndex=0; makeSimilarityRankings(mfn,myttIndex); %initializes 'tables' and 'animIndex' theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum = 0;%flag as unused theVars(mfn).thresholdTesters(myttIndex).statsWindow.histAxis=0; theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewConnectionsText = 0; theVars(mfn).thresholdTesters(myttIndex).statsWindow.fewConPromptHandle = 0; theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewBound = 3;%default theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyConnectionsText = 0; theVars(mfn).thresholdTesters(myttIndex).statsWindow.manyConPromptHandle = 0; theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyBound = 10;%default theVars(mfn).thresholdTesters(myttIndex).statsWindow.totalNumPatchesText = 0; theVars(mfn).thresholdTesters(myttIndex).numTopVals = 10; numTopVals = theVars(mfn).thresholdTesters(myttIndex).numTopVals; theVars(mfn).thresholdTesters(myttIndex).tophandles = zeros(numTopVals,1); stringValTop = cell(numTopVals,1); for(i=1:numTopVals) stringValTop(i)={''}; end; theVars(mfn).thresholdTesters(myttIndex).numRecVals = 10; numRecVals = theVars(mfn).thresholdTesters(myttIndex).numRecVals; theVars(mfn).thresholdTesters(myttIndex).rechandles = zeros(numRecVals,1); %recOrigIndexes holds the originalIndexes of the elements currently %listed in the recent matches list (to be used for name conversion) theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes = zeros(numRecVals,1); stringValRec = cell(numRecVals,1); %start empty for(i=1:numRecVals) stringValRec(i)={''}; end; thisFigNum=getNextFigNum; theVars(mfn).thresholdTesters(myttIndex).figNum = thisFigNum; %end of datastructure initialization and setting default values figure(thisFigNum); figtitle = sprintf('Parameter Explorer for Figure %d', mfn); set(thisFigNum,{'Toolbar','MenuBar','Units','Name','NumberTitle'},... {'none','none','pixels', figtitle, 'off'}); currfigdims = get(thisFigNum,'Position'); %get the defaults figdims = [660, 520]; currfigdims(1:2) = currfigdims(1:2)-100; currfigdims(3:4) = figdims; set(thisFigNum, 'Position', currfigdims); set(thisFigNum,'Units','normalized'); thebigaxishandle= axes('Visible','off','Units','pixels',... 'Position',[0 0 1 1]); set(thisFigNum,'Units','pixels'); GUIheight=60; %the stuff at the bottom textsize=12; sptextsize = textsize+3; axistitleheight=30; spacer=15; smallspace=3; desiredaxisheight=min(10+3*figdims(1)/4,... figdims(2)-(GUIheight+textsize+axistitleheight))-2;%-2 for padding changeVerbButtonDims=[90,25]; changeVerbButtonHandle = uicontrol('Style','pushbutton','String','change verb',... 'Position',[0,figdims(2)-(changeVerbButtonDims(2)),... changeVerbButtonDims],'Callback',... {@changeVerbButtonCallback, mfn,myttIndex}); popupDims = [175,25]; %insert names popup here if {NAME} changing is added text(desiredaxisheight+spacer,figdims(2),... 'Use similarity measure:','HorizontalAlignment',... 'left','VerticalAlignment','top','FontSize',textsize); popuphandle = uicontrol('Style', 'popup', 'String', ... 'absolute sim|relative sim (pearson)|rel sim 2|absolute simsim|relative simsim|rel2 simsim',... 'Position', [figdims(1)-popupDims(1),figdims(2)-(popupDims(2)+sptextsize+smallspace),... popupDims],'Callback', {@setSimTypeCB, mfn, myttIndex}); set(popuphandle,'Value',theVars(mfn).simMode); spacer=15; stringValTitleTop = {'\bfTop 10 Best Matches\rm'}; titleTop = text(10+desiredaxisheight+spacer,figdims(2)-... (popupDims(2)+sptextsize+2*smallspace), stringValTitleTop,... 'HorizontalAlignment','left','VerticalAlignment','top','FontSize',textsize); for(i=1:theVars(mfn).thresholdTesters(myttIndex).numTopVals) theVars(mfn).thresholdTesters(myttIndex).tophandles(i) =... text(10+desiredaxisheight+spacer,figdims(2)-(popupDims(2)+i*(sptextsize)+sptextsize+2*smallspace),... stringValTop{i},'HorizontalAlignment','left',... 'VerticalAlignment','top','FontSize',textsize,'FontName','FixedWidth'); end; fillTopText(mfn,myttIndex);%insert the actual verb names toendoftopvals = figdims(2)-(popupDims(2)+ ... (theVars(mfn).thresholdTesters(myttIndex).numTopVals+1)*... (sptextsize)+sptextsize+2*smallspace); stringValTitleRec = {'\bfTop 10 Most Recent\rm'}; titleRec = text(10+desiredaxisheight+spacer, toendoftopvals-(spacer),... stringValTitleRec,'HorizontalAlignment','left',... 'VerticalAlignment','top','FontSize',textsize); for(i=1:numRecVals) theVars(mfn).thresholdTesters(myttIndex).rechandles(i) = ... text(10+desiredaxisheight+spacer,toendoftopvals-(spacer+i*(sptextsize)),... stringValRec{i},'HorizontalAlignment','left',... 'VerticalAlignment','top','FontSize',textsize,'FontName','FixedWidth'); end; t2=text(10+desiredaxisheight+spacer,GUIheight,'Threshold range is','FontSize',... textsize,'Color', [0 0 0],... 'HorizontalAlignment','left','VerticalAlignment','bottom','Units','pixels'); rangeString = ['from ', num2str(theVars(mfn).thresholdTesters(myttIndex).fromValue),... ' to ', num2str(theVars(mfn).thresholdTesters(myttIndex).toValue)]; theVars(mfn).thresholdTesters(myttIndex).rangeDisplayHandle = ... text(10+desiredaxisheight+spacer,GUIheight-(textsize+1),... rangeString,'FontSize', textsize,'Color', [0 0 0],... 'HorizontalAlignment','left','VerticalAlignment','bottom','Units','pixels'); restartButtonDims=[50,25]; t3=text(10+desiredaxisheight+spacer,restartButtonDims(2)+5,... 'currently','FontSize', textsize,'Color', [0 0 0],... 'HorizontalAlignment','left','VerticalAlignment','baseline','Units','pixels'); textpos = get(t3 , 'Extent'); theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle = ... text(textpos(1)+textpos(3)+2,restartButtonDims(2)+5, ... sprintf('%1.5f',theVars(mfn).thresholdTesters(myttIndex).currentThreshold),... 'FontWeight','bold', 'FontSize',textsize+4,'Color', [1 0 0],... 'HorizontalAlignment','left','VerticalAlignment','baseline','Units','pixels'); restartButton = uicontrol('Style','pushbutton','String','restart','Position',... [10+desiredaxisheight+spacer,0,restartButtonDims]); resumeButton = uicontrol('Style','pushbutton','String','resume','Position',... [10+desiredaxisheight+spacer+restartButtonDims(1),0,restartButtonDims]); editRangeButtonDims = [70,25]; editRangeButtonHandle = uicontrol('Style','pushbutton','String','edit range',... 'Position', [figdims(1)-editRangeButtonDims(1),... 0, editRangeButtonDims],... 'Callback',{@editRangeButtonCallback,mfn, myttIndex}); setValueButtonDims = [70,25]; setValueButtonHandle = uicontrol('Style','pushbutton','String','set value',... 'Position', [figdims(1)-setValueButtonDims(1),... editRangeButtonDims(2), setValueButtonDims],... 'Callback',{@setValueButtonCallback,mfn, myttIndex}); closeWindowButtonDims=[140,25]; closeWindowButton = uicontrol('Style','pushbutton','String','close',... 'Position',[0,0,closeWindowButtonDims],'Callback',... {@closeButtonCallback,mfn,myttIndex}); useThisButtonDims = [140,25]; useThisButtonHandle = uicontrol('Style','pushbutton','String','use this threshold',... 'Position',[0,closeWindowButtonDims(2)+5,useThisButtonDims],... 'Callback',{@useThisButtonCallback,mfn,myttIndex}); getStatsButtonDims = [100,25]; getStatsButtonHandle = uicontrol('Style','pushbutton', 'String', 'get stats',... 'Position', [(figdims(1)/2)-getStatsButtonDims(1),0,... getStatsButtonDims], 'Callback',{@getStatsButtonCallback,mfn,myttIndex}); theVars(mfn).thresholdTesters(myttIndex).clickQueryTextHandle = ... text((figdims(1)/2)-getStatsButtonDims(1),getStatsButtonDims(2)+5,'',... 'FontSize', textsize, 'HorizontalAlignment','left',... 'VerticalAlignment','bottom','Units','pixels'); %do this after all the ui objects are created so we can pass their handles set(restartButton,'Callback',{@restartButtonCallback, mfn, myttIndex,... resumeButton,editRangeButtonHandle, changeVerbButtonHandle,popuphandle,... useThisButtonHandle,closeWindowButton,getStatsButtonHandle,setValueButtonHandle}); set(resumeButton,'Callback',{@resumeButtonCallback, mfn, myttIndex}); theVars(mfn).thresholdTesters(myttIndex).buttonHandleList = [restartButton; ... resumeButton; editRangeButtonHandle; changeVerbButtonHandle;popuphandle;... useThisButtonHandle;closeWindowButton;getStatsButtonHandle;setValueButtonHandle]; %theaxishandle is global so animators can see it theVars(mfn).thresholdTesters(myttIndex).theaxishandle=... axes('Units','pixels','Position',[10,... GUIheight+textsize+2,desiredaxisheight,desiredaxisheight]); %fill in the patches & set their visibility based on the currentThreshold fillaxis(mfn, myttIndex, index, selectedVerb); adjustVisForCurrThreshold(mfn, myttIndex); set(theVars(mfn).thresholdTesters(myttIndex).patchhandles,'ButtonDownFcn',... {@patchClickCallback, mfn, myttIndex}); function makeSimilarityRankings(mfn,myttIndex) global theVars %construct tables of affinities using all similarity measures %relative to the focus (proteinIndex) %NOTE: these tables include similarities to ALL inputs, not just the subset %appearing in this thresholdTester's main window index = theVars(mfn).thresholdTesters(myttIndex).verbIndex; tables={}; tables{1}=zeros(theVars(mfn).origNuminputs,2); %abs tables{2}=zeros(theVars(mfn).origNuminputs,2); %rel (pearson) tables{3}=zeros(theVars(mfn).origNuminputs,2); %rel2 tables{4}=zeros(theVars(mfn).origNuminputs,2); %abssimsim tables{5}=zeros(theVars(mfn).origNuminputs,2); %relsimsim tables{6}=zeros(theVars(mfn).origNuminputs,2); %rel2simsim %column 1 is the ID (index) assoc with this affinity val for(i=1:6) %HARD CODED tables{i}(:,1) = [1:theVars(mfn).origNuminputs]'; end; %column 2 is the affinity val tables{1}(:,2)=theVars(mfn).theFullAbsSimilarityMatrix(index,:)'; tables{2}(:,2)=theVars(mfn).theFullRelSimilarityMatrix(index,:)'; tables{3}(:,2)=theVars(mfn).theFullRel2SimilarityMatrix(index,:)'; tables{4}(:,2)=theVars(mfn).theFullAbsSimSimMatrix(index,:)'; tables{5}(:,2)=theVars(mfn).theFullRelSimSimMatrix(index,:)'; tables{6}(:,2)=theVars(mfn).theFullRel2SimSimMatrix(index,:)'; %NOTE: sorts to ASCENDING order for(i=1:6) %HARD CODED tables{i} = sortrows(tables{i},2); end; theVars(mfn).thresholdTesters(myttIndex).tables = tables; simTypeID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; theVars(mfn).thresholdTesters(myttIndex).animIndex =... min(find(tables{simTypeID}(:,2)> ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold)); if(isempty(theVars(mfn).thresholdTesters(myttIndex).animIndex)) %set to one past the end theVars(mfn).thresholdTesters(myttIndex).animIndex = theVars(mfn).origNuminputs+1; end; function setSimTypeCB(obj, eventinfo, mfn, myttIndex) global theVars; %do stuff based on the obj's 'Value' (1 thru 6) oldID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; newID = get(obj,'Value'); if(oldID ~= newID) theVars(mfn).thresholdTesters(myttIndex).stopflag=1; theVars(mfn).thresholdTesters(myttIndex).simTypeID = get(obj,'Value'); adjustVisForCurrThreshold(mfn,myttIndex); fillTopText(mfn,myttIndex); clearRecText(mfn, myttIndex); end; %function setNameTypeCB(obj, eventInfo, mfn, myttIndex) %function renameText(mfn, myttIndex,oldNameType) %fill in these functions if {NAME} changing is added function fillTopText(mfn, myttIndex) global theVars; toptexthandles = theVars(mfn).thresholdTesters(myttIndex).tophandles; simTypeID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; tables = theVars(mfn).thresholdTesters(myttIndex).tables; numTopVals = theVars(mfn).thresholdTesters(myttIndex).numTopVals; %set the top text values desiredverbIDs = tables{simTypeID}(end-numTopVals+1:end,1); %change next line if {NAME} changing is added namesaschars = char(theVars(mfn).allFullNames{desiredverbIDs}); for(i=1:numTopVals) verbNum = desiredverbIDs(end-i+1); verbRowNum = ceil(verbNum/theVars(mfn).origNumcols); if(verbNum <= theVars(mfn).origNumcols) verbColNum = verbNum; else %verbRowNum > 1 verbColNum = verbNum-(verbRowNum-1)*theVars(mfn).origNumcols; end; c=theVars(mfn).patchColors(verbRowNum,verbColNum,:); %darken the text to account for the effect of the grey bg c = c*0.9; %NEW!(Mar 9) thestring = sprintf('%2d. %s (%1.5f)', i, namesaschars(end-i+1,:),... tables{simTypeID}(end-i+1,2)); set(toptexthandles(i), {'String','Color'},{thestring,c}); end; function clearRecText(mfn, myttIndex) global theVars; rectexthandles = theVars(mfn).thresholdTesters(myttIndex).rechandles; for(i=1:length(rectexthandles)) set(rectexthandles(i), {'String','Color'},{'','k'}); end; theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes = ... zeros(size(theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes)); function restartButtonCallback(obj, eventdata, mfn, myttIndex, theresumebutton, ... editrangebutton,changeVerbButtonHandle,popuphandle,... useThisButtonHandle,closeWindowButton,getStatsButtonHandle,setValueButtonHandle) global theVars; set(obj,'Enable','off'); %user can't click restart twice in a row set(editrangebutton,'Enable','off'); set([changeVerbButtonHandle,popuphandle,setValueButtonHandle... useThisButtonHandle,closeWindowButton,getStatsButtonHandle],'Enable','off'); simTypeID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; tables = theVars(mfn).thresholdTesters(myttIndex).tables; %reset theVars(mfn).thresholdTesters(myttIndex).currentThreshold = ... theVars(mfn).thresholdTesters(myttIndex).fromValue; set(theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle,'String',... sprintf('%1.5f',theVars(mfn).thresholdTesters(myttIndex).currentThreshold)); adjustVisForCurrThreshold(mfn,myttIndex); %show top matches fillTopText(mfn,myttIndex); %clear most recent matches clearRecText(mfn, myttIndex); theVars(mfn).thresholdTesters(myttIndex).stopflag=0; if(strcmp(get(theresumebutton,'String'),'resume')) set(theresumebutton,'String','pause'); end; if(theVars(mfn).thresholdTesters(myttIndex).fromValue < ... theVars(mfn).thresholdTesters(myttIndex).toValue) animateForwards(mfn, myttIndex); else animateBackwards(mfn, myttIndex); end; function resumeButtonCBHelper(weWantToPause, mfn, myttIndex) %weWantToPause is a boolean global theVars; therestartbutton = theVars(mfn).thresholdTesters(myttIndex).buttonHandleList(1); theresumebutton = ... theVars(mfn).thresholdTesters(myttIndex).buttonHandleList(2); buttonsToToggle = theVars(mfn).thresholdTesters(myttIndex).buttonHandleList(3:end); if(weWantToPause) theVars(mfn).thresholdTesters(myttIndex).stopflag=1; set(theresumebutton,'String','resume'); set(therestartbutton,'Enable','on'); set(buttonsToToggle, 'Enable','on'); else set(therestartbutton,'Enable','off'); set(buttonsToToggle, 'Enable','off'); set(theresumebutton,'String','pause'); theVars(mfn).thresholdTesters(myttIndex).stopflag=0; if(theVars(mfn).thresholdTesters(myttIndex).fromValue < ... theVars(mfn).thresholdTesters(myttIndex).toValue) animateForwards(mfn, myttIndex); else animateBackwards(mfn, myttIndex); end; end; function resumeButtonCallback(obj,eventdata, mfn, myttIndex) global theVars; if(strcmp(get(obj,'String'),'pause')) %user clicked pause resumeButtonCBHelper(1,mfn,myttIndex); else resumeButtonCBHelper(0,mfn,myttIndex); end; function changeVerbButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; oldVerbIndex = theVars(mfn).thresholdTesters(myttIndex).verbIndex; selectedVerb = getVerbID(mfn); if(~isempty(selectedVerb)) index=find(strcmp(theVars(mfn).allFullNames,selectedVerb{1})); if(oldVerbIndex ~= index) theVars(mfn).thresholdTesters(myttIndex).verbIndex = index; makeSimilarityRankings(mfn,myttIndex); %sets tables set(get(theVars(mfn).thresholdTesters(myttIndex).theaxishandle,'Title'),... {'String','FontSize'}, {selectedVerb,14}); adjustVisForCurrThreshold(mfn, myttIndex); fillTopText(mfn, myttIndex); clearRecText(mfn, myttIndex); end; end; function getStatsButtonCallback(obj, eventdata, mfn, myttIndex) showStats(mfn,myttIndex); %so we can call this independant of %clicking on the stats button function showStats(mfn, myttIndex); global theVars; textsize=12; %calculate what we want to display switch(theVars(mfn).thresholdTesters(myttIndex).simTypeID) case 1 fullAffinityVals = theVars(mfn).theFullAbsSimilarityMatrix(theVars(mfn).inboundsIndexes,:); case 2 fullAffinityVals = theVars(mfn).theFullRelSimilarityMatrix(theVars(mfn).inboundsIndexes,:); case 3 fullAffinityVals = theVars(mfn).theFullRel2SimilarityMatrix(theVars(mfn).inboundsIndexes,:); case 4 fullAffinityVals = theVars(mfn).theFullAbsSimSimMatrix(theVars(mfn).inboundsIndexes,:); case 5 fullAffinityVals = theVars(mfn).theFullRelSimSimMatrix(theVars(mfn).inboundsIndexes,:); case 6 fullAffinityVals = theVars(mfn).theFullRel2SimSimMatrix(theVars(mfn).inboundsIndexes,:); end; fullAffinities = fullAffinityVals > ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; histData = sum(fullAffinities,2); %connectivity counts numberFewCon = length(find(histData <= ... theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewBound)); percentFewCon = numberFewCon *100 / theVars(mfn).lastValidDataIndex; fewConString = [num2str(numberFewCon), ' ( ', num2str(percentFewCon),'% )']; numberManyCon = length(find(histData > ... theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyBound)); percentManyCon = numberManyCon *100 / theVars(mfn).lastValidDataIndex; manyConString = [num2str(numberManyCon), ' ( ', num2str(percentManyCon),'% )']; numberPatches = sum(histData); fewConPrompt = sprintf('Number of verbs with %2g connections or less:',... theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewBound); manyConPrompt = sprintf('Number of verbs with more than %2g connections:',... theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyBound); if(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum == 0) ttFigPos = get(theVars(mfn).thresholdTesters(myttIndex).figNum,'Position'); pixelsSS=get(0,'screensize'); screenwidth = pixelsSS(3); screenheight = pixelsSS(4); hOffsetDefault = 20; vOffsetDefault = 35; ttRightmostCorner = ttFigPos(1)+ttFigPos(3); hOffset = min(hOffsetDefault,screenwidth-ttRightmostCorner); vOffset = min(vOffsetDefault, ttFigPos(2)); newPos = ttFigPos + [hOffset,-vOffset,0,0]; %we need to layout the window statsFigNum=getNextFigNum; theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum = statsFigNum; figure(statsFigNum); figtitle = sprintf('Connectivity Statistics for Figure %d',mfn); set(statsFigNum,{'Toolbar','MenuBar','Position','Name','NumberTitle'},... {'none','none',newPos, figtitle,'off'}); thebigaxishandle= axes('Visible','off','Units','pixels',... 'Position',[0,0,1,1]); set(statsFigNum,'Units','Pixels'); currfigdims=get(statsFigNum,'Position');%get the defaults figdims = [560,420]; currfigdims(3:4) = figdims; set(statsFigNum, 'Position', currfigdims); theVars(mfn).thresholdTesters(myttIndex).statsWindow.histAxis = ... axes('Units','pixels','Position',[25,figdims(2)/3,figdims(1)-50,(figdims(2)*2/3)-20]); hist(histData,max(histData)); mytitle = sprintf('Connectivity of data in figure %d using threshold %1.5f', mfn, theVars(mfn).thresholdTesters(myttIndex).currentThreshold); title(mytitle); xlabel('number of connections'); ylabel('number of verbs'); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum,'CurrentAxes',thebigaxishandle); closeWindowButtonDims=[140,25]; closeWindowButton = uicontrol('Style','pushbutton','String','close',... 'Position',[0,0,closeWindowButtonDims],'Callback',... {@statsCloseButtonCallback,mfn,myttIndex}); customizeButtonDims=[140,25]; customizeButton = uicontrol('Style', 'pushbutton', 'String', 'customize...',... 'Position',[figdims(1)-customizeButtonDims(1),... 0,customizeButtonDims],'Callback', {@customizeStatsButtonCallback,... mfn, myttIndex}); tt2 = text(10, closeWindowButtonDims(2)+5,... 'Total number of squares to display in the whole data set:',... 'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels'); tt2Extent=get(tt2,'Extent'); theVars(mfn).thresholdTesters(myttIndex).statsWindow.totalNumPatchesText = ... text(tt2Extent(1)+tt2Extent(3)+5, closeWindowButtonDims(2)+5, num2str(numberPatches),... 'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels'); theVars(mfn).thresholdTesters(myttIndex).statsWindow.manyConPromptHandle = ... text(10, closeWindowButtonDims(2)+textsize+2*5,... manyConPrompt, 'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels'); manyConPromptExtent=get(theVars(mfn).thresholdTesters(myttIndex).statsWindow.manyConPromptHandle,'Extent'); theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyConnectionsText = ... text(manyConPromptExtent(1)+manyConPromptExtent(3)+5, closeWindowButtonDims(2)+textsize+2*5,... manyConString, 'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels','FontWeight','bold'); theVars(mfn).thresholdTesters(myttIndex).statsWindow.fewConPromptHandle = ... text(10,closeWindowButtonDims(2)+2*textsize+3*5 ,... fewConPrompt,'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels'); fewConPromptExtent=get(theVars(mfn).thresholdTesters(myttIndex).statsWindow.fewConPromptHandle,'Extent'); theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewConnectionsText = ... text(fewConPromptExtent(1)+fewConPromptExtent(3)+5, closeWindowButtonDims(2)+2*textsize+3*5, ... fewConString, 'FontSize',textsize,'HorizontalAlignment','left',... 'VerticalAlignment','baseline','Units','pixels','FontWeight','bold'); else %the desired figure already exists, update its display figure(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum,'CurrentAxes',... theVars(mfn).thresholdTesters(myttIndex).statsWindow.histAxis); hist(histData,max(histData)); mytitle = sprintf('Connectivity of data in figure %d using threshold %f', ... mfn,theVars(mfn).thresholdTesters(myttIndex).currentThreshold); title(mytitle); xlabel('number of connections'); ylabel('number of verbs'); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.fewConPromptHandle,... 'String', fewConPrompt); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewConnectionsText,... 'String', fewConString); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.manyConPromptHandle,... 'String', manyConPrompt); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyConnectionsText,... 'String', manyConString); set(theVars(mfn).thresholdTesters(myttIndex).statsWindow.totalNumPatchesText,... 'String',num2str(numberPatches)); end; function statsCloseButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; if(myFigureCloseRequest) %0 --> flag stats window as non-existant theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum = 0; end; function useThisButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; %check if any of the simMode, threshold or {NAME}naming choices have %changed, and make appropriate updates to info window and main %figure (do nothing if nothing has changed) %close this TT window (and DON'T ask the user if they're sure) thisWindow = theVars(mfn).thresholdTesters(myttIndex).figNum; theVars(mfn).thresholdTesters(myttIndex).figNum = 0; %flag as unused subs = []; %other windows to close if this does if(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum > 0) % prepare to close the corresponding stats window subs = theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum; end; closeTTnoOption(thisWindow,subs); theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum = 0; %clear memory theVars(mfn).thresholdTesters(myttIndex).patchhandles = []; theVars(mfn).thresholdTesters(myttIndex).tables = {}; theVars(mfn).thresholdTesters(myttIndex).buttonHandleList = []; theVars(mfn).thresholdTesters(myttIndex).tophandles = []; theVars(mfn).thresholdTesters(myttIndex).rechandles = []; theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes = []; %pack; msg = sprintf('Currently redrawing figure %d. Please be patient...',mfn); writeUserMessage(mfn,{msg}); %now update the main figure newThreshold = ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; newSimMode = theVars(mfn).thresholdTesters(myttIndex).simTypeID; oldSimMode = theVars(mfn).simMode; if(theVars(mfn).visThreshold ~= newThreshold | ... oldSimMode ~= newSimMode) theVars(mfn).simMode = newSimMode; %set the new sim measure theVars(mfn).visThreshold = newThreshold; %set the new threshold updateSimInfo(mfn); set(0,'CurrentFigure',mfn); %set the focus figure, but DON'T BRING TO FRONT makeNewPatches(mfn); figure(mfn); %bring to foreground %next test is special for verbs data if(oldSimMode <=3 & newSimMode >3) theVars(mfn).fni=2; updateFeatureListHandles(mfn); %numFeatures has changed elseif(oldSimMode > 3 & newSimMode <=3) theVars(mfn).fni=1; updateFeatureListHandles(mfn); %numFeatures has changed end; %erase the 'please wait' message writeUserMessage(mfn,{''}); %else, nothing has changed, so do nothing end; %test is need to change {NAMES} function animateForwards(mfn, myttIndex) %threshold will INCREASE from currentThreshold to toValue %so we'll be turning patches OFF global theVars; patchesToHide=[]; tables = theVars(mfn).thresholdTesters(myttIndex).tables; patchhandles = theVars(mfn).thresholdTesters(myttIndex).patchhandles; simTypeID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; i=theVars(mfn).thresholdTesters(myttIndex).animIndex; tdh = theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle; stop = theVars(mfn).thresholdTesters(myttIndex).stopflag; %exit this loop when we exceed the desired maxthreshold while(~stop & i<=size(tables{simTypeID},1)) nextThreshold = min(tables{simTypeID}(i,2),... theVars(mfn).thresholdTesters(myttIndex).toValue); if(nextThreshold > theVars(mfn).thresholdTesters(myttIndex).toValue) break; %<-- EXIT the loop end; previouslyOff = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff; if(length(previouslyOff)>0) prevOffColors = get(previouslyOff,'EdgeColor'); set(previouslyOff,'Visible','off'); if(length(previouslyOff)==1) set(previouslyOff,'FaceColor',prevOffColors); else set(previouslyOff,{'FaceColor'},prevOffColors); end; end; patchesToHide = find(tables{simTypeID}(:,2)<= nextThreshold &... tables{simTypeID}(:,2)>... theVars(mfn).thresholdTesters(myttIndex).currentThreshold); if(length(patchesToHide) > 0) currColors=get(patchhandles(tables{simTypeID}(patchesToHide,1)),'FaceColor'); set(patchhandles(tables{simTypeID}(patchesToHide,1)),'FaceColor','none'); theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff = ... patchhandles(tables{simTypeID}(patchesToHide,1)); set(tdh,'String',sprintf('%1.5f',nextThreshold)); i=max(patchesToHide); theVars(mfn).thresholdTesters(myttIndex).animIndex=i; theVars(mfn).thresholdTesters(myttIndex).currentThreshold=nextThreshold; %update 'recently added' list updateRec(tables{simTypeID}(patchesToHide,1), tables{simTypeID}(patchesToHide,2), ... currColors, mfn, myttIndex); pause(0.5); else i=i+1; theVars(mfn).thresholdTesters(myttIndex).animIndex=i; theVars(mfn).thresholdTesters(myttIndex).currentThreshold= ... nextThreshold; set(tdh,'String',sprintf('%1.5f',nextThreshold)); end; stop = theVars(mfn).thresholdTesters(myttIndex).stopflag; end; %finish up if we didn't abort due to a stop call if(~stop) previouslyOff = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff; if(length(previouslyOff)>0) prevOffColors = get(previouslyOff,'EdgeColor'); set(previouslyOff,'Visible','off'); if(length(previouslyOff)==1) set(previouslyOff,'FaceColor',prevOffColors); else set(previouslyOff,{'FaceColor'},prevOffColors); end; end; resumeButtonCBHelper(1,mfn,myttIndex); %toggle pause button end; function updateRec(verbnumList, verbscoresList, colorsList, mfn, myttIndex) global theVars; numnew = length(verbnumList); rechandles = theVars(mfn).thresholdTesters(myttIndex).rechandles; if(numnew==1) colorsList = num2cell(colorsList,2); end; %darken the text to account for the effect of the grey bg colorsList = num2cell(mycell2mat(colorsList)*0.9,2); lastIndextoShow = min(theVars(mfn).thresholdTesters(myttIndex).numRecVals,numnew); %use FullNames, not feature names for newnames newnames = cellstr([char(theVars(mfn).allFullNames{verbnumList(1:lastIndextoShow)}), ... repmat(' (',lastIndextoShow,1),num2str(verbscoresList(1:lastIndextoShow)), ... repmat(')',lastIndextoShow,1)]); strs = get(rechandles, 'String'); allstrs = cat(1,newnames,strs(1:end-lastIndextoShow)); set(rechandles,{'String'},allstrs); strcolors = get(rechandles,'Color'); allcolors = cat(1,colorsList(1:lastIndextoShow),strcolors(1:end-lastIndextoShow)); set(rechandles,{'Color'}, allcolors); %finally, keep a ref to the originalIndexes oldrecorigI = theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes; theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes=... [verbnumList(1:lastIndextoShow);oldrecorigI(1:end-lastIndextoShow)]; function animateBackwards(mfn, myttIndex) %threshold will DECREASE from currentThreshold to toValue %so we'll be turning patches on global theVars; patchesToShow=[]; tables = theVars(mfn).thresholdTesters(myttIndex).tables; patchhandles = theVars(mfn).thresholdTesters(myttIndex).patchhandles; simTypeID = theVars(mfn).thresholdTesters(myttIndex).simTypeID; i=theVars(mfn).thresholdTesters(myttIndex).animIndex; tdh = theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle; stop = theVars(mfn).thresholdTesters(myttIndex).stopflag; %exit this loop when we exceed the desired minthreshold while(~stop & i>0) if(i>1) nextThreshold = max(theVars(mfn).thresholdTesters(myttIndex).toValue,... tables{simTypeID}(i-1,2)); else %this is the last one to show nextThreshold = theVars(mfn).thresholdTesters(myttIndex).toValue; end; if(theVars(mfn).thresholdTesters(myttIndex).currentThreshold <= ... theVars(mfn).thresholdTesters(myttIndex).toValue) break; %<--EXIT the loop end; previouslyOn = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn; if(length(previouslyOn)>0) prevOnColors = get(previouslyOn,'FaceColor'); if(length(previouslyOn)==1) set(previouslyOn,'EdgeColor',prevOnColors); else set(previouslyOn,{'EdgeColor'},prevOnColors); end; end; %we need these complicated 'find' conditions because when we %first start, the current threshold value may not be based on the %affinities of this verb patchesToShow = find(tables{simTypeID}(:,2)>nextThreshold &... tables{simTypeID}(:,2)<=... theVars(mfn).thresholdTesters(myttIndex).currentThreshold); if(length(patchesToShow)>0) %BLACK highlights are now used currColors = get(patchhandles(tables{simTypeID}(patchesToShow,1)),'FaceColor'); set(patchhandles(tables{simTypeID}(patchesToShow,1)),'EdgeColor','k'); set(patchhandles(tables{simTypeID}(patchesToShow,1)),'Visible','on'); theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn = ... patchhandles(tables{simTypeID}(patchesToShow,1)); set(tdh,'String',sprintf('%1.5f',nextThreshold)); i=min(patchesToShow)-1; theVars(mfn).thresholdTesters(myttIndex).animIndex=i; theVars(mfn).thresholdTesters(myttIndex).currentThreshold=nextThreshold; %update 'recently removed' list updateRec(tables{simTypeID}(patchesToShow,1), tables{simTypeID}(patchesToShow,2),... currColors, mfn, myttIndex); pause(0.5); else i=i-1; theVars(mfn).thresholdTesters(myttIndex).animIndex=i; theVars(mfn).thresholdTesters(myttIndex).currentThreshold= ... nextThreshold; set(tdh,'String',sprintf('%1.5f',nextThreshold)); %need this here? end; stop = theVars(mfn).thresholdTesters(myttIndex).stopflag; end; %finish up if we didn't abort due to a stop call if(~stop) previouslyOn = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn; if(length(previouslyOn)>0) prevOnColors = get(previouslyOn,'FaceColor'); if(length(previouslyOn)==1) set(previouslyOn,'EdgeColor',prevOnColors); else set(previouslyOn,{'EdgeColor'},prevOnColors); end; end; resumeButtonCBHelper(1,mfn,myttIndex); %toggle pause button end; function closeButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; thisWindow = theVars(mfn).thresholdTesters(myttIndex).figNum; subs = []; %other windows to close if this does if(theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum > 0) % prepare to close the corresponding stats window subs = theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum; end; %close the threshold tester window & subs (if any) if(myFigureCloseRequest(thisWindow,subs)) %if we get in here the user didn't cancel theVars(mfn).thresholdTesters(myttIndex).statsWindow.figNum =0; theVars(mfn).thresholdTesters(myttIndex).figNum = 0; theVars(mfn).thresholdTesters(myttIndex).patchhandles = []; theVars(mfn).thresholdTesters(myttIndex).tables = {}; theVars(mfn).thresholdTesters(myttIndex).buttonHandleList = []; theVars(mfn).thresholdTesters(myttIndex).tophandles = []; theVars(mfn).thresholdTesters(myttIndex).rechandles = []; theVars(mfn).thresholdTesters(myttIndex).recOrigIndexes = []; end; function selectedVerb = getVerbID(mfn) global theVars; myprompt = 'Which verb''s connections do you want to monitor?'; mytitle = 'Threshold Test Selection'; lines= 1; def = theVars(mfn).names(1); %default to the first element selectedVerb = inputdlg(myprompt,mytitle,lines,def); done = 0; while (~done & ~isempty(selectedVerb)) %selectedVerb is empty when the user clicked 'cancel' if(ismember(selectedVerb,theVars(mfn).names)) done=1; else errorprompt = sprintf('%s is not in figure %d.\n%s',selectedVerb{1},mfn,myprompt); selectedVerb = inputdlg(errorprompt,mytitle,lines,def); end; end; function customizeStatsButtonCallback(obj, eventData, mfn, myttIndex) global theVars; promptMain = 'Show me total number of verbs with connectivity...'; promptSub = '<= this value:'; prompt1 = sprintf('%s\n%s', promptMain, promptSub); prompt2 = '> this value:'; mytitle = 'Change what summary statistics are displayed'; lines=1; def = {num2str(theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewBound),... num2str(theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyBound)}; theAnswer = inputdlg({prompt1,prompt2}, mytitle, lines, def); theVars(mfn).thresholdTesters(myttIndex).statsWindow.numFewBound = str2num(theAnswer{1}); theVars(mfn).thresholdTesters(myttIndex).statsWindow.numManyBound = str2num(theAnswer{2}); %now redisplay based on these new settings showStats(mfn, myttIndex); function setAnimBounds(mfn, myttIndex) global theVars; basicprompt = 'Select threshold animation bounds in [-1,1].'; myFromprompt = 'FROM:'; prompt1 = sprintf('%s\n%s',basicprompt,myFromprompt); myToprompt = 'TO:'; mytitle = 'Change the Upper and Lower Thresholds'; lines=1; def = {num2str(theVars(mfn).thresholdTesters(myttIndex).fromValue),... num2str(theVars(mfn).thresholdTesters(myttIndex).toValue)}; theAnswer = inputdlg({prompt1, myToprompt}, mytitle, lines, def); if(isempty(theAnswer)) %user clicked 'cancel' return; %leave everything as it was end; done=0; while(~done) def = theAnswer; %to do: implement this check so str2num is always valid theAnswerNums(1) = str2num(theAnswer{1}); theAnswerNums(2) = str2num(theAnswer{2}); maxval = max(theAnswerNums); minval = min(theAnswerNums); errorprompt = ''; done = 1; if(maxval == minval) errorprompt = sprintf('TO and FROM values cannot be the same.\n%s',errorprompt); done=0; end; if(maxval > 1) errorprompt = sprintf('Selected values cannot be more than 1.\n%s',errorprompt); def{find(theAnswerNums > 1)}='1'; done=0; end; if(minval < -1) errorprompt = sprintf('Selected values cannot be less than -1.\n%s',errorprompt); def{find(theAnswerNums < -1)} = '-1'; done=0; end; if(length(errorprompt > 0)) prompt1 = sprintf('%s\n%s', errorprompt, myFromprompt); theAnswer = inputdlg({prompt1, myToprompt}, mytitle, lines, def); end; end; theVars(mfn).thresholdTesters(myttIndex).fromValue = theAnswerNums(1); theVars(mfn).thresholdTesters(myttIndex).toValue = theAnswerNums(2); function editRangeButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; currentThreshold = theVars(mfn).thresholdTesters(myttIndex).currentThreshold; oldFrom = theVars(mfn).thresholdTesters(myttIndex).fromValue; oldTo = theVars(mfn).thresholdTesters(myttIndex).toValue; setAnimBounds(mfn, myttIndex); %sets fromValue and toValue in theVars newFrom = theVars(mfn).thresholdTesters(myttIndex).fromValue; newTo = theVars(mfn).thresholdTesters(myttIndex).toValue; if(oldFrom ~= newFrom | oldTo ~= newTo) smaller = min(newFrom, newTo); bigger = max(newFrom, newTo); if(currentThreshold < smaller) theVars(mfn).thresholdTesters(myttIndex).currentThreshold = smaller; set(theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle,'String',... sprintf('%1.5f',smaller)); adjustVisForCurrThreshold(mfn, myttIndex); clearRecText(mfn, myttIndex); elseif(currentThreshold > bigger) theVars(mfn).thresholdTesters(myttIndex).currentThreshold = bigger; set(theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle,'String',... sprintf('%1.5f',bigger)); adjustVisForCurrThreshold(mfn, myttIndex); clearRecText(mfn, myttIndex); end; rangeString = ['from ', num2str(newFrom),' to ', num2str(newTo)]; set(theVars(mfn).thresholdTesters(myttIndex).rangeDisplayHandle,... 'String',rangeString); end; adjustVisForCurrThreshold(mfn,myttIndex); %sort-out any cells just %turned on/off function fillaxis(mfn, myttIndex, verbindex, selectedVerb) global theVars; %all the patches are drawn, so just make an array of %origNuminputs-many 1's and the appropriate number of trailing 0's adjacentPatchesToDraw = zeros(1,theVars(mfn).origNumrows*theVars(mfn).origNumcols); n=theVars(mfn).origNuminputs; adjacentPatchesToDraw(1:n) = 1; [bghandle,patchhandles]=hintonColorOneBoxSize(reshape(adjacentPatchesToDraw,... theVars(mfn).origNumcols, theVars(mfn).origNumrows)', ... [0 0 0], 10, mfn); %always use a black border with big patches title(selectedVerb,'FontSize',14); theVars(mfn).thresholdTesters(myttIndex).patchhandles = patchhandles; function adjustVisForCurrThreshold(mfn,myttIndex) %ALSO SETS ANIM INDEX, and fixes any patchesjust turned on/off global theVars previouslyOff = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff; if(length(previouslyOff)>0) prevOffColors = get(previouslyOff,'EdgeColor'); if(iscell(prevOffColors)) set(previouslyOff,{'FaceColor'},prevOffColors); else set(previouslyOff,'FaceColor',prevOffColors); end; end; theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOff=[]; previouslyOn = theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn; if(length(previouslyOn)>0) prevOnColors = get(previouslyOn,'FaceColor'); if(length(previouslyOn)==1) set(previouslyOn,'EdgeColor',prevOnColors); else set(previouslyOn,{'EdgeColor'},prevOnColors); end; %assumes we set the edge to another color to indicate it's newly-on-ness end; theVars(mfn).thresholdTesters(myttIndex).patchHjustTurnedOn=[]; aff = theVars(mfn).thresholdTesters(myttIndex).tables{... theVars(mfn).thresholdTesters(myttIndex).simTypeID}; rowsToTurnOff = find(aff(:,2) <= theVars(mfn).thresholdTesters(myttIndex).currentThreshold); indexesToTurnOff = aff(rowsToTurnOff,1); indexesToTurnOn = setdiff([1:theVars(mfn).origNuminputs], indexesToTurnOff); handlesToTurnOff = theVars(mfn).thresholdTesters(myttIndex).patchhandles(indexesToTurnOff); handlesToTurnOn = theVars(mfn).thresholdTesters(myttIndex).patchhandles(indexesToTurnOn); set(handlesToTurnOff,'Visible','off'); set(handlesToTurnOn,'Visible','on'); %re-establish the anim index theVars(mfn).thresholdTesters(myttIndex).animIndex = ... min(find(theVars(mfn).thresholdTesters(myttIndex).tables{... theVars(mfn).thresholdTesters(myttIndex).simTypeID}(:,2)>... theVars(mfn).thresholdTesters(myttIndex).currentThreshold)); if(isempty(theVars(mfn).thresholdTesters(myttIndex).animIndex)) %set to one past the end theVars(mfn).thresholdTesters(myttIndex).animIndex = theVars(mfn).origNuminputs+1; end; function patchClickCallback(obj, eventdata, mfn, myttIndex) global theVars; patchIndex = find(theVars(mfn).thresholdTesters(myttIndex).patchhandles == obj); patchcolor = get(obj, 'FaceColor'); if(strcmp(patchcolor,'none')) patchcolor = get(obj, 'EdgeColor'); end; %darken the text to account for the effect of the grey bg patchcolor = patchcolor*0.9; %{NAME} patchname = theVars(mfn).allFullNames{patchIndex}; set(theVars(mfn).thresholdTesters(myttIndex).clickQueryTextHandle, {'String','Color'},... {patchname,patchcolor}); function setValueButtonCallback(obj, eventdata, mfn, myttIndex) global theVars; enterThresholdPrompt = 'Enter the desired threshold in [-1,1]'; mytitle = 'Change the Current Threshold Value'; lines=1; def = {num2str(theVars(mfn).thresholdTesters(myttIndex).currentThreshold)}; theAnswer = inputdlg({enterThresholdPrompt}, mytitle, lines, def); done = 0; while (~done & ~isempty(theAnswer)) %theAnswer is empty when the user clicked 'cancel' if(str2num(theAnswer{1})>=-1 & str2num(theAnswer{1})<=1) done=1; else errorprompt = sprintf('%g is not in [-1,1].\n%s',str2num(theAnswer{1}),enterThresholdPrompt); theAnswer = inputdlg({errorprompt},mytitle,lines,def); end; end; if(done) theVars(mfn).thresholdTesters(myttIndex).currentThreshold = ... str2num(theAnswer{1}); set(theVars(mfn).thresholdTesters(myttIndex).thresholdDisplayHandle,'String',... sprintf('%1.5f',str2num(theAnswer{1}))); changed = 0; if(theVars(mfn).thresholdTesters(myttIndex).fromValue < ... theVars(mfn).thresholdTesters(myttIndex).toValue) if(theVars(mfn).thresholdTesters(myttIndex).currentThreshold < ... theVars(mfn).thresholdTesters(myttIndex).fromValue) theVars(mfn).thresholdTesters(myttIndex).fromValue = ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; changed = 1; elseif(theVars(mfn).thresholdTesters(myttIndex).currentThreshold > ... theVars(mfn).thresholdTesters(myttIndex).toValue) theVars(mfn).thresholdTesters(myttIndex).toValue = ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; changed = 1; end; else %from > to if(theVars(mfn).thresholdTesters(myttIndex).currentThreshold > ... theVars(mfn).thresholdTesters(myttIndex).fromValue) theVars(mfn).thresholdTesters(myttIndex).fromValue = ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; changed = 1; elseif(theVars(mfn).thresholdTesters(myttIndex).currentThreshold < ... theVars(mfn).thresholdTesters(myttIndex).toValue) theVars(mfn).thresholdTesters(myttIndex).toValue = ... theVars(mfn).thresholdTesters(myttIndex).currentThreshold; changed = 1; end; end; if(changed) rangeString = ['from ', num2str(theVars(mfn).thresholdTesters(myttIndex).fromValue),... ' to ', num2str(theVars(mfn).thresholdTesters(myttIndex).toValue)]; set(theVars(mfn).thresholdTesters(myttIndex).rangeDisplayHandle,'String',rangeString); end; adjustVisForCurrThreshold(mfn,myttIndex); end; function indextouse = getNextAvailableTTindex(mfn) global theVars; if(length(theVars(mfn).thresholdTesters)==0) %it's the first one indextouse = 1; else freedOnes = find([theVars(mfn).thresholdTesters.figNum]==0); if(isempty(freedOnes)) indextouse = length(theVars(mfn).thresholdTesters)+1; else indextouse = freedOnes(1); end; end;