X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FNJTree.java;h=6c239be1de8a3c2311e99ca0c59a2c0dc95a8ee2;hb=83193bc5c3e150dc7331b5b27a67cb5f9efb477c;hp=6daee9bae6f033e7b364691632d64333676f308a;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git diff --git a/src/jalview/analysis/NJTree.java b/src/jalview/analysis/NJTree.java index 6daee9b..6c239be 100755 --- a/src/jalview/analysis/NJTree.java +++ b/src/jalview/analysis/NJTree.java @@ -29,7 +29,14 @@ import jalview.util.*; import java.util.*; -public class NJTree { +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ +public class NJTree +{ Vector cluster; SequenceI[] sequence; int[] done; @@ -54,12 +61,25 @@ public class NJTree { int start; int end; - public NJTree(SequenceNode node) { + /** + * Creates a new NJTree object. + * + * @param node DOCUMENT ME! + */ + public NJTree(SequenceNode node) + { top = node; maxheight = findHeight(top); } - public NJTree(SequenceI[] seqs, NewickFile treefile) { + /** + * Creates a new NJTree object. + * + * @param seqs DOCUMENT ME! + * @param treefile DOCUMENT ME! + */ + public NJTree(SequenceI[] seqs, NewickFile treefile) + { top = treefile.getTree(); maxheight = findHeight(top); @@ -75,31 +95,54 @@ public class NJTree { SequenceI nam; String realnam; - while (i < leaves.size()) { + while (i < leaves.size()) + { j = (SequenceNode) leaves.elementAt(i++); realnam = j.getName(); nam = null; - if (namesleft > -1) { + if (namesleft > -1) + { nam = algnIds.findIdMatch(realnam); } - if (nam != null) { + if (nam != null) + { j.setElement(nam); namesleft--; - } else { + } + else + { j.setElement(new Sequence(realnam, "THISISAPLACEHLDER")); j.setPlaceholder(true); } } } - public NJTree(SequenceI[] sequence, int start, int end) { + /** + * Creates a new NJTree object. + * + * @param sequence DOCUMENT ME! + * @param start DOCUMENT ME! + * @param end DOCUMENT ME! + */ + public NJTree(SequenceI[] sequence, int start, int end) + { this(sequence, "NJ", "BL", start, end); } + /** + * Creates a new NJTree object. + * + * @param sequence DOCUMENT ME! + * @param type DOCUMENT ME! + * @param pwtype DOCUMENT ME! + * @param start DOCUMENT ME! + * @param end DOCUMENT ME! + */ public NJTree(SequenceI[] sequence, String type, String pwtype, int start, - int end) { + int end) + { this.sequence = sequence; this.node = new Vector(); this.type = type; @@ -107,11 +150,13 @@ public class NJTree { this.start = start; this.end = end; - if (!(type.equals("NJ"))) { + if (!(type.equals("NJ"))) + { type = "AV"; } - if (!(pwtype.equals("PID"))) { + if (!(pwtype.equals("PID"))) + { type = "BL"; } @@ -119,7 +164,8 @@ public class NJTree { done = new int[sequence.length]; - while ((i < sequence.length) && (sequence[i] != null)) { + while ((i < sequence.length) && (sequence[i] != null)) + { done[i] = 0; i++; } @@ -135,7 +181,13 @@ public class NJTree { cluster(); } - public String toString() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public String toString() + { jalview.io.NewickFile fout = new jalview.io.NewickFile(getTopNode()); return fout.print(false, true); // distances only @@ -147,7 +199,8 @@ public class NJTree { * * @param alignment Vector */ - public void UpdatePlaceHolders(Vector alignment) { + public void UpdatePlaceHolders(Vector alignment) + { Vector leaves = new Vector(); findLeaves(top, leaves); @@ -155,13 +208,18 @@ public class NJTree { SequenceIdMatcher seqmatcher = null; int i = 0; - while (i < sz) { + while (i < sz) + { SequenceNode leaf = (SequenceNode) leaves.elementAt(i++); - if (alignment.contains(leaf.element())) { + if (alignment.contains(leaf.element())) + { leaf.setPlaceholder(false); - } else { - if (seqmatcher == null) { + } + else + { + if (seqmatcher == null) + { // Only create this the first time we need it SequenceI[] seqs = new SequenceI[alignment.size()]; @@ -173,21 +231,32 @@ public class NJTree { SequenceI nam = seqmatcher.findIdMatch(leaf.getName()); - if (nam != null) { + if (nam != null) + { leaf.setPlaceholder(false); leaf.setElement(nam); - } else { + } + else + { leaf.setPlaceholder(true); } } } } - public void cluster() { - while (noClus > 2) { - if (type.equals("NJ")) { + /** + * DOCUMENT ME! + */ + public void cluster() + { + while (noClus > 2) + { + if (type.equals("NJ")) + { float mind = findMinNJDistance(); - } else { + } + else + { float mind = findMinDistance(); } @@ -206,12 +275,17 @@ public class NJTree { int one = -1; int two = -1; - for (int i = 0; i < noseqs; i++) { - if (done[i] != 1) { - if (onefound == false) { + for (int i = 0; i < noseqs; i++) + { + if (done[i] != 1) + { + if (onefound == false) + { two = i; onefound = true; - } else { + } + else + { one = i; } } @@ -225,7 +299,16 @@ public class NJTree { findMaxDist(top); } - public Cluster joinClusters(int i, int j) { + /** + * DOCUMENT ME! + * + * @param i DOCUMENT ME! + * @param j DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Cluster joinClusters(int i, int j) + { float dist = distance[i][j]; int noi = ((Cluster) cluster.elementAt(i)).value.length; @@ -233,11 +316,13 @@ public class NJTree { int[] value = new int[noi + noj]; - for (int ii = 0; ii < noi; ii++) { + for (int ii = 0; ii < noi; ii++) + { value[ii] = ((Cluster) cluster.elementAt(i)).value[ii]; } - for (int ii = noi; ii < (noi + noj); ii++) { + for (int ii = noi; ii < (noi + noj); ii++) + { value[ii] = ((Cluster) cluster.elementAt(j)).value[ii - noi]; } @@ -246,9 +331,12 @@ public class NJTree { ri = findr(i, j); rj = findr(j, i); - if (type.equals("NJ")) { + if (type.equals("NJ")) + { findClusterNJDistance(i, j); - } else { + } + else + { findClusterDistance(i, j); } @@ -260,9 +348,12 @@ public class NJTree { SequenceNode tmpi = (SequenceNode) (node.elementAt(i)); SequenceNode tmpj = (SequenceNode) (node.elementAt(j)); - if (type.equals("NJ")) { + if (type.equals("NJ")) + { findNewNJDistances(tmpi, tmpj, dist); - } else { + } + else + { findNewDistances(tmpi, tmpj, dist); } @@ -274,8 +365,16 @@ public class NJTree { return c; } + /** + * DOCUMENT ME! + * + * @param tmpi DOCUMENT ME! + * @param tmpj DOCUMENT ME! + * @param dist DOCUMENT ME! + */ public void findNewNJDistances(SequenceNode tmpi, SequenceNode tmpj, - float dist) { + float dist) + { float ih = 0; float jh = 0; @@ -285,29 +384,41 @@ public class NJTree { tmpi.dist = ((dist + ri) - rj) / 2; tmpj.dist = (dist - tmpi.dist); - if (tmpi.dist < 0) { + if (tmpi.dist < 0) + { tmpi.dist = 0; } - if (tmpj.dist < 0) { + if (tmpj.dist < 0) + { tmpj.dist = 0; } } + /** + * DOCUMENT ME! + * + * @param tmpi DOCUMENT ME! + * @param tmpj DOCUMENT ME! + * @param dist DOCUMENT ME! + */ public void findNewDistances(SequenceNode tmpi, SequenceNode tmpj, - float dist) { + float dist) + { float ih = 0; float jh = 0; SequenceNode sni = tmpi; SequenceNode snj = tmpj; - while (sni != null) { + while (sni != null) + { ih = ih + sni.dist; sni = (SequenceNode) sni.left(); } - while (snj != null) { + while (snj != null) + { jh = jh + snj.dist; snj = (SequenceNode) snj.left(); } @@ -316,75 +427,121 @@ public class NJTree { tmpj.dist = ((dist / 2) - jh); } - public void findClusterDistance(int i, int j) { + /** + * DOCUMENT ME! + * + * @param i DOCUMENT ME! + * @param j DOCUMENT ME! + */ + public void findClusterDistance(int i, int j) + { int noi = ((Cluster) cluster.elementAt(i)).value.length; int noj = ((Cluster) cluster.elementAt(j)).value.length; // New distances from cluster to others float[] newdist = new float[noseqs]; - for (int l = 0; l < noseqs; l++) { - if ((l != i) && (l != j)) { + for (int l = 0; l < noseqs; l++) + { + if ((l != i) && (l != j)) + { newdist[l] = ((distance[i][l] * noi) + (distance[j][l] * noj)) / (noi + noj); - } else { + } + else + { newdist[l] = 0; } } - for (int ii = 0; ii < noseqs; ii++) { + for (int ii = 0; ii < noseqs; ii++) + { distance[i][ii] = newdist[ii]; distance[ii][i] = newdist[ii]; } } - public void findClusterNJDistance(int i, int j) { + /** + * DOCUMENT ME! + * + * @param i DOCUMENT ME! + * @param j DOCUMENT ME! + */ + public void findClusterNJDistance(int i, int j) + { int noi = ((Cluster) cluster.elementAt(i)).value.length; int noj = ((Cluster) cluster.elementAt(j)).value.length; // New distances from cluster to others float[] newdist = new float[noseqs]; - for (int l = 0; l < noseqs; l++) { - if ((l != i) && (l != j)) { + for (int l = 0; l < noseqs; l++) + { + if ((l != i) && (l != j)) + { newdist[l] = ((distance[i][l] + distance[j][l]) - distance[i][j]) / 2; - } else { + } + else + { newdist[l] = 0; } } - for (int ii = 0; ii < noseqs; ii++) { + for (int ii = 0; ii < noseqs; ii++) + { distance[i][ii] = newdist[ii]; distance[ii][i] = newdist[ii]; } } - public float findr(int i, int j) { + /** + * DOCUMENT ME! + * + * @param i DOCUMENT ME! + * @param j DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float findr(int i, int j) + { float tmp = 1; - for (int k = 0; k < noseqs; k++) { - if ((k != i) && (k != j) && (done[k] != 1)) { + for (int k = 0; k < noseqs; k++) + { + if ((k != i) && (k != j) && (done[k] != 1)) + { tmp = tmp + distance[i][k]; } } - if (noClus > 2) { + if (noClus > 2) + { tmp = tmp / (noClus - 2); } return tmp; } - public float findMinNJDistance() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float findMinNJDistance() + { float min = 100000; - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i + 1; j < noseqs; j++) { - if ((done[i] != 1) && (done[j] != 1)) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i + 1; j < noseqs; j++) + { + if ((done[i] != 1) && (done[j] != 1)) + { float tmp = distance[i][j] - (findr(i, j) + findr(j, i)); - if (tmp < min) { + if (tmp < min) + { mini = i; minj = j; @@ -397,13 +554,23 @@ public class NJTree { return min; } - public float findMinDistance() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float findMinDistance() + { float min = 100000; - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i + 1; j < noseqs; j++) { - if ((done[i] != 1) && (done[j] != 1)) { - if (distance[i][j] < min) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i + 1; j < noseqs; j++) + { + if ((done[i] != 1) && (done[j] != 1)) + { + if (distance[i][j] < min) + { mini = i; minj = j; @@ -416,34 +583,54 @@ public class NJTree { return min; } - public float[][] findDistances() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float[][] findDistances() + { float[][] distance = new float[noseqs][noseqs]; - if (pwtype.equals("PID")) { - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i; j < noseqs; j++) { - if (j == i) { + if (pwtype.equals("PID")) + { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i; j < noseqs; j++) + { + if (j == i) + { distance[i][i] = 0; - } else { + } + else + { distance[i][j] = 100 - Comparison.PID(sequence[i], sequence[j], start, end); distance[j][i] = distance[i][j]; } } } - } else if (pwtype.equals("BL")) { + } + else if (pwtype.equals("BL")) + { int maxscore = 0; - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i; j < noseqs; j++) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i; j < noseqs; j++) + { int score = 0; - for (int k = start; k < end; k++) { - try { + for (int k = start; k < end; k++) + { + try + { score += ResidueProperties.getBLOSUM62(sequence[i].getSequence( k, k + 1), sequence[j].getSequence(k, k + 1)); - } catch (Exception ex) { + } + catch (Exception ex) + { System.err.println("err creating BLOSUM62 tree"); ex.printStackTrace(); } @@ -451,37 +638,47 @@ public class NJTree { distance[i][j] = (float) score; - if (score > maxscore) { + if (score > maxscore) + { maxscore = score; } } } - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i; j < noseqs; j++) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i; j < noseqs; j++) + { distance[i][j] = (float) maxscore - distance[i][j]; distance[j][i] = distance[i][j]; } } - } else if (pwtype.equals("SW")) { + } + else if (pwtype.equals("SW")) + { float max = -1; - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i; j < noseqs; j++) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i; j < noseqs; j++) + { AlignSeq as = new AlignSeq(sequence[i], sequence[j], "pep"); as.calcScoreMatrix(); as.traceAlignment(); as.printAlignment(); distance[i][j] = (float) as.maxscore; - if (max < distance[i][j]) { + if (max < distance[i][j]) + { max = distance[i][j]; } } } - for (int i = 0; i < (noseqs - 1); i++) { - for (int j = i; j < noseqs; j++) { + for (int i = 0; i < (noseqs - 1); i++) + { + for (int j = i; j < noseqs; j++) + { distance[i][j] = max - distance[i][j]; distance[j][i] = distance[i][j]; } @@ -491,10 +688,15 @@ public class NJTree { return distance; } - public void makeLeaves() { + /** + * DOCUMENT ME! + */ + public void makeLeaves() + { cluster = new Vector(); - for (int i = 0; i < noseqs; i++) { + for (int i = 0; i < noseqs; i++) + { SequenceNode sn = new SequenceNode(); sn.setElement(sequence[i]); @@ -509,16 +711,29 @@ public class NJTree { } } - public Vector findLeaves(SequenceNode node, Vector leaves) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * @param leaves DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Vector findLeaves(SequenceNode node, Vector leaves) + { + if (node == null) + { return leaves; } - if ((node.left() == null) && (node.right() == null)) { + if ((node.left() == null) && (node.right() == null)) + { leaves.addElement(node); return leaves; - } else { + } + else + { findLeaves((SequenceNode) node.left(), leaves); findLeaves((SequenceNode) node.right(), leaves); } @@ -526,22 +741,44 @@ public class NJTree { return leaves; } - public Object findLeaf(SequenceNode node, int count) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * @param count DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Object findLeaf(SequenceNode node, int count) + { found = _findLeaf(node, count); return found; } - public Object _findLeaf(SequenceNode node, int count) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * @param count DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Object _findLeaf(SequenceNode node, int count) + { + if (node == null) + { return null; } - if (node.ycount == count) { + if (node.ycount == count) + { found = node.element(); return found; - } else { + } + else + { _findLeaf((SequenceNode) node.left(), count); _findLeaf((SequenceNode) node.right(), count); } @@ -554,80 +791,137 @@ public class NJTree { * * @param node SequenceNode */ - public void printNode(SequenceNode node) { - if (node == null) { + public void printNode(SequenceNode node) + { + if (node == null) + { return; } - if ((node.left() == null) && (node.right() == null)) { + if ((node.left() == null) && (node.right() == null)) + { System.out.println("Leaf = " + ((SequenceI) node.element()).getName()); System.out.println("Dist " + ((SequenceNode) node).dist); System.out.println("Boot " + node.getBootstrap()); - } else { + } + else + { System.out.println("Dist " + ((SequenceNode) node).dist); printNode((SequenceNode) node.left()); printNode((SequenceNode) node.right()); } } - public void findMaxDist(SequenceNode node) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public void findMaxDist(SequenceNode node) + { + if (node == null) + { return; } - if ((node.left() == null) && (node.right() == null)) { + if ((node.left() == null) && (node.right() == null)) + { float dist = ((SequenceNode) node).dist; - if (dist > maxDistValue) { + if (dist > maxDistValue) + { maxdist = (SequenceNode) node; maxDistValue = dist; } - } else { + } + else + { findMaxDist((SequenceNode) node.left()); findMaxDist((SequenceNode) node.right()); } } - public Vector getGroups() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Vector getGroups() + { return groups; } - public float getMaxHeight() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float getMaxHeight() + { return maxheight; } - public void groupNodes(SequenceNode node, float threshold) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * @param threshold DOCUMENT ME! + */ + public void groupNodes(SequenceNode node, float threshold) + { + if (node == null) + { return; } - if ((node.height / maxheight) > threshold) { + if ((node.height / maxheight) > threshold) + { groups.addElement(node); - } else { + } + else + { groupNodes((SequenceNode) node.left(), threshold); groupNodes((SequenceNode) node.right(), threshold); } } - public float findHeight(SequenceNode node) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float findHeight(SequenceNode node) + { + if (node == null) + { return maxheight; } - if ((node.left() == null) && (node.right() == null)) { + if ((node.left() == null) && (node.right() == null)) + { node.height = ((SequenceNode) node.parent()).height + node.dist; - if (node.height > maxheight) { + if (node.height > maxheight) + { return node.height; - } else { + } + else + { return maxheight; } - } else { - if (node.parent() != null) { + } + else + { + if (node.parent() != null) + { node.height = ((SequenceNode) node.parent()).height + node.dist; - } else { + } + else + { maxheight = 0; node.height = (float) 0.0; } @@ -639,8 +933,15 @@ public class NJTree { return maxheight; } - public SequenceNode reRoot() { - if (maxdist != null) { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public SequenceNode reRoot() + { + if (maxdist != null) + { ycount = 0; float tmpdist = maxdist.dist; @@ -673,15 +974,25 @@ public class NJTree { return top; } - public static void printN(SequenceNode node) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public static void printN(SequenceNode node) + { + if (node == null) + { return; } - if ((node.left() != null) && (node.right() != null)) { + if ((node.left() != null) && (node.right() != null)) + { printN((SequenceNode) node.left()); printN((SequenceNode) node.right()); - } else { + } + else + { System.out.println(" name = " + ((SequenceI) node.element()).getName()); } @@ -690,17 +1001,31 @@ public class NJTree { ((SequenceNode) node).count + " " + ((SequenceNode) node).height); } - public void reCount(SequenceNode node) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public void reCount(SequenceNode node) + { ycount = 0; _reCount(node); } - public void _reCount(SequenceNode node) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public void _reCount(SequenceNode node) + { + if (node == null) + { return; } - if ((node.left() != null) && (node.right() != null)) { + if ((node.left() != null) && (node.right() != null)) + { _reCount((SequenceNode) node.left()); _reCount((SequenceNode) node.right()); @@ -709,14 +1034,23 @@ public class NJTree { ((SequenceNode) node).count = l.count + r.count; ((SequenceNode) node).ycount = (l.ycount + r.ycount) / 2; - } else { + } + else + { ((SequenceNode) node).count = 1; ((SequenceNode) node).ycount = ycount++; } } - public void swapNodes(SequenceNode node) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public void swapNodes(SequenceNode node) + { + if (node == null) + { return; } @@ -726,62 +1060,117 @@ public class NJTree { node.setRight(tmp); } - public void changeDirection(SequenceNode node, SequenceNode dir) { - if (node == null) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + * @param dir DOCUMENT ME! + */ + public void changeDirection(SequenceNode node, SequenceNode dir) + { + if (node == null) + { return; } - if (node.parent() != top) { + if (node.parent() != top) + { changeDirection((SequenceNode) node.parent(), node); SequenceNode tmp = (SequenceNode) node.parent(); - if (dir == node.left()) { + if (dir == node.left()) + { node.setParent(dir); node.setLeft(tmp); - } else if (dir == node.right()) { + } + else if (dir == node.right()) + { node.setParent(dir); node.setRight(tmp); } - } else { - if (dir == node.left()) { + } + else + { + if (dir == node.left()) + { node.setParent(node.left()); - if (top.left() == node) { + if (top.left() == node) + { node.setRight(top.right()); - } else { + } + else + { node.setRight(top.left()); } - } else { + } + else + { node.setParent(node.right()); - if (top.left() == node) { + if (top.left() == node) + { node.setLeft(top.right()); - } else { + } + else + { node.setLeft(top.left()); } } } } - public void setMaxDist(SequenceNode node) { + /** + * DOCUMENT ME! + * + * @param node DOCUMENT ME! + */ + public void setMaxDist(SequenceNode node) + { this.maxdist = maxdist; } - public SequenceNode getMaxDist() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public SequenceNode getMaxDist() + { return maxdist; } - public SequenceNode getTopNode() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public SequenceNode getTopNode() + { return top; } } -class Cluster { +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ +class Cluster +{ int[] value; - public Cluster(int[] value) { + /** + * Creates a new Cluster object. + * + * @param value DOCUMENT ME! + */ + public Cluster(int[] value) + { this.value = value; } } +