(no commit message)
[jalview.git] / forester / java / src / org / forester / sdi / GSDI.java
index 44fb856..4ab6395 100644 (file)
@@ -37,7 +37,6 @@ import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyMethods;
 import org.forester.phylogeny.PhylogenyNode;
 import org.forester.phylogeny.data.Event;
-import org.forester.phylogeny.data.Taxonomy;
 import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
 import org.forester.sdi.SDIutil.TaxonomyComparisonBase;
 import org.forester.util.ForesterUtil;
@@ -59,6 +58,15 @@ public final class GSDI implements GSDII {
                  final boolean most_parsimonious_duplication_model,
                  final boolean strip_gene_tree,
                  final boolean strip_species_tree ) throws SDIException {
+        this( gene_tree, species_tree, most_parsimonious_duplication_model, strip_gene_tree, strip_species_tree, true );
+    }
+
+    public GSDI( final Phylogeny gene_tree,
+                 final Phylogeny species_tree,
+                 final boolean most_parsimonious_duplication_model,
+                 final boolean strip_gene_tree,
+                 final boolean strip_species_tree,
+                 final boolean transfer_taxonomy ) throws SDIException {
         _most_parsimonious_duplication_model = most_parsimonious_duplication_model;
         if ( gene_tree.getRoot().getNumberOfDescendants() == 3 ) {
             gene_tree.reRoot( gene_tree.getRoot().getChildNode( 2 ) );
@@ -76,7 +84,7 @@ public final class GSDI implements GSDII {
         PhylogenyMethods.preOrderReId( species_tree );
         final GSDIsummaryResult gsdi_summary_result = geneTreePostOrderTraversal( gene_tree,
                                                                                   _most_parsimonious_duplication_model,
-                                                                                  true );
+                                                                                  transfer_taxonomy );
         _speciation_or_duplication_events_sum = gsdi_summary_result.getSpeciationOrDuplicationEventsSum();
         _speciations_sum = gsdi_summary_result.getSpeciationsSum();
         _duplications_sum = gsdi_summary_result.getDuplicationsSum();
@@ -144,10 +152,10 @@ public final class GSDI implements GSDII {
      * Preconditions: Mapping M for external nodes must have been calculated and
      * the species tree must be labeled in preorder.
      * <p>
-     * @param transfer_taxonomy 
-     * @return 
-     * @throws SDIException 
-     * 
+     * @param transfer_taxonomy
+     * @return
+     * @throws SDIException
+     *
      */
     final static GSDIsummaryResult geneTreePostOrderTraversal( final Phylogeny gene_tree,
                                                                final boolean most_parsimonious_duplication_model,
@@ -158,7 +166,7 @@ public final class GSDI implements GSDII {
             if ( g.isInternal() ) {
                 if ( g.getNumberOfDescendants() != 2 ) {
                     throw new SDIException( "gene tree contains internal node with " + g.getNumberOfDescendants()
-                            + " descendents" );
+                                            + " descendents" );
                 }
                 PhylogenyNode s1 = g.getChildNode1().getLink();
                 PhylogenyNode s2 = g.getChildNode2().getLink();
@@ -171,46 +179,13 @@ public final class GSDI implements GSDII {
                     }
                 }
                 g.setLink( s1 );
-                if ( transfer_taxonomy ) {
-                    transferTaxonomy( g, s1 );
-                }
                 determineEvent( s1, g, most_parsimonious_duplication_model, res );
             }
-        }
-        return res;
-    }
-
-    private static final void transferTaxonomy( final PhylogenyNode g, final PhylogenyNode s ) {
-        if ( s.getNodeData().isHasTaxonomy() ) {
-            g.getNodeData().setTaxonomy(  s.getNodeData().getTaxonomy() );
-            if ( g.isInternal() ) {
-                if ( g.getChildNode1().isInternal() ) {
-                    if ( g.getChildNode1().getNodeData().isHasTaxonomy() && g.getChildNode1().getNodeData().getTaxonomy() == s.getNodeData().getTaxonomy() ) {
-                        g.getChildNode1().getNodeData().setTaxonomy( null );
-                    }
-                }
-                if ( g.getChildNode2().isInternal() ) {
-                    if ( g.getChildNode2().getNodeData().isHasTaxonomy() && g.getChildNode2().getNodeData().getTaxonomy() == s.getNodeData().getTaxonomy() ) {
-                        g.getChildNode2().getNodeData().setTaxonomy( null );
-                    }
-                }
-            }
-        }
-        else if ( ForesterUtil.isEmpty( g.getName() ) && !ForesterUtil.isEmpty( s.getName() ) ) {
-            g.setName( s.getName() );
-            if ( g.isInternal() ) {
-                if ( g.getChildNode1().isInternal() ) {
-                    if ( g.getChildNode1().getName() == s.getName() ) {
-                        g.getChildNode1().setName(  "" );
-                    }
-                }
-                if ( g.getChildNode2().isInternal() ) {
-                    if ( g.getChildNode2().getName() == s.getName() ) {
-                        g.getChildNode2().setName(  "" );
-                    }
-                }
+            if ( transfer_taxonomy ) {
+                transferTaxonomy( g );
             }
         }
+        return res;
     }
 
     final static GSDIsummaryResult geneTreePostOrderTraversal( final Phylogeny gene_tree,
@@ -222,7 +197,7 @@ public final class GSDI implements GSDII {
             if ( g.isInternal() ) {
                 if ( g.getNumberOfDescendants() != 2 ) {
                     throw new SDIException( "gene tree contains internal node with " + g.getNumberOfDescendants()
-                            + " descendents" );
+                                            + " descendents" );
                 }
                 PhylogenyNode s1 = g.getChildNode1().getLink();
                 PhylogenyNode s2 = g.getChildNode2().getLink();
@@ -259,8 +234,8 @@ public final class GSDI implements GSDII {
      * This allows for linking of internal nodes of the species tree (as opposed
      * to just external nodes, as in the method it overrides.
      * If TaxonomyComparisonBase is null, it will try to determine it.
-     * @throws SDIException 
-     * 
+     * @throws SDIException
+     *
      */
     final static NodesLinkingResult linkNodesOfG( final Phylogeny gene_tree,
                                                   final Phylogeny species_tree,
@@ -324,7 +299,7 @@ public final class GSDI implements GSDII {
                         }
                         else {
                             throw new SDIException( "taxonomy \"" + g.getNodeData().getTaxonomy()
-                                    + "\" not present in species tree" );
+                                                    + "\" not present in species tree" );
                         }
                     }
                     else {
@@ -347,6 +322,40 @@ public final class GSDI implements GSDII {
         return res;
     }
 
+    static final void transferTaxonomy( final PhylogenyNode g ) {
+        if ( g == null ) {
+            throw new IllegalArgumentException( "gene tree node is null" );
+        }
+        final PhylogenyNode s = g.getLink();
+        if ( s == null ) {
+            throw new IllegalArgumentException( "mapped species tree node is null" );
+        }
+        if ( s.getNodeData().isHasTaxonomy() ) {
+            g.getNodeData().setTaxonomy( s.getNodeData().getTaxonomy() );
+            if ( g.isInternal() ) {
+                if ( g.getChildNode1().isInternal() && g.getChildNode1().getNodeData().isHasTaxonomy()
+                        && ( g.getChildNode1().getNodeData().getTaxonomy() == s.getNodeData().getTaxonomy() ) ) {
+                    g.getChildNode1().getNodeData().setTaxonomy( null );
+                }
+                if ( g.getChildNode2().isInternal() && g.getChildNode2().getNodeData().isHasTaxonomy()
+                        && ( g.getChildNode2().getNodeData().getTaxonomy() == s.getNodeData().getTaxonomy() ) ) {
+                    g.getChildNode2().getNodeData().setTaxonomy( null );
+                }
+            }
+        }
+        else if ( ForesterUtil.isEmpty( g.getName() ) && !ForesterUtil.isEmpty( s.getName() ) ) {
+            g.setName( s.getName() );
+            if ( g.isInternal() ) {
+                if ( g.getChildNode1().isInternal() && ( g.getChildNode1().getName() == s.getName() ) ) {
+                    g.getChildNode1().setName( "" );
+                }
+                if ( g.getChildNode2().isInternal() && ( g.getChildNode2().getName() == s.getName() ) ) {
+                    g.getChildNode2().setName( "" );
+                }
+            }
+        }
+    }
+
     private final static void addScientificNamesMappedToReducedSpecificity( final String s1,
                                                                             final String s2,
                                                                             final SortedSet<String> scientific_names_mapped_to_reduced_specificity ) {