cb9ad07e31693a64d90d64aa2b6866954f87fc1d
[jalview.git] / src / jalview / analysis / scoremodels / PairwiseDistanceModel.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.scoremodels;
22
23 import jalview.api.analysis.DistanceModelI;
24 import jalview.datamodel.AlignmentView;
25 import jalview.util.Comparison;
26
27 public class PairwiseDistanceModel implements DistanceModelI
28 {
29   PairwiseScoreModelI scoreModel;
30
31   /**
32    * Constructor given something to provide pairwise scores for residues
33    * 
34    * @param sm
35    */
36   public PairwiseDistanceModel(PairwiseScoreModelI sm)
37   {
38     scoreModel = sm;
39   }
40
41   /**
42    * Returns a matrix of [i][j] values representing distances between pairs of
43    * sequences
44    */
45   @Override
46   public float[][] findDistances(AlignmentView seqData)
47   {
48     String[] sequenceString = seqData
49             .getSequenceStrings(Comparison.GAP_SPACE);
50     int noseqs = sequenceString.length;
51     float[][] distance = new float[noseqs][noseqs];
52
53     /*
54      * calculate similarity scores for the upper half of the matrix
55      * as [i, j] = the sum of pairwise scores of corresponding
56      * positions of sequence[i] and sequence[j]
57      */
58     float maxscore = 0;
59     int end = sequenceString[0].length();
60     for (int i = 0; i < (noseqs - 1); i++)
61     {
62       for (int j = i; j < noseqs; j++)
63       {
64         float score = 0;
65
66         for (int k = 0; k < end; k++)
67         {
68           try
69           {
70             score += scoreModel.getPairwiseScore(
71                     sequenceString[i].charAt(k),
72                     sequenceString[j].charAt(k));
73           } catch (Exception ex)
74           {
75             System.err.println("err creating " + getName() + " tree");
76             ex.printStackTrace();
77           }
78         }
79
80         distance[i][j] = score;
81
82         if (score > maxscore)
83         {
84           maxscore = score;
85         }
86       }
87     }
88
89     /*
90      * subtract similarity scores from the maximum value to
91      * convert to a distance measure; also populate the lower
92      * half of the result matrix with this value 
93      */
94     // FIXME this assumes the score matrix is symmetric - it may not be?
95     for (int i = 0; i < (noseqs - 1); i++)
96     {
97       for (int j = i; j < noseqs; j++)
98       {
99         distance[i][j] = maxscore - distance[i][j];
100         distance[j][i] = distance[i][j];
101       }
102     }
103     return distance;
104   }
105
106   @Override
107   public String getName()
108   {
109     return scoreModel.getName();
110   }
111
112   @Override
113   public boolean isDNA()
114   {
115     return scoreModel.isDNA();
116   }
117
118   @Override
119   public boolean isProtein()
120   {
121     return scoreModel.isProtein();
122   }
123
124   public PairwiseScoreModelI getScoreModel()
125   {
126     return scoreModel;
127   }
128 }