X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fclade_analysis%2FAnalysis.java;h=4803f54f2da0a6ffab0ed6755ffee4347887872b;hb=3830877262aa9098f0bdecc7e7d3b171f6d8f527;hp=bddd51826ef8a87cbb2bd3e8311884a5ecf98355;hpb=c0c53d86b63599b080b7c42d80332ad9683b92d6;p=jalview.git diff --git a/forester/java/src/org/forester/clade_analysis/Analysis.java b/forester/java/src/org/forester/clade_analysis/Analysis.java index bddd518..4803f54 100644 --- a/forester/java/src/org/forester/clade_analysis/Analysis.java +++ b/forester/java/src/org/forester/clade_analysis/Analysis.java @@ -27,21 +27,21 @@ // * Multiple "hits" with different "M" values // * More tests (including multiple children per node), especially on edge cases // * Utilize relevant support values for warnings -// * Better system for "clade label creation" (e.g. 1.3.4 + 1.3.6 -> 1.3), use -// specific separator (eg . | _ ) package org.forester.clade_analysis; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyNode; +import org.forester.phylogeny.data.Confidence; import org.forester.util.ForesterUtil; public final class Analysis { - public static Result execute( final Phylogeny p, final String query ) { + public static Result execute( final Phylogeny p, final String query, final String separator ) { final PhylogenyNode qnode = p.getNode( query ); if ( qnode.isRoot() ) { throw new IllegalStateException( "Unexpected error: Query " + query @@ -51,8 +51,14 @@ public final class Analysis { throw new IllegalStateException( "Unexpected error: Parent of query " + query + " is root. This should have never happened" ); } - final PhylogenyNode qnode_p = qnode.getParent(); - final PhylogenyNode qnode_pp = qnode.getParent().getParent(); + PhylogenyNode qnode_p = qnode.getParent(); + PhylogenyNode qnode_pp = qnode.getParent().getParent(); + while ( qnode_p.getNumberOfDescendants() == 1 ) { + qnode_p = qnode_p.getParent(); + } + while ( qnode_pp.getNumberOfDescendants() == 1 ) { + qnode_pp = qnode_pp.getParent(); + } final List qnode_ext_nodes = qnode_pp.getAllExternalDescendants(); final int lec_ext_nodes = qnode_ext_nodes.size() - 1; final int p_ext_nodes = p.getNumberOfExternalNodes() - 1; @@ -67,7 +73,7 @@ public final class Analysis { qnode_ext_nodes_names.add( name ); } } - final String greatest_common_prefix = ForesterUtil.greatestCommonPrefix( qnode_ext_nodes_names ); + final String greatest_common_prefix = ForesterUtil.greatestCommonPrefix( qnode_ext_nodes_names, separator ); final Result res = new Result(); if ( greatest_common_prefix.length() < 1 ) { res.addWarning( "No greatest common prefix" ); @@ -81,17 +87,34 @@ public final class Analysis { } res.setLeastEncompassingCladeSize( lec_ext_nodes ); res.setTreeSize( p_ext_nodes ); - final String greatest_common_prefix_a = analyzeSiblings( qnode_p, qnode_pp ); - res.setGreatestCommonPrefixUp( greatest_common_prefix_a ); - final String greatest_common_prefix_b = analyzeSiblings( qnode, qnode_p ); - res.setGreatestCommonPrefixDown( greatest_common_prefix_b ); + + final String conf = obtainConfidence( qnode_pp ); + if ( conf != null ) { + res.setGreatestCommonCladeSubtreeConfidence(conf); + } + + final String greatest_common_prefix_up[] = analyzeSiblings( qnode_p, qnode_pp, separator ); + res.setGreatestCommonPrefixUp( greatest_common_prefix_up[ 0 ] ); + if ( greatest_common_prefix_up[ 1 ] != null ) { + res.setGreatestCommonCladeUpSubtreeConfidence( greatest_common_prefix_up[ 1 ] ); + } + final String greatest_common_prefix_down[] = analyzeSiblings( qnode, qnode_p, separator ); + res.setGreatestCommonPrefixDown( greatest_common_prefix_down[ 0 ] ); + if ( greatest_common_prefix_down[ 1 ] != null ) { + res.setGreatestCommonCladeDownSubtreeConfidence( greatest_common_prefix_down[ 1 ] ); + } return res; } - private final static String analyzeSiblings( final PhylogenyNode child, final PhylogenyNode parent ) { + + + private final static String[] analyzeSiblings( final PhylogenyNode child, + final PhylogenyNode parent, + final String separator ) { final int child_index = child.getChildNodeIndex(); final List ext_nodes_names = new ArrayList<>(); final List descs = parent.getDescendants(); + String conf = null; for( int i = 0; i < descs.size(); ++i ) { if ( i != child_index ) { final PhylogenyNode d = descs.get( i ); @@ -102,9 +125,36 @@ public final class Analysis { } ext_nodes_names.add( name.trim() ); } + if ( descs.size() == 2 ) { + conf = obtainConfidence( d ); + } + } + } + final String greatest_common_prefix = ForesterUtil.greatestCommonPrefix( ext_nodes_names, separator ); + return new String[] { greatest_common_prefix, conf }; + } + + private final static String obtainConfidence( final PhylogenyNode n ) { + if ( n.getBranchData().getConfidences() != null && n.getBranchData().getConfidences().size() > 0 ) { + final List confidences = n.getBranchData().getConfidences(); + boolean not_first = false; + Collections.sort( confidences ); + final StringBuilder sb = new StringBuilder(); + for( final Confidence confidence : confidences ) { + final double value = confidence.getValue(); + if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) { + if ( not_first ) { + sb.append( " / " ); + } + else { + not_first = true; + } + sb.append( ( ForesterUtil.isEmpty( confidence.getType() ) ? "confidence: " + : confidence.getType() + ": " ) + value ); + } } + return sb.toString(); } - final String greatest_common_prefix = ForesterUtil.greatestCommonPrefix( ext_nodes_names ); - return greatest_common_prefix; + return null; } }