X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fphylogeny%2FPhylogenyNode.java;h=a65de7cd83e5e3e6e7f983c87a79362c3a163f0a;hb=89d7b6ec1ddc3a3c1e953cf389c24ba7aae7fbfe;hp=c3411086cf3ff5789d3163ab828accc29a23b8e4;hpb=b88e65c78ea0d334aeeb3ad5c23b12b31c05f949;p=jalview.git diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java index c341108..a65de7c 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java @@ -33,7 +33,9 @@ import java.util.List; import org.forester.io.parsers.nhx.NHXFormatException; import org.forester.io.parsers.nhx.NHXParser; import org.forester.phylogeny.data.BranchData; +import org.forester.phylogeny.data.Confidence; import org.forester.phylogeny.data.NodeData; +import org.forester.phylogeny.data.PhylogenyDataUtil; import org.forester.phylogeny.iterators.ChildNodeIteratorForward; import org.forester.phylogeny.iterators.PhylogenyNodeIterator; import org.forester.phylogeny.iterators.PreorderTreeIterator; @@ -41,9 +43,7 @@ import org.forester.util.ForesterUtil; public class PhylogenyNode implements PhylogenyNodeI, Comparable { - /** Value of -99.0 is used as default value. */ - public final static double DISTANCE_DEFAULT = -1024.0; - private static int _node_count = 0; + private static int _node_count = 0; private byte _indicator; private int _id; private int _sum_ext_nodes; @@ -413,28 +413,47 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable public final PhylogenyNode getNextExternalNodeWhileTakingIntoAccountCollapsedNodes() { //TODO work on me ~~ - if ( isInternal() ) { - throw new UnsupportedOperationException( "attempt to get next external node of an internal node" ); + if ( isInternal() && !isCollapse() ) { + throw new UnsupportedOperationException( "attempt to get next external node of an uncollapsed internal node" ); } - else if ( isLastExternalNode() ) { + if ( isRoot() ) { + return null; + } + if ( getParent().isCollapse() ) { + throw new UnsupportedOperationException( "attempt to get next external node of node with a collapsed parent" ); + } + // This checks if last node. + PhylogenyNode n = this; + boolean last = true; + while ( !n.isRoot() ) { + if ( !n.isLastChildNode() ) { + last = false; + break; + } + n = n.getParent(); + } + if ( last ) { return null; } int index = getChildNodeIndex(); PhylogenyNode previous_node = this; PhylogenyNode current_node = getParent(); while ( !current_node.isRoot() - && ( ( current_node.getNumberOfDescendants() == 1 ) || previous_node.isLastChildNode() ) ) { + && ( current_node.isCollapse() || ( current_node.getNumberOfDescendants() == 1 ) || previous_node + .isLastChildNode() ) ) { index = current_node.getChildNodeIndex(); previous_node = current_node; current_node = current_node.getParent(); } - current_node = current_node.getChildNode( index + 1 ); - while ( current_node.isInternal() ) { + if ( index < current_node.getNumberOfDescendants() - 1 ) { + current_node = current_node.getChildNode( index + 1 ); + } + while ( current_node.isInternal() && !current_node.isCollapse() ) { current_node = current_node.getFirstChildNode(); } return current_node; } - + public final NodeData getNodeData() { if ( _node_data == null ) { _node_data = new NodeData(); @@ -576,7 +595,7 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable _x = 0; _y = 0; //_node_name = ""; - _distance_parent = PhylogenyNode.DISTANCE_DEFAULT; + _distance_parent = PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT; _collapse = false; _link = null; _branch_data = null; @@ -904,7 +923,9 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable // --------------------------------------------------------- // Writing of Nodes to Strings // --------------------------------------------------------- - final public String toNewHampshire( final boolean simple_nh, final boolean write_distance_to_parent ) { + final public String toNewHampshire( final boolean simple_nh, + final boolean write_distance_to_parent, + final boolean write_support_values_in_brackets ) { final StringBuilder sb = new StringBuilder(); String data = ""; if ( !ForesterUtil.isEmpty( getName() ) ) { @@ -943,10 +964,16 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable sb.append( data ); } } - if ( ( getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) && write_distance_to_parent ) { + if ( write_distance_to_parent && ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { sb.append( ":" ); sb.append( getDistanceToParent() ); } + if ( write_support_values_in_brackets && !isExternal() + && ( getBranchData().getConfidence( 0 ).getValue() != Confidence.CONFIDENCE_DEFAULT_VALUE ) ) { + sb.append( "[" ); + sb.append( getBranchData().getConfidence( 0 ).getValue() ); + sb.append( "]" ); + } return sb.toString(); } @@ -968,7 +995,7 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable sb.append( name ); } } - if ( getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) { + if ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) { sb.append( ":" ); sb.append( getDistanceToParent() ); } @@ -1030,24 +1057,24 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable } public static PhylogenyNode createInstanceFromNhxString( final String nhx ) throws NHXFormatException { - return new PhylogenyNode( nhx, ForesterUtil.TAXONOMY_EXTRACTION.NO, false ); + return new PhylogenyNode( nhx, PhylogenyMethods.TAXONOMY_EXTRACTION.NO, false ); } public static PhylogenyNode createInstanceFromNhxString( final String nhx, - final ForesterUtil.TAXONOMY_EXTRACTION taxonomy_extraction ) + final PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction ) throws NHXFormatException { return new PhylogenyNode( nhx, taxonomy_extraction, false ); } public static PhylogenyNode createInstanceFromNhxString( final String nhx, - final ForesterUtil.TAXONOMY_EXTRACTION taxonomy_extraction, + final PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction, final boolean replace_underscores ) throws NHXFormatException { return new PhylogenyNode( nhx, taxonomy_extraction, replace_underscores ); } private PhylogenyNode( final String nhx, - final ForesterUtil.TAXONOMY_EXTRACTION taxonomy_extraction, + final PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction, final boolean replace_underscores ) throws NHXFormatException { init(); NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores );