1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
package jalview.analysis; |
22 |
|
|
23 |
|
import jalview.datamodel.AlignmentAnnotation; |
24 |
|
import jalview.datamodel.Annotation; |
25 |
|
import jalview.datamodel.SequenceFeature; |
26 |
|
import jalview.datamodel.SequenceI; |
27 |
|
import jalview.util.Comparison; |
28 |
|
import jalview.util.Format; |
29 |
|
|
30 |
|
import java.util.Hashtable; |
31 |
|
|
32 |
|
|
33 |
|
|
34 |
|
|
35 |
|
|
36 |
|
|
37 |
|
|
38 |
|
@author |
39 |
|
@version |
40 |
|
|
|
|
| 58.1% |
Uncovered Elements: 112 (267) |
Complexity: 58 |
Complexity Density: 0.34 |
|
41 |
|
public class StructureFrequency |
42 |
|
{ |
43 |
|
public static final int STRUCTURE_PROFILE_LENGTH = 74; |
44 |
|
|
45 |
|
|
46 |
|
|
47 |
|
public static final String MAXCOUNT = "C"; |
48 |
|
|
49 |
|
public static final String MAXRESIDUE = "R"; |
50 |
|
|
51 |
|
public static final String PID_GAPS = "G"; |
52 |
|
|
53 |
|
public static final String PID_NOGAPS = "N"; |
54 |
|
|
55 |
|
public static final String PROFILE = "P"; |
56 |
|
|
57 |
|
public static final String PAIRPROFILE = "B"; |
58 |
|
|
59 |
|
|
60 |
|
|
61 |
|
|
62 |
|
@param |
63 |
|
|
64 |
|
@param |
65 |
|
|
66 |
|
@return |
67 |
|
|
|
|
| 75% |
Uncovered Elements: 2 (8) |
Complexity: 3 |
Complexity Density: 0.75 |
|
68 |
90 |
public static int findPair(SequenceFeature[] pairs, int indice)... |
69 |
|
{ |
70 |
|
|
71 |
855 |
for (int i = 0; i < pairs.length; i++) |
72 |
|
{ |
73 |
855 |
if (pairs[i].getBegin() == indice) |
74 |
|
|
75 |
|
{ |
76 |
|
|
77 |
90 |
return pairs[i].getEnd(); |
78 |
|
|
79 |
|
} |
80 |
|
} |
81 |
0 |
return -1; |
82 |
|
} |
83 |
|
|
84 |
|
|
85 |
|
|
86 |
|
|
87 |
|
|
88 |
|
@param |
89 |
|
@param |
90 |
|
@param |
91 |
|
@param |
92 |
|
@param |
93 |
|
@param |
94 |
|
|
|
|
| 86.3% |
Uncovered Elements: 18 (131) |
Complexity: 28 |
Complexity Density: 0.32 |
|
95 |
5 |
public static final void calculate(SequenceI[] sequences, int start,... |
96 |
|
int end, Hashtable<String, Object>[] result, boolean profile, |
97 |
|
AlignmentAnnotation rnaStruc) |
98 |
|
{ |
99 |
|
|
100 |
5 |
Hashtable<String, Object> residueHash; |
101 |
5 |
String maxResidue; |
102 |
5 |
char[] struc = rnaStruc.getRNAStruc().toCharArray(); |
103 |
|
|
104 |
5 |
SequenceFeature[] rna = rnaStruc._rnasecstr; |
105 |
5 |
char c, s, cEnd; |
106 |
5 |
int bpEnd = -1; |
107 |
5 |
int jSize = sequences.length; |
108 |
5 |
int[] values; |
109 |
5 |
int[][] pairs; |
110 |
5 |
float percentage; |
111 |
|
|
112 |
470 |
for (int i = start; i < end; i++) |
113 |
|
{ |
114 |
465 |
int canonicalOrWobblePairCount = 0, canonical = 0; |
115 |
465 |
int otherPairCount = 0; |
116 |
465 |
int nongap = 0; |
117 |
465 |
maxResidue = "-"; |
118 |
464 |
values = new int[255]; |
119 |
465 |
pairs = new int[255][255]; |
120 |
465 |
bpEnd = -1; |
121 |
465 |
if (i < struc.length) |
122 |
|
{ |
123 |
465 |
s = struc[i]; |
124 |
|
} |
125 |
|
else |
126 |
|
{ |
127 |
0 |
s = '-'; |
128 |
|
} |
129 |
465 |
if (s == '.' || s == ' ') |
130 |
|
{ |
131 |
285 |
s = '-'; |
132 |
|
} |
133 |
|
|
134 |
465 |
if (!Rna.isOpeningParenthesis(s)) |
135 |
|
{ |
136 |
375 |
if (s == '-') |
137 |
|
{ |
138 |
285 |
values['-']++; |
139 |
|
} |
140 |
|
} |
141 |
|
else |
142 |
|
{ |
143 |
90 |
bpEnd = findPair(rna, i); |
144 |
|
|
145 |
90 |
if (bpEnd > -1) |
146 |
|
{ |
147 |
5579 |
for (int j = 0; j < jSize; j++) |
148 |
|
{ |
149 |
5490 |
if (sequences[j] == null) |
150 |
|
{ |
151 |
0 |
jalview.bin.Console.errPrintln( |
152 |
|
"WARNING: Consensus skipping null sequence - possible race condition."); |
153 |
0 |
continue; |
154 |
|
} |
155 |
|
|
156 |
5490 |
c = sequences[j].getCharAt(i); |
157 |
5490 |
cEnd = sequences[j].getCharAt(bpEnd); |
158 |
|
|
159 |
5489 |
if (Comparison.isGap(c) || Comparison.isGap(cEnd)) |
160 |
|
{ |
161 |
10 |
values['-']++; |
162 |
10 |
continue; |
163 |
|
} |
164 |
5480 |
nongap++; |
165 |
|
|
166 |
|
|
167 |
|
|
168 |
5480 |
if ('a' <= c && 'z' >= c) |
169 |
|
{ |
170 |
0 |
c += 'A' - 'a'; |
171 |
|
} |
172 |
5480 |
if ('a' <= cEnd && 'z' >= cEnd) |
173 |
|
{ |
174 |
0 |
cEnd += 'A' - 'a'; |
175 |
|
} |
176 |
5480 |
if (Rna.isCanonicalOrWobblePair(c, cEnd)) |
177 |
|
{ |
178 |
4865 |
canonicalOrWobblePairCount++; |
179 |
4865 |
if (Rna.isCanonicalPair(c, cEnd)) |
180 |
|
{ |
181 |
4315 |
canonical++; |
182 |
|
} |
183 |
|
} |
184 |
|
else |
185 |
|
{ |
186 |
615 |
otherPairCount++; |
187 |
|
} |
188 |
5480 |
pairs[c][cEnd]++; |
189 |
|
} |
190 |
|
} |
191 |
|
} |
192 |
|
|
193 |
465 |
residueHash = new Hashtable<>(); |
194 |
465 |
if (profile) |
195 |
|
{ |
196 |
|
|
197 |
465 |
residueHash.put(PROFILE, |
198 |
|
new int[][] |
199 |
|
{ values, new int[] { jSize, (jSize - values['-']) } }); |
200 |
|
|
201 |
465 |
residueHash.put(PAIRPROFILE, pairs); |
202 |
|
} |
203 |
465 |
values['('] = canonicalOrWobblePairCount; |
204 |
465 |
values['['] = canonical; |
205 |
465 |
values['{'] = otherPairCount; |
206 |
|
|
207 |
|
|
208 |
|
|
209 |
|
|
210 |
465 |
int count = canonicalOrWobblePairCount; |
211 |
|
|
212 |
|
|
213 |
|
|
214 |
|
|
215 |
|
|
216 |
465 |
if (canonicalOrWobblePairCount > 0 || otherPairCount > 0) |
217 |
|
{ |
218 |
90 |
if (canonicalOrWobblePairCount >= otherPairCount) |
219 |
|
{ |
220 |
90 |
maxResidue = (canonicalOrWobblePairCount - canonical) < canonical |
221 |
|
? "(" |
222 |
|
: "["; |
223 |
|
} |
224 |
|
else |
225 |
|
{ |
226 |
0 |
maxResidue = "{"; |
227 |
|
} |
228 |
|
} |
229 |
465 |
residueHash.put(MAXCOUNT, Integer.valueOf(count)); |
230 |
465 |
residueHash.put(MAXRESIDUE, maxResidue); |
231 |
|
|
232 |
465 |
percentage = ((float) count * 100) / jSize; |
233 |
465 |
residueHash.put(PID_GAPS, Float.valueOf(percentage)); |
234 |
|
|
235 |
465 |
percentage = ((float) count * 100) / nongap; |
236 |
465 |
residueHash.put(PID_NOGAPS, Float.valueOf(percentage)); |
237 |
|
|
238 |
465 |
if (result[i] == null) |
239 |
|
{ |
240 |
375 |
result[i] = residueHash; |
241 |
|
} |
242 |
465 |
if (bpEnd > 0) |
243 |
|
{ |
244 |
90 |
values[')'] = values['(']; |
245 |
90 |
values[']'] = values['[']; |
246 |
90 |
values['}'] = values['{']; |
247 |
90 |
values['('] = 0; |
248 |
90 |
values['['] = 0; |
249 |
90 |
values['{'] = 0; |
250 |
90 |
maxResidue = maxResidue.equals("(") ? ")" |
251 |
0 |
: maxResidue.equals("[") ? "]" : "}"; |
252 |
|
|
253 |
90 |
residueHash = new Hashtable<>(); |
254 |
90 |
if (profile) |
255 |
|
{ |
256 |
90 |
residueHash.put(PROFILE, |
257 |
|
new int[][] |
258 |
|
{ values, new int[] { jSize, (jSize - values['-']) } }); |
259 |
|
|
260 |
90 |
residueHash.put(PAIRPROFILE, pairs); |
261 |
|
} |
262 |
|
|
263 |
90 |
residueHash.put(MAXCOUNT, Integer.valueOf(count)); |
264 |
90 |
residueHash.put(MAXRESIDUE, maxResidue); |
265 |
|
|
266 |
90 |
percentage = ((float) count * 100) / jSize; |
267 |
90 |
residueHash.put(PID_GAPS, Float.valueOf(percentage)); |
268 |
|
|
269 |
90 |
percentage = ((float) count * 100) / nongap; |
270 |
90 |
residueHash.put(PID_NOGAPS, Float.valueOf(percentage)); |
271 |
|
|
272 |
90 |
result[bpEnd] = residueHash; |
273 |
|
} |
274 |
|
} |
275 |
|
} |
276 |
|
|
277 |
|
|
278 |
|
|
279 |
|
|
280 |
|
|
281 |
|
@param |
282 |
|
|
283 |
|
@param |
284 |
|
@param |
285 |
|
@param |
286 |
|
@param |
287 |
|
@param |
288 |
|
|
|
|
| 40.2% |
Uncovered Elements: 49 (82) |
Complexity: 20 |
Complexity Density: 0.38 |
|
289 |
5 |
public static void completeConsensus(AlignmentAnnotation consensus,... |
290 |
|
Hashtable<String, Object>[] hconsensus, int iStart, int width, |
291 |
|
boolean ignoreGapsInConsensusCalculation, |
292 |
|
boolean includeAllConsSymbols, long nseq) |
293 |
|
{ |
294 |
5 |
float tval, value; |
295 |
5 |
if (consensus == null || consensus.annotations == null |
296 |
|
|| consensus.annotations.length < width) |
297 |
|
{ |
298 |
|
|
299 |
|
|
300 |
0 |
return; |
301 |
|
} |
302 |
5 |
String fmtstr = "%3.1f"; |
303 |
5 |
int precision = 2; |
304 |
5 |
while (nseq > 100) |
305 |
|
{ |
306 |
0 |
precision++; |
307 |
0 |
nseq /= 10; |
308 |
|
} |
309 |
5 |
if (precision > 2) |
310 |
|
{ |
311 |
0 |
fmtstr = "%" + (2 + precision) + "." + precision + "f"; |
312 |
|
} |
313 |
5 |
Format fmt = new Format(fmtstr); |
314 |
|
|
315 |
470 |
for (int i = iStart; i < width; i++) |
316 |
|
{ |
317 |
465 |
Hashtable<String, Object> hci; |
318 |
? |
if (i >= hconsensus.length || ((hci = hconsensus[i]) == null)) |
319 |
|
{ |
320 |
|
|
321 |
|
|
322 |
0 |
consensus.annotations[i] = null; |
323 |
0 |
continue; |
324 |
|
} |
325 |
465 |
value = 0; |
326 |
465 |
Float fv; |
327 |
465 |
if (ignoreGapsInConsensusCalculation) |
328 |
|
{ |
329 |
0 |
fv = (Float) hci.get(StructureFrequency.PID_NOGAPS); |
330 |
|
} |
331 |
|
else |
332 |
|
{ |
333 |
465 |
fv = (Float) hci.get(StructureFrequency.PID_GAPS); |
334 |
|
} |
335 |
465 |
if (fv == null) |
336 |
|
{ |
337 |
0 |
consensus.annotations[i] = null; |
338 |
|
|
339 |
0 |
continue; |
340 |
|
} |
341 |
465 |
value = fv.floatValue(); |
342 |
465 |
String maxRes = hci.get(StructureFrequency.MAXRESIDUE).toString(); |
343 |
465 |
String mouseOver = hci.get(StructureFrequency.MAXRESIDUE) + " "; |
344 |
465 |
if (maxRes.length() > 1) |
345 |
|
{ |
346 |
0 |
mouseOver = "[" + maxRes + "] "; |
347 |
0 |
maxRes = "+"; |
348 |
|
} |
349 |
465 |
int[][] profile = (int[][]) hci.get(StructureFrequency.PROFILE); |
350 |
465 |
int[][] pairs = (int[][]) hci.get(StructureFrequency.PAIRPROFILE); |
351 |
|
|
352 |
465 |
if (pairs != null && includeAllConsSymbols) |
353 |
|
|
354 |
|
|
355 |
|
{ |
356 |
0 |
mouseOver = ""; |
357 |
|
|
358 |
|
|
359 |
|
|
360 |
|
|
361 |
|
|
362 |
|
|
363 |
|
|
364 |
|
|
365 |
|
|
366 |
|
|
367 |
|
|
368 |
0 |
int[][] ca = new int[625][]; |
369 |
0 |
float[] vl = new float[625]; |
370 |
0 |
int x = 0; |
371 |
0 |
for (int c = 65; c < 90; c++) |
372 |
|
{ |
373 |
0 |
for (int d = 65; d < 90; d++) |
374 |
|
{ |
375 |
0 |
ca[x] = new int[] { c, d }; |
376 |
0 |
vl[x] = pairs[c][d]; |
377 |
0 |
x++; |
378 |
|
} |
379 |
|
} |
380 |
0 |
jalview.util.QuickSort.sort(vl, ca); |
381 |
0 |
int p = 0; |
382 |
|
|
383 |
|
|
384 |
|
|
385 |
|
|
386 |
0 |
final int divisor = profile[1][ignoreGapsInConsensusCalculation ? 1 |
387 |
|
: 0]; |
388 |
0 |
for (int c = 624; c > 0; c--) |
389 |
|
{ |
390 |
0 |
if (vl[c] > 0) |
391 |
|
{ |
392 |
0 |
tval = (vl[c] * 100f / divisor); |
393 |
0 |
mouseOver += ((p == 0) ? "" : "; ") + (char) ca[c][0] |
394 |
|
+ (char) ca[c][1] + " " + fmt.form(tval) + "%"; |
395 |
0 |
p++; |
396 |
|
|
397 |
|
} |
398 |
|
} |
399 |
|
|
400 |
|
|
401 |
|
} |
402 |
|
else |
403 |
|
{ |
404 |
465 |
mouseOver += (fmt.form(value) + "%"); |
405 |
|
} |
406 |
465 |
consensus.annotations[i] = new Annotation(maxRes, mouseOver, ' ', |
407 |
|
value); |
408 |
|
} |
409 |
|
} |
410 |
|
|
411 |
|
|
412 |
|
|
413 |
|
|
414 |
|
@param |
415 |
|
@return |
416 |
|
|
|
|
| 0% |
Uncovered Elements: 42 (42) |
Complexity: 7 |
Complexity Density: 0.23 |
|
417 |
0 |
public static int[] extractProfile(Hashtable<String, Object> hconsensus,... |
418 |
|
boolean ignoreGapsInConsensusCalculation) |
419 |
|
{ |
420 |
0 |
int[] rtnval = new int[STRUCTURE_PROFILE_LENGTH]; |
421 |
0 |
int[][] profile = (int[][]) hconsensus.get(StructureFrequency.PROFILE); |
422 |
0 |
int[][] pairs = (int[][]) hconsensus |
423 |
|
.get(StructureFrequency.PAIRPROFILE); |
424 |
|
|
425 |
0 |
if (profile == null) |
426 |
|
{ |
427 |
0 |
return null; |
428 |
|
} |
429 |
|
|
430 |
|
|
431 |
|
|
432 |
0 |
int[][] ca = new int[625][]; |
433 |
0 |
float[] vl = new float[625]; |
434 |
0 |
int x = 0; |
435 |
0 |
for (int c = 65; c < 90; c++) |
436 |
|
{ |
437 |
0 |
for (int d = 65; d < 90; d++) |
438 |
|
{ |
439 |
0 |
ca[x] = new int[] { c, d }; |
440 |
0 |
vl[x] = pairs[c][d]; |
441 |
0 |
x++; |
442 |
|
} |
443 |
|
} |
444 |
0 |
jalview.util.QuickSort.sort(vl, ca); |
445 |
|
|
446 |
0 |
int valuesCount = 0; |
447 |
0 |
rtnval[1] = 0; |
448 |
0 |
int offset = 2; |
449 |
0 |
final int divisor = profile[1][ignoreGapsInConsensusCalculation ? 1 |
450 |
|
: 0]; |
451 |
0 |
for (int c = 624; c > 0; c--) |
452 |
|
{ |
453 |
0 |
if (vl[c] > 0) |
454 |
|
{ |
455 |
0 |
rtnval[offset++] = ca[c][0]; |
456 |
0 |
rtnval[offset++] = ca[c][1]; |
457 |
0 |
rtnval[offset] = (int) (vl[c] * 100f / divisor); |
458 |
0 |
rtnval[1] += rtnval[offset++]; |
459 |
0 |
valuesCount++; |
460 |
|
} |
461 |
|
} |
462 |
0 |
rtnval[0] = valuesCount; |
463 |
|
|
464 |
|
|
465 |
0 |
int[] result = new int[rtnval.length + 1]; |
466 |
0 |
result[0] = AlignmentAnnotation.STRUCTURE_PROFILE; |
467 |
0 |
System.arraycopy(rtnval, 0, result, 1, rtnval.length); |
468 |
0 |
return result; |
469 |
|
} |
470 |
|
} |