// Note that leaves are threaded from left to right. // This means that if displayed top to bottom, centroids would be reversed // Therefore, accumulate in reverse order into AlgorithmData private void getResults() { SOTACell curr = head; int numCells = 0; FloatMatrix centroidFM = new FloatMatrix(numberOfClusters, numberOfSamples); FloatMatrix varianceFM = new FloatMatrix(numberOfClusters, numberOfSamples); int[] clusterSize = new int[numberOfClusters]; FloatMatrix clusterDiversity = new FloatMatrix(numberOfClusters, 1); int numDiv = cycleDiversity.size(); FloatMatrix cycleDivFM = new FloatMatrix(numDiv, 1); int[] clusterOrder = new int[numberOfClusters]; clusters = new Cluster(); NodeList nodeList = clusters.getNodeList(); Node newNode; int[] clusterMembership; int clusterPop; // move to tail while (curr.succ != null) curr = curr.succ; // now curr is at the tail while (numCells <= numberOfClusters && curr != null) { for (int i = 0; i < numberOfSamples; i++) { centroidFM.set(numCells, i, curr.centroidGene.get(0, i)); varianceFM.set(numCells, i, curr.getColumnVar(i)); } clusterPop = curr.members.size(); clusterSize[numCells] = clusterPop; clusterDiversity.set( numCells, 0, (float) curr.cellDiversity * (float) myFactor); // alter poloarity by myFactor based on metric clusterOrder[numCells] = numCells; // accumulate cluster probe indicies clusterMembership = new int[clusterPop]; for (int i = 0; i < clusterPop; i++) { clusterMembership[i] = ((Integer) (curr.members.elementAt(i))).intValue(); } newNode = new Node(); newNode.setProbesIndexes(clusterMembership); nodeList.addNode(newNode); numCells++; curr = curr.pred; } // now accumlate cycle divresity information if (myFactor == 1) { float initDiv = ((Float) (cycleDiversity.elementAt(0))).floatValue(); for (int i = 0; i < numDiv; i++) { cycleDivFM.set(i, 0, (((Float) (cycleDiversity.elementAt(i))).floatValue()) / initDiv); } } else { float lowerLim = numberOfGenes * myFactor; float initDiv = ((Float) (cycleDiversity.elementAt(0))).floatValue() + Math.abs(lowerLim); for (int i = 0; i < numDiv; i++) { cycleDivFM.set( i, 0, (((Float) (cycleDiversity.elementAt(i))).floatValue() + Math.abs(lowerLim)) / initDiv); } } // put all important information into AlgorithmData inData.addParam("cycles", String.valueOf(numberOfClusters)); inData.addCluster("cluster", clusters); inData.addMatrix("centroid-matrix", centroidFM); inData.addMatrix("cluster-variances", varianceFM); inData.addMatrix("cluster-diversity", clusterDiversity); inData.addMatrix("cycle-diversity", cycleDivFM); inData.addIntArray("cluster-population", clusterSize); // Additions to AlgorithmData to allow drawing arrays float[] nodeHeight = new float[numberOfClusters * 2]; int[] nodePopulation = new int[numberOfClusters * 2]; int[] leftChild = new int[nodeHeight.length * 2]; int[] rightChild = new int[nodeHeight.length * 2]; initializeReturnValues(nodeHeight, nodePopulation, leftChild, rightChild); utilCounter = 0; loadReturnValues(root, 0, nodeHeight, nodePopulation, leftChild, rightChild); inData.addMatrix("node-heights", new FloatMatrix(nodeHeight, nodeHeight.length)); inData.addIntArray("left-child", leftChild); inData.addIntArray("right-child", rightChild); inData.addIntArray("node-population", nodePopulation); if (useClusterVariance) inData.addParam("computed-var-cutoff", String.valueOf(endCriteria)); return; }