Merge pull request #1306 from broadinstitute/rhl_doc_overlapping_genes

Output coverage for all overlapping genes in DepthOfCoverage
This commit is contained in:
ldgauthier 2016-03-08 13:28:30 -05:00
commit dcc6c0f2aa
2 changed files with 26 additions and 16 deletions

View File

@ -523,14 +523,16 @@ public class DepthOfCoverage extends LocusWalker<Map<DoCOutputType.Partition,Map
Map<String,DepthOfCoverageStats> geneNamesToStats = new HashMap<String,DepthOfCoverageStats>(); // allows indirect updating of objects in list Map<String,DepthOfCoverageStats> geneNamesToStats = new HashMap<String,DepthOfCoverageStats>(); // allows indirect updating of objects in list
for ( Pair<GenomeLoc, CoveragePartitioner> targetStats : statsByTarget ) { for ( Pair<GenomeLoc, CoveragePartitioner> targetStats : statsByTarget ) {
String gene = getGeneName(targetStats.first,refseqIterator); List<String> genes = getGeneNames(targetStats.first,refseqIterator);
if ( geneNamesToStats.keySet().contains(gene) ) { for (String gene : genes) {
logger.debug("Merging "+geneNamesToStats.get(gene).toString()+" and "+targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample).toString()); if ( geneNamesToStats.keySet().contains(gene) ) {
geneNamesToStats.get(gene).merge(targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample)); logger.debug("Merging "+geneNamesToStats.get(gene).toString()+" and "+targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample).toString());
} else { geneNamesToStats.get(gene).merge(targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample));
DepthOfCoverageStats merger = new DepthOfCoverageStats(targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample)); } else {
geneNamesToStats.put(gene,merger); DepthOfCoverageStats merger = new DepthOfCoverageStats(targetStats.second.getCoverageByAggregationType(DoCOutputType.Partition.sample));
statsByGene.add(new Pair<String,DepthOfCoverageStats>(gene,merger)); geneNamesToStats.put(gene,merger);
statsByGene.add(new Pair<String,DepthOfCoverageStats>(gene,merger));
}
} }
} }
@ -574,24 +576,32 @@ public class DepthOfCoverage extends LocusWalker<Map<DoCOutputType.Partition,Map
} }
//blatantly stolen from Andrew Kernytsky //blatantly stolen from Andrew Kernytsky
private String getGeneName(GenomeLoc target, LocationAwareSeekableRODIterator refseqIterator) { // edited by Pawel Sztromwasser to support overlap with multiple exons/genes
private List<String> getGeneNames(GenomeLoc target, LocationAwareSeekableRODIterator refseqIterator) {
logger.debug("Examining "+target.toString()); logger.debug("Examining "+target.toString());
if (refseqIterator == null) { return "UNKNOWN"; }
List<String> unknown = Arrays.asList("UNKNOWN");
if (refseqIterator == null) { return unknown; }
RODRecordList annotationList = refseqIterator.seekForward(target); RODRecordList annotationList = refseqIterator.seekForward(target);
logger.debug("Annotation list is " + (annotationList == null ? "null" : annotationList.getName())); logger.debug("Annotation list is " + (annotationList == null ? "null" : annotationList.getName()));
if (annotationList == null) { return "UNKNOWN"; } if (annotationList == null) { return unknown; }
List<String> geneNames = new ArrayList<String>();
for(GATKFeature rec : annotationList) { for(GATKFeature rec : annotationList) {
if ( ((RefSeqFeature)rec.getUnderlyingObject()).overlapsExonP(target) ) { if ( ((RefSeqFeature)rec.getUnderlyingObject()).overlapsExonP(target) ) {
logger.debug("We do overlap "+ rec.getUnderlyingObject().toString()); logger.debug("We do overlap "+ rec.getUnderlyingObject().toString());
return ((RefSeqFeature)rec.getUnderlyingObject()).getGeneName(); geneNames.add(((RefSeqFeature)rec.getUnderlyingObject()).getGeneName());
} else {
logger.debug("No overlap");
} }
logger.debug("No overlap");
} }
return "UNKNOWN"; if (geneNames.isEmpty()) { geneNames = unknown; }
return geneNames;
} }
private LocationAwareSeekableRODIterator initializeRefSeq() { private LocationAwareSeekableRODIterator initializeRefSeq() {

View File

@ -164,7 +164,7 @@ public class DepthOfCoverageIntegrationTest extends WalkerTest {
spec.addAuxFile("a148e50f9db207adfd5d5f0f29eb54d8", baseOutputFile); spec.addAuxFile("a148e50f9db207adfd5d5f0f29eb54d8", baseOutputFile);
spec.addAuxFile("7ccd5193a3c035d1cc856cbc89e3daf4", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_cumulative_coverage_counts")); spec.addAuxFile("7ccd5193a3c035d1cc856cbc89e3daf4", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_cumulative_coverage_counts"));
spec.addAuxFile("2efe59c20721ce61bc5b334a26d11720", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_cumulative_coverage_proportions")); spec.addAuxFile("2efe59c20721ce61bc5b334a26d11720", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_cumulative_coverage_proportions"));
spec.addAuxFile("9194cec953e0fe0b84a681f9bb63ffbe", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_gene_summary")); spec.addAuxFile("3dd61151e758c1f3c4bd1150b6577b45", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_gene_summary"));
spec.addAuxFile("cf62d95ec1f459fbbe35370c3f0ca481", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_interval_statistics")); spec.addAuxFile("cf62d95ec1f459fbbe35370c3f0ca481", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_interval_statistics"));
spec.addAuxFile("b4fcb739b7f9e309e38a7d5e7e4ebb9f", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_interval_summary")); spec.addAuxFile("b4fcb739b7f9e309e38a7d5e7e4ebb9f", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_interval_summary"));
spec.addAuxFile("6bf63f9c62071e850c6f0b6356fb63eb", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_statistics")); spec.addAuxFile("6bf63f9c62071e850c6f0b6356fb63eb", createTempFileFromBase(baseOutputFile.getAbsolutePath()+".sample_statistics"));