Merge branch 'develop' into features/JAL-2393customMatrices
[jalview.git] / src / jalview / analysis / NJTree.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.analysis;
22
23 import jalview.api.analysis.ScoreModelI;
24 import jalview.api.analysis.SimilarityParamsI;
25 import jalview.datamodel.SequenceNode;
26 import jalview.viewmodel.AlignmentViewport;
27
28 /**
29  * DOCUMENT ME!
30  * 
31  * @author $author$
32  * @version $Revision$
33  */
34 public class NJTree extends TreeBuilder
35 {
36   /**
37    * Constructor given a viewport, tree type and score model
38    * 
39    * @param av
40    *          the current alignment viewport
41    * @param sm
42    *          a distance or similarity score model to use to compute the tree
43    * @param scoreParameters
44    */
45   public NJTree(AlignmentViewport av, ScoreModelI sm,
46           SimilarityParamsI scoreParameters)
47   {
48     super(av, sm, scoreParameters);
49   }
50   // private long _lycount = 0, _lylimit = 0;
51
52   /**
53    * DOCUMENT ME!
54    * 
55    * @return DOCUMENT ME!
56    */
57   @Override
58   protected
59   double findMinDistance()
60   {
61     double min = Double.MAX_VALUE;
62
63     for (int i = 0; i < (noseqs - 1); i++)
64     {
65       for (int j = i + 1; j < noseqs; j++)
66       {
67         if (!done.get(i) && !done.get(j))
68         {
69           double tmp = distances.getValue(i, j)
70                   - (findr(i, j) + findr(j, i));
71
72           if (tmp < min)
73           {
74             mini = i;
75             minj = j;
76
77             min = tmp;
78           }
79         }
80       }
81     }
82
83     return min;
84   }
85
86   /**
87    * DOCUMENT ME!
88    * 
89    * @param tmpi
90    *          DOCUMENT ME!
91    * @param tmpj
92    *          DOCUMENT ME!
93    * @param dist
94    *          DOCUMENT ME!
95    */
96   @Override
97   protected
98   void findNewDistances(SequenceNode tmpi, SequenceNode tmpj, double dist)
99   {
100
101     tmpi.dist = ((dist + ri) - rj) / 2;
102     tmpj.dist = (dist - tmpi.dist);
103
104     if (tmpi.dist < 0)
105     {
106       tmpi.dist = 0;
107     }
108
109     if (tmpj.dist < 0)
110     {
111       tmpj.dist = 0;
112     }
113   }
114
115
116
117   /**
118    * Calculates and saves the distance between the combination of cluster(i) and
119    * cluster(j) and all other clusters. The new distance to cluster k is
120    * calculated as the average of the distances from i to k and from j to k,
121    * less half the distance from i to j.
122    * 
123    * @param i
124    * @param j
125    */
126   @Override
127   protected
128   void findClusterDistance(int i, int j)
129   {
130     // New distances from cluster i to others
131     double[] newdist = new double[noseqs];
132   
133     double ijDistance = distances.getValue(i, j);
134     for (int l = 0; l < noseqs; l++)
135     {
136       if ((l != i) && (l != j))
137       {
138         newdist[l] = (distances.getValue(i, l) + distances.getValue(j, l) - ijDistance) / 2;
139       }
140       else
141       {
142         newdist[l] = 0;
143       }
144     }
145   
146     for (int ii = 0; ii < noseqs; ii++)
147     {
148       distances.setValue(i, ii, newdist[ii]);
149       distances.setValue(ii, i, newdist[ii]);
150     }
151   }
152 }