- final static public void transferNodeNameToField( final Phylogeny phy,
- final PhylogenyMethods.PhylogenyNodeField field,
- final boolean external_only ) throws PhyloXmlDataFormatException {
- final PhylogenyNodeIterator it = phy.iteratorPostorder();
- while ( it.hasNext() ) {
- final PhylogenyNode n = it.next();
- if ( external_only && n.isInternal() ) {
- continue;
- }
- final String name = n.getName().trim();
- if ( !ForesterUtil.isEmpty( name ) ) {
- switch ( field ) {
- case TAXONOMY_CODE:
- n.setName( "" );
- setTaxonomyCode( n, name );
- break;
- case TAXONOMY_SCIENTIFIC_NAME:
- n.setName( "" );
- if ( !n.getNodeData().isHasTaxonomy() ) {
- n.getNodeData().setTaxonomy( new Taxonomy() );
- }
- n.getNodeData().getTaxonomy().setScientificName( name );
- break;
- case TAXONOMY_COMMON_NAME:
- n.setName( "" );
- if ( !n.getNodeData().isHasTaxonomy() ) {
- n.getNodeData().setTaxonomy( new Taxonomy() );
- }
- n.getNodeData().getTaxonomy().setCommonName( name );
- break;
- case SEQUENCE_SYMBOL:
- n.setName( "" );
- if ( !n.getNodeData().isHasSequence() ) {
- n.getNodeData().setSequence( new Sequence() );
- }
- n.getNodeData().getSequence().setSymbol( name );
- break;
- case SEQUENCE_NAME:
- n.setName( "" );
- if ( !n.getNodeData().isHasSequence() ) {
- n.getNodeData().setSequence( new Sequence() );
- }
- n.getNodeData().getSequence().setName( name );
- break;
- case TAXONOMY_ID_UNIPROT_1: {
- if ( !n.getNodeData().isHasTaxonomy() ) {
- n.getNodeData().setTaxonomy( new Taxonomy() );
- }
- String id = name;
- final int i = name.indexOf( '_' );
- if ( i > 0 ) {
- id = name.substring( 0, i );
- }
- else {
- n.setName( "" );
- }
- n.getNodeData().getTaxonomy()
- .setIdentifier( new Identifier( id, PhyloXmlUtil.UNIPROT_TAX_PROVIDER ) );
- break;
- }
- case TAXONOMY_ID_UNIPROT_2: {
- if ( !n.getNodeData().isHasTaxonomy() ) {
- n.getNodeData().setTaxonomy( new Taxonomy() );
- }
- String id = name;
- final int i = name.indexOf( '_' );
- if ( i > 0 ) {
- id = name.substring( i + 1, name.length() );
- }
- else {
- n.setName( "" );
- }
- n.getNodeData().getTaxonomy()
- .setIdentifier( new Identifier( id, PhyloXmlUtil.UNIPROT_TAX_PROVIDER ) );
- break;
- }
- case TAXONOMY_ID: {
- if ( !n.getNodeData().isHasTaxonomy() ) {
- n.getNodeData().setTaxonomy( new Taxonomy() );
- }
- n.getNodeData().getTaxonomy().setIdentifier( new Identifier( name ) );
- break;
- }
+ final public static Event getEventAtLCA( final PhylogenyNode n1, final PhylogenyNode n2 ) {
+ return calculateLCA( n1, n2 ).getNodeData().getEvent();
+ }
+
+ /**
+ * Returns taxonomy t if all external descendants have
+ * the same taxonomy t, null otherwise.
+ *
+ */
+ public static Taxonomy getExternalDescendantsTaxonomy( final PhylogenyNode node ) {
+ final List<PhylogenyNode> descs = node.getAllExternalDescendants();
+ Taxonomy tax = null;
+ for( final PhylogenyNode n : descs ) {
+ if ( !n.getNodeData().isHasTaxonomy() || n.getNodeData().getTaxonomy().isEmpty() ) {
+ return null;
+ }
+ else if ( tax == null ) {
+ tax = n.getNodeData().getTaxonomy();
+ }
+ else if ( n.getNodeData().getTaxonomy().isEmpty() || !tax.isEqual( n.getNodeData().getTaxonomy() ) ) {
+ return null;
+ }
+ }
+ return tax;
+ }
+
+ public static PhylogenyNode getFurthestDescendant( final PhylogenyNode node ) {
+ final List<PhylogenyNode> children = node.getAllExternalDescendants();
+ PhylogenyNode farthest = null;
+ double longest = -Double.MAX_VALUE;
+ for( final PhylogenyNode child : children ) {
+ if ( PhylogenyMethods.getDistance( child, node ) > longest ) {
+ farthest = child;
+ longest = PhylogenyMethods.getDistance( child, node );
+ }
+ }
+ return farthest;
+ }
+
+ // public static PhylogenyMethods getInstance() {
+ // if ( PhylogenyMethods._instance == null ) {
+ // PhylogenyMethods._instance = new PhylogenyMethods();
+ // }
+ // return PhylogenyMethods._instance;
+ // }
+ /**
+ * Returns the largest confidence value found on phy.
+ */
+ static public double getMaximumConfidenceValue( final Phylogeny phy ) {
+ double max = -Double.MAX_VALUE;
+ for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {
+ final double s = PhylogenyMethods.getConfidenceValue( iter.next() );
+ if ( ( s != Confidence.CONFIDENCE_DEFAULT_VALUE ) && ( s > max ) ) {
+ max = s;
+ }
+ }
+ return max;
+ }
+
+ static public int getMinimumDescendentsPerInternalNodes( final Phylogeny phy ) {
+ int min = Integer.MAX_VALUE;
+ int d = 0;
+ PhylogenyNode n;
+ for( final PhylogenyNodeIterator it = phy.iteratorPreorder(); it.hasNext(); ) {
+ n = it.next();
+ if ( n.isInternal() ) {
+ d = n.getNumberOfDescendants();
+ if ( d < min ) {
+ min = d;