public String getQual() { String qual; if (mergedQual != null) { qual = mergedQual; } else { qual = samRecord.getBaseQualityString(); } return qual; }
private boolean hasLowQualityBase(SAMRecord read) { //TODO: Don't hardcode phred33 for (int i=0; i<read.getBaseQualityString().length(); i++) { if ((read.getBaseQualityString().charAt(i) - '!') < 20) { return true; } } return false; }
/** * Adds the SAMRecord's quality scores. * <p/> * Does not assume Phred quality encoding (for obvious reasons); getBaseQualityString() is used to read the * unmodified ASCII score. To elaborate, SAMFileReader, which is generating these SAMRecords, builds the * SAMRecord by subtracting a value from each quality score and storing that transformed value internally. * Since we desire original scores here (whatever was in the file to begin with), we effectively undo this * transformation by asking SAMRecord to convert the quality back into the ASCII that was read in the file. */ public void add(final SAMRecord samRecord) { addAsciiQuality(samRecord.getBaseQualityString().getBytes()); }
private static void printFastq(PrintStream ps, SAMRecord record) { ps.print('@'); ps.println(record.getReadName()); ps.println(record.getReadString()); ps.println('+'); ps.println(record.getBaseQualityString()); }
private void print(SAMRecord r, int index) throws IOException { OutputStream os = outputs[index]; os.write('@'); if (prefix != null) { os.write(prefix.getBytes()); os.write('.'); os.write(String.valueOf(counter).getBytes()); os.write(' '); } os.write(r.getReadName().getBytes()); if (index > 0) { os.write('/'); os.write(48 + index); } os.write('\n'); os.write(r.getReadBases()); os.write("\n+\n".getBytes()); os.write(r.getBaseQualityString().getBytes()); os.write('\n'); } }
/** * Adds the SAMRecord's quality scores. * <p/> * Does not assume Phred quality encoding (for obvious reasons); getBaseQualityString() is used to read the * unmodified ASCII score. To elaborate, the {@link SamReader}, which is generating these {@link SAMRecord}s, builds the * SAMRecord by subtracting a value from each quality score and storing that transformed value internally. * Since we desire original scores here (whatever was in the file to begin with), we effectively undo this * transformation by asking {@link SAMRecord} to convert the quality back into the ASCII that was read in the file. */ public void add(final SAMRecord samRecord, final boolean useOriginalQualities) { addAsciiQuality(useOriginalQualities && samRecord.getOriginalBaseQualities() != null ? SAMUtils.phredToFastq(samRecord.getOriginalBaseQualities()).getBytes() : samRecord.getBaseQualityString().getBytes()); }
/** * Adds the SAMRecord's quality scores. * <p/> * Does not assume Phred quality encoding (for obvious reasons); getBaseQualityString() is used to read the * unmodified ASCII score. To elaborate, the {@link SamReader}, which is generating these {@link SAMRecord}s, builds the * SAMRecord by subtracting a value from each quality score and storing that transformed value internally. * Since we desire original scores here (whatever was in the file to begin with), we effectively undo this * transformation by asking {@link SAMRecord} to convert the quality back into the ASCII that was read in the file. */ public void add(final SAMRecord samRecord, final boolean useOriginalQualities) { addAsciiQuality(useOriginalQualities && samRecord.getOriginalBaseQualities() != null ? SAMUtils.phredToFastq(samRecord.getOriginalBaseQualities()).getBytes() : samRecord.getBaseQualityString().getBytes()); }
/** * The following passage is for paranoid mode only. When java is run with * asserts on it will throw an {@link AssertionError} if read bases or * quality scores of a restored SAM record mismatch the original. This is * effectively a runtime round trip test. */ private static void assertSame(SAMFileHeader samFileHeader, List<SAMRecord> samRecords, List<CramCompressionRecord> cramRecords) { @SuppressWarnings("UnusedAssignment") boolean assertsEnabled = false; assert assertsEnabled = true; if (assertsEnabled) { final Cram2SamRecordFactory f = new Cram2SamRecordFactory(samFileHeader); for (int i = 0; i < samRecords.size(); i++) { final SAMRecord restoredSamRecord = f.create(cramRecords.get(i)); assert (restoredSamRecord.getAlignmentStart() == samRecords.get(i).getAlignmentStart()); assert (restoredSamRecord.getReferenceName().equals(samRecords.get(i).getReferenceName())); assert (restoredSamRecord.getReadString().equals(samRecords.get(i).getReadString())); assert (restoredSamRecord.getBaseQualityString().equals(samRecords.get(i).getBaseQualityString())); } } }
/** * Get quality string in a safe way, avoid exceptions due to quality scores beyond MAX_PHRED_SCORE * @param record current SAMRecord from the parsed BAM * @return base quality string contains only values less then MAX_PHRED_SCORE */ static String getBaseQualityString(SAMRecord record) { try { return record.getBaseQualityString(); } catch(IllegalArgumentException iae) { // For consolidated reads the quality score can be outside the allowed ranges for proper character representation // In this case we saturate at the highest value System.err.println("WARNING: Cannot get encode qualities for SAM entry at " + record.getReferenceName() + ":" + record.getAlignmentStart() + ", record name: '" + record.getReadName()+"'. Qualities capped at " + SAMUtils.MAX_PHRED_SCORE); byte[] qs=record.getBaseQualities(); char[] qsChar = new char[qs.length]; for(int i=0 ; i < qs.length; i++) { byte q = qs[i]; if((q < 0) || (q > SAMUtils.MAX_PHRED_SCORE)) qs[i] = SAMUtils.MAX_PHRED_SCORE; qsChar[i] = (char)(q + 33); } return new String(qsChar); } }
@Test public void testReverseComplement() { final SAMRecord rec = createTestSamRec(); rec.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), false); Assert.assertEquals(rec.getReadString(), "GTGTGTGTGT"); Assert.assertEquals(rec.getBaseQualityString(), "IIIIIHHHHH"); Assert.assertEquals(rec.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1}); Assert.assertEquals(rec.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1}); Assert.assertEquals(rec.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1}); Assert.assertEquals(rec.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f}); Assert.assertEquals(rec.getStringAttribute("Y1"), "GTTTTCTTTT"); }
@Test(dataProvider = "reverseComplementData") public void testSafeReverseComplement(boolean inplace, String bases, String quals, String y1, byte[] x1, short[] x2, int[] x3, float[] x4) throws CloneNotSupportedException { final SAMRecord original = createTestSamRec(); final SAMRecord cloneOfOriginal = (SAMRecord) original.clone(); //Runs a copy (rather than in-place) reverseComplement cloneOfOriginal.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), inplace); Assert.assertEquals(original.getReadString(), bases); Assert.assertEquals(original.getBaseQualityString(), quals); Assert.assertEquals(original.getByteArrayAttribute("X1"), x1); Assert.assertEquals(original.getSignedShortArrayAttribute("X2"), x2); Assert.assertEquals(original.getSignedIntArrayAttribute("X3"), x3); Assert.assertEquals(original.getFloatArrayAttribute("X4"), x4); Assert.assertEquals(original.getStringAttribute("Y1"), y1); Assert.assertEquals(cloneOfOriginal.getReadString(), "GTGTGTGTGT"); Assert.assertEquals(cloneOfOriginal.getBaseQualityString(), "IIIIIHHHHH"); Assert.assertEquals(cloneOfOriginal.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1}); Assert.assertEquals(cloneOfOriginal.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1}); Assert.assertEquals(cloneOfOriginal.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1}); Assert.assertEquals(cloneOfOriginal.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f}); Assert.assertEquals(cloneOfOriginal.getStringAttribute("Y1"), "GTTTTCTTTT"); }
@Test public static void testQueryAlignmentStartOne() throws IOException { // one read on chrM starts from 9060 final CloseableIterator<SAMRecord> baiIterator = bamFileReaderBAI.queryAlignmentStart("chrM", 9060); final CloseableIterator<SAMRecord> csiIterator = bamFileReaderCSI.queryAlignmentStart("chrM", 9060); Assert.assertTrue(baiIterator.hasNext()); Assert.assertTrue(csiIterator.hasNext()); SAMRecord r1 = baiIterator.next(); SAMRecord r2 = csiIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); Assert.assertFalse(baiIterator.hasNext()); Assert.assertFalse(csiIterator.hasNext()); baiIterator.close(); csiIterator.close(); }
@Test public static void testQueryUnmapped() { int counter = 0; CloseableIterator<SAMRecord> baiIterator = bamFileReaderBAI.queryUnmapped(); CloseableIterator<SAMRecord> csiIterator = bamFileReaderCSI.queryUnmapped(); Assert.assertTrue(baiIterator.hasNext()); while (baiIterator.hasNext()) { Assert.assertTrue(csiIterator.hasNext()); SAMRecord r1 = baiIterator.next(); SAMRecord r2 = csiIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); counter++; } Assert.assertFalse(csiIterator.hasNext()); Assert.assertEquals(counter, nofUnmappedReads); baiIterator.close(); csiIterator.close(); }
@Test public static void testQueryOverlapped() { int counter = 0; CloseableIterator<SAMRecord> baiIterator = bamFileReaderBAI.query("chrM", 1500, 10450, false); CloseableIterator<SAMRecord> csiIterator = bamFileReaderCSI.query("chrM", 1500, 10450, false); Assert.assertTrue(baiIterator.hasNext()); while (baiIterator.hasNext()) { Assert.assertTrue(csiIterator.hasNext()); SAMRecord r1 = baiIterator.next(); SAMRecord r2 = csiIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); counter++; } Assert.assertFalse(csiIterator.hasNext()); Assert.assertEquals(counter, noChrMReadsOverlapped); baiIterator.close(); csiIterator.close(); }
/** * Converts a {@link SAMRecord} into a {@link FastqRecord}. */ public static FastqRecord asFastqRecord(final SAMRecord record) { String readName = record.getReadName(); if(record.getReadPairedFlag() && (record.getFirstOfPairFlag() || record.getSecondOfPairFlag())) { readName += (record.getFirstOfPairFlag()) ? FastqConstants.FIRST_OF_PAIR : FastqConstants.SECOND_OF_PAIR; } return new FastqRecord(readName, record.getReadString(), record.getStringAttribute(SAMTag.CO.name()), record.getBaseQualityString()); }
/** * Converts a {@link SAMRecord} into a {@link FastqRecord}. */ public static FastqRecord asFastqRecord(final SAMRecord record) { String readName = record.getReadName(); if(record.getReadPairedFlag() && (record.getFirstOfPairFlag() || record.getSecondOfPairFlag())) { readName += (record.getFirstOfPairFlag()) ? FastqConstants.FIRST_OF_PAIR : FastqConstants.SECOND_OF_PAIR; } return new FastqRecord(readName, record.getReadString(), record.getStringAttribute(SAMTag.CO.name()), record.getBaseQualityString()); }
public void addAlignment(int sampleIdx, SAMRecordWrapper samRecord, int chromosomeChunkIdx) { Feature chunk = this.chromosomeChunker.getChunks().get(chromosomeChunkIdx); SAMRecord read = samRecord.getSamRecord(); // Only output reads with original start pos within specified chromosomeChunk // Avoids reads being written in 2 different chunks int origAlignmentStart = read.getAlignmentStart(); String yo = read.getStringAttribute("YO"); if (yo != null) { String[] fields = yo.split(":"); origAlignmentStart = Integer.parseInt(fields[1]); } if (origAlignmentStart >= chunk.getStart() && origAlignmentStart <= chunk.getEnd()) { if (samRecord.isUnalignedRc() && read.getReadUnmappedFlag()) { // This read was reverse complemented, but not updated. // Change it back to its original state. read.setReadString(rc.reverseComplement(read.getReadString())); read.setBaseQualityString(rc.reverse(read.getBaseQualityString())); read.setReadNegativeStrandFlag(!read.getReadNegativeStrandFlag()); } writers[sampleIdx][chromosomeChunkIdx].addAlignment(read); } }
@Test public void testQueryUnmapped() throws IOException { try (final SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE); final SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped()) { CRAMFileReader reader = new CRAMFileReader( new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(craiBytes), source, ValidationStringency.STRICT); int counter = 0; CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped(); while (unmappedSamIterator.hasNext()) { Assert.assertTrue(unmappedCramIterator.hasNext()); SAMRecord r1 = unmappedSamIterator.next(); SAMRecord r2 = unmappedCramIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); counter++; } Assert.assertFalse(unmappedCramIterator.hasNext()); Assert.assertEquals(counter, nofUnmappedReads); } }
@Test public void scanAllUnmappedReads() throws IOException { SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE); CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT); reader.setValidationStringency(ValidationStringency.SILENT); int counter = 0; SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped(); CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped(); while (unmappedSamIterator.hasNext()) { Assert.assertTrue(unmappedCramIterator.hasNext()); SAMRecord r1 = unmappedSamIterator.next(); SAMRecord r2 = unmappedCramIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); counter++; } Assert.assertFalse(unmappedCramIterator.hasNext()); Assert.assertEquals(counter, nofUnmappedReads); reader.close(); }
public static Alignment buildAlignment(SAMRecord record, Map<String, Object> attributes, String referenceSequence) { List<Alignment.AlignmentDifference> differences; differences = AlignmentUtils.getDifferencesFromCigar(record, referenceSequence, Integer.MAX_VALUE); Alignment alignment = new Alignment(record.getReadName(), record.getReferenceName(), record.getAlignmentStart(), record.getAlignmentEnd(), record.getUnclippedStart(), record.getUnclippedEnd(), record.getReadLength(), record.getMappingQuality(), record.getBaseQualityString(),//.replace("\\", "\\\\").replace("\"", "\\\""), record.getMateReferenceName(), record.getMateAlignmentStart(), record.getInferredInsertSize(), record.getFlags(), differences, attributes); return alignment; } public static Alignment buildAlignment(SAMRecord record, String referenceSequence) {