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 } }
void SVCandidateSetSequenceFragmentSampleGroup:: add( const bam_header_info& bamHeader, const bam_record& bamRead, const bool isExpectRepeat, const bool isSourcedFromGraphEdgeNode1, const bool isSubMapped) { using namespace illumina::common; #ifdef DEBUG_SVDATA log_os << "SVDataGroup adding: " << bamRead << "\n"; #endif SVCandidateSetSequenceFragment* fragPtr(getSequenceFragment(bamRead.qname())); if (nullptr == fragPtr) return; SVCandidateSetSequenceFragment& fragment(*fragPtr); SVCandidateSetRead* targetReadPtr(nullptr); if (2 == bamRead.read_no()) { if (bamRead.isNonStrictSupplement()) { fragment.read2Supplemental.emplace_back(); targetReadPtr = (&(fragment.read2Supplemental.back())); } else { targetReadPtr = (&(fragment.read2)); } } else { if (bamRead.isNonStrictSupplement()) { fragment.read1Supplemental.emplace_back(); targetReadPtr = (&(fragment.read1Supplemental.back())); } else { targetReadPtr = (&(fragment.read1)); } } SVCandidateSetRead& targetRead(*targetReadPtr); if (targetRead.isSet()) { if (isExpectRepeat) return; std::ostringstream oss; oss << "Unexpected alignment name collision. Source: '" << dataSourceName << "'\n" << "\tExisting read: "; summarizeAlignmentRecord(bamHeader, targetRead.bamrec, oss); oss << "\n" << "\tNew read: "; summarizeAlignmentRecord(bamHeader, bamRead, oss); oss << "\n"; BOOST_THROW_EXCEPTION(GeneralException(oss.str())); } targetRead.bamrec = bamRead; targetRead.isSourcedFromGraphEdgeNode1 = isSourcedFromGraphEdgeNode1; targetRead.isSubMapped = isSubMapped; targetRead.readIndex = (isSubMapped ? _subMappedReadIndex : _mappedReadIndex); }