in progress...
[jalview.git] / forester / java / src / org / forester / sdi / GSDIR.java
index 6b170d9..651383d 100644 (file)
@@ -52,7 +52,8 @@ public class GSDIR implements GSDII {
     public GSDIR( final Phylogeny gene_tree,\r
                   final Phylogeny species_tree,\r
                   final boolean strip_gene_tree,\r
-                  final boolean strip_species_tree ) throws SDIException {\r
+                  final boolean strip_species_tree,\r
+                  final boolean transfer_taxonomy ) throws SDIException {\r
         final NodesLinkingResult nodes_linking_result = GSDI.linkNodesOfG( gene_tree,\r
                                                                            species_tree,\r
                                                                            strip_gene_tree,\r
@@ -72,7 +73,7 @@ public class GSDIR implements GSDII {
         }\r
         if ( gene_tree.getRoot().getNumberOfDescendants() == 2 ) {\r
             gene_tree_branches_post_order.add( new PhylogenyBranch( gene_tree.getRoot().getChildNode1(), gene_tree\r
-                    .getRoot().getChildNode2() ) );\r
+                                                                    .getRoot().getChildNode2() ) );\r
         }\r
         int min_duplications_sum = Integer.MAX_VALUE;\r
         int speciations_sum = 0;\r
@@ -80,7 +81,6 @@ public class GSDIR implements GSDII {
         for( final PhylogenyBranch branch : gene_tree_branches_post_order ) {\r
             reRoot( branch, gene_tree );\r
             PhylogenyMethods.preOrderReId( species_tree );\r
-          \r
             final GSDIsummaryResult gsdi_result = GSDI.geneTreePostOrderTraversal( gene_tree,\r
                                                                                    true,\r
                                                                                    min_duplications_sum );\r
@@ -91,6 +91,9 @@ public class GSDIR implements GSDII {
                 min_duplications_sum = gsdi_result.getDuplicationsSum();\r
                 speciations_sum = gsdi_result.getSpeciationsSum();\r
                 _min_duplications_sum_gene_tree = gene_tree.copy();\r
+                if ( transfer_taxonomy ) {\r
+                    transferTaxonomy( _min_duplications_sum_gene_tree );\r
+                }\r
             }\r
             else if ( gsdi_result.getDuplicationsSum() == min_duplications_sum ) {\r
                 final List<Phylogeny> l = new ArrayList<Phylogeny>();\r
@@ -99,6 +102,9 @@ public class GSDIR implements GSDII {
                 final int index = getIndexesOfShortestTree( l ).get( 0 );\r
                 if ( index == 1 ) {\r
                     _min_duplications_sum_gene_tree = gene_tree.copy();\r
+                    if ( transfer_taxonomy ) {\r
+                        transferTaxonomy( _min_duplications_sum_gene_tree );\r
+                    }\r
                 }\r
             }\r
             _duplications_sum_stats.addValue( gsdi_result.getDuplicationsSum() );\r
@@ -182,7 +188,7 @@ public class GSDIR implements GSDII {
     /**\r
      * Places the root of this Phylogeny on Branch b. The new root is always\r
      * placed on the middle of the branch b.\r
-     * \r
+     *\r
      */\r
     static final void reRoot( final PhylogenyBranch b, final Phylogeny phy ) {\r
         final PhylogenyNode n1 = b.getFirstNode();\r
@@ -202,10 +208,16 @@ public class GSDIR implements GSDII {
         //        else if ( ( n1.getParent() != null ) && n1.getParent().isRoot()\r
         //                && ( ( n1.getParent().getChildNode1() == n2 ) || ( n1.getParent().getChildNode2() == n2 ) ) ) {\r
         //            phy.reRoot( n1 );\r
-        //           \r
+        //\r
         //        }\r
         else {\r
             throw new IllegalArgumentException( "reRoot( Branch b ): b is not a branch." );\r
         }\r
     }\r
+\r
+    private final static void transferTaxonomy( final Phylogeny gt ) {\r
+        for( final PhylogenyNodeIterator it = gt.iteratorPostorder(); it.hasNext(); ) {\r
+            GSDI.transferTaxonomy( it.next() );\r
+        }\r
+    }\r
 }\r