in progress...
[jalview.git] / forester / java / src / org / forester / clade_analysis / Analysis.java
index bddd518..4803f54 100644 (file)
 // * 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<PhylogenyNode> 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<String> ext_nodes_names = new ArrayList<>();
         final List<PhylogenyNode> 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<Confidence> 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;
     }
 }