log("Adjusting reads.");
RealignmentWriter writer = getRealignmentWriter(outputSam, isTightAlignment, tempDir);
SAMFileReader contigReader = new SAMFileReader(new File(alignedToContigSam));
contigReader.setValidationStringency(ValidationStringency.SILENT);
SamStringReader samStringReader = new SamStringReader(samHeader);
for (SAMRecord read : contigReader) {
String origSamStr = read.getReadName();
origSamStr = origSamStr.replace(Sam2Fastq.FIELD_DELIMITER, "\t");
SAMRecord orig;
try {
orig = samStringReader.getRead(origSamStr);
} catch (RuntimeException e) {
System.out.println("Error processing: [" + origSamStr + "]");
System.out.println("Contig read: [" + read.getSAMString() + "]");
e.printStackTrace();
throw e;
}
orig.setHeader(samHeader);
orig.setReadString(read.getReadString());
orig.setBaseQualityString(read.getBaseQualityString());
SAMRecord readToOutput = null;
// Only adjust reads that align to contig with no indel and shorter edit distance than the original alignment
String matchingString = read.getReadLength() + "M";
if ((read.getCigarString().equals(matchingString)) &&
(read.getReadUnmappedFlag() == false) &&
(!orig.getCigarString().contains("N")) && // Don't remap introns
(SAMRecordUtils.getEditDistance(read, null) < SAMRecordUtils.getOrigEditDistance(orig)) &&
(!isFiltered(orig))) {
SAMRecord origRead = orig;
String contigReadStr = read.getReferenceName();
int numBestHits = SAMRecordUtils.getIntAttribute(read, "X0");
int numSubOptimalHits = SAMRecordUtils.getIntAttribute(read, "X1");
int totalHits = numBestHits + numSubOptimalHits;
List<HitInfo> bestHits = getBestHits(contigReadStr, samStringReader, read, matchingString);
Map<String, SAMRecord> outputReadAlignmentInfo = convertBestHitsToAlignmentInfo(bestHits, origRead);
readToOutput = getUpdatedReadInfo(outputReadAlignmentInfo, read,
orig, origRead, c2r, totalHits, isTightAlignment);
}
adjustForStrand(read.getReadNegativeStrandFlag(), orig);
writer.addAlignment(readToOutput, orig);
}
int realignedCount = writer.flush();
contigReader.close();
log("Done adjusting reads. Number of reads realigned: " + realignedCount);
}