Jalview 2.6 source licence
[jalview.git] / src / jalview / util / Comparison.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
10  * 
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.util;
19
20 import jalview.datamodel.*;
21
22 /**
23  * DOCUMENT ME!
24  * 
25  * @author $author$
26  * @version $Revision$
27  */
28 public class Comparison
29 {
30   /** DOCUMENT ME!! */
31   public static final String GapChars = " .-";
32
33   /**
34    * DOCUMENT ME!
35    * 
36    * @param ii
37    *          DOCUMENT ME!
38    * @param jj
39    *          DOCUMENT ME!
40    * 
41    * @return DOCUMENT ME!
42    */
43   public static final float compare(SequenceI ii, SequenceI jj)
44   {
45     return Comparison.compare(ii, jj, 0, ii.getLength() - 1);
46   }
47
48   /**
49    * this was supposed to be an ungapped pid calculation
50    * 
51    * @param ii
52    *          SequenceI
53    * @param jj
54    *          SequenceI
55    * @param start
56    *          int
57    * @param end
58    *          int
59    * @return float
60    */
61   public static float compare(SequenceI ii, SequenceI jj, int start, int end)
62   {
63     String si = ii.getSequenceAsString();
64     String sj = jj.getSequenceAsString();
65
66     int ilen = si.length() - 1;
67     int jlen = sj.length() - 1;
68
69     while (jalview.util.Comparison.isGap(si.charAt(start + ilen)))
70     {
71       ilen--;
72     }
73
74     while (jalview.util.Comparison.isGap(sj.charAt(start + jlen)))
75     {
76       jlen--;
77     }
78
79     int count = 0;
80     int match = 0;
81     float pid = -1;
82
83     if (ilen > jlen)
84     {
85       for (int j = 0; j < jlen; j++)
86       {
87         if (si.substring(start + j, start + j + 1).equals(
88                 sj.substring(start + j, start + j + 1)))
89         {
90           match++;
91         }
92
93         count++;
94       }
95
96       pid = (float) match / (float) ilen * 100;
97     }
98     else
99     {
100       for (int j = 0; j < jlen; j++)
101       {
102         if (si.substring(start + j, start + j + 1).equals(
103                 sj.substring(start + j, start + j + 1)))
104         {
105           match++;
106         }
107
108         count++;
109       }
110
111       pid = (float) match / (float) jlen * 100;
112     }
113
114     return pid;
115   }
116
117   /**
118    * this is a gapped PID calculation
119    * 
120    * @param s1
121    *          SequenceI
122    * @param s2
123    *          SequenceI
124    * @return float
125    */
126   public final static float PID(String seq1, String seq2)
127   {
128     return PID(seq1, seq2, 0, seq1.length());
129   }
130
131   static final int caseShift = 'a' - 'A';
132
133   // Another pid with region specification
134   public final static float PID(String seq1, String seq2, int start, int end)
135   {
136
137     int s1len = seq1.length();
138     int s2len = seq2.length();
139
140     int len = Math.min(s1len, s2len);
141
142     if (end < len)
143     {
144       len = end;
145     }
146
147     if (len < start)
148     {
149       start = len - 1; // we just use a single residue for the difference
150     }
151
152     int bad = 0;
153     char chr1;
154     char chr2;
155
156     for (int i = start; i < len; i++)
157     {
158       chr1 = seq1.charAt(i);
159
160       chr2 = seq2.charAt(i);
161
162       if ('a' <= chr1 && chr1 <= 'z')
163       {
164         // TO UPPERCASE !!!
165         // Faster than toUpperCase
166         chr1 -= caseShift;
167       }
168       if ('a' <= chr2 && chr2 <= 'z')
169       {
170         // TO UPPERCASE !!!
171         // Faster than toUpperCase
172         chr2 -= caseShift;
173       }
174
175       if (chr1 != chr2 && !isGap(chr1) && !isGap(chr2))
176       {
177         bad++;
178       }
179     }
180
181     return ((float) 100 * (len - bad)) / len;
182   }
183
184   /**
185    * DOCUMENT ME!
186    * 
187    * @param c
188    *          DOCUMENT ME!
189    * 
190    * @return DOCUMENT ME!
191    */
192   public static final boolean isGap(char c)
193   {
194     return (c == '-' || c == '.' || c == ' ') ? true : false;
195   }
196
197   public static final boolean isNucleotide(SequenceI[] seqs)
198   {
199     int i = 0, iSize = seqs.length, j, jSize;
200     float nt = 0, aa = 0;
201     char c;
202     while (i < iSize)
203     {
204       jSize = seqs[i].getLength();
205       for (j = 0; j < jSize; j++)
206       {
207         c = seqs[i].getCharAt(j);
208         if ('a' <= c && c <= 'z')
209         {
210           c -= ('a' - 'A');
211         }
212
213         if (c == 'A' || c == 'G' || c == 'C' || c == 'T' || c == 'U')
214         {
215           nt++;
216         }
217         else if (!jalview.util.Comparison.isGap(seqs[i].getCharAt(j)))
218         {
219           aa++;
220         }
221       }
222       i++;
223     }
224
225     if ((nt / (nt + aa)) > 0.85f)
226     {
227       return true;
228     }
229     else
230     {
231       return false;
232     }
233
234   }
235 }