diff --git a/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java b/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java index 305519447..af18171a9 100755 --- a/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java +++ b/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java @@ -119,6 +119,10 @@ public class GATKArgumentCollection { @Argument(fullName = "downsample_to_coverage", shortName = "dcov", doc = "Coverage [integer] to downsample to at any given locus; note that downsampled reads are randomly selected from all possible reads at a locus (use max_reads_at_locus to stop the engine from reading in all reads)", required = false) public Integer downsampleCoverage = null; + @Element(required = false) + @Argument(fullName="useOriginalQualities", shortName = "OQ", doc = "If set, use the original base quality scores from the OQ tag when present instead of the standard scores", required=false) + public Boolean useOriginalBaseQualities = false; + @Element(required = false) @Argument(fullName = "validation_strictness", shortName = "S", doc = "How strict should we be with validation", required = false) public SAMFileReader.ValidationStringency strictnessLevel = SAMFileReader.ValidationStringency.SILENT; diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java b/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java index 80221be41..46c37bfee 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java @@ -43,9 +43,6 @@ public class ClipReadsWalker extends ReadWalker 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 ) @@ -118,14 +124,34 @@ public class GATKSAMRecord extends SAMRecord { } public byte[] getBaseQualities() { - if ( mQualities == null ) - mQualities = mRecord.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 ) - mQualString = mRecord.getBaseQualityString(); + if ( mQualString == null ) { + final byte[] quals = getBaseQualities(); + if ( quals.length > 0 ) + mQualString = StringUtil.bytesToString(quals); + } return mQualString; } 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 219e3df6e..922f4a462 100755 --- a/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java +++ b/java/test/org/broadinstitute/sting/playground/gatk/walkers/ClipReadsWalkersIntegrationTest.java @@ -50,7 +50,7 @@ public class ClipReadsWalkersIntegrationTest extends WalkerTest { " -OQ -QT 4" + " -o %s -ob %s", 2, - Arrays.asList("55c01ccc2e84481b22d3632cdb06c8ba", "f9b1347fabbc33bb24f7c7fa8dfb798b")); + Arrays.asList("55c01ccc2e84481b22d3632cdb06c8ba", "ff7c6edba61307738b34786e14edbef9")); executeTest("clipOriginalQuals", spec); } } \ No newline at end of file