From 6df43f730a0c33f5a02efbbe5cef985c0df51733 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Tue, 23 Jul 2013 23:47:15 -0400 Subject: [PATCH] Fixing ReadBackedPileup to represent mapping qualities as ints, not (signed) bytes. Having them as bytes caused problems for downstream programmers who had data with high MQs. --- .../missing/QualifyMissingIntervals.java | 2 +- .../sting/utils/pileup/ReadBackedPileup.java | 2 +- .../utils/pileup/ReadBackedPileupImpl.java | 8 +++---- .../pileup/ReadBackedPileupUnitTest.java | 21 ++++++++++++++++++- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/protected/java/src/org/broadinstitute/sting/gatk/walkers/diagnostics/missing/QualifyMissingIntervals.java b/protected/java/src/org/broadinstitute/sting/gatk/walkers/diagnostics/missing/QualifyMissingIntervals.java index d0db3ef98..f67db4187 100644 --- a/protected/java/src/org/broadinstitute/sting/gatk/walkers/diagnostics/missing/QualifyMissingIntervals.java +++ b/protected/java/src/org/broadinstitute/sting/gatk/walkers/diagnostics/missing/QualifyMissingIntervals.java @@ -156,7 +156,7 @@ public final class QualifyMissingIntervals extends LocusWalker baseQual += qual; } double mapQual = 0.0; - for (byte qual : pileup.getMappingQuals()) { + for (int qual : pileup.getMappingQuals()) { mapQual += qual; } diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java index e1865ba3c..059c41d64 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java @@ -270,7 +270,7 @@ public interface ReadBackedPileup extends Iterable, HasGenomeLoca * Get an array of the mapping qualities * @return */ - public byte[] getMappingQuals(); + public int[] getMappingQuals(); /** * Returns a new ReadBackedPileup that is sorted by start coordinate of the reads. diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java index 65c47c23b..455a6aa12 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java @@ -969,11 +969,11 @@ public class ReadBackedPileupImpl implements ReadBackedPileup { * @return */ @Override - public byte[] getMappingQuals() { - byte[] v = new byte[getNumberOfElements()]; + public int[] getMappingQuals() { + final int[] v = new int[getNumberOfElements()]; int pos = 0; - for (PileupElement pile : pileupElementTracker) { - v[pos++] = (byte) pile.getRead().getMappingQuality(); + for ( final PileupElement pile : pileupElementTracker ) { + v[pos++] = pile.getRead().getMappingQuality(); } return v; } diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java index 18fa8a302..02b11b970 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java @@ -296,7 +296,6 @@ public class ReadBackedPileupUnitTest { testRBPCounts(pileup, new RBPCountTest(params.nReads + 2, params.nMapq0 + 1, params.nDeletions + 1)); } - private void testRBPCounts(final ReadBackedPileup rbp, RBPCountTest expected) { for ( int cycles = 0; cycles < 3; cycles++ ) { // multiple cycles to make sure caching is working @@ -306,4 +305,24 @@ public class ReadBackedPileupUnitTest { Assert.assertEquals(rbp.getNumberOfMappingQualityZeroReads(), expected.nMapq0); } } + + @Test + public void testRBPMappingQuals() { + + // create a read with high MQ + final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(header, "read", 0, 1, 10); + read.setReadBases(Utils.dupBytes((byte) 'A', 10)); + read.setBaseQualities(Utils.dupBytes((byte) 30, 10)); + read.setCigarString("10M"); + read.setMappingQuality(200); // set a MQ higher than max signed byte + + // now create the RBP + final List elts = new LinkedList<>(); + elts.add(new PileupElement(read, 0, read.getCigar().getCigarElement(0), 0, 0)); + final Map pileupsBySample = new HashMap<>(); + pileupsBySample.put("foo", new ReadBackedPileupImpl(loc, elts)); + final ReadBackedPileup pileup = new ReadBackedPileupImpl(loc, pileupsBySample); + + Assert.assertEquals(pileup.getMappingQuals()[0], 200); + } } \ No newline at end of file