private final int _min_duplications_sum;\r
private final int _speciations_sum;\r
private final BasicDescriptiveStatistics _duplications_sum_stats;\r
- private final List<Phylogeny> _min_duplications_sum_gene_trees;\r
+ private Phylogeny _min_duplications_sum_gene_tree;\r
private final List<PhylogenyNode> _stripped_gene_tree_nodes;\r
private final List<PhylogenyNode> _stripped_species_tree_nodes;\r
private final Set<PhylogenyNode> _mapped_species_tree_nodes;\r
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
final List<PhylogenyBranch> gene_tree_branches_post_order = new ArrayList<PhylogenyBranch>();\r
for( final PhylogenyNodeIterator it = gene_tree.iteratorPostorder(); it.hasNext(); ) {\r
final PhylogenyNode n = it.next();\r
- if ( !n.isRoot() /*&& !( n.getParent().isRoot() && n.isFirstChildNode() )*/) {\r
+ if ( !n.isRoot() && !( n.getParent().isRoot() && ( gene_tree.getRoot().getNumberOfDescendants() == 2 ) ) ) {\r
gene_tree_branches_post_order.add( new PhylogenyBranch( n, n.getParent() ) );\r
}\r
}\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
+ }\r
int min_duplications_sum = Integer.MAX_VALUE;\r
int speciations_sum = 0;\r
- _min_duplications_sum_gene_trees = new ArrayList<Phylogeny>();\r
_duplications_sum_stats = new BasicDescriptiveStatistics();\r
for( final PhylogenyBranch branch : gene_tree_branches_post_order ) {\r
- gene_tree.reRoot( branch );\r
+ reRoot( branch, gene_tree );\r
PhylogenyMethods.preOrderReId( species_tree );\r
- //TEST, remove later\r
- // for( final PhylogenyNodeIterator it = _gene_tree.iteratorPostorder(); it.hasNext(); ) {\r
- // final PhylogenyNode g = it.next();\r
- // if ( g.isInternal() ) {\r
- // g.setLink( null );\r
- // }\r
- // }\r
- final GSDIsummaryResult gsdi_result = GSDI.geneTreePostOrderTraversal( gene_tree, true );\r
+ final GSDIsummaryResult gsdi_result = GSDI.geneTreePostOrderTraversal( gene_tree,\r
+ true,\r
+ min_duplications_sum );\r
+ if ( gsdi_result == null ) {\r
+ continue;\r
+ }\r
if ( gsdi_result.getDuplicationsSum() < min_duplications_sum ) {\r
min_duplications_sum = gsdi_result.getDuplicationsSum();\r
speciations_sum = gsdi_result.getSpeciationsSum();\r
- _min_duplications_sum_gene_trees.clear();\r
- _min_duplications_sum_gene_trees.add( gene_tree.copy() );\r
- //_speciations_sum\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
- _min_duplications_sum_gene_trees.add( gene_tree.copy() );\r
+ final List<Phylogeny> l = new ArrayList<Phylogeny>();\r
+ l.add( _min_duplications_sum_gene_tree );\r
+ l.add( gene_tree );\r
+ 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
}\r
return _min_duplications_sum;\r
}\r
\r
- public List<Phylogeny> getMinDuplicationsSumGeneTrees() {\r
- return _min_duplications_sum_gene_trees;\r
+ public Phylogeny getMinDuplicationsSumGeneTree() {\r
+ return _min_duplications_sum_gene_tree;\r
}\r
\r
@Override\r
}\r
return shortests;\r
}\r
+\r
+ /**\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
+ static final void reRoot( final PhylogenyBranch b, final Phylogeny phy ) {\r
+ final PhylogenyNode n1 = b.getFirstNode();\r
+ final PhylogenyNode n2 = b.getSecondNode();\r
+ if ( n1.isExternal() ) {\r
+ phy.reRoot( n1 );\r
+ }\r
+ else if ( n2.isExternal() ) {\r
+ phy.reRoot( n2 );\r
+ }\r
+ else if ( ( n2 == n1.getChildNode1() ) || ( n2 == n1.getChildNode2() ) ) {\r
+ phy.reRoot( n2 );\r
+ }\r
+ else if ( ( n1 == n2.getChildNode1() ) || ( n1 == n2.getChildNode2() ) ) {\r
+ phy.reRoot( n1 );\r
+ }\r
+ // else if ( ( n1.getParent() != null ) && n1.getParent().isRoot()\r
+ // && ( ( n1.getParent().getChildNode1() == n2 ) || ( n1.getParent().getChildNode2() == n2 ) ) ) {\r
+ // phy.reRoot( n1 );\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