a2e1c71b167baba40e6b3706d291f2e9093e983a
[jalview.git] / src / jalview / analysis / AlignmentUtil.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4 *\r
5 * This program is free software; you can redistribute it and/or\r
6 * modify it under the terms of the GNU General Public License\r
7 * as published by the Free Software Foundation; either version 2\r
8 * of the License, or (at your option) any later version.\r
9 *\r
10 * This program is distributed in the hope that it will be useful,\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 * GNU General Public License for more details.\r
14 *\r
15 * You should have received a copy of the GNU General Public License\r
16 * along with this program; if not, write to the Free Software\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18 */\r
19 package jalview.analysis;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import jalview.util.*;\r
24 \r
25 import java.util.*;\r
26 \r
27 \r
28 public class AlignmentUtil {\r
29     private AlignmentUtil() {\r
30     }\r
31 \r
32     public static int[][] percentIdentity2(AlignmentI align) {\r
33         return percentIdentity2(align, 0, align.getWidth() - 1);\r
34     }\r
35 \r
36     public static int[][] percentIdentity2(AlignmentI align, int start, int end) {\r
37         int[][] cons2 = new int[align.getWidth()][24];\r
38 \r
39         // Initialize the array\r
40         for (int j = 0; j < 24; j++) {\r
41             for (int i = 0; i < align.getWidth(); i++) {\r
42                 cons2[i][j] = 0;\r
43             }\r
44         }\r
45 \r
46         return cons2;\r
47     }\r
48 \r
49     public static int getPixelHeight(int i, int j, int charHeight) {\r
50         int h = 0;\r
51 \r
52         while (i < j) {\r
53             h += charHeight;\r
54             i++;\r
55         }\r
56 \r
57         return h;\r
58     }\r
59 \r
60     public static Vector substitution_rates(AlignmentI align, int start, int end) {\r
61         Vector rates = new Vector();\r
62 \r
63         int len = (end - start + 1);\r
64 \r
65         // Turn seqs into char arrays\r
66         int[][] seqint = new int[align.getHeight()][len];\r
67 \r
68         for (int j = 0; j < align.getHeight(); j++) {\r
69             SequenceI seq = align.getSequenceAt(j);\r
70 \r
71             for (int i = 0; i < len; i++) {\r
72                 char c = seq.getCharAt((start + i) - 1);\r
73 \r
74                 if (c == 'A') {\r
75                     seqint[j][i] = 0;\r
76                 } else if (c == 'C') {\r
77                     seqint[j][i] = 1;\r
78                 } else if (c == 'T') {\r
79                     seqint[j][i] = 2;\r
80                 } else if (c == 'G') {\r
81                     seqint[j][i] = 3;\r
82                 } else {\r
83                     seqint[j][i] = -1;\r
84                 }\r
85             }\r
86         }\r
87 \r
88         //      print_matrix(seqint,2,len);     for (int j = 0; j < align.getHeight(); j++) {\r
89         for (int j = 0; j < align.getHeight(); j++) {\r
90             for (int k = 0; k < align.getHeight(); k++) {\r
91                 int[][] counts = new int[4][4];\r
92                 int tot = 0;\r
93                 int[] tots = new int[4];\r
94                 int fulltot = 0;\r
95                 int[] fulltots = new int[4];\r
96 \r
97                 for (int i = 0; i < len; i++) {\r
98                     if (k != j) {\r
99                         //                      System.out.println("Seq " + j + " " + k + " " + i + " " + seqint[j][i] + " " + seqint[k][i]);\r
100                         if ((seqint[j][i] >= 0) && (seqint[k][i] >= 0)) {\r
101                             counts[seqint[k][i]][seqint[j][i]]++;\r
102 \r
103                             //  print_matrix(counts,4,4);\r
104                             tots[seqint[j][i]]++;\r
105                             tot++;\r
106                         }\r
107 \r
108                         if (seqint[j][i] != -1) {\r
109                             fulltots[seqint[j][i]]++;\r
110                             fulltot++;\r
111                         }\r
112                     }\r
113                 }\r
114 \r
115                 if (k != j) {\r
116                     System.out.println();\r
117 \r
118                     System.out.println("Sequence " +\r
119                         align.getSequenceAt(j).getName() + " " +\r
120                         align.getSequenceAt(k).getName());\r
121 \r
122                     System.out.println();\r
123                     print_matrix(counts, 4, 4);\r
124                     System.out.println();\r
125 \r
126                     double[][] out = new double[4][4]; // = constant_multiply_matrix(counts,1.0/tot,4,4);\r
127 \r
128                     for (int i = 0; i < 4; i++) {\r
129                         for (int jj = 0; jj < 4; jj++) {\r
130                             out[i][jj] = (double) counts[i][jj] / tots[jj];\r
131                         }\r
132                     }\r
133 \r
134                     print_matrix(out, 4, 4);\r
135                     System.out.println();\r
136 \r
137                     System.out.print("RATES\t");\r
138                     System.out.print(align.getSequenceAt(j).getName() + "\t" +\r
139                         align.getSequenceAt(k).getName() + "\t");\r
140 \r
141                     for (int i = 0; i < 4; i++) {\r
142                         for (int jj = 0; jj < 4; jj++) {\r
143                             Format.print(System.out, "%4.3f\t", out[i][jj]);\r
144                         }\r
145                     }\r
146 \r
147                     System.out.println();\r
148 \r
149                     for (int i = 0; i < 4; i++) {\r
150                         Format.print(System.out, "%4.3f\t",\r
151                             ((double) fulltots[i] * 1.0) / fulltot);\r
152                     }\r
153 \r
154                     System.out.println();\r
155                     System.out.print("\nGC ");\r
156 \r
157                     Format.print(System.out, "%4.3f\t",\r
158                         (double) ((100 * fulltots[1]) + fulltots[3]) / fulltot);\r
159 \r
160                     System.out.print((fulltots[1] + fulltots[3]) + "\t" +\r
161                         fulltot);\r
162 \r
163                     System.out.println();\r
164 \r
165                     rates.addElement(out);\r
166                 }\r
167             }\r
168         }\r
169 \r
170         return rates;\r
171     }\r
172 \r
173     public static double[][] constant_multiply_matrix(int[][] matrix, double c,\r
174         int n, int m) {\r
175         double[][] out = new double[n][m];\r
176 \r
177         for (int i = 0; i < n; i++) {\r
178             for (int j = 0; j < m; j++) {\r
179                 out[i][j] = matrix[i][j] * c;\r
180             }\r
181         }\r
182 \r
183         return out;\r
184     }\r
185 \r
186     public static void print_matrix(int[][] matrix, int n, int m) {\r
187         for (int i = 0; i < n; i++) {\r
188             for (int j = 0; j < m; j++) {\r
189                 System.out.print(matrix[i][j] + "\t");\r
190             }\r
191 \r
192             System.out.println();\r
193         }\r
194     }\r
195 \r
196     public static void print_matrix(double[][] matrix, int n, int m) {\r
197         for (int i = 0; i < n; i++) {\r
198             for (int j = 0; j < m; j++) {\r
199                 Format.print(System.out, "%4.3f\t", matrix[i][j]);\r
200             }\r
201 \r
202             System.out.println();\r
203         }\r
204     }\r
205 }\r