X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fphylogeny%2FPhylogenyNode.java;h=9e71765641aed27dc87691bc93bf0c7dec7c9113;hb=f507bf348ffed906d04bc76a614d6778d4cb5d64;hp=d17fd41a1a9bce5c53000d2a4cf4a3b8e381f939;hpb=391381d661a230af98751dd6eba77bb2353c4d3e;p=jalview.git diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java index d17fd41..9e71765 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java @@ -42,7 +42,7 @@ import org.forester.phylogeny.iterators.PreorderTreeIterator; import org.forester.util.ForesterUtil; /** - * Warning. Implementation of method 'compareTo' only looks at + * Warning. Implementation of method 'compareTo' only looks at * node name. Thus, use of this class in SortedSets might lead * to unexpected behavior. * @@ -86,7 +86,23 @@ public final class PhylogenyNode implements Comparable { private PhylogenyNode( final String nhx, final NHXParser.TAXONOMY_EXTRACTION taxonomy_extraction, final boolean replace_underscores ) throws NHXFormatException, PhyloXmlDataFormatException { - NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores, false ); + NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores, false, false, false ); + setId( PhylogenyNode.getNodeCount() ); + PhylogenyNode.increaseNodeCount(); + setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!). + } + + private PhylogenyNode( final String nhx, + final NHXParser.TAXONOMY_EXTRACTION taxonomy_extraction, + final boolean replace_underscores, + final boolean parse_extended_tags ) throws NHXFormatException, PhyloXmlDataFormatException { + NHXParser.parseNHX( nhx, + this, + taxonomy_extraction, + replace_underscores, + false, + false, + parse_extended_tags ); setId( PhylogenyNode.getNodeCount() ); PhylogenyNode.increaseNodeCount(); setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!). @@ -95,7 +111,7 @@ public final class PhylogenyNode implements Comparable { /** * Adds PhylogenyNode n to the list of child nodes and sets the _parent of n * to this. - * + * * @param n * the PhylogenyNode to add */ @@ -141,8 +157,8 @@ public final class PhylogenyNode implements Comparable { * Returns a new PhylogenyNode which has its data copied from this * PhylogenyNode. Links to the other Nodes in the same Phylogeny are NOT * copied (e.g. _link to _parent). Field "_link" IS copied. - * - * @see #getLink() + * + * @see #getLink() */ final public PhylogenyNode copyNodeData() { final PhylogenyNode node = new PhylogenyNode(); @@ -168,8 +184,8 @@ public final class PhylogenyNode implements Comparable { * Returns a new PhylogenyNode which has the same data as this * PhylogenyNode. Links to the other Nodes in the same Phylogeny are NOT * copied (e.g. _link to _parent). Field "_link" IS copied. - * - * @see #getLink() + * + * @see #getLink() */ final public PhylogenyNode copyNodeDataShallow() { final PhylogenyNode node = new PhylogenyNode(); @@ -190,8 +206,8 @@ public final class PhylogenyNode implements Comparable { @Override /** * Based on node name, sequence, and taxonomy. - * - * + * + * */ final public boolean equals( final Object o ) { if ( this == o ) { @@ -239,7 +255,7 @@ public final class PhylogenyNode implements Comparable { /** * Returns a List containing references to all external children of this * PhylogenyNode. - * + * * @return List of references to external Nodes */ final public List getAllExternalDescendants() { @@ -267,7 +283,7 @@ public final class PhylogenyNode implements Comparable { /** * Returns a List containing references to all names of the external * children of this PhylogenyNode. - * + * * @return List of references to names of external Nodes */ final public List getAllExternalDescendantsNames() { @@ -288,7 +304,7 @@ public final class PhylogenyNode implements Comparable { /** * This return child node n of this node. - * + * * @param n * the index of the child to get * @return the child node with index n @@ -327,7 +343,7 @@ public final class PhylogenyNode implements Comparable { /** * This gets the child node index of this node. *

- * + * * @return the child node index of this node * @throws UnsupportedOperationException * if this node is a root node @@ -341,7 +357,7 @@ public final class PhylogenyNode implements Comparable { * parent *

* [last modified Aug 14, 2006 by CMZ] - * + * * @return the child node index of this node * @throws UnsupportedOperationException * if this node is a root node @@ -377,7 +393,7 @@ public final class PhylogenyNode implements Comparable { * Convenience method. Returns the first child node of this node. *

* [last modified May 18, 2005 by CMZ] - * + * * @return the first child node of this node */ public final PhylogenyNode getFirstChildNode() { @@ -402,7 +418,7 @@ public final class PhylogenyNode implements Comparable { * Convenience method. Returns the last child node of this node. *

* [last modified May 18, 2005 by CMZ] - * + * * @return the last child node of this node */ public final PhylogenyNode getLastChildNode() { @@ -452,12 +468,12 @@ public final class PhylogenyNode implements Comparable { public final PhylogenyNode getNextExternalNodeWhileTakingIntoAccountCollapsedNodes() { //TODO work on me ~~ - if ( isInternal() && !isCollapse() ) { - throw new UnsupportedOperationException( "attempt to get next external node of an uncollapsed internal node" ); - } if ( isRoot() ) { return null; } + if ( isInternal() && !isCollapse() ) { + throw new UnsupportedOperationException( "attempt to get next external node of an uncollapsed internal node" ); + } if ( getParent().isCollapse() ) { throw new UnsupportedOperationException( "attempt to get next external node of node with a collapsed parent" ); } @@ -499,6 +515,10 @@ public final class PhylogenyNode implements Comparable { } return _node_data; } + + public final boolean isHasNodeData() { + return ( !( _node_data == null || _node_data.isEmpty() ) ); + } final public int getNumberOfDescendants() { if ( _descendants == null ) { @@ -597,9 +617,10 @@ public final class PhylogenyNode implements Comparable { /** * Returns whether this PhylogenyNode should be drawn as collapsed. + * Root can not be collapsed. */ final public boolean isCollapse() { - return _collapse; + return _collapse && _parent != null; } /** @@ -616,7 +637,7 @@ public final class PhylogenyNode implements Comparable { /** * Checks whether this PhylogenyNode is external (tip). - * + * * @return true if this PhylogenyNode is external, false otherwise */ final public boolean isExternal() { @@ -663,7 +684,7 @@ public final class PhylogenyNode implements Comparable { /** * Checks whether this PhylogenyNode is internal (tip). - * + * * @return true if this PhylogenyNode is external, false otherwise */ final public boolean isInternal() { @@ -674,7 +695,7 @@ public final class PhylogenyNode implements Comparable { * Returns true if this node is the last child node of its _parent. *

* [last modified June 01, 2005 by CMZ] - * + * * @return true if this node is the last child node of its _parent, false * otherwise */ @@ -701,7 +722,7 @@ public final class PhylogenyNode implements Comparable { /** * Checks whether this PhylogenyNode is a root. - * + * * @return true if this PhylogenyNode is the root, false otherwise */ final public boolean isRoot() { @@ -768,14 +789,14 @@ public final class PhylogenyNode implements Comparable { } /** - * Inserts PhylogenyNode n at the specified position i into the list of + * Inserts PhylogenyNode node at the specified position i into the list of * child nodes. This does not allow null slots in the list of child nodes: - * If i is larger than the number of child nodes, n is just added to the - * list, not place at index i. - * + * If i is larger than the number of child nodes, node is just added to the + * list, not placed at index i. + * * @param i * the index of position where to add the child - * @param n + * @param node * the PhylogenyNode to add */ final public void setChildNode( final int i, final PhylogenyNode node ) { @@ -876,7 +897,7 @@ public final class PhylogenyNode implements Comparable { } if ( getNumberOfDescendants() != 2 ) { throw new RuntimeException( "attempt to swap descendants of node with " + getNumberOfDescendants() - + " descendants" ); + + " descendants" ); } final PhylogenyNode a = getChildNode( 0 ); final PhylogenyNode b = getChildNode( 1 ); @@ -887,17 +908,15 @@ public final class PhylogenyNode implements 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 write_distance_to_parent, final NH_CONVERSION_SUPPORT_VALUE_STYLE svs ) { - final StringBuilder sb = new StringBuilder(); String data = ""; if ( ( svs == NH_CONVERSION_SUPPORT_VALUE_STYLE.AS_INTERNAL_NODE_NAMES ) && !isExternal() ) { if ( getBranchData().isHasConfidences() && ( getBranchData().getConfidence( 0 ).getValue() != Confidence.CONFIDENCE_DEFAULT_VALUE ) ) { data = Confidence.FORMATTER.format( ForesterUtil - .round( getBranchData().getConfidence( 0 ).getValue(), - PhyloXmlUtil.ROUNDING_DIGITS_FOR_PHYLOXML_DOUBLE_OUTPUT ) ); + .round( getBranchData().getConfidence( 0 ).getValue(), + PhyloXmlUtil.ROUNDING_DIGITS_FOR_PHYLOXML_DOUBLE_OUTPUT ) ); } } else if ( !ForesterUtil.isEmpty( getName() ) ) { @@ -913,29 +932,19 @@ public final class PhylogenyNode implements Comparable { else if ( !ForesterUtil.isEmpty( getNodeData().getTaxonomy().getCommonName() ) ) { data = getNodeData().getTaxonomy().getCommonName(); } - else if ( getNodeData().getTaxonomy().getTaxonomyCode() != null ) { - data = getNodeData().getTaxonomy().getTaxonomyCode(); - } } else if ( getNodeData().isHasSequence() ) { if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getName() ) ) { data = getNodeData().getSequence().getName(); } - } - if ( data.length() > 0 ) { - data = ForesterUtil.replaceIllegalNhCharacters( data ); - if ( simple_nh && ( data.length() > 10 ) ) { - data = data.substring( 0, 11 ); - } - if ( ForesterUtil.isContainsParanthesesableNhCharacter( data ) ) { - sb.append( '\'' ); - sb.append( data ); - sb.append( '\'' ); + else if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getSymbol() ) ) { + data = getNodeData().getSequence().getSymbol(); } - else { - sb.append( data ); + else if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getGeneName() ) ) { + data = getNodeData().getSequence().getGeneName(); } } + final StringBuilder sb = ForesterUtil.santitizeStringForNH( data ); if ( write_distance_to_parent && ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { sb.append( ":" ); sb.append( getDistanceToParent() ); @@ -945,8 +954,8 @@ public final class PhylogenyNode implements Comparable { && ( getBranchData().getConfidence( 0 ).getValue() != Confidence.CONFIDENCE_DEFAULT_VALUE ) ) { sb.append( "[" ); sb.append( Confidence.FORMATTER.format( ForesterUtil - .round( getBranchData().getConfidence( 0 ).getValue(), - PhyloXmlUtil.ROUNDING_DIGITS_FOR_PHYLOXML_DOUBLE_OUTPUT ) ) ); + .round( getBranchData().getConfidence( 0 ).getValue(), + PhyloXmlUtil.ROUNDING_DIGITS_FOR_PHYLOXML_DOUBLE_OUTPUT ) ) ); sb.append( "]" ); } return sb.toString(); @@ -957,18 +966,10 @@ public final class PhylogenyNode implements Comparable { * representation. */ final public String toNewHampshireX() { - final StringBuffer sb = new StringBuffer(); + final StringBuilder sb = new StringBuilder(); final StringBuffer s_nhx = new StringBuffer(); if ( !ForesterUtil.isEmpty( getName() ) ) { - final String name = ForesterUtil.replaceIllegalNhCharacters( getName() ); - if ( ForesterUtil.isContainsParanthesesableNhCharacter( name ) ) { - sb.append( '\'' ); - sb.append( name ); - sb.append( '\'' ); - } - else { - sb.append( name ); - } + sb.append( ForesterUtil.santitizeStringForNH( getName() ) ); } if ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) { sb.append( ":" ); @@ -991,6 +992,10 @@ public final class PhylogenyNode implements Comparable { @Override final public String toString() { final StringBuilder sb = new StringBuilder(); + if ( !ForesterUtil.isEmpty( getName() ) ) { + sb.append( getName() ); + sb.append( " " ); + } if ( getNodeData().isHasTaxonomy() ) { if ( !ForesterUtil.isEmpty( getNodeData().getTaxonomy().getScientificName() ) ) { sb.append( getNodeData().getTaxonomy().getScientificName() ); @@ -1022,10 +1027,10 @@ public final class PhylogenyNode implements Comparable { sb.append( getNodeData().getSequence().getAccession().toString() ); sb.append( " " ); } - } - if ( ( sb.length() <= 1 ) && !ForesterUtil.isEmpty( getName() ) ) { - sb.append( getName() ); - sb.append( " " ); + if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getMolecularSequence() ) ) { + sb.append( getNodeData().getSequence().getMolecularSequence() ); + sb.append( " " ); + } } if ( sb.length() <= 1 ) { sb.append( "[" ); @@ -1076,7 +1081,7 @@ public final class PhylogenyNode implements Comparable { /** * Adds PhylogenyNode n to the list of child nodes. But does NOT set the * _parent of n to this. - * + * * @see addAsChild( PhylogenyNode n ) * @param n * the PhylogenyNode to add @@ -1086,26 +1091,34 @@ public final class PhylogenyNode implements Comparable { } public static PhylogenyNode createInstanceFromNhxString( final String nhx ) throws NHXFormatException, - PhyloXmlDataFormatException { + PhyloXmlDataFormatException { return new PhylogenyNode( nhx, NHXParser.TAXONOMY_EXTRACTION.NO, false ); } public static PhylogenyNode createInstanceFromNhxString( final String nhx, final NHXParser.TAXONOMY_EXTRACTION taxonomy_extraction ) - throws NHXFormatException, PhyloXmlDataFormatException { + throws NHXFormatException, PhyloXmlDataFormatException { return new PhylogenyNode( nhx, taxonomy_extraction, false ); } public static PhylogenyNode createInstanceFromNhxString( final String nhx, final NHXParser.TAXONOMY_EXTRACTION taxonomy_extraction, final boolean replace_underscores ) - throws NHXFormatException, PhyloXmlDataFormatException { + throws NHXFormatException, PhyloXmlDataFormatException { return new PhylogenyNode( nhx, taxonomy_extraction, replace_underscores ); } + + public static PhylogenyNode createInstanceFromNhxString( final String nhx, + final NHXParser.TAXONOMY_EXTRACTION taxonomy_extraction, + final boolean replace_underscores, + final boolean parse_extended_tags ) + throws NHXFormatException, PhyloXmlDataFormatException { + return new PhylogenyNode( nhx, taxonomy_extraction, replace_underscores, parse_extended_tags ); + } /** * Returns the total number of all Nodes created so far. - * + * * @return total number of Nodes (long) */ synchronized final public static long getNodeCount() {