@Override public int compare(Pair<Integer, File> p1, Pair<Integer, File> p2) { int startPositionP1 = p1.getFirst(); int startPositionP2 = p2.getFirst(); if (startPositionP1 == startPositionP2) return 0; return startPositionP1 < startPositionP2 ? -1 : 1; }
// we need to pad ref by at least the bandwidth / 2 on either side public BAQCalculationResult calcBAQFromHMM(SAMRecord read, byte[] ref, int refOffset) { // todo -- need to handle the case where the cigar sum of lengths doesn't cover the whole read Pair<Integer, Integer> queryRange = calculateQueryRange(read); if (queryRange == null) return null; // read has Ns, or is completely clipped away int queryStart = queryRange.getFirst(); int queryEnd = queryRange.getSecond(); BAQCalculationResult baqResult = calcBAQFromHMM(ref, read.getReadBases(), read.getBaseQualities(), queryStart, queryEnd); // cap quals int readI = 0, refI = 0; for (CigarElement elt : read.getCigar().getCigarElements()) { int l = elt.getLength(); switch (elt.getOperator()) { case N: // cannot handle these return null; case H: case P: // ignore pads and hard clips break; case S: refI += l; // move the reference too, in addition to I case I: // todo -- is it really the case that we want to treat I and S the same? for (int i = readI; i < readI + l; i++) baqResult.bq[i] = baqResult.rawQuals[i]; readI += l; break; case D: refI += l; break; case M: for (int i = readI; i < readI + l; i++) { int expectedPos = refI - refOffset + (i - readI); baqResult.bq[i] = capBaseByBAQ( baqResult.rawQuals[i], baqResult.bq[i], baqResult.state[i], expectedPos); } readI += l; refI += l; break; default: throw new ReviewedGATKException( "BUG: Unexpected CIGAR element " + elt + " in read " + read.getReadName()); } } if (readI != read.getReadLength()) // odd cigar string System.arraycopy(baqResult.rawQuals, 0, baqResult.bq, 0, baqResult.bq.length); return baqResult; }
/** * General interval reduce routine called after all of the traversals are done * * @param results interval reduce results */ public void onTraversalDone(List<Pair<GenomeLoc, ReduceType>> results) { for (Pair<GenomeLoc, ReduceType> result : results) { logger.info(String.format("[INTERVAL REDUCE RESULT] at %s ", result.getFirst())); this.onTraversalDone(result.getSecond()); } }