static void getSingleReadSVCandidates( const ReadScannerOptions& opt, const ReadScannerDerivOptions& dopt, const bam_record& localRead, const SimpleAlignment& localAlign, const chromMap_t& chromToIndex, const reference_contig_segment& refSeq, std::vector<SVObservation>& candidates) { using namespace illumina::common; const bool isRead2(localRead.is_paired() && (localRead.read_no() == 2)); const FRAGSOURCE::index_t fragSource(isRead2 ? FRAGSOURCE::READ2 : FRAGSOURCE::READ1); // - process any large indels in the localRead: getSVCandidatesFromReadIndels(opt, dopt, localAlign, fragSource, candidates); #ifdef DEBUG_SCANNER log_os << __FUNCTION__ << ": post-indels candidate_size: " << candidates.size() << "\n"; #endif // a read can provide SA split evidence or semi-aligned/soft-clip, but not both. // this prevents split reads from triggering spurious local assembles. It is // possible for a read to genuinely contain evidence of both, but this should // be very rare. if (localRead.isSASplit()) { getSACandidatesFromRead(opt, dopt, localRead, localAlign, fragSource, chromToIndex, candidates); #ifdef DEBUG_SCANNER log_os << __FUNCTION__ << ": post-split read candidate_size: " << candidates.size() << "\n"; #endif } else { if (dopt.isSmallCandidates) { getSVCandidatesFromSemiAligned(opt, dopt, localRead, localAlign, fragSource, refSeq, candidates); } #ifdef DEBUG_SCANNER log_os << __FUNCTION__ << ": post-semialigned candidate_size: " << candidates.size() << "\n"; #endif } }
bool SVLocusScanner:: isSVEvidence( const bam_record& bamRead, const unsigned defaultReadGroupIndex, const reference_contig_segment& refSeq, SVLocusEvidenceCount* incountsPtr) const { // exclude innie read pairs which are anomalously short: const bool isAnom(isNonCompressedAnomalous(bamRead,defaultReadGroupIndex)); const bool isSplit(bamRead.isSASplit()); getAlignment(bamRead,_bamAlign); const bool isIndel(isLocalIndelEvidence(_bamAlign)); const bool isAssm((_dopt.isSmallCandidates) && ((!isSplit) && isSemiAlignedEvidence(bamRead, _bamAlign, refSeq))); const bool isEvidence(isAnom || isSplit || isIndel || isAssm); if (nullptr != incountsPtr) { SVLocusEvidenceCount& incounts(*incountsPtr); incounts.total++; if (isAnom) incounts.anom++; if (isSplit) incounts.split++; if (isIndel) incounts.indel++; if (isAssm) incounts.assm++; if (! isEvidence) incounts.ignored++; if (isAnom) { if (isMateInsertionEvidenceCandidate(bamRead, getMinMapQ())) { // these counts are used to generate background noise rates in later candidate generation stages: incounts.remoteRecoveryCandidates++; } } } return isEvidence; }