diff --git a/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java b/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java index 7d2882dbb..4b0ac4b19 100755 --- a/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java +++ b/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java @@ -39,6 +39,7 @@ import java.util.Map; /** * Useful class for storing different AlignmentContexts * User: ebanks + * Modified: chartl (split by read group) */ public class StratifiedAlignmentContext { @@ -140,6 +141,40 @@ public class StratifiedAlignmentContext { myContext.add(read, p.getOffset()); } + return contexts; + } + + /** + * Splits the given AlignmentContext into a StratifiedAlignmentContext per read group. + * + * @param pileup the original pileup + * @return a Map of sample name to StratifiedAlignmentContext + * @todo - support for collapsing or assuming read groups if they are missing + * + **/ + public static Map splitContextByReadGroup(ReadBackedPileup pileup) { + HashMap contexts = new HashMap(); + + for ( PileupElement p : pileup ) { + SAMRecord read = p.getRead(); + + SAMReadGroupRecord readGroup = read.getReadGroup(); + if ( readGroup == null ) { + throw new StingException("Missing read group for read " + read.getReadName()); + } + + String group = readGroup.getReadGroupId(); + + StratifiedAlignmentContext myContext = contexts.get(group); + + if ( myContext == null ) { + myContext = new StratifiedAlignmentContext(pileup.getLocation()); + contexts.put(group,myContext); + } + + myContext.add(read,p.getOffset()); + } + return contexts; } } \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/coverage/CoverageStatistics.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/coverage/CoverageStatistics.java index 9a4a96d2e..6340a4f25 100644 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/coverage/CoverageStatistics.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/coverage/CoverageStatistics.java @@ -141,12 +141,17 @@ public class CoverageStatistics extends LocusWalker, DepthOf } public Map map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { - Map contextsBySample = - StratifiedAlignmentContext.splitContextBySample(context.getBasePileup()); + Map contexts; + if ( useReadGroup ) { + contexts = StratifiedAlignmentContext.splitContextByReadGroup(context.getBasePileup()); + } else { + contexts = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup()); + } + HashMap depthBySample = new HashMap(); - for ( String sample : contextsBySample.keySet() ) { - AlignmentContext sampleContext = contextsBySample.get(sample).getContext(StratifiedAlignmentContext.StratifiedContextType.COMPLETE); + for ( String sample : contexts.keySet() ) { + AlignmentContext sampleContext = contexts.get(sample).getContext(StratifiedAlignmentContext.StratifiedContextType.COMPLETE); int properDepth = 0; for ( PileupElement e : sampleContext.getBasePileup() ) { if ( e.getQual() >= minBaseQuality && e.getMappingQual() >= minMappingQuality ) {