6956 |
12 Dec 22 |
nicklas |
1 |
package net.sf.basedb.reggie.plugins.cmd; |
6956 |
12 Dec 22 |
nicklas |
2 |
|
6956 |
12 Dec 22 |
nicklas |
3 |
public class BarcodeUtil |
6956 |
12 Dec 22 |
nicklas |
4 |
{ |
6956 |
12 Dec 22 |
nicklas |
5 |
|
6956 |
12 Dec 22 |
nicklas |
6 |
/** |
6956 |
12 Dec 22 |
nicklas |
Compare two sequences, optionally allowing a given number of mismatches. |
6956 |
12 Dec 22 |
nicklas |
maxMM is the total number of allowed mismatches, maxNotN is the |
6956 |
12 Dec 22 |
nicklas |
total number of allowed mismatches where none of the bases is 'N'. |
6956 |
12 Dec 22 |
nicklas |
10 |
*/ |
6956 |
12 Dec 22 |
nicklas |
11 |
public static boolean matches(String seq1, String seq2, int maxMM, int maxNotN) |
6956 |
12 Dec 22 |
nicklas |
12 |
{ |
6956 |
12 Dec 22 |
nicklas |
13 |
if (seq1.length() != seq2.length()) return false; |
6956 |
12 Dec 22 |
nicklas |
14 |
for (int i = 0; i < seq1.length(); i++) |
6956 |
12 Dec 22 |
nicklas |
15 |
{ |
6956 |
12 Dec 22 |
nicklas |
16 |
char c1 = seq1.charAt(i); |
6956 |
12 Dec 22 |
nicklas |
17 |
char c2 = seq2.charAt(i); |
6956 |
12 Dec 22 |
nicklas |
18 |
if (c1 != c2) |
6956 |
12 Dec 22 |
nicklas |
19 |
{ |
6956 |
12 Dec 22 |
nicklas |
20 |
maxMM--; |
6956 |
12 Dec 22 |
nicklas |
21 |
if (maxMM < 0) return false; |
6956 |
12 Dec 22 |
nicklas |
22 |
if (c1 != 'N' && c2 != 'N') |
6956 |
12 Dec 22 |
nicklas |
23 |
{ |
6956 |
12 Dec 22 |
nicklas |
24 |
maxNotN--; |
6956 |
12 Dec 22 |
nicklas |
25 |
if (maxNotN < 0) return false; |
6956 |
12 Dec 22 |
nicklas |
26 |
} |
6956 |
12 Dec 22 |
nicklas |
27 |
} |
6956 |
12 Dec 22 |
nicklas |
28 |
} |
6956 |
12 Dec 22 |
nicklas |
29 |
return true; |
6956 |
12 Dec 22 |
nicklas |
30 |
} |
6956 |
12 Dec 22 |
nicklas |
31 |
|
6956 |
12 Dec 22 |
nicklas |
32 |
/** |
6956 |
12 Dec 22 |
nicklas |
Merge two sequences so that all N in the first sequence is replaced |
6956 |
12 Dec 22 |
nicklas |
by the corresponding base in the second sequence. |
6956 |
12 Dec 22 |
nicklas |
35 |
*/ |
6956 |
12 Dec 22 |
nicklas |
36 |
public static String mergeN(String seq1, String seq2) |
6956 |
12 Dec 22 |
nicklas |
37 |
{ |
6956 |
12 Dec 22 |
nicklas |
38 |
StringBuilder merged = new StringBuilder(); |
6956 |
12 Dec 22 |
nicklas |
39 |
for (int i = 0; i < seq1.length(); i++) |
6956 |
12 Dec 22 |
nicklas |
40 |
{ |
6956 |
12 Dec 22 |
nicklas |
41 |
char c1 = seq1.charAt(i); |
6956 |
12 Dec 22 |
nicklas |
42 |
if (c1 == 'N' && i < seq2.length()) c1 = seq2.charAt(i); |
6956 |
12 Dec 22 |
nicklas |
43 |
merged.append(c1); |
6956 |
12 Dec 22 |
nicklas |
44 |
} |
6956 |
12 Dec 22 |
nicklas |
45 |
return merged.toString(); |
6956 |
12 Dec 22 |
nicklas |
46 |
} |
6956 |
12 Dec 22 |
nicklas |
47 |
|
6956 |
12 Dec 22 |
nicklas |
48 |
/** |
6956 |
12 Dec 22 |
nicklas |
Change the given sequence to it's reverse complement. This is needed for the |
6956 |
12 Dec 22 |
nicklas |
second barcode that is reported differently in the JSON (Library.Barcode) |
6956 |
12 Dec 22 |
nicklas |
field and in the FASTQ. |
6956 |
12 Dec 22 |
nicklas |
52 |
*/ |
6956 |
12 Dec 22 |
nicklas |
53 |
public static String reverseComplement(String seq) |
6956 |
12 Dec 22 |
nicklas |
54 |
{ |
6956 |
12 Dec 22 |
nicklas |
55 |
StringBuilder rev = new StringBuilder(); |
6956 |
12 Dec 22 |
nicklas |
56 |
for (int i = seq.length()-1; i >= 0; i--) |
6956 |
12 Dec 22 |
nicklas |
57 |
{ |
6956 |
12 Dec 22 |
nicklas |
58 |
char c = seq.charAt(i); |
6956 |
12 Dec 22 |
nicklas |
59 |
switch (c) |
6956 |
12 Dec 22 |
nicklas |
60 |
{ |
6956 |
12 Dec 22 |
nicklas |
61 |
case 'A': rev.append('T'); break; |
6956 |
12 Dec 22 |
nicklas |
62 |
case 'C': rev.append('G'); break; |
6956 |
12 Dec 22 |
nicklas |
63 |
case 'G': rev.append('C'); break; |
6956 |
12 Dec 22 |
nicklas |
64 |
case 'T': rev.append('A'); break; |
6956 |
12 Dec 22 |
nicklas |
65 |
case 'N': rev.append('N'); break; |
6956 |
12 Dec 22 |
nicklas |
66 |
default: rev.append(c); |
6956 |
12 Dec 22 |
nicklas |
67 |
} |
6956 |
12 Dec 22 |
nicklas |
68 |
} |
6956 |
12 Dec 22 |
nicklas |
69 |
return rev.toString(); |
6956 |
12 Dec 22 |
nicklas |
70 |
} |
6956 |
12 Dec 22 |
nicklas |
71 |
|
6956 |
12 Dec 22 |
nicklas |
72 |
} |