package org.forester.phylogeny;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import org.forester.archaeopteryx.Archaeopteryx;
import org.forester.io.parsers.nhx.NHXFormatException;
import org.forester.io.parsers.nhx.NHXParser;
+import org.forester.io.parsers.phyloxml.PhyloXmlUtil;
import org.forester.phylogeny.data.BranchData;
+import org.forester.phylogeny.data.Confidence;
import org.forester.phylogeny.data.NodeData;
-import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
-import org.forester.phylogeny.factories.PhylogenyFactory;
+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;
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();
.isLastChildNode() ) ) {
index = current_node.getChildNodeIndex();
previous_node = current_node;
- System.out.println(" " + previous_node.getName());
current_node = current_node.getParent();
}
- // if ( !current_node.isCollapse() ) {
- current_node = current_node.getChildNode( index + 1 );
- //}
+ 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 static void main( final String[] args ) {
- try {
- final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
- PhylogenyNode n;
- List<PhylogenyNode> ext = new ArrayList<PhylogenyNode>();
-// final StringBuffer sb0 = new StringBuffer(
-// "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
-// final Phylogeny t0 = factory.create( sb0, new NHXParser() )[ 0 ];
-//
-// t0.getNode( "cd" ).setCollapse( true );
-// t0.getNode( "cde" ).setCollapse( true );
- // n = t0.getFirstExternalNode();
-
-// while ( n != null ) {
-// System.out.println( n.getName() );
-// ext.add( n );
-// n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
-// }
-//
-// // Archaeopteryx.createApplication( t );
-// if ( !ext.get( 0 ).getName().equals( "a" ) ) {
-// System.out.println( "0 fail" );
-// }
-// if ( !ext.get( 1 ).getName().equals( "b" ) ) {
-// System.out.println( "1 fail" );
-// }
-// if ( !ext.get( 2 ).getName().equals( "cde" ) ) {
-// System.out.println( "2 fail" );
-// }
-// if ( !ext.get( 3 ).getName().equals( "f" ) ) {
-// System.out.println( "3 fail" );
-// }
-// if ( !ext.get( 4 ).getName().equals( "g" ) ) {
-// System.out.println( "4 fail" );
-// }
-// if ( !ext.get( 5 ).getName().equals( "h" ) ) {
-// System.out.println( "5 fail" );
-// }
- // if ( !ext.get( 6 ).getName().equals( "a" ) ) {
- // System.out.println( "6 fail" );
- // }
- // if ( !ext.get( 7 ).getName().equals( "a" ) ) {
- // System.out.println( "7 fail" );
- // }
-
-
- final StringBuffer sb1 = new StringBuffer(
- "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
- final Phylogeny t1 = factory.create( sb1, new NHXParser() )[ 0 ];
-
- t1.getNode( "ab" ).setCollapse( true );
- t1.getNode( "cd" ).setCollapse( true );
- t1.getNode( "cde" ).setCollapse( true );
- // n = t1.getFirstExternalNode();
- n = t1.getNode( "ab" );
- ext = new ArrayList<PhylogenyNode>();
- while ( n != null ) {
- System.out.println( n.getName() );
- ext.add( n );
- n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
- }
-
- // Archaeopteryx.createApplication( t1 );
- if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
- System.out.println( "0 fail" );
- }
-
- if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
- System.out.println( "1 fail" );
- }
- if ( !ext.get( 2 ).getName().equals( "f" ) ) {
- System.out.println( "2 fail" );
- }
- if ( !ext.get( 3 ).getName().equals( "g" ) ) {
- System.out.println( "3 fail" );
- }
- if ( !ext.get( 4 ).getName().equals( "h" ) ) {
- System.out.println( "4 fail" );
- }
-
- //
- //
- final StringBuffer sb2 = new StringBuffer(
- "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
- final Phylogeny t2 = factory.create( sb2, new NHXParser() )[ 0 ];
-
- t2.getNode( "ab" ).setCollapse( true );
- t2.getNode( "cd" ).setCollapse( true );
- t2.getNode( "cde" ).setCollapse( true );
- t2.getNode( "c" ).setCollapse( true );
- t2.getNode( "d" ).setCollapse( true );
- t2.getNode( "e" ).setCollapse( true );
- t2.getNode( "gh" ).setCollapse( true );
- // t2.getNode( "h" ).setCollapse( true );
- // n = t1.getFirstExternalNode();
- n = t2.getNode( "ab" );
- ext = new ArrayList<PhylogenyNode>();
- while ( n != null ) {
- System.out.println( n.getName() );
- ext.add( n );
- n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
- }
-
- // Archaeopteryx.createApplication( t1 );
- if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
- System.out.println( "0 fail" );
- }
-
- if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
- System.out.println( "1 fail" );
- }
- if ( !ext.get( 2 ).getName().equals( "f" ) ) {
- System.out.println( "2 fail" );
- }
- if ( !ext.get( 3 ).getName().equals( "g" ) ) {
- System.out.println( "3 fail" );
- }
- if ( !ext.get( 4 ).getName().equals( "h" ) ) {
- System.out.println( "4 fail" );
- }
-
-
- }
- catch ( IOException e ) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
-
+
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 NH_CONVERSION_SUPPORT_VALUE_STYLE svs ) {
final StringBuilder sb = new StringBuilder();
String data = "";
- if ( !ForesterUtil.isEmpty( getName() ) ) {
+ 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 ) );
+ }
+ }
+ else if ( !ForesterUtil.isEmpty( getName() ) ) {
data = getName();
}
else if ( getNodeData().isHasTaxonomy() ) {
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 ( ( svs == NH_CONVERSION_SUPPORT_VALUE_STYLE.IN_SQUARE_BRACKETS ) && !isExternal()
+ && getBranchData().isHasConfidences()
+ && ( 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 ) ) );
+ sb.append( "]" );
+ }
return sb.toString();
}
/**
+ * Swaps the the two childern of a PhylogenyNode node of this Phylogeny.
+ */
+ public void swapChildren() throws RuntimeException {
+ if ( isExternal() ) {
+ throw new RuntimeException( "attempt to swap descendants of external node" );
+ }
+ if ( getNumberOfDescendants() != 2 ) {
+ throw new RuntimeException( "attempt to swap descendants of node with " + getNumberOfDescendants()
+ + " descendants" );
+ }
+ final PhylogenyNode a = getChildNode( 0 );
+ final PhylogenyNode b = getChildNode( 1 );
+ setChildNode( 0, b );
+ setChildNode( 1, a );
+ }
+
+ /**
* Converts this PhylogenyNode to a New Hampshire X (NHX) String
* representation.
*/
sb.append( name );
}
}
- if ( getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+ if ( getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
sb.append( ":" );
sb.append( getDistanceToParent() );
}
}
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 );