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