From bf7ff064d7b1e3a513653f5161c9b56cfb81a74b Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Mon, 28 Jan 2013 22:22:44 +0000 Subject: [PATCH] inprogress --- .../org/forester/phylogeny/PhylogenyMethods.java | 30 ++++++++++++++++ .../src/org/forester/phylogeny/PhylogenyNode.java | 1 - forester/java/src/org/forester/test/Test.java | 38 ++++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java b/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java index e8498c5..f14efd3 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java @@ -266,6 +266,18 @@ public class PhylogenyMethods { return stats; } + public final static void collapseSubtreeStructure( final PhylogenyNode n ) { + final List eds = n.getAllExternalDescendants(); + final List d = new ArrayList(); + 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. */ diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java index 17a839e..072f664 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java @@ -72,7 +72,6 @@ public final class PhylogenyNode implements Comparable { * Default constructor for PhylogenyNode. */ public PhylogenyNode() { - // init(); setId( PhylogenyNode.getNodeCount() ); PhylogenyNode.increaseNodeCount(); setSumExtNodes( 1 ); // For ext node, this number is 1 (not 0!!) diff --git a/forester/java/src/org/forester/test/Test.java b/forester/java/src/org/forester/test/Test.java index f04b445..b80a584 100644 --- a/forester/java/src/org/forester/test/Test.java +++ b/forester/java/src/org/forester/test/Test.java @@ -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; } } -- 1.7.10.2