diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java index 6eea12e2b..526f25797 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java @@ -30,7 +30,7 @@ public class BaseQualityRankSumTest extends RankSumTest { } } } - protected void fillQualsFromPileup(final Allele ref, final List alts, final Map> stratifiedContext, final List refQuals, List altQuals) { + protected void fillQualsFromPileup(final Allele ref, final List alts, final int refLoc, final Map> stratifiedContext, final List refQuals, final List altQuals) { // TODO -- implement me; how do we pull out the correct offset from the read? return; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java index 520b0f232..749278ce7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java @@ -34,7 +34,7 @@ public class MappingQualityRankSumTest extends RankSumTest { } } - protected void fillQualsFromPileup(final Allele ref, final List alts, final Map> stratifiedContext, final List refQuals, List altQuals) { + protected void fillQualsFromPileup(final Allele ref, final List alts, final int refLoc, final Map> stratifiedContext, final List refQuals, final List altQuals) { for ( final Map.Entry> alleleBin : stratifiedContext.entrySet() ) { final boolean matchesRef = ref.equals(alleleBin.getKey()); final boolean matchesAlt = alts.contains(alleleBin.getKey()); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java index 80d248ac2..ad9600edf 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java @@ -123,7 +123,7 @@ public abstract class RankSumTest extends InfoFieldAnnotation implements Standar if ( context == null ) continue; - fillQualsFromPileup(vc.getReference(), vc.getAlternateAlleles(), context, refQuals, altQuals); + fillQualsFromPileup(vc.getReference(), vc.getAlternateAlleles(), vc.getStart(), context, refQuals, altQuals); } if ( refQuals.size() == 0 || altQuals.size() == 0 ) @@ -146,7 +146,7 @@ public abstract class RankSumTest extends InfoFieldAnnotation implements Standar return map; } - protected abstract void fillQualsFromPileup(final Allele ref, final List alts, final Map> stratifiedContext, final List refQuals, List altQuals); + protected abstract void fillQualsFromPileup(final Allele ref, final List alts, final int refLoc, final Map> stratifiedContext, final List refQuals, List altQuals); protected abstract void fillQualsFromPileup(final byte ref, final List alts, final ReadBackedPileup pileup, final List refQuals, final List altQuals); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java index e013f0e08..9ff8886cf 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java @@ -12,6 +12,7 @@ import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.sam.AlignmentUtils; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; +import org.broadinstitute.sting.utils.sam.ReadUtils; import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.*; @@ -47,11 +48,7 @@ public class ReadPosRankSumTest extends RankSumTest { } } - protected void fillQualsFromPileup(final Allele ref, final List alts, final Map> stratifiedContext, final List refQuals, List altQuals) { - // TODO -- implement me; how do we pull out the correct offset from the read? - return; - -/* + protected void fillQualsFromPileup(final Allele ref, final List alts, final int refLoc, final Map> stratifiedContext, final List refQuals, final List altQuals) { for ( final Map.Entry> alleleBin : stratifiedContext.entrySet() ) { final boolean matchesRef = ref.equals(alleleBin.getKey()); final boolean matchesAlt = alts.contains(alleleBin.getKey()); @@ -59,13 +56,21 @@ public class ReadPosRankSumTest extends RankSumTest { continue; for ( final GATKSAMRecord read : alleleBin.getValue() ) { + final int offset = ReadUtils.getReadCoordinateForReferenceCoordinate( read.getUnclippedStart(), read.getCigar(), refLoc, ReadUtils.ClippingTail.RIGHT_TAIL, true ); + if ( offset == ReadUtils.CLIPPING_GOAL_NOT_REACHED ) + continue; + int readPos = AlignmentUtils.calcAlignmentByteArrayOffset( read.getCigar(), offset, false, false, 0, 0 ); + + final int numAlignedBases = AlignmentUtils.getNumAlignedBases( read ); + if (readPos > numAlignedBases / 2) + readPos = numAlignedBases - (readPos + 1); + if ( matchesRef ) - refQuals.add((double)read.getMappingQuality()); + refQuals.add((double) readPos); else - altQuals.add((double)read.getMappingQuality()); + altQuals.add((double) readPos); } } -*/ } protected void fillIndelQualsFromPileup(ReadBackedPileup pileup, List refQuals, List altQuals) { 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 81ba00888..e5cd9f4d5 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -73,7 +73,7 @@ public class PileupElement implements Comparable { } public PileupElement(final GATKSAMRecord read, final int offset, final boolean isDeletion, final boolean isBeforeDeletion, final boolean isAfterDeletion, final boolean isBeforeInsertion, final boolean isAfterInsertion, final boolean isNextToSoftClip) { - this(read,offset, isDeletion, isBeforeDeletion, isAfterDeletion, isBeforeInsertion, isAfterInsertion, isNextToSoftClip, null, -1); + this(read, offset, isDeletion, isBeforeDeletion, isAfterDeletion, isBeforeInsertion, isAfterInsertion, isNextToSoftClip, null, -1); } public boolean isDeletion() { return isDeletion; diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java index 3b2736418..e0fee66ef 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java @@ -381,15 +381,19 @@ public class AlignmentUtils { return alignment; } - public static int calcAlignmentByteArrayOffset(final Cigar cigar, PileupElement pileup, final int alignmentStart, final int refLocus) { - int pileupOffset = pileup.getOffset(); + public static int calcAlignmentByteArrayOffset(final Cigar cigar, final PileupElement pileupElement, final int alignmentStart, final int refLocus) { + return calcAlignmentByteArrayOffset( cigar, pileupElement.getOffset(), pileupElement.isInsertionAtBeginningOfRead(), pileupElement.isDeletion(), alignmentStart, refLocus ); + } + + public static int calcAlignmentByteArrayOffset(final Cigar cigar, final int offset, final boolean isInsertionAtBeginningOfRead, final boolean isDeletion, final int alignmentStart, final int refLocus) { + int pileupOffset = offset; // Special case for reads starting with insertion - if (pileup.isInsertionAtBeginningOfRead()) + if (isInsertionAtBeginningOfRead) return 0; // Reassign the offset if we are in the middle of a deletion because of the modified representation of the read bases - if (pileup.isDeletion()) { + if (isDeletion) { pileupOffset = refLocus - alignmentStart; final CigarElement ce = cigar.getCigarElement(0); if (ce.getOperator() == CigarOperator.S) { @@ -414,7 +418,7 @@ public class AlignmentUtils { break; case D: case N: - if (!pileup.isDeletion()) { + if (!isDeletion) { alignmentPos += elementLength; } else { if (pos + elementLength - 1 >= pileupOffset) {