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 );
+ 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 );
// ---------------------------------------------------------
// 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() ) ) {
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() );
&& ( 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();
* 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( ":" );
@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() {