/* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Read a, Read b) { final long[] alist, blist; if (useCache) { if (a.obj == null) { alist = new long[comparisons]; a.obj = alist; fill(a, alist); } else { alist = (long[]) a.obj; } if (b.obj == null) { blist = new long[comparisons]; b.obj = alist; fill(b, blist); } else { blist = (long[]) b.obj; } } else { long[][] matrix = local1.get(); if (matrix == null) { matrix = new long[2][comparisons]; local1.set(matrix); } alist = matrix[0]; blist = matrix[1]; fill(a, alist); fill(b, blist); } return compare(alist, blist); }
@Override boolean processReadPair(Read r1, Read r2) { assert (r2 == null); final byte[] quals = r1.quality, bases = r1.bases; final byte[] match = (r1.match == null ? null : !r1.shortmatch() ? r1.match : Read.toLongMatchString(r1.match)); if (match == null || quals == null || bases == null) { return false; } int subs = 0; int indels = 0; for (int qpos = 0, mpos = 0, last = quals.length - 1; mpos < match.length; mpos++) { final byte m = match[mpos]; final byte mprev = match[Tools.max(mpos - 1, 0)]; final byte mnext = match[Tools.min(mpos + 1, match.length - 1)]; final byte q1 = quals[qpos]; final byte b2 = bases[qpos]; int sub = 0, indel = 0; if (m == 'S') { sub = 1; } else if (m == 'I') { indel = 1; } else if (m == 'm') { if (mprev == 'D' || mnext == 'D') { indel = 1; } } else if (m == 'D') { // do nothing } else if (m == 'C') { // do nothing } else { throw new RuntimeException( "Bad symbol m='" + ((char) m) + "'\n" + new String(match) + "\n" + new String(bases) + "\n"); } subs += sub; indels += indel; if (q1 >= minq && q1 <= maxq) { if (sub > 0 || (indel > 0 && countIndels)) { return true; } } if (m != 'D') { qpos++; } } return keepPerfect && subs == 0 && indels == 0; }
/** This will create a count consensus of the bases at each position in the cluster. */ public int[][] baseCounts() { int maxLeft = -1, maxRight = -1; for (Read r : this) { long[] obj = (long[]) r.obj; int pos = (int) obj[1]; maxLeft = Tools.max(maxLeft, pos); maxRight = Tools.max(maxRight, r.length() - pos); } final int width = maxLeft + maxRight; // assert(size()==1) : "\nleft="+maxLeft+", right="+maxRight+", width="+width+", // "+k+"\n"+get(0).toFastq()+"\n"+get(size()-1).toFastq(); // System.err.println("\n\n"); final int[][] counts = new int[4][width]; for (Read r : this) { long[] obj = (long[]) r.obj; int pos = (int) obj[1]; byte[] bases = r.bases, quals = r.quality; // System.err.println("pos="+pos+", maxLeft="+maxLeft); for (int cloc = 0, rloc = maxLeft - pos; cloc < bases.length; cloc++, rloc++) { // System.err.println("cloc="+cloc+"/"+bases.length+", rloc="+rloc+"/"+width); int x = AminoAcid.baseToNumber[bases[cloc]]; if (x > -1) { int q = (quals == null ? 20 : quals[cloc]); counts[x][rloc] += q; } } } // if(size()>0){//Looks correct. // System.err.println(Arrays.toString(counts[0])); // System.err.println(Arrays.toString(counts[1])); // System.err.println(Arrays.toString(counts[2])); // System.err.println(Arrays.toString(counts[3])); // } return counts; }