inprogress
authorcmzmasek@gmail.com <cmzmasek@gmail.com@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Mon, 28 Jan 2013 22:22:44 +0000 (22:22 +0000)
committercmzmasek@gmail.com <cmzmasek@gmail.com@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Mon, 28 Jan 2013 22:22:44 +0000 (22:22 +0000)
forester/java/src/org/forester/phylogeny/PhylogenyMethods.java
forester/java/src/org/forester/phylogeny/PhylogenyNode.java
forester/java/src/org/forester/test/Test.java

index e8498c5..f14efd3 100644 (file)
@@ -266,6 +266,18 @@ public class PhylogenyMethods {
         return stats;
     }
 
+    public final static void collapseSubtreeStructure( final PhylogenyNode n ) {
+        final List<PhylogenyNode> eds = n.getAllExternalDescendants();
+        final List<Double> d = new ArrayList<Double>();
+        for( final PhylogenyNode ed : eds ) {
+            d.add( calculateDistanceToAncestor( n, ed ) );
+        }
+        for( int i = 0; i < eds.size(); ++i ) {
+            n.setChildNode( i, eds.get( i ) );
+            eds.get( i ).setDistanceToParent( d.get( i ) );
+        }
+    }
+
     public static int countNumberOfOneDescendantNodes( final Phylogeny phy ) {
         int count = 0;
         for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {
@@ -1481,6 +1493,24 @@ public class PhylogenyMethods {
         return PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
     }
 
+    static double calculateDistanceToAncestor( final PhylogenyNode anc, PhylogenyNode desc ) {
+        double d = 0;
+        boolean all_default = true;
+        while ( anc != desc ) {
+            if ( desc.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
+                d += desc.getDistanceToParent();
+                if ( all_default ) {
+                    all_default = false;
+                }
+            }
+            desc = desc.getParent();
+        }
+        if ( all_default ) {
+            return PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT;
+        }
+        return d;
+    }
+
     /**
      * Deep copies the phylogeny originating from this node.
      */
index 17a839e..072f664 100644 (file)
@@ -72,7 +72,6 @@ public final class PhylogenyNode implements Comparable<PhylogenyNode> {
      * Default constructor for PhylogenyNode.
      */
     public PhylogenyNode() {
-        //  init();
         setId( PhylogenyNode.getNodeCount() );
         PhylogenyNode.increaseNodeCount();
         setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!)
index f04b445..b80a584 100644 (file)
@@ -387,6 +387,15 @@ public final class Test {
             System.out.println( "failed." );
             failed++;
         }
+        System.out.print( "Tree methods: " );
+        if ( Test.testTreeMethods() ) {
+            System.out.println( "OK." );
+            succeeded++;
+        }
+        else {
+            System.out.println( "failed." );
+            failed++;
+        }
         System.out.print( "Postorder Iterator: " );
         if ( Test.testPostOrderIterator() ) {
             System.out.println( "OK." );
@@ -1948,6 +1957,34 @@ public final class Test {
         return true;
     }
 
+    private static boolean testTreeMethods() {
+        try {
+            final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+            final Phylogeny t0 = factory.create( "((((A,B)ab,C)abc,D)abcd,E)", new NHXParser() )[ 0 ];
+            PhylogenyMethods.collapseSubtreeStructure( t0.getNode( "abcd" ) );
+            if ( !t0.toNewHampshireX().equals( "((A,B,C,D)abcd,E)" ) ) {
+                System.out.println( t0.toNewHampshireX() );
+                return false;
+            }
+            final Phylogeny t1 = factory.create( "((((A:0.1,B)ab:0.2,C)abc:0.3,D)abcd:0.4,E)", new NHXParser() )[ 0 ];
+            PhylogenyMethods.collapseSubtreeStructure( t1.getNode( "abcd" ) );
+            if ( !isEqual( t1.getNode( "A" ).getDistanceToParent(), 0.6 ) ) {
+                return false;
+            }
+            if ( !isEqual( t1.getNode( "B" ).getDistanceToParent(), 0.5 ) ) {
+                return false;
+            }
+            if ( !isEqual( t1.getNode( "C" ).getDistanceToParent(), 0.3 ) ) {
+                return false;
+            }
+        }
+        catch ( final Exception e ) {
+            e.printStackTrace( System.out );
+            return false;
+        }
+        return true;
+    }
+
     private static boolean testConfidenceAssessor() {
         try {
             final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
@@ -5911,6 +5948,7 @@ public final class Test {
                 return false;
             }
             if ( !n6.toNewHampshireX().equals( "n6:1.0E-6[&&NHX:T=1:S=Ecoli:D=N:B=100]" ) ) {
+                System.out.println( n6.toNewHampshireX() );
                 return false;
             }
         }