/* (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;
  }
示例#3
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;
  }