seqNameToIndexMap.put(seq.getSequenceName(), seq.getSequenceIndex());
}
ReadFeatures2Cigar readFeatures2Cigar = new ReadFeatures2Cigar();
List<SAMRecord> samRecords = new ArrayList<SAMRecord>();
SAMRecord samRecord = null;
int counter = 0;
for (CramRecord record : readRecords) {
CramRecord cramRecord = record;
samRecord = new SAMRecord(header);
if (record.tags != null && !record.tags.isEmpty()) {
for (ReadTag rt : record.tags) {
samRecord.setAttribute(rt.getKey(), rt.getValue());
}
}
if (readGroups != null && !readGroups.isEmpty()) {
String rgId = readGroups.get(cramRecord.getReadGroupID());
if (rgId != null)
samRecord.setAttribute("RG", rgId);
}
if (cramRecord.next != null || cramRecord.previous != null) {
CramRecord mate = cramRecord.next == null ? cramRecord.previous : cramRecord.next;
samRecord.setReadPairedFlag(true);
samRecord.setMateAlignmentStart((int) mate.getAlignmentStart());
samRecord.setMateNegativeStrandFlag(mate.isNegativeStrand());
samRecord.setInferredInsertSize(record.insertSize);
if (SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(mate.getSequenceName())) {
samRecord.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
samRecord.setMateUnmappedFlag(!mate.isReadMapped());
if (cramRecord.isFirstInPair()) {
samRecord.setFirstOfPairFlag(true);
samRecord.setSecondOfPairFlag(false);
} else {
samRecord.setFirstOfPairFlag(false);
samRecord.setSecondOfPairFlag(true);
}
} else {
if (mate.getSequenceName() == null || !seqNameToIndexMap.containsKey(mate.getSequenceName())) {
samRecord.setReadPairedFlag(false);
samRecord.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
samRecord.setMateNegativeStrandFlag(false);
} else {
int seqIndex = seqNameToIndexMap.get(mate.getSequenceName());
samRecord.setMateReferenceIndex(seqIndex);
samRecord.setMateUnmappedFlag(!mate.isReadMapped());
if (cramRecord.isFirstInPair()) {
samRecord.setFirstOfPairFlag(true);
samRecord.setSecondOfPairFlag(false);
} else {
samRecord.setFirstOfPairFlag(false);
samRecord.setSecondOfPairFlag(true);
}
}
}
samRecord.setReadName(cramRecord.getReadName());
} else {
String readName = cramRecord.getReadName();
if (readName == null)
readName = String.valueOf(counter);
if (!cramRecord.isLastFragment()) {
samRecord.setFirstOfPairFlag(cramRecord.isFirstInPair());
samRecord.setSecondOfPairFlag(!cramRecord.isFirstInPair());
samRecord.setReadPairedFlag(true);
} else {
if (cramRecord.isLastFragment()) {
samRecord.setReadName(readName);
samRecord.setReadPairedFlag(false);
samRecord.setFirstOfPairFlag(false);
samRecord.setSecondOfPairFlag(false);
} else {
samRecord.setReadName(readName);
samRecord.setFirstOfPairFlag(cramRecord.isFirstInPair());
samRecord.setSecondOfPairFlag(!cramRecord.isFirstInPair());
samRecord.setReadPairedFlag(true);
}
}
}
samRecord.setMappingQuality((int) cramRecord.getMappingQuality() & 0xFF);
if (cramRecord.isReadMapped()) {
samRecord.setAlignmentStart((int) cramRecord.getAlignmentStart());
samRecord.setReadBases(cramRecord.getReadBases());
byte[] scores = cramRecord.getQualityScores();
scores = cramRecord.getQualityScores();
injectQualityScores(scores, samRecord);
} else {
samRecord.setAlignmentStart((int) cramRecord.getAlignmentStart());
samRecord.setReadBases(cramRecord.getReadBases());
byte[] scores = cramRecord.getQualityScores();
injectQualityScores(scores, samRecord);
}
samRecord.setCigar(readFeatures2Cigar.getCigar2(cramRecord.getReadFeatures(),
(int) cramRecord.getReadLength()));
samRecord.setReadUnmappedFlag(!cramRecord.isReadMapped());
samRecord.setReadNegativeStrandFlag(cramRecord.isNegativeStrand());
samRecord.setReferenceName(seqName);
samRecord.setProperPairFlag(cramRecord.isProperPair());
samRecord.setDuplicateReadFlag(cramRecord.isDuplicate());
samRecord.setReadFailsVendorQualityCheckFlag(cramRecord.vendorFiltered);
if (SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(samRecord.getReferenceName()))
samRecord.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
if (samRecord.getReadUnmappedFlag()) {
samRecord.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
samRecord.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
}
samRecords.add(samRecord);
}
return samRecords;
}