void SVScorePairRefProcessor:: processClearedRecord( const bam_record& bamRead) { using namespace illumina::common; assert(bamParams.isSet); const pos_t refPos(bamRead.pos()-1); if (! bamParams.interval.range.is_pos_intersect(refPos)) return; const bool isLargeInsert(isLargeInsertSV(sv)); #ifdef DEBUG_MEGAPAIR log_os << __FUNCTION__ << ": read: " << bamRead << "\n"; #endif /// check if fragment is too big or too small: const int templateSize(std::abs(bamRead.template_size())); if (templateSize < bamParams.minFrag) return; if (templateSize > bamParams.maxFrag) return; // count only from the down stream reads const bool isFirstBamRead(isFirstRead(bamRead)); // get fragment range: pos_t fragBeginRefPos(refPos); if (! isFirstBamRead) { fragBeginRefPos=bamRead.mate_pos()-1; } const pos_t fragEndRefPos(fragBeginRefPos+templateSize); if (fragBeginRefPos > fragEndRefPos) { std::ostringstream oss; oss << "ERROR: Failed to parse fragment range from bam record. Frag begin,end: " << fragBeginRefPos << " " << fragEndRefPos << " bamRecord: " << bamRead << "\n"; BOOST_THROW_EXCEPTION(LogicException(oss.str())); } { const pos_t fragOverlap(std::min((1+svParams.centerPos-fragBeginRefPos), (fragEndRefPos-svParams.centerPos))); #ifdef DEBUG_MEGAPAIR log_os << __FUNCTION__ << ": frag begin/end/overlap: " << fragBeginRefPos << " " << fragEndRefPos << " " << fragOverlap << "\n"; #endif if (fragOverlap < pairOpt.minFragSupport) return; } SVFragmentEvidence& fragment(evidence.getSampleEvidence(bamParams.bamIndex)[bamRead.qname()]); static const bool isShadow(false); SVFragmentEvidenceRead& evRead(fragment.getRead(bamRead.is_first())); setReadEvidence(svParams.minMapQ, svParams.minTier2MapQ, bamRead, isShadow, evRead); setAlleleFrag(*bamParams.fragDistroPtr, templateSize, fragment.ref.getBp(isBp1),isLargeInsert); }
/// get SV candidates from SA-tag split-read alignment static SVObservation GetSplitSACandidate( const ReadScannerDerivOptions& dopt, const bam_record& localRead, const SimpleAlignment& localAlign, const SimpleAlignment& remoteAlign, const FRAGSOURCE::index_t fragSource) { using namespace SVEvidenceType; static const index_t svSource(SPLIT_ALIGN); SVObservation sv; sv.evtype = svSource; sv.fragSource = fragSource; SVBreakend& localBreakend(sv.bp1); SVBreakend& remoteBreakend(sv.bp2); // use single-side evidence, have to read the supp read to get the // reverse edge. this protects against double-count: localBreakend.lowresEvidence.add(svSource); updateSABreakend(dopt, localAlign, localBreakend); updateSABreakend(dopt, remoteAlign, remoteBreakend); // If the local (bp1) alignment is split downstream (on the right side) then this read goes from bp1 -> bp2. // If it is a forward read (e.g. read1 on + strand), this means it's a forward read for this event. const bool isSplitDownstream(isSplitOpenDownstream(localAlign.path)); const bool isReadFw = (localRead.is_first() == localRead.is_fwd_strand()); if (dopt.isStranded) { if (isReadFw == isSplitDownstream) { sv.fwReads += 1; } else { sv.rvReads += 1; } } return sv; }
/// get SV candidates from anomalous read pairs static void getSVCandidatesFromPair( const ReadScannerOptions& opt, const ReadScannerDerivOptions& dopt, const SVLocusScanner::CachedReadGroupStats& rstats, const bam_record& localRead, const SimpleAlignment& localAlign, const bam_record* remoteReadPtr, std::vector<SVObservation>& candidates) { if (! localRead.is_paired()) return; // don't count paired end evidence from SA-split reads twice: if (localRead.isNonStrictSupplement()) return; if (localRead.is_unmapped() || localRead.is_mate_unmapped()) return; // special case typically used for RNA-Seq analysis: if (opt.isIgnoreAnomProperPair && localRead.is_proper_pair()) return; // abstract remote alignment to SimpleAlignment object: const bool isRemote(nullptr != remoteReadPtr); const SimpleAlignment remoteAlign(isRemote ? getAlignment(*remoteReadPtr) : getFakeMateAlignment(localRead)); AlignmentPairAnalyzer pairInspector(opt, dopt, rstats); pairInspector.reset(localAlign, remoteAlign, isRemote, localRead.is_first()); if (! pairInspector.computeLargeEventRegionScale()) return; candidates.emplace_back(); pairInspector.getSVObservation(candidates.back()); #ifdef DEBUG_SCANNER log_os << __FUNCTION__ << " evaluating pair sv for inclusion: " << candidates.back() << "\n"; #endif }