import org.forester.phylogeny.iterators.PreorderTreeIterator;
import org.forester.util.ForesterUtil;
-public class PhylogenyNode implements PhylogenyNodeI, Comparable<PhylogenyNode> {
+public final class PhylogenyNode implements PhylogenyNodeI, Comparable<PhylogenyNode> {
- private static int _node_count = 0;
+ private static int _node_count = 0;
private byte _indicator;
private int _id;
private int _sum_ext_nodes;
private float _x;
private float _y;
- private double _distance_parent;
+ private double _distance_parent = PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
private boolean _collapse;
private PhylogenyNode _parent;
private PhylogenyNode _link;
* Default constructor for PhylogenyNode.
*/
public PhylogenyNode() {
- init();
+ // init();
setId( PhylogenyNode.getNodeCount() );
PhylogenyNode.increaseNodeCount();
setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!)
}
+ public void reset() {
+ _parent = null;
+ _link = null;
+ _descendants = null;
+ _node_data = null;
+ _branch_data = null;
+ }
+
/**
* Adds PhylogenyNode n to the list of child nodes and sets the _parent of n
* to this.
}
final public List<PhylogenyNode> getDescendants() {
+ if ( _descendants == null ) {
+ _descendants = new ArrayList<PhylogenyNode>();
+ }
return _descendants;
}
}
final public int getNumberOfDescendants() {
+ if ( _descendants == null ) {
+ return 0;
+ }
return _descendants.size();
}
return result;
}
- final private void init() {
- _descendants = new ArrayList<PhylogenyNode>();
- _parent = null;
- _id = 0;
- initializeData();
- }
-
+ // final private void init() {
+ //_descendants = new ArrayList<PhylogenyNode>();
+ // _parent = null; //TODO not needed?
+ // _id = 0; //TODO not needed?
+ //initializeData(); //TODO not needed?
+ //}
/**
* Deletes data of this PhylogenyNode. Links to the other Nodes in the
* Phylogeny, the ID and the sum of external nodes are NOT deleted. Field
*
* @see #getLink() (Last modified: 12/20/03)
*/
- final public void initializeData() {
- _indicator = 0;
- _x = 0;
- _y = 0;
- //_node_name = "";
- _distance_parent = PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
- _collapse = false;
- _link = null;
- _branch_data = null;
- _node_data = null;
- }
-
+ // final private void initializeData() {
+ // _indicator = 0;
+ // _x = 0;
+ // _y = 0;
+ // //_node_name = "";
+ // _distance_parent = PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
+ // _collapse = false;
+ // _link = null;
+ // _branch_data = null;
+ // _node_data = null;
+ // }
/**
* Returns whether this PhylogenyNode should be drawn as collapsed.
*/
* @return true if this PhylogenyNode is external, false otherwise
*/
final public boolean isExternal() {
+ if ( _descendants == null ) {
+ return true;
+ }
return ( getNumberOfDescendants() < 1 );
}
/**
* Swaps the the two childern of a PhylogenyNode node of this Phylogeny.
*/
- public void swapChildren() throws RuntimeException {
+ public final void swapChildren() throws RuntimeException {
if ( isExternal() ) {
throw new RuntimeException( "attempt to swap descendants of external node" );
}
@Override
final public String toString() {
- final StringBuilder sb = new StringBuilder();
- if ( !ForesterUtil.isEmpty( getName() ) ) {
+ StringBuilder sb = new StringBuilder();
+ if ( ForesterUtil.isEmpty( getName() ) ) {
sb.append( getName() );
sb.append( " " );
}
- sb.append( "[" );
- sb.append( getId() );
- sb.append( "]" );
- return sb.toString();
+ if ( getNodeData().isHasTaxonomy() ) {
+ if ( !ForesterUtil.isEmpty( getNodeData().getTaxonomy().getScientificName() ) ) {
+ sb.append( getNodeData().getTaxonomy().getScientificName() );
+ sb.append( " " );
+ }
+ else if ( !ForesterUtil.isEmpty( getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
+ sb.append( getNodeData().getTaxonomy().getTaxonomyCode() );
+ sb.append( " " );
+ }
+ else if ( getNodeData().getTaxonomy().getIdentifier() != null ) {
+ sb.append( getNodeData().getTaxonomy().getIdentifier().toString() );
+ sb.append( " " );
+ }
+ }
+ if ( getNodeData().isHasSequence() ) {
+ if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getName() ) ) {
+ sb.append( getNodeData().getSequence().getName() );
+ sb.append( " " );
+ }
+ else if ( !ForesterUtil.isEmpty( getNodeData().getSequence().getSymbol() ) ) {
+ sb.append( getNodeData().getSequence().getSymbol() );
+ sb.append( " " );
+ }
+ else if ( getNodeData().getSequence().getAccession() != null ) {
+ sb.append( getNodeData().getTaxonomy().getIdentifier().toString() );
+ sb.append( " " );
+ }
+ }
+ if ( sb.length() <= 1 ) {
+ sb.append( "[" );
+ sb.append( getId() );
+ sb.append( "]" );
+ }
+ return sb.toString().trim();
}
/**
private PhylogenyNode( final String nhx,
final PhylogenyMethods.TAXONOMY_EXTRACTION taxonomy_extraction,
final boolean replace_underscores ) throws NHXFormatException {
- init();
+ // init();
NHXParser.parseNHX( nhx, this, taxonomy_extraction, replace_underscores );
setId( PhylogenyNode.getNodeCount() );
PhylogenyNode.increaseNodeCount();