Allow to retrieve a snapshot of the edited phylogenetic tree using javascript code...
[jalview.git] / forester / java / src / org / forester / phylogeny / PhylogenyMethods.java
index f53e41a..2b7fd29 100644 (file)
@@ -41,6 +41,8 @@ import org.forester.phylogeny.data.Confidence;
 import org.forester.phylogeny.data.DomainArchitecture;
 import org.forester.phylogeny.data.Taxonomy;
 import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
+import org.forester.util.BasicDescriptiveStatistics;
+import org.forester.util.DescriptiveStatistics;
 import org.forester.util.FailedConditionCheckException;
 import org.forester.util.ForesterUtil;
 
@@ -271,15 +273,28 @@ public class PhylogenyMethods {
         return max;
     }
 
-    public static int calculateMaximumNumberOfDescendantsPerNode( final Phylogeny phy ) {
-        int max = 0;
+    public static DescriptiveStatistics calculatNumberOfDescendantsPerNodeStatistics( final Phylogeny phy ) {
+        final DescriptiveStatistics stats = new BasicDescriptiveStatistics();
         for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {
-            final PhylogenyNode node = iter.next();
-            if ( node.getNumberOfDescendants() > max ) {
-                max = node.getNumberOfDescendants();
+            final PhylogenyNode n = iter.next();
+            if ( !n.isExternal() ) {
+                stats.addValue( n.getNumberOfDescendants() );
             }
         }
-        return max;
+        return stats;
+    }
+
+    public static DescriptiveStatistics calculatConfidenceStatistics( final Phylogeny phy ) {
+        final DescriptiveStatistics stats = new BasicDescriptiveStatistics();
+        for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {
+            final PhylogenyNode n = iter.next();
+            if ( !n.isExternal() ) {
+                if ( n.getBranchData().isHasConfidences() ) {
+                    stats.addValue( n.getBranchData().getConfidence( 0 ).getValue() );
+                }
+            }
+        }
+        return stats;
     }
 
     /**
@@ -970,15 +985,16 @@ public class PhylogenyMethods {
                     }
                 }
             }
-            else if ( node.getNodeData().isHasSequence()
+            if ( !match && node.getNodeData().isHasSequence()
                     && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial ) ) {
                 match = true;
             }
-            else if ( node.getNodeData().isHasSequence()
+            if ( !match && node.getNodeData().isHasSequence()
                     && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial ) ) {
                 match = true;
             }
-            else if ( node.getNodeData().isHasSequence()
+            if ( !match
+                    && node.getNodeData().isHasSequence()
                     && ( node.getNodeData().getSequence().getAccession() != null )
                     && match( node.getNodeData().getSequence().getAccession().getValue(),
                               query,
@@ -986,7 +1002,7 @@ public class PhylogenyMethods {
                               partial ) ) {
                 match = true;
             }
-            else if ( node.getNodeData().isHasSequence()
+            if ( !match && node.getNodeData().isHasSequence()
                     && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {
                 final DomainArchitecture da = node.getNodeData().getSequence().getDomainArchitecture();
                 I: for( int i = 0; i < da.getNumberOfDomains(); ++i ) {
@@ -996,6 +1012,22 @@ public class PhylogenyMethods {
                     }
                 }
             }
+            if ( !match && ( node.getNodeData().getBinaryCharacters() != null ) ) {
+                Iterator<String> it = node.getNodeData().getBinaryCharacters().getPresentCharacters().iterator();
+                I: while ( it.hasNext() ) {
+                    if ( match( it.next(), query, case_sensitive, partial ) ) {
+                        match = true;
+                        break I;
+                    }
+                }
+                it = node.getNodeData().getBinaryCharacters().getGainedCharacters().iterator();
+                I: while ( it.hasNext() ) {
+                    if ( match( it.next(), query, case_sensitive, partial ) ) {
+                        match = true;
+                        break I;
+                    }
+                }
+            }
             if ( match ) {
                 nodes.add( node );
             }
@@ -1052,15 +1084,16 @@ public class PhylogenyMethods {
                         }
                     }
                 }
-                else if ( node.getNodeData().isHasSequence()
+                if ( !match && node.getNodeData().isHasSequence()
                         && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial ) ) {
                     match = true;
                 }
-                else if ( node.getNodeData().isHasSequence()
+                if ( !match && node.getNodeData().isHasSequence()
                         && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial ) ) {
                     match = true;
                 }
-                else if ( node.getNodeData().isHasSequence()
+                if ( !match
+                        && node.getNodeData().isHasSequence()
                         && ( node.getNodeData().getSequence().getAccession() != null )
                         && match( node.getNodeData().getSequence().getAccession().getValue(),
                                   query,
@@ -1068,7 +1101,7 @@ public class PhylogenyMethods {
                                   partial ) ) {
                     match = true;
                 }
-                else if ( node.getNodeData().isHasSequence()
+                if ( !match && node.getNodeData().isHasSequence()
                         && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {
                     final DomainArchitecture da = node.getNodeData().getSequence().getDomainArchitecture();
                     I: for( int i = 0; i < da.getNumberOfDomains(); ++i ) {
@@ -1078,6 +1111,38 @@ public class PhylogenyMethods {
                         }
                     }
                 }
+                if ( !match && ( node.getNodeData().getBinaryCharacters() != null ) ) {
+                    Iterator<String> it = node.getNodeData().getBinaryCharacters().getPresentCharacters().iterator();
+                    I: while ( it.hasNext() ) {
+                        if ( match( it.next(), query, case_sensitive, partial ) ) {
+                            match = true;
+                            break I;
+                        }
+                    }
+                    it = node.getNodeData().getBinaryCharacters().getGainedCharacters().iterator();
+                    I: while ( it.hasNext() ) {
+                        if ( match( it.next(), query, case_sensitive, partial ) ) {
+                            match = true;
+                            break I;
+                        }
+                    }
+                    //                    final String[] bcp_ary = node.getNodeData().getBinaryCharacters()
+                    //                            .getPresentCharactersAsStringArray();
+                    //                    I: for( final String bc : bcp_ary ) {
+                    //                        if ( match( bc, query, case_sensitive, partial ) ) {
+                    //                            match = true;
+                    //                            break I;
+                    //                        }
+                    //                    }
+                    //                    final String[] bcg_ary = node.getNodeData().getBinaryCharacters()
+                    //                            .getGainedCharactersAsStringArray();
+                    //                    I: for( final String bc : bcg_ary ) {
+                    //                        if ( match( bc, query, case_sensitive, partial ) ) {
+                    //                            match = true;
+                    //                            break I;
+                    //                        }
+                    //                    }
+                }
                 if ( !match ) {
                     all_matched = false;
                     break;