320855ac4c0a733c905a364c3d5743e150ae89de
[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 \r
20 package jalview.util;\r
21 \r
22 import jalview.datamodel.*;\r
23 \r
24 public class Comparison {\r
25 \r
26   public static float compare(SequenceI ii, SequenceI jj)\r
27   {\r
28     return Comparison.compare(ii,jj,0,ii.getLength()-1);\r
29   }\r
30   /**\r
31    * this was supposed to be an ungapped pid calculation\r
32    * @param ii SequenceI\r
33    * @param jj SequenceI\r
34    * @param start int\r
35    * @param end int\r
36    * @return float\r
37    */\r
38   public static float compare(SequenceI ii, SequenceI jj, int start, int end) {\r
39 \r
40      String si   = ii.getSequence();\r
41      String sj   = jj.getSequence();\r
42 \r
43      int ilen = si.length()-1;\r
44      int jlen = sj.length()-1;\r
45 \r
46      while (jalview.util.Comparison.isGap(si.charAt(start + ilen)))\r
47      {\r
48        ilen--;\r
49      }\r
50 \r
51      while (jalview.util.Comparison.isGap(sj.charAt(start + jlen)))\r
52      {\r
53        jlen--;\r
54      }\r
55 \r
56      int   count = 0;\r
57      int   match = 0;\r
58      float pid   = -1;\r
59 \r
60      if (ilen > jlen) {\r
61 \r
62        for (int j = 0; j < jlen; j++) {\r
63          if (si.substring(start + j,start + j+1).equals(sj.substring(start + j,start + j+1))) {\r
64            match++;\r
65          }\r
66          count++;\r
67        }\r
68        pid = (float)match/(float)ilen * 100;\r
69      } else {\r
70        for (int j = 0; j < jlen; j++) {\r
71          if (si.substring(start + j,start + j+1).equals(sj.substring(start + j,start + j+1))) {\r
72            match++;\r
73          }\r
74          count++;\r
75        }\r
76        pid = (float)match/(float)jlen * 100;\r
77      }\r
78 \r
79     return pid;\r
80   }\r
81 \r
82   /**\r
83    * this is a gapped PID calculation\r
84    *\r
85    * @param s1 SequenceI\r
86    * @param s2 SequenceI\r
87    * @return float\r
88    */\r
89   public static float PID(SequenceI s1 , SequenceI s2)\r
90   {\r
91     int len;\r
92 \r
93     if (s1.getSequence().length() > s2.getSequence().length())\r
94       len = s1.getSequence().length();\r
95     else\r
96       len = s2.getSequence().length();\r
97 \r
98 \r
99     int bad = 0;\r
100 \r
101     for (int i = 0; i < len; i++)\r
102     {\r
103       char chr1;\r
104       char chr2;\r
105 \r
106       if (i < s1.getSequence().length())\r
107         chr1 = s1.getSequence().charAt(i);\r
108       else\r
109         chr1 = '.';\r
110 \r
111 \r
112       if (i < s2.getSequence().length())\r
113         chr2 = s2.getSequence().charAt(i);\r
114       else\r
115         chr2 = '.';\r
116 \r
117 \r
118       if (!(jalview.util.Comparison.isGap( chr1 ))  &&  !(jalview.util.Comparison.isGap( chr2 )))\r
119       {\r
120         if (chr1!=chr2)\r
121           bad++;\r
122       }\r
123     }\r
124 \r
125     return (float)100*(len-bad)/len;\r
126   }\r
127 \r
128   // Another pid with region specification\r
129 \r
130   public static float PID(SequenceI s1 , SequenceI s2, int start, int end)\r
131   {\r
132     int len;\r
133 \r
134     if (s1.getSequence().length() > s2.getSequence().length())\r
135       len = s1.getSequence().length();\r
136     else\r
137       len = s2.getSequence().length();\r
138 \r
139     if (end<len)\r
140       len=end;\r
141 \r
142     if (len<start) {\r
143       start = len - 1; // we just use a single residue for the difference\r
144     }\r
145 \r
146     int bad = 0;\r
147 \r
148     for (int i = start; i < len; i++)\r
149     {\r
150       char chr1;\r
151       char chr2;\r
152 \r
153       if (i < s1.getSequence().length())\r
154         chr1 = s1.getSequence().charAt(i);\r
155       else\r
156         chr1 = '.';\r
157 \r
158 \r
159       if (i < s2.getSequence().length())\r
160         chr2 = s2.getSequence().charAt(i);\r
161       else\r
162         chr2 = '.';\r
163 \r
164 \r
165       if (!(jalview.util.Comparison.isGap( chr1 ))  &&  !(jalview.util.Comparison.isGap( chr2 )))\r
166       {\r
167         if (chr1!=chr2)\r
168           bad++;\r
169       }\r
170     }\r
171 \r
172     return (float)100*(len-bad)/len;\r
173   }\r
174 \r
175 \r
176   public static String GapChars = " .-";\r
177   public static boolean isGap(char c)\r
178   {\r
179     return  (c != '.' && c != '-' && c != ' ') ? false : true;\r
180   }\r
181 }\r