import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.forester.io.parsers.nhx.NHXParser;
import org.forester.io.writers.PhylogenyWriter;
new_node.setParent( sibling_parent );
sibling.setParent( new_node );
sibling_parent.setChildNode( sibling_index, new_node );
- final double new_dist = sibling.getDistanceToParent() == PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ? PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT
- : sibling.getDistanceToParent() / 2;
+ final double new_dist = sibling.getDistanceToParent() == PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT
+ ? PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT : sibling.getDistanceToParent() / 2;
new_node.setDistanceToParent( new_dist );
sibling.setDistanceToParent( new_dist );
externalNodesHaveChanged();
* the root-node of a subtree
* @return the height of the subtree emanating at n
*/
- public double calculateSubtreeHeight( final PhylogenyNode n ) {
- if ( n.isExternal() || n.isCollapse() ) {
- return ForesterUtil.isLargerOrEqualToZero( n.getDistanceToParent() );
+ public double calculateSubtreeHeight( final PhylogenyNode n, final boolean take_collapse_into_account ) {
+ if ( n.isExternal() || ( take_collapse_into_account && n.isCollapse() ) ) {
+ return n.getDistanceToParent() > 0 ? n.getDistanceToParent() : 0;
}
else {
double max = -Double.MAX_VALUE;
for( int i = 0; i < n.getNumberOfDescendants(); ++i ) {
- final double l = calculateSubtreeHeight( n.getChildNode( i ) );
+ final double l = calculateSubtreeHeight( n.getChildNode( i ), take_collapse_into_account );
if ( l > max ) {
max = l;
}
}
- return max + ForesterUtil.isLargerOrEqualToZero( n.getDistanceToParent() );
+ return max + ( n.getDistanceToParent() > 0 ? n.getDistanceToParent() : 0 );
}
}
if ( p.getNumberOfDescendants() == 2 ) {
final int pi = p.getChildNodeIndex();
if ( removed_node.isFirstChildNode() ) {
- p.getChildNode( 1 ).setDistanceToParent( PhylogenyMethods.addPhylogenyDistances( p
- .getDistanceToParent(), p.getChildNode( 1 ).getDistanceToParent() ) );
+ p.getChildNode( 1 )
+ .setDistanceToParent( PhylogenyMethods.addPhylogenyDistances( p.getDistanceToParent(),
+ p.getChildNode( 1 )
+ .getDistanceToParent() ) );
pp.setChildNode( pi, p.getChildNode( 1 ) );
}
else {
- p.getChildNode( 0 ).setDistanceToParent( PhylogenyMethods.addPhylogenyDistances( p
- .getDistanceToParent(), p.getChildNode( 0 ).getDistanceToParent() ) );
+ p.getChildNode( 0 )
+ .setDistanceToParent( PhylogenyMethods.addPhylogenyDistances( p.getDistanceToParent(),
+ p.getChildNode( 0 )
+ .getDistanceToParent() ) );
pp.setChildNode( pi, p.getChildNode( 0 ) );
}
}
*/
public List<PhylogenyNode> getExternalNodes() {
if ( _external_nodes_set == null ) {
- _external_nodes_set = new ArrayList<PhylogenyNode>();
+ _external_nodes_set = new ArrayList<>();
for( final PhylogenyNodeIterator it = iteratorPostorder(); it.hasNext(); ) {
final PhylogenyNode n = it.next();
if ( n.isExternal() ) {
}
/**
- * Returns the number of duplications of this Phylogeny (int). A return
- * value of -1 indicates that the number of duplications is unknown.
- */
- // public int getNumberOfDuplications() {
- // return _number_of_duplications;
- // } // getNumberOfDuplications()
- /**
- * Sets the number of duplications of this Phylogeny (int). A value of -1
- * indicates that the number of duplications is unknown.
- *
- * @param clean_nh
- * set to true for clean NH format
- */
- // public void setNumberOfDuplications( int i ) {
- // if ( i < 0 ) {
- // _number_of_duplications = -1;
- // }
- // else {
- // _number_of_duplications = i;
- // }
- // } // setNumberOfDuplications( int )
- /**
* Returns the first external PhylogenyNode.
*/
public PhylogenyNode getFirstExternalNode() {
/**
* This calculates the height for rooted, tree-shaped phylogenies. The
- * height is the longest distance from the root to an external node. Please
- * note. Child nodes of collapsed nodes are ignored -- which is useful for
- * display purposes but might be misleading for other applications.
+ * height is the longest distance from the root to an external node.
*
* @return the height for rooted, tree-shaped phylogenies
*/
- public double getHeight() {
+ public double calculateHeight( final boolean take_collapse_into_account ) {
if ( isEmpty() ) {
return 0.0;
}
- return calculateSubtreeHeight( getRoot() );
+ return calculateSubtreeHeight( getRoot(), take_collapse_into_account );
}
public Identifier getIdentifier() {
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( n.getName().equals( name ) ) {
return nodes;
}
+ public List<PhylogenyNode> getNodes( final Pattern p ) {
+ if ( isEmpty() ) {
+ return null;
+ }
+ final List<PhylogenyNode> nodes = new ArrayList<>();
+ for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
+ final PhylogenyNode n = iter.next();
+ if ( n.getName() != null ) {
+ final Matcher m = p.matcher( n.getName() );
+ if ( m.find() ) {
+ nodes.add( n );
+ }
+ }
+ }
+ return nodes;
+ }
+
public List<PhylogenyNode> getNodesViaSequenceName( final String seq_name ) {
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( n.getNodeData().isHasSequence() && n.getNodeData().getSequence().getName().equals( seq_name ) ) {
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( n.getNodeData().isHasSequence() && n.getNodeData().getSequence().getSymbol().equals( seq_name ) ) {
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( n.getNodeData().isHasSequence() && n.getNodeData().getSequence().getGeneName().equals( seq_name ) ) {
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( n.getNodeData().isHasTaxonomy()
if ( isEmpty() ) {
return null;
}
- final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> nodes = new ArrayList<>();
for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
final PhylogenyNode n = iter.next();
if ( PhylogenyMethods.getSpecies( n ).equals( specname ) ) {
public List<PhylogenyNode> getParalogousNodes( final PhylogenyNode n, final String[] taxonomyCodeRange ) {
PhylogenyNode node = n;
PhylogenyNode prev = null;
- final List<PhylogenyNode> v = new ArrayList<PhylogenyNode>();
- final Map<PhylogenyNode, List<String>> map = new HashMap<PhylogenyNode, List<String>>();
+ final List<PhylogenyNode> v = new ArrayList<>();
+ final Map<PhylogenyNode, List<String>> map = new HashMap<>();
getTaxonomyMap( getRoot(), map );
if ( !node.isExternal() || isEmpty() ) {
return null;
taxIdList = map.get( node );
if ( node.isDuplication() && isContains( taxIdList, taxonomyCodeRangeList ) ) {
if ( node.getChildNode1() == prev ) {
- v.addAll( getNodeByTaxonomyID( searchNodeSpeciesId, node.getChildNode2()
- .getAllExternalDescendants() ) );
+ v.addAll( getNodeByTaxonomyID( searchNodeSpeciesId,
+ node.getChildNode2().getAllExternalDescendants() ) );
}
else {
- v.addAll( getNodeByTaxonomyID( searchNodeSpeciesId, node.getChildNode1()
- .getAllExternalDescendants() ) );
+ v.addAll( getNodeByTaxonomyID( searchNodeSpeciesId,
+ node.getChildNode1().getAllExternalDescendants() ) );
}
}
}
public Collection<SequenceRelation.SEQUENCE_RELATION_TYPE> getRelevantSequenceRelationTypes() {
if ( _relevant_sequence_relation_types == null ) {
- _relevant_sequence_relation_types = new Vector<SEQUENCE_RELATION_TYPE>();
+ _relevant_sequence_relation_types = new Vector<>();
}
return _relevant_sequence_relation_types;
}
return true;
}
+ public boolean isCompletelyBinaryAllow3ChildrenAtRoot() {
+ if ( isEmpty() ) {
+ return false;
+ }
+ for( final PhylogenyNodeIterator iter = iteratorPreorder(); iter.hasNext(); ) {
+ final PhylogenyNode node = iter.next();
+ if ( node.isRoot() ) {
+ if ( node.isInternal()
+ && ( ( node.getNumberOfDescendants() != 2 ) && ( node.getNumberOfDescendants() != 3 ) ) ) {
+ return false;
+ }
+ }
+ else {
+ if ( node.isInternal() && ( node.getNumberOfDescendants() != 2 ) ) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
/**
* Checks whether a Phylogeny object is deleted (or empty).
*
}
else {
node.setDistanceToParent( ( c.getDistanceToParent() >= 0.0 ? c.getDistanceToParent() : 0.0 )
- + ( node.getDistanceToParent() >= 0.0 ? node.getDistanceToParent() : 0.0 ) );
+ + ( node.getDistanceToParent() >= 0.0 ? node.getDistanceToParent() : 0.0 ) );
}
if ( c.getBranchDataDirectly() != null ) {
node.setBranchData( ( BranchData ) c.getBranchDataDirectly().copy() );
*/
public void setRooted( final boolean b ) {
_rooted = b;
- } // setRooted( boolean )
+ }
public void setSequenceRelationQueries( final Collection<Sequence> sequencesByName ) {
_sequenceRelationQueries = sequencesByName;
* @return List node with the same taxonomy identifier
*/
private List<PhylogenyNode> getNodeByTaxonomyID( final String taxonomyID, final List<PhylogenyNode> nodes ) {
- final List<PhylogenyNode> retour = new ArrayList<PhylogenyNode>();
+ final List<PhylogenyNode> retour = new ArrayList<>();
for( final PhylogenyNode node : nodes ) {
if ( taxonomyID.equals( PhylogenyMethods.getTaxonomyIdentifier( node ) ) ) {
retour.add( node );
* @return species contains in all leaf under the param node
*/
private List<String> getSubNodeTaxonomy( final PhylogenyNode node ) {
- final List<String> taxonomyList = new ArrayList<String>();
+ final List<String> taxonomyList = new ArrayList<>();
final List<PhylogenyNode> childs = node.getAllExternalDescendants();
String speciesId = null;
for( final PhylogenyNode phylogenyNode : childs ) {