e48c0cac61ade1262c60ca13e062d3615977d9be
[jalview.git] / src / jalview / util / Comparison.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.util;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 \r
24 /**\r
25  * DOCUMENT ME!\r
26  *\r
27  * @author $author$\r
28  * @version $Revision$\r
29  */\r
30 public class Comparison\r
31 {\r
32   /** DOCUMENT ME!! */\r
33   public static String GapChars = " .-";\r
34 \r
35   /**\r
36    * DOCUMENT ME!\r
37    *\r
38    * @param ii DOCUMENT ME!\r
39    * @param jj DOCUMENT ME!\r
40    *\r
41    * @return DOCUMENT ME!\r
42    */\r
43   public static float compare(SequenceI ii, SequenceI jj)\r
44   {\r
45     return Comparison.compare(ii, jj, 0, ii.getLength() - 1);\r
46   }\r
47 \r
48   /**\r
49    * this was supposed to be an ungapped pid calculation\r
50    * @param ii SequenceI\r
51    * @param jj SequenceI\r
52    * @param start int\r
53    * @param end int\r
54    * @return float\r
55    */\r
56   public static float compare(SequenceI ii, SequenceI jj, int start, int end)\r
57   {\r
58     String si = ii.getSequence();\r
59     String sj = jj.getSequence();\r
60 \r
61     int ilen = si.length() - 1;\r
62     int jlen = sj.length() - 1;\r
63 \r
64     while (jalview.util.Comparison.isGap(si.charAt(start + ilen)))\r
65     {\r
66       ilen--;\r
67     }\r
68 \r
69     while (jalview.util.Comparison.isGap(sj.charAt(start + jlen)))\r
70     {\r
71       jlen--;\r
72     }\r
73 \r
74     int count = 0;\r
75     int match = 0;\r
76     float pid = -1;\r
77 \r
78     if (ilen > jlen)\r
79     {\r
80       for (int j = 0; j < jlen; j++)\r
81       {\r
82         if (si.substring(start + j, start + j + 1).equals(sj.substring(start +\r
83             j, start + j + 1)))\r
84         {\r
85           match++;\r
86         }\r
87 \r
88         count++;\r
89       }\r
90 \r
91       pid = (float) match / (float) ilen * 100;\r
92     }\r
93     else\r
94     {\r
95       for (int j = 0; j < jlen; j++)\r
96       {\r
97         if (si.substring(start + j, start + j + 1).equals(sj.substring(start +\r
98             j, start + j + 1)))\r
99         {\r
100           match++;\r
101         }\r
102 \r
103         count++;\r
104       }\r
105 \r
106       pid = (float) match / (float) jlen * 100;\r
107     }\r
108 \r
109     return pid;\r
110   }\r
111 \r
112   /**\r
113    * this is a gapped PID calculation\r
114    *\r
115    * @param s1 SequenceI\r
116    * @param s2 SequenceI\r
117    * @return float\r
118    */\r
119   public static float PID(SequenceI s1, SequenceI s2)\r
120   {\r
121     int len;\r
122 \r
123     if (s1.getSequence().length() > s2.getSequence().length())\r
124     {\r
125       len = s1.getSequence().length();\r
126     }\r
127     else\r
128     {\r
129       len = s2.getSequence().length();\r
130     }\r
131 \r
132     int bad = 0;\r
133 \r
134     for (int i = 0; i < len; i++)\r
135     {\r
136       char chr1;\r
137       char chr2;\r
138 \r
139       if (i < s1.getSequence().length())\r
140       {\r
141         chr1 = Character.toUpperCase(s1.getSequence().charAt(i));\r
142       }\r
143       else\r
144       {\r
145         chr1 = '.';\r
146       }\r
147 \r
148       if (i < s2.getSequence().length())\r
149       {\r
150         chr2 = Character.toUpperCase(s2.getSequence().charAt(i));\r
151       }\r
152       else\r
153       {\r
154         chr2 = '.';\r
155       }\r
156 \r
157       if (! (jalview.util.Comparison.isGap(chr1)) &&\r
158           ! (jalview.util.Comparison.isGap(chr2)))\r
159       {\r
160         if (chr1 != chr2)\r
161         {\r
162           bad++;\r
163         }\r
164       }\r
165     }\r
166 \r
167     return ( (float) 100 * (len - bad)) / len;\r
168   }\r
169 \r
170   // Another pid with region specification\r
171   public static float PID(SequenceI s1, SequenceI s2, int start, int end)\r
172   {\r
173     int len;\r
174 \r
175     if (s1.getSequence().length() > s2.getSequence().length())\r
176     {\r
177       len = s1.getSequence().length();\r
178     }\r
179     else\r
180     {\r
181       len = s2.getSequence().length();\r
182     }\r
183 \r
184     if (end < len)\r
185     {\r
186       len = end;\r
187     }\r
188 \r
189     if (len < start)\r
190     {\r
191       start = len - 1; // we just use a single residue for the difference\r
192     }\r
193 \r
194     int bad = 0;\r
195 \r
196     for (int i = start; i < len; i++)\r
197     {\r
198       char chr1;\r
199       char chr2;\r
200 \r
201       if (i < s1.getSequence().length())\r
202       {\r
203         chr1 = Character.toUpperCase(s1.getSequence().charAt(i));\r
204       }\r
205       else\r
206       {\r
207         chr1 = '.';\r
208       }\r
209 \r
210       if (i < s2.getSequence().length())\r
211       {\r
212         chr2 = Character.toUpperCase(s2.getSequence().charAt(i));\r
213       }\r
214       else\r
215       {\r
216         chr2 = '.';\r
217       }\r
218 \r
219       if (! (jalview.util.Comparison.isGap(chr1)) &&\r
220           ! (jalview.util.Comparison.isGap(chr2)))\r
221       {\r
222         if (chr1 != chr2)\r
223         {\r
224           bad++;\r
225         }\r
226       }\r
227     }\r
228 \r
229     return ( (float) 100 * (len - bad)) / len;\r
230   }\r
231 \r
232   /**\r
233    * DOCUMENT ME!\r
234    *\r
235    * @param c DOCUMENT ME!\r
236    *\r
237    * @return DOCUMENT ME!\r
238    */\r
239   public static boolean isGap(char c)\r
240   {\r
241     return (c == '-' || c == '.' || c == ' ') ? true : false;\r
242   }\r
243 \r
244   public static boolean isNucleotide(SequenceI [] seqs)\r
245   {\r
246     int i = 0, iSize = seqs.length, j, jSize;\r
247     float nt = 0, aa = 0;\r
248     char c;\r
249     while (i < iSize)\r
250     {\r
251       jSize = seqs[i].getLength();\r
252       for (j = 0; j < jSize; j++)\r
253       {\r
254         c = seqs[i].getCharAt(j);\r
255         if ('a' <= c && c <= 'z')\r
256           c -= ('a' - 'A');\r
257 \r
258         if (c == 'A' || c == 'G' || c == 'C' || c == 'T' || c == 'U')\r
259           nt++;\r
260         else if (!jalview.util.Comparison.isGap( seqs[i].getCharAt(j)))\r
261         {\r
262           aa++;\r
263         }\r
264       }\r
265       i++;\r
266     }\r
267 \r
268     if ( (nt / (nt + aa)) > 0.85f)\r
269       return true;\r
270     else\r
271       return false;\r
272 \r
273   }\r
274 }\r