import org.forester.io.parsers.nhx.NHXFormatException;
import org.forester.io.parsers.nhx.NHXParser;
-import org.forester.io.parsers.util.PhylogenyParserException;
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;
public class PhylogenyNode implements PhylogenyNodeI, Comparable<PhylogenyNode> {
- /** 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;
setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!)
}
- public PhylogenyNode( final String nhx ) throws NHXFormatException {
- this( nhx, ForesterUtil.TAXONOMY_EXTRACTION.NO );
- }
-
- public PhylogenyNode( final String nhx, final ForesterUtil.TAXONOMY_EXTRACTION taxonomy_extraction )
- throws NHXFormatException {
- init();
- NHXParser.parseNHX( nhx, this, taxonomy_extraction, false );
- setId( PhylogenyNode.getNodeCount() );
- PhylogenyNode.increaseNodeCount();
- setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!)
- }
-
- /**
- * Constructor for PhylogenyNode.
- * <p>
- *
- * @param s
- * String representing one PhylogenyNode in New Hampshire (NH) or
- * New Hampshire X (NHX) format.
- * @throws NHXFormatException
- * @throws PhylogenyParserException
- */
- public PhylogenyNode( final String nhx,
- final ForesterUtil.TAXONOMY_EXTRACTION taxonomy_extraction,
- final boolean replace_underscores ) throws NHXFormatException {
- init();
- NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores );
- 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.
return current_node;
}
+ 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 ( 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.isCollapse() || ( current_node.getNumberOfDescendants() == 1 ) || previous_node
+ .isLastChildNode() ) ) {
+ index = current_node.getChildNodeIndex();
+ previous_node = current_node;
+ current_node = current_node.getParent();
+ }
+ 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();
_x = 0;
_y = 0;
//_node_name = "";
- _distance_parent = PhylogenyNode.DISTANCE_DEFAULT;
+ _distance_parent = PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
_collapse = false;
_link = null;
_branch_data = null;
// ---------------------------------------------------------
// 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() ) ) {
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();
}
sb.append( name );
}
}
- if ( getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+ if ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
sb.append( ":" );
sb.append( getDistanceToParent() );
}
synchronized final static void setNodeCount( final int i ) {
PhylogenyNode._node_count = i;
}
+
+ public static PhylogenyNode createInstanceFromNhxString( final String nhx ) throws NHXFormatException {
+ return new PhylogenyNode( nhx, PhylogenyMethods.TAXONOMY_EXTRACTION.NO, false );
+ }
+
+ public static PhylogenyNode createInstanceFromNhxString( final String nhx,
+ final PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction )
+ throws NHXFormatException {
+ return new PhylogenyNode( nhx, taxonomy_extraction, false );
+ }
+
+ public static PhylogenyNode createInstanceFromNhxString( final String nhx,
+ 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 PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction,
+ final boolean replace_underscores ) throws NHXFormatException {
+ init();
+ NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores );
+ setId( PhylogenyNode.getNodeCount() );
+ PhylogenyNode.increaseNodeCount();
+ setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!)
+ }
}