unsigned SVScorer:: getBreakendMaxMappedDepth(const SVBreakend& bp) { /// define a new interval -/+ 50 bases around the center pos /// of the breakpoint static const pos_t regionSize(50); const pos_t centerPos(bp.interval.range.center_pos()); const known_pos_range2 searchRange(std::max((centerPos-regionSize),0), (centerPos+regionSize)); std::vector<unsigned> depth(searchRange.size(),0); bool isNormalFound(false); const unsigned bamCount(_bamStreams.size()); for (unsigned bamIndex(0); bamIndex < bamCount; ++bamIndex) { if (_isAlignmentTumor[bamIndex]) continue; bam_streamer& bamStream(*_bamStreams[bamIndex]); // set bam stream to new search interval: bamStream.set_new_region(bp.interval.tid, searchRange.begin_pos(), searchRange.end_pos()); while (bamStream.next()) { const bam_record& bamRead(*(bamStream.get_record_ptr())); // turn filtration off down to mapped only to match depth estimate method: //if (_readScanner.isReadFiltered(bamRead)) continue; if (bamRead.is_unmapped()) continue; if ((bamRead.pos()-1) >= searchRange.end_pos()) break; addReadToDepthEst(bamRead,searchRange.begin_pos(),depth); } isNormalFound=true; break; } assert(isNormalFound); return *(std::max_element(depth.begin(),depth.end())); }
void SVScorer:: getBreakendMaxMappedDepthAndMQ0( const bool isMaxDepth, const double cutoffDepth, const SVBreakend& bp, unsigned& maxDepth, float& MQ0Frac) { /// define a new interval -/+ 50 bases around the center pos /// of the breakpoint static const pos_t regionSize(50); maxDepth=0; MQ0Frac=0; unsigned totalReads(0); unsigned totalMQ0Reads(0); const pos_t centerPos(bp.interval.range.center_pos()); const known_pos_range2 searchRange(std::max((centerPos-regionSize),0), (centerPos+regionSize)); if (searchRange.size() == 0) return; std::vector<unsigned> depth(searchRange.size(),0); bool isCutoff(false); bool isNormalFound(false); const unsigned bamCount(_bamStreams.size()); for (unsigned bamIndex(0); bamIndex < bamCount; ++bamIndex) { if (_isAlignmentTumor[bamIndex]) continue; isNormalFound=true; bam_streamer& bamStream(*_bamStreams[bamIndex]); // set bam stream to new search interval: bamStream.set_new_region(bp.interval.tid, searchRange.begin_pos(), searchRange.end_pos()); while (bamStream.next()) { const bam_record& bamRead(*(bamStream.get_record_ptr())); // turn filtration down to mapped only to match depth estimate method: if (bamRead.is_unmapped()) continue; const pos_t refPos(bamRead.pos()-1); if (refPos >= searchRange.end_pos()) break; addReadToDepthEst(bamRead,searchRange.begin_pos(),depth); totalReads++; if (0 == bamRead.map_qual()) totalMQ0Reads++; if (isMaxDepth) { const pos_t depthOffset(refPos-searchRange.begin_pos()); if (depthOffset>=0) { if (depth[depthOffset] > cutoffDepth) { isCutoff=true; break; } } } } if (isCutoff) break; } assert(isNormalFound); maxDepth = *(std::max_element(depth.begin(),depth.end())); if (totalReads>=10) { MQ0Frac = static_cast<float>(totalMQ0Reads)/static_cast<float>(totalReads); } }