X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FNJTree.java;h=67ce460bb5ba8b158528c421641a603a5495382b;hb=797df64fa2a0a30773d0f48f5494d4155e5a8be3;hp=13ba909eac5a616ab678f7224d764b2fc05fe12b;hpb=509bee00fcac9f93f21c2a5fd5698ed6584fbca7;p=jalview.git diff --git a/src/jalview/analysis/NJTree.java b/src/jalview/analysis/NJTree.java old mode 100755 new mode 100644 index 13ba909..67ce460 --- a/src/jalview/analysis/NJTree.java +++ b/src/jalview/analysis/NJTree.java @@ -1,20 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.analysis; @@ -90,11 +89,11 @@ public class NJTree * and original alignment data represented by Cigar strings. * * @param seqs - * SequenceI[] + * SequenceI[] * @param odata - * Cigar[] + * Cigar[] * @param treefile - * NewickFile + * NewickFile */ public NJTree(SequenceI[] seqs, AlignmentView odata, NewickFile treefile) { @@ -115,9 +114,9 @@ public class NJTree * Creates a new NJTree object from a tree from an external source * * @param seqs - * SequenceI which should be associated with leafs of treefile + * SequenceI which should be associated with leafs of treefile * @param treefile - * A parsed tree + * A parsed tree */ public NJTree(SequenceI[] seqs, NewickFile treefile) { @@ -196,15 +195,15 @@ public class NJTree * Creates a new NJTree object. * * @param sequence - * DOCUMENT ME! + * DOCUMENT ME! * @param type - * DOCUMENT ME! + * DOCUMENT ME! * @param pwtype - * DOCUMENT ME! + * DOCUMENT ME! * @param start - * DOCUMENT ME! + * DOCUMENT ME! * @param end - * DOCUMENT ME! + * DOCUMENT ME! */ public NJTree(SequenceI[] sequence, AlignmentView seqData, String type, String pwtype, int start, int end) @@ -228,7 +227,7 @@ public class NJTree sdata.addOperation(CigarArray.M, end - start + 1); this.seqData = new AlignmentView(sdata, start); } - + // System.err.println("Made seqData");// dbg if (!(type.equals("NJ"))) { type = "AV"; @@ -238,7 +237,7 @@ public class NJTree { if (ResidueProperties.getScoreMatrix(pwtype) == null) { - type = "BLOSUM62"; + pwtype = "BLOSUM62"; } } @@ -256,24 +255,28 @@ public class NJTree distance = findDistances(this.seqData .getSequenceStrings(Comparison.GapChars.charAt(0))); - + // System.err.println("Made distances");// dbg makeLeaves(); + // System.err.println("Made leaves");// dbg noClus = cluster.size(); cluster(); + // System.err.println("Made clusters");// dbg + } /** - * DOCUMENT ME! + * Generate a string representation of the Tree * - * @return DOCUMENT ME! + * @return Newick File with all tree data available */ public String toString() { jalview.io.NewickFile fout = new jalview.io.NewickFile(getTopNode()); - return fout.print(false, true); // distances only + return fout.print(isHasBootstrap(), + isHasDistances(), isHasRootDistance()); // output all data available for tree } /** @@ -281,7 +284,7 @@ public class NJTree * used when the alignment associated to a tree has changed. * * @param alignment - * Vector + * Vector */ public void UpdatePlaceHolders(Vector alignment) { @@ -343,7 +346,24 @@ public class NJTree } } } + /** + * rename any nodes according to their associated sequence. + * This will modify the tree's metadata! (ie the original NewickFile or newly generated BinaryTree's label data) + */ + public void renameAssociatedNodes() { + applyToNodes(new NodeTransformI() { + @Override + public void transform(BinaryNode node) + { + Object el = node.element(); + if (el!=null && el instanceof SequenceI) + { + node.setName(((SequenceI)el).getName()); + } + } + }); + } /** * DOCUMENT ME! */ @@ -403,9 +423,9 @@ public class NJTree * DOCUMENT ME! * * @param i - * DOCUMENT ME! + * DOCUMENT ME! * @param j - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! */ @@ -471,11 +491,11 @@ public class NJTree * DOCUMENT ME! * * @param tmpi - * DOCUMENT ME! + * DOCUMENT ME! * @param tmpj - * DOCUMENT ME! + * DOCUMENT ME! * @param dist - * DOCUMENT ME! + * DOCUMENT ME! */ public void findNewNJDistances(SequenceNode tmpi, SequenceNode tmpj, float dist) @@ -499,11 +519,11 @@ public class NJTree * DOCUMENT ME! * * @param tmpi - * DOCUMENT ME! + * DOCUMENT ME! * @param tmpj - * DOCUMENT ME! + * DOCUMENT ME! * @param dist - * DOCUMENT ME! + * DOCUMENT ME! */ public void findNewDistances(SequenceNode tmpi, SequenceNode tmpj, float dist) @@ -534,9 +554,9 @@ public class NJTree * DOCUMENT ME! * * @param i - * DOCUMENT ME! + * DOCUMENT ME! * @param j - * DOCUMENT ME! + * DOCUMENT ME! */ public void findClusterDistance(int i, int j) { @@ -570,9 +590,9 @@ public class NJTree * DOCUMENT ME! * * @param i - * DOCUMENT ME! + * DOCUMENT ME! * @param j - * DOCUMENT ME! + * DOCUMENT ME! */ public void findClusterNJDistance(int i, int j) { @@ -603,9 +623,9 @@ public class NJTree * DOCUMENT ME! * * @param i - * DOCUMENT ME! + * DOCUMENT ME! * @param j - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! */ @@ -738,8 +758,9 @@ public class NJTree { try { - score += pwmatrix.getPairwiseScore(sequenceString[i] - .charAt(k), sequenceString[j].charAt(k)); + score += pwmatrix.getPairwiseScore( + sequenceString[i].charAt(k), + sequenceString[j].charAt(k)); } catch (Exception ex) { System.err.println("err creating BLOSUM62 tree"); @@ -772,15 +793,16 @@ public class NJTree /* * else if (pwtype.equals("SW")) { float max = -1; * - * for (int i = 0; i < (noseqs - 1); i++) { for (int j = i; j < noseqs; j++) { - * AlignSeq as = new AlignSeq(sequence[i], sequence[j], "pep"); + * 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(System.out); * distance[i][j] = (float) as.maxscore; * * if (max < distance[i][j]) { max = distance[i][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]; } } }/ + * 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]; + * } } }/ */ } @@ -811,9 +833,9 @@ public class NJTree * Search for leaf nodes. * * @param node - * root node to search from + * root node to search from * @param leaves - * Vector of leaves to add leaf node objects too. + * Vector of leaves to add leaf node objects too. * * @return Vector of leaf nodes on binary tree */ @@ -825,7 +847,7 @@ public class NJTree } if ((node.left() == null) && (node.right() == null)) // Interior node - // detection + // detection { leaves.addElement(node); @@ -848,9 +870,9 @@ public class NJTree * Find the leaf node with a particular ycount * * @param node - * initial point on tree to search from + * initial point on tree to search from * @param count - * value to search for + * value to search for * * @return null or the node with ycound=count */ @@ -863,7 +885,6 @@ public class NJTree /* * #see findLeaf(SequenceNode node, count) - * */ public Object _findLeaf(SequenceNode node, int count) { @@ -891,7 +912,7 @@ public class NJTree * printNode is mainly for debugging purposes. * * @param node - * SequenceNode + * SequenceNode */ public void printNode(SequenceNode node) { @@ -919,7 +940,7 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! */ public void findMaxDist(SequenceNode node) { @@ -969,9 +990,9 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! * @param threshold - * DOCUMENT ME! + * DOCUMENT ME! */ public void groupNodes(SequenceNode node, float threshold) { @@ -995,7 +1016,7 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! */ @@ -1116,7 +1137,7 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! */ public void printN(SequenceNode node) { @@ -1145,29 +1166,39 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! */ public void reCount(SequenceNode node) { ycount = 0; + _lycount = 0; + // _lylimit = this.node.size(); _reCount(node); } + private long _lycount = 0, _lylimit = 0; + /** * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! */ public void _reCount(SequenceNode node) { + // if (_lycount<_lylimit) + // { + // System.err.println("Warning: depth of _recount greater than number of nodes."); + // } if (node == null) { return; } + _lycount++; if ((node.left() != null) && (node.right() != null)) { + _reCount((SequenceNode) node.left()); _reCount((SequenceNode) node.right()); @@ -1182,13 +1213,14 @@ public class NJTree ((SequenceNode) node).count = 1; ((SequenceNode) node).ycount = ycount++; } + _lycount--; } /** * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! */ public void swapNodes(SequenceNode node) { @@ -1207,9 +1239,9 @@ public class NJTree * DOCUMENT ME! * * @param node - * DOCUMENT ME! + * DOCUMENT ME! * @param dir - * DOCUMENT ME! + * DOCUMENT ME! */ public void changeDirection(SequenceNode node, SequenceNode dir) { @@ -1308,14 +1340,16 @@ public class NJTree { return hasRootDistance; } + /** * apply the given transform to all the nodes in the tree. + * * @param nodeTransformI */ public void applyToNodes(NodeTransformI nodeTransformI) { - for (Enumeration nodes = node.elements(); nodes.hasMoreElements(); - nodeTransformI.transform((BinaryNode)nodes.nextElement())) + for (Enumeration nodes = node.elements(); nodes.hasMoreElements(); nodeTransformI + .transform((BinaryNode) nodes.nextElement())) ; } } @@ -1334,7 +1368,7 @@ class Cluster * Creates a new Cluster object. * * @param value - * DOCUMENT ME! + * DOCUMENT ME! */ public Cluster(int[] value) {