From 98ecaf8aa0c0507f3f6774cc3065604648e210d6 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 29 Sep 2011 17:18:39 -0400 Subject: [PATCH] Support for ReducedReads with reduced counts and average quals -- ReadUtils and UnitTest updated to support new byte[] style -- Removed unnecessary read transformer in PairHMM --- .../indels/PairHMMIndelErrorModel.java | 4 --- .../sting/utils/pileup/PileupElement.java | 6 ++-- .../sting/utils/sam/ReadUtils.java | 33 ++++++++++++------- .../sting/utils/ReadUtilsUnitTest.java | 28 +++++----------- 4 files changed, 32 insertions(+), 39 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java index c8328771b..7c436ce44 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java @@ -415,10 +415,6 @@ public class PairHMMIndelErrorModel { if (read == null) continue; - if ( isReduced ) { - read = ReadUtils.reducedReadWithReducedQuals(read); - } - if(ReadUtils.is454Read(read)) { continue; } diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java index 053864791..f6ed792a5 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -87,11 +87,11 @@ public class PileupElement { public int getReducedCount() { if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced count for non-reduced read " + getRead().getReadName()); - return (int)getQual(); + return ReadUtils.getReducedCount(getRead(), offset); } public byte getReducedQual() { - return (byte)(int)ReadUtils.getReducedReadQualityTagValue(getRead()); + if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced qual for non-reduced read " + getRead().getReadName()); + return ReadUtils.getReducedQual(getRead(), offset); } - } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index fcb3089cd..a57154ff1 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -54,26 +54,35 @@ public class ReadUtils { public static final String REDUCED_READ_QUALITY_TAG = "RQ"; public static final String REDUCED_READ_CONSENSUS_COUNTS_TAG = "CC"; - public final static Integer getReducedReadQualityTagValue(final SAMRecord read) { - return read.getIntegerAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); + public final static byte[] getReducedReadQualityTagValue(final SAMRecord read) { + return read.getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); } public final static boolean isReducedRead(final SAMRecord read) { return getReducedReadQualityTagValue(read) != null; } + public final static byte getReducedQual(final SAMRecord read, final int i) { + return read.getBaseQualities()[i]; + } + + public final static byte getReducedCount(final SAMRecord read, final int i) { + return getReducedReadQualityTagValue(read)[i]; + } + public final static SAMRecord reducedReadWithReducedQuals(final SAMRecord read) { if ( ! isReducedRead(read) ) throw new IllegalArgumentException("read must be a reduced read"); - try { - SAMRecord newRead = (SAMRecord)read.clone(); - byte reducedQual = (byte)(int)getReducedReadQualityTagValue(read); - byte[] newQuals = new byte[read.getBaseQualities().length]; - Arrays.fill(newQuals, reducedQual); - newRead.setBaseQualities(newQuals); - return newRead; - } catch ( CloneNotSupportedException e ) { - throw new ReviewedStingException("SAMRecord no longer supports clone", e); - } + return read; +// try { +// SAMRecord newRead = (SAMRecord)read.clone(); +// byte reducedQual = (byte)(int)getReducedReadQualityTagValue(read); +// byte[] newQuals = new byte[read.getBaseQualities().length]; +// Arrays.fill(newQuals, reducedQual); +// newRead.setBaseQualities(newQuals); +// return newRead; +// } catch ( CloneNotSupportedException e ) { +// throw new ReviewedStingException("SAMRecord no longer supports clone", e); +// } } // ---------------------------------------------------------------------------------------------------- diff --git a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java index e1fdadadc..c14fea24c 100755 --- a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java @@ -16,7 +16,7 @@ public class ReadUtilsUnitTest extends BaseTest { SAMRecord read, reducedRead; final static String BASES = "ACTG"; final static String QUALS = "!+5?"; - final private static int REDUCED_READ_QUAL = 20; + final private static byte[] REDUCED_READ_COUNTS = new byte[]{10, 20, 30, 40}; @BeforeTest public void init() { @@ -29,7 +29,7 @@ public class ReadUtilsUnitTest extends BaseTest { reducedRead = ArtificialSAMUtils.createArtificialRead(header, "reducedRead", 0, 1, BASES.length()); reducedRead.setReadBases(BASES.getBytes()); reducedRead.setBaseQualityString(QUALS); - reducedRead.setAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG, REDUCED_READ_QUAL); + reducedRead.setAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG, REDUCED_READ_COUNTS); } private void testReadBasesAndQuals(SAMRecord read, int expectedStart, int expectedStop) { @@ -52,21 +52,10 @@ public class ReadUtilsUnitTest extends BaseTest { Assert.assertEquals(ReadUtils.getReducedReadQualityTagValue(read), null, "No reduced read tag in normal read"); Assert.assertTrue(ReadUtils.isReducedRead(reducedRead), "isReducedRead is true for reduced read"); - Assert.assertEquals((int) ReadUtils.getReducedReadQualityTagValue(reducedRead), REDUCED_READ_QUAL, "Reduced read tag is set to expected value"); - } - - @Test - public void testreducedReadWithReducedQualsWithReducedRead() { - SAMRecord replacedRead = ReadUtils.reducedReadWithReducedQuals(reducedRead); - Assert.assertEquals(replacedRead.getReadBases(), reducedRead.getReadBases()); - Assert.assertEquals(replacedRead.getBaseQualities().length, reducedRead.getBaseQualities().length); - for ( int i = 0; i < replacedRead.getBaseQualities().length; i++) - Assert.assertEquals(replacedRead.getBaseQualities()[i], REDUCED_READ_QUAL); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testreducedReadWithReducedQualsWithNormalRead() { - ReadUtils.reducedReadWithReducedQuals(read); + for ( int i = 0; i < reducedRead.getReadLength(); i++) { + Assert.assertEquals(ReadUtils.getReducedQual(reducedRead, i), read.getBaseQualities()[i], "Reduced read quality not set to the expected value at " + i); + Assert.assertEquals(ReadUtils.getReducedCount(reducedRead, i), REDUCED_READ_COUNTS[i], "Reduced read count not set to the expected value at " + i); + } } @Test @@ -77,8 +66,7 @@ public class ReadUtilsUnitTest extends BaseTest { Assert.assertFalse(readp.isReducedRead()); Assert.assertTrue(reducedreadp.isReducedRead()); - Assert.assertEquals(reducedreadp.getReducedCount(), 0); - Assert.assertEquals(reducedreadp.getReducedQual(), REDUCED_READ_QUAL); - + Assert.assertEquals(reducedreadp.getReducedCount(), REDUCED_READ_COUNTS[0]); + Assert.assertEquals(reducedreadp.getReducedQual(), readp.getQual()); } }