diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/DepthOfCoverageWalker.java b/java/src/org/broadinstitute/sting/gatk/walkers/DepthOfCoverageWalker.java index 06b924062..ec1824793 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/DepthOfCoverageWalker.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/DepthOfCoverageWalker.java @@ -30,6 +30,11 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.cmdLine.Argument; import org.broadinstitute.sting.utils.Pair; import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMReadGroupRecord; + +import java.util.HashMap; +import java.util.Collections; +import java.util.ArrayList; /** * Display the depth of coverage at a given locus. @@ -50,6 +55,9 @@ public class DepthOfCoverageWalker extends LocusWalker @Argument(fullName="minMAPQ", shortName = "minMAPQ", doc="If provided, we will exclude reads with MAPQ < this value at a locus in coverage",required=false) public int excludeMAPQBelowThis = -1; + @Argument(fullName="byReadGroup", shortName="byRG", doc="List read depths for each read group") + public boolean byReadGroup = false; + public boolean includeReadsWithDeletionAtLoci() { return ! excludeDeletionsInCoverage; } public void initialize() { @@ -66,6 +74,11 @@ public class DepthOfCoverageWalker extends LocusWalker public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { int nCleanReads = 0, nBadMAPQReads = 0, nDeletionReads = 0; + HashMap depthByReadGroup = new HashMap(); + for (SAMReadGroupRecord rg : this.getToolkit().getSAMFileHeader().getReadGroups()) { + depthByReadGroup.put(rg.getReadGroupId(), 0); + } + for ( int i = 0; i < context.getReads().size(); i++ ) { SAMRecord read = context.getReads().get(i); int offset = context.getOffsets().get(i); @@ -73,6 +86,10 @@ public class DepthOfCoverageWalker extends LocusWalker if ( read.getMappingQuality() < excludeMAPQBelowThis ) nBadMAPQReads++; else if ( offset == -1 ) nDeletionReads++; else nCleanReads++; + + String readGroupName = read.getReadGroup().getReadGroupId(); + int oldDepth = depthByReadGroup.get(readGroupName); + depthByReadGroup.put(readGroupName, oldDepth + 1); } int nTotalReads = nCleanReads + (excludeDeletionsInCoverage ? 0 : nDeletionReads); @@ -86,6 +103,15 @@ public class DepthOfCoverageWalker extends LocusWalker break; } + if (byReadGroup) { + ArrayList rgs = new ArrayList(depthByReadGroup.keySet()); + Collections.sort(rgs); + + for (String rg : rgs) { + out.printf(" %s %8d%n", rg, depthByReadGroup.get(rg)); + } + } + return nTotalReads; }