extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/cmd/BarcodeUtil.java

Code
Comments
Other
Rev Date Author Line
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 7     Compare two sequences, optionally allowing a given number of mismatches.
6956 12 Dec 22 nicklas 8     maxMM is the total number of allowed mismatches, maxNotN is the
6956 12 Dec 22 nicklas 9     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 33     Merge two sequences so that all N in the first sequence is replaced
6956 12 Dec 22 nicklas 34     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 49     Change the given sequence to it's reverse complement. This is needed for the
6956 12 Dec 22 nicklas 50     second barcode that is reported differently in the JSON (Library.Barcode)
6956 12 Dec 22 nicklas 51     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 }