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.
*
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, 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!!).
/**
* Adds PhylogenyNode n to the list of child nodes and sets the _parent of n
* to this.
- *
+ *
* @param n
* the PhylogenyNode to add
*/
* 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();
* 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();
@Override
/**
* Based on node name, sequence, and taxonomy.
- *
- *
+ *
+ *
*/
final public boolean equals( final Object o ) {
if ( this == o ) {
}
}
- final public List<PhylogenyNode> getAllDescendants() {
- return _descendants;
- }
-
+
/**
* Returns a List containing references to all external children of this
* PhylogenyNode.
- *
+ *
* @return List of references to external Nodes
*/
final public List<PhylogenyNode> getAllExternalDescendants() {
/**
* 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<String> getAllExternalDescendantsNames() {
/**
* This return child node n of this node.
- *
+ *
* @param n
* the index of the child to get
* @return the child node with index n
/**
* This gets the child node index of this node.
* <p>
- *
+ *
* @return the child node index of this node
* @throws UnsupportedOperationException
* if this node is a root node
* parent
* <p>
* [last modified Aug 14, 2006 by CMZ]
- *
+ *
* @return the child node index of this node
* @throws UnsupportedOperationException
* if this node is a root node
* Convenience method. Returns the first child node of this node.
* <p>
* [last modified May 18, 2005 by CMZ]
- *
+ *
* @return the first child node of this node
*/
public final PhylogenyNode getFirstChildNode() {
* Convenience method. Returns the last child node of this node.
* <p>
* [last modified May 18, 2005 by CMZ]
- *
+ *
* @return the last child node of this node
*/
public final PhylogenyNode getLastChildNode() {
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" );
}
}
return _node_data;
}
+
+ public final boolean isHasNodeData() {
+ return ( !( _node_data == null || _node_data.isEmpty() ) );
+ }
final public int getNumberOfDescendants() {
if ( _descendants == null ) {
/**
* Returns whether this PhylogenyNode should be drawn as collapsed.
+ * Root can not be collapsed.
*/
final public boolean isCollapse() {
- return _collapse;
+ return _collapse && _parent != null;
}
/**
/**
* Checks whether this PhylogenyNode is external (tip).
- *
+ *
* @return true if this PhylogenyNode is external, false otherwise
*/
final public boolean isExternal() {
- if ( _descendants == null ) {
- return true;
- }
- return ( getNumberOfDescendants() < 1 );
+ return ( _descendants == null ) || ( _descendants.size() == 0 );
}
final public boolean isFirstChildNode() {
/**
* Checks whether this PhylogenyNode is internal (tip).
- *
+ *
* @return true if this PhylogenyNode is external, false otherwise
*/
final public boolean isInternal() {
* Returns true if this node is the last child node of its _parent.
* <p>
* [last modified June 01, 2005 by CMZ]
- *
+ *
* @return true if this node is the last child node of its _parent, false
* otherwise
*/
/**
* Checks whether this PhylogenyNode is a root.
- *
+ *
* @return true if this PhylogenyNode is the root, false otherwise
*/
final public boolean isRoot() {
}
/**
- * 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 ) {
}
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 );
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() ) ) {
&& ( 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();
@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() );
sb.append( " " );
}
}
- if ( ( sb.length() <= 1 ) && !ForesterUtil.isEmpty( getName() ) ) {
- sb.append( getName() );
- sb.append( " " );
- }
if ( sb.length() <= 1 ) {
sb.append( "[" );
sb.append( getId() );
/**
* 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
}
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() {