diff --git a/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java b/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java index 450edca70..a7a00150d 100755 --- a/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -3,7 +3,6 @@ package org.broadinstitute.sting.utils.sam; import java.util.*; import net.sf.samtools.*; -import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.StingException; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; @@ -26,8 +25,6 @@ public class GATKSAMRecord extends SAMRecord { // the SAMRecord data we're caching private String mReadString = null; - private String mQualString = null; - private byte[] mQualities = null; private SAMReadGroupRecord mReadGroup = null; private boolean mNegativeStrandFlag; private boolean mUnmappedFlag; @@ -42,8 +39,6 @@ public class GATKSAMRecord extends SAMRecord { // These attributes exist in memory only, and are never written to disk. private Map temporaryAttributes; - private final static String ORIGINAL_QUAL_ATTRIBUTE_TAG = "OQ"; // The tag that holds the original quality scores - public GATKSAMRecord(SAMRecord record) { super(null); // it doesn't matter - this isn't used if ( record == null ) @@ -58,6 +53,17 @@ public class GATKSAMRecord extends SAMRecord { List attributes = record.getAttributes(); for ( SAMTagAndValue attribute : attributes ) setAttribute(attribute.tag, attribute.value); + + // if we are using original quals, set them now if t hey are present in the record + if ( GenomeAnalysisEngine.instance.getArguments().useOriginalBaseQualities ) { + byte[] originalQuals = mRecord.getOriginalBaseQualities(); + if ( originalQuals != null ) + mRecord.setBaseQualities(originalQuals); + } + + // sanity check that the lengths of the base and quality strings are equal + if ( getBaseQualities().length != getReadLength() ) + throw new StingException(String.format("Error: the number of base qualities does not match the number of bases in %s (and the GATK does not currently support '*' for the quals)", mRecord.getReadName())); } /////////////////////////////////////////////////////////////////////////////// @@ -120,50 +126,6 @@ public class GATKSAMRecord extends SAMRecord { mSecondOfPairFlag = b; } - public byte[] getBaseQualities() { - if ( mQualities == null ) { - if ( GenomeAnalysisEngine.instance.getArguments().useOriginalBaseQualities ) { - final Object attr = mRecord.getAttribute(ORIGINAL_QUAL_ATTRIBUTE_TAG); - if ( attr != null ) { - if ( attr instanceof String ) { - mQualities = QualityUtils.fastqToPhred((String)attr); - } else { - throw new StingException(String.format("Value encoded by %s in %s isn't a string!", ORIGINAL_QUAL_ATTRIBUTE_TAG, mRecord.getReadName())); - } - } - } - // if we don't want original quals or couldn't find them, use the main quals - if ( mQualities == null ) - mQualities = mRecord.getBaseQualities(); - - // sanity check that the lengths of the base and quality strings are equal - if ( mQualities.length != getReadLength() ) - throw new StingException(String.format("Error: the number of base qualities does not match the number of bases in %s (and the GATK does not currently support '*' for the quals)", mRecord.getReadName())); - } - return mQualities; - } - - public String getBaseQualityString() { - if ( mQualString == null ) { - final byte[] quals = getBaseQualities(); - if ( Arrays.equals(NULL_QUALS, quals) ) - mQualString = NULL_QUALS_STRING; - else - mQualString = SAMUtils.phredToFastq(quals); - } - return mQualString; - } - - public void setBaseQualities(byte[] bytes) { - mQualities = bytes; - mRecord.setBaseQualities(bytes); - } - - public void setBaseQualityString(String s) { - mQualString = s; - mRecord.setBaseQualityString(s); - } - /** * Checks whether an attribute has been set for the given key. * @@ -250,6 +212,14 @@ public class GATKSAMRecord extends SAMRecord { public int getReadLength() { return mRecord.getReadLength(); } + public byte[] getBaseQualities() { return mRecord.getBaseQualities(); } + + public void setBaseQualities(byte[] bytes) { mRecord.setBaseQualities(bytes); } + + public String getBaseQualityString() { return mRecord.getBaseQualityString(); } + + public void setBaseQualityString(String s) { mRecord.setBaseQualityString(s); } + public byte[] getOriginalBaseQualities() { return mRecord.getOriginalBaseQualities(); } public void setOriginalBaseQualities(byte[] bytes) { mRecord.setOriginalBaseQualities(bytes); } diff --git a/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java b/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java index 922f4a462..3c62437cf 100755 --- a/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java +++ b/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java @@ -47,10 +47,10 @@ public class ClipReadsWalkersIntegrationTest extends WalkerTest { " -T ClipReads" + " -I " + validationDataLocation + "originalQuals.chr1.1-1K.bam" + " -L chr1:1-1,000" + - " -OQ -QT 4" + + " -OQ -QT 4 -CR WRITE_Q0S" + " -o %s -ob %s", 2, - Arrays.asList("55c01ccc2e84481b22d3632cdb06c8ba", "ff7c6edba61307738b34786e14edbef9")); + Arrays.asList("55c01ccc2e84481b22d3632cdb06c8ba", "12eeaaa8df3d742f68cdd8838b203825")); executeTest("clipOriginalQuals", spec); } } \ No newline at end of file