function createWindowDisplayWithCoords(myFigNum, fromRowIndex, toRowIndex,... fromColIndex,toColIndex, dataSource, createSubWindow) global theVars; global menubarheight; global scrollbarwidth; global bottompadding; % if(createSubWindow) then is the figNum of the spawning window % else is the adjacency matrix. % and are the dataindex boundaries for % displaying a *subset* of the data figure(myFigNum); %create and focus the desired new figure set(myFigNum, 'Units','pixels'); %position should be 0,0, but for some reason this is too low... set(myFigNum,'Position',[5,5,theVars(myFigNum).desiredWindowWidth,... theVars(myFigNum).desiredWindowHeight]); set(myFigNum,'Toolbar','none'); set(myFigNum,'CloseRequestFcn','mainFigureCloseRequest'); if(createSubWindow) figtitle = sprintf('(Data Subset from Figure %d)',dataSource); set(myFigNum, 'Name',figtitle); end; if(theVars(myFigNum).desirednumpixelspersubcell < 4) %the 'patches' are really vertical lines which cannot be resized set(myFigNum,'Resize','off'); end; thebigaxishandle = axes('Visible','off','Units','pixels',... 'Position',[0, theVars(myFigNum).desiredWindowHeight-... (theVars(myFigNum).desiredheight+bottompadding),... theVars(myFigNum).desiredwidth,theVars(myFigNum).desiredheight+bottompadding]); if(theVars(myFigNum).needVertScrollbar) %calculate the sliderstepsize totalHeightinPixels = theVars(myFigNum).desiredheight+bottompadding; numPixelsPastWindowBottom = totalHeightinPixels -... theVars(myFigNum).desiredWindowHeight; squareHeight = theVars(myFigNum).origNumrows*theVars(myFigNum).desirednumpixelspersubcell... +theVars(myFigNum).desirednumpixelsperpadding; desiredNumVertSliderSteps = numPixelsPastWindowBottom / squareHeight; end; if(theVars(myFigNum).needHorizScrollbar) totalWidthinPixels = theVars(myFigNum).desiredwidth; numPixelsPastRightofWindow = totalWidthinPixels -... theVars(myFigNum).desiredWindowWidth; squareWidth = theVars(myFigNum).origNumcols*theVars(myFigNum).desirednumpixelspersubcell... +theVars(myFigNum).desirednumpixelsperpadding; desiredNumHorizSliderSteps = numPixelsPastRightofWindow / squareWidth; end; %for now, don't keep a ref to the scrollbar handles if(theVars(myFigNum).needVertScrollbar & theVars(myFigNum).needHorizScrollbar) %need two scrollbars %make vertical scroller sl=uicontrol('Style','slider','Position',... [theVars(myFigNum).desiredWindowWidth-scrollbarwidth,0,... scrollbarwidth,theVars(myFigNum).desiredWindowHeight],... 'SliderStep',[0.01, 1/desiredNumVertSliderSteps],... 'Callback',{@sliderCallback,thebigaxishandle, ... myFigNum, 0}, 'Value',1); %0 callback param--> is NOT horizontal %make horiz scroller sl=uicontrol('Style','slider','Position',... [0,0,theVars(myFigNum).desiredWindowWidth-scrollbarwidth,... scrollbarwidth], 'SliderStep',[0.01, 1/desiredNumHorizSliderSteps],... 'Callback',{@sliderCallback,thebigaxishandle, ... myFigNum, 1}, 'Value',0); %1 callback param--> IS horizontal else %need 0 or 1 scroll bars if(theVars(myFigNum).needHorizScrollbar) sl=uicontrol('Style','slider','Position',... [0,0,theVars(myFigNum).desiredWindowWidth,... scrollbarwidth],'SliderStep',[0.01, 1/desiredNumHorizSliderSteps],... 'Callback',{@sliderCallback,thebigaxishandle, ... myFigNum, 1}, 'Value',0); %1 callback param--> IS horizontal elseif(theVars(myFigNum).needVertScrollbar) sl=uicontrol('Style','slider','Position',... [theVars(myFigNum).desiredWindowWidth-scrollbarwidth,0,... scrollbarwidth,theVars(myFigNum).desiredWindowHeight],... 'SliderStep',[0.01, 1/desiredNumVertSliderSteps],... 'Callback',{@sliderCallback,thebigaxishandle, ... myFigNum, 0}, 'Value',1); %0 callback param--> is NOT horizontal end; end; actualwidth = theVars(myFigNum).origNumcols*theVars(myFigNum).desirednumpixelspersubcell+2;%!! actualheight = theVars(myFigNum).origNumrows*theVars(myFigNum).desirednumpixelspersubcell+2;%!! paddedwidth= actualwidth + theVars(myFigNum).desirednumpixelsperpadding; paddedheight= actualheight + theVars(myFigNum).desirednumpixelsperpadding; pos = paddedwidth/2; %offset to center text if(~ createSubWindow) %we have an adj matrix %remove the 1's on the diagonal nondiagdata = dataSource - diag(diag(dataSource)); thedata = dataSource; %for calculating similarities lvi = theVars(myFigNum).lastValidDataIndex; else lvi = theVars(dataSource).lastValidDataIndex; end; textDarkener = 0.9;%set to 1 to leave text colors unchanged nextNewIndex=1; %only used if createSubWindow=1 for(i=fromRowIndex:toRowIndex) for(j=fromColIndex:toColIndex) box off; coordsString = sprintf('%d,%d', i- fromRowIndex +1, j- ... fromColIndex+1); if(createSubWindow) originalIndex = (i-1)*theVars(dataSource).numcols + j; index=nextNewIndex; nextNewIndex=nextNewIndex+1; else originalIndex = (i-1)*theVars(myFigNum).numcols + j; index=originalIndex; end; if(originalIndex > lvi) if(createSubWindow & theVars(myFigNum).lastValidDataIndex ~= ... index-1) fprintf('SOMETHING IS WRONG! lvi is %d, should be %d', ... theVars(myFigNum).lastValidDataIndex, index-1); end; break; %skip the squarifying placeholder zeros end; if(createSubWindow) %NOTE: the function variable originalIndex is the index of %this elem, **relative to the spawning window**. But the value %stored in theVars (myorigindex) is the index relative to the %this cluster of the complete data set (ie rel to the first %window opened) theVars(myFigNum).theAxesHandles(index).myorigindex = ... theVars(dataSource).theAxesHandles(originalIndex).myorigindex; else theVars(myFigNum).theAxesHandles(index).myorigindex = index; end; set(myFigNum,'CurrentAxes',thebigaxishandle); %just in case if(isempty(theVars(myFigNum).names)) myname=num2str(index); else myname = theVars(myFigNum).names{index}; end; %add titles %NOTE: text is positioned ***relative to thebigaxis*** theVars(myFigNum).nameHandles(index)=text((j-fromColIndex)* ... (paddedwidth)+pos,(theVars(myFigNum).desiredheight)+bottompadding... -((i-fromRowIndex)*(paddedheight)+theVars(myFigNum).mytitlefontsize),myname,... 'FontSize',theVars(myFigNum).mytitlefontsize,'Color', ... textDarkener * theVars(myFigNum).borderColors(i-fromRowIndex+1,... j-fromColIndex+1,:), 'HorizontalAlignment','center',... 'VerticalAlignment','baseline', 'Units','pixels'); set(theVars(myFigNum).nameHandles(index),'Units','normalized'); %NOTE: axes are positioned ***relative to the figure*** a=axes('Units','pixels','Position',... [(j-fromColIndex)*(paddedwidth)+... (theVars(myFigNum).desirednumpixelsperpadding/2)... (theVars(myFigNum).desiredWindowHeight)-((i-fromRowIndex+1)*(paddedheight))... actualwidth actualheight]); if(~ createSubWindow) %do NOT include myself in my associates (myassocI) theVars(myFigNum).theAxesHandles(index).myassocI = ... find(nondiagdata(index,:) > theVars(myFigNum).visThreshold); adjacentPatchesToDraw = dataSource(index,:); adjacentPatchesToDraw = adjacentPatchesToDraw > theVars(myFigNum).visThreshold; else %reconstruct from parent's adjacency info adjacentPatchesToDraw = zeros(1,theVars(myFigNum).origNumcols*... theVars(myFigNum).origNumrows);%some of these zeros %may be left as padding switch(theVars(myFigNum).simMode) case 1 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullAbsSimilarityMatrix,1)) = ... theVars(myFigNum).theFullAbsSimilarityMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); case 2 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullRelSimilarityMatrix,1)) = ... theVars(myFigNum).theFullRelSimilarityMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); case 3 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullRel2SimilarityMatrix,1)) = ... theVars(myFigNum).theFullRel2SimilarityMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); case 4 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullAbsSimSimMatrix,1)) = ... theVars(myFigNum).theFullAbsSimSimMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); case 5 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullRelSimSimMatrix,1)) = ... theVars(myFigNum).theFullRelSimSimMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); case 6 adjacentPatchesToDraw(1:size(theVars(myFigNum).theFullRel2SimSimMatrix,1)) = ... theVars(myFigNum).theFullRel2SimSimMatrix(... theVars(myFigNum).theAxesHandles(index).myorigindex,:); end; adjacentPatchesToDraw = adjacentPatchesToDraw > theVars(myFigNum).visThreshold; %assocI is relative only to the parent of the spawnee, not %the original ancestor (ie. in the case where the parent was also spawned) origAssociates = adjacentPatchesToDraw(theVars(myFigNum).inboundsIndexes); origAssociates(index)=0; %remove self-adjacency theVars(myFigNum).theAxesHandles(index).myassocI = find(origAssociates);%nonzero vals end; [grayboxhandle,greymaphandle,whitemaphandle] = makeConnectionMap(myFigNum, ... reshape(adjacentPatchesToDraw,theVars(myFigNum).origNumcols, ... theVars(myFigNum).origNumrows)', ... theVars(myFigNum).borderColors(i-fromRowIndex+1,j-fromColIndex+1,:)); theVars(myFigNum).theAxesHandles(index).mybg = grayboxhandle; theVars(myFigNum).theAxesHandles(index).mymap = greymaphandle; theVars(myFigNum).theAxesHandles(index).myhilitemap = whitemaphandle; theVars(myFigNum).theAxesHandles(index).myhandle = a; theVars(myFigNum).theAxesHandles(index).numvisiblelevels = 1; theVars(myFigNum).theAxesHandles(index).isdoneexpanding = 0; theVars(myFigNum).theAxesHandles(index).latestlevelI={}; set(a,'Units','normalized'); theVars(myFigNum).theAxesHandles(index).coordsText = ... text(0.5,0.5,coordsString,'HorizontalAlignment','center', ... 'VerticalAlignment','middle','FontSize',15,'Units','normalized',... 'HitTest','off','Visible','off', 'HandleVisibility','off'); end; end; set(thebigaxishandle,'HandleVisibility','off'); set(thebigaxishandle,'Units','normalized'); %to allow the text to scale numinputs = theVars(myFigNum).lastValidDataIndex; for(i=1:numinputs) %this 'set ButtonDownFcn' has to be done AFTER the above loop set(theVars(myFigNum).theAxesHandles(i).mybg,'ButtonDownFcn',{@clickCallback, ... theVars(myFigNum).theAxesHandles(i).myassocI, i,myFigNum}); set(theVars(myFigNum).theAxesHandles(i).mymap,'ButtonDownFcn',{@clickMapCallback, ... theVars(myFigNum).theAxesHandles(i).myassocI, i,... theVars(myFigNum).theAxesHandles(i).mybg,myFigNum}); set(theVars(myFigNum).theAxesHandles(i).myhilitemap,'ButtonDownFcn',{@clickMapCallback, ... theVars(myFigNum).theAxesHandles(i).myassocI, i,... theVars(myFigNum).theAxesHandles(i).mybg,myFigNum}); end; %set up the main figure to catch keypresses set(myFigNum,'KeyPressFcn',{@keyPressCallback,myFigNum})