various case sensitivity bugs fixed in residue comparison functions.
[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