8179811a7ae0bf1231584d81d273f6f7e1252122
[jalview.git] / forester / java / src / org / forester / sdi / GSDIR.java
1 // $Id:\r
2 // FORESTER -- software libraries and applications\r
3 // for evolutionary biology research and applications.\r
4 //\r
5 // Copyright (C) 2008-2013 Christian M. Zmasek\r
6 // All rights reserved\r
7 //\r
8 // This library is free software; you can redistribute it and/or\r
9 // modify it under the terms of the GNU Lesser General Public\r
10 // License as published by the Free Software Foundation; either\r
11 // version 2.1 of the License, or (at your option) any later version.\r
12 //\r
13 // This library is distributed in the hope that it will be useful,\r
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
16 // Lesser General Public License for more details.\r
17 //\r
18 // You should have received a copy of the GNU Lesser General Public\r
19 // License along with this library; if not, write to the Free Software\r
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
21 //\r
22 // Contact: phylosoft @ gmail . com\r
23 // WWW: www.phylosoft.org\r
24 \r
25 package org.forester.sdi;\r
26 \r
27 import java.util.ArrayList;\r
28 import java.util.List;\r
29 \r
30 import org.forester.phylogeny.Phylogeny;\r
31 import org.forester.phylogeny.PhylogenyBranch;\r
32 import org.forester.phylogeny.PhylogenyMethods;\r
33 import org.forester.phylogeny.PhylogenyNode;\r
34 import org.forester.phylogeny.iterators.PhylogenyNodeIterator;\r
35 import org.forester.util.BasicDescriptiveStatistics;\r
36 \r
37 public class GSDIR extends GSDI {\r
38 \r
39     private int                              _min_duplications_sum;\r
40     private final BasicDescriptiveStatistics _duplications_sum_stats;\r
41     private final List<Phylogeny>            _min_duplications_sum_gene_trees;\r
42 \r
43     public GSDIR( final Phylogeny gene_tree, final Phylogeny species_tree, final boolean strip_gene_tree, final int x )\r
44             throws SDIException {\r
45         super( gene_tree.copy(), species_tree, true, strip_gene_tree, true, 1 );\r
46         _min_duplications_sum = Integer.MAX_VALUE;\r
47         _min_duplications_sum_gene_trees = new ArrayList<Phylogeny>();\r
48         _duplications_sum_stats = new BasicDescriptiveStatistics();\r
49         linkNodesOfG();\r
50         final List<PhylogenyBranch> gene_tree_branches_post_order = new ArrayList<PhylogenyBranch>();\r
51         for( final PhylogenyNodeIterator it = _gene_tree.iteratorPostorder(); it.hasNext(); ) {\r
52             final PhylogenyNode n = it.next();\r
53             if ( !n.isRoot() ) {\r
54                 gene_tree_branches_post_order.add( new PhylogenyBranch( n, n.getParent() ) );\r
55             }\r
56         }\r
57         for( final PhylogenyBranch branch : gene_tree_branches_post_order ) {\r
58             _duplications_sum = 0;\r
59             _speciation_or_duplication_events_sum = 0;\r
60             _speciations_sum = 0;\r
61             _gene_tree.reRoot( branch );\r
62             PhylogenyMethods.preOrderReId( getSpeciesTree() );\r
63             //TEST, remove later\r
64             for( final PhylogenyNodeIterator it = _gene_tree.iteratorPostorder(); it.hasNext(); ) {\r
65                 final PhylogenyNode g = it.next();\r
66                 if ( g.isInternal() ) {\r
67                     g.setLink( null );\r
68                 }\r
69             }\r
70             geneTreePostOrderTraversal();\r
71             if ( _duplications_sum < _min_duplications_sum ) {\r
72                 _min_duplications_sum = _duplications_sum;\r
73                 _min_duplications_sum_gene_trees.clear();\r
74                 _min_duplications_sum_gene_trees.add( getGeneTree().copy() );\r
75             }\r
76             else if ( _duplications_sum == _min_duplications_sum ) {\r
77                 _min_duplications_sum_gene_trees.add( getGeneTree().copy() );\r
78             }\r
79             _duplications_sum_stats.addValue( _duplications_sum );\r
80         }\r
81         System.out.println( _duplications_sum_stats.getSummaryAsString() );\r
82     }\r
83 \r
84     public int getMinDuplicationsSum() {\r
85         return _min_duplications_sum;\r
86     }\r
87 \r
88     public List<Phylogeny> getMinDuplicationsSumGeneTrees() {\r
89         return _min_duplications_sum_gene_trees;\r
90     }\r
91 \r
92     public BasicDescriptiveStatistics getDuplicationsSumStats() {\r
93         return _duplications_sum_stats;\r
94     }\r
95 }\r