bool isMateInsertionEvidenceCandidate( const bam_record& bamRead, const unsigned minMapq) { if (! bamRead.is_paired()) return false; if (bamRead.isNonStrictSupplement()) return false; if (bamRead.is_unmapped() || bamRead.is_mate_unmapped()) return false; if (bamRead.map_qual() < minMapq) return false; if (bamRead.target_id() < 0) return false; if (bamRead.mate_target_id() < 0) return false; if (bamRead.target_id() != bamRead.mate_target_id()) return true; /// TODO: better candidate definition based on fragment size distro: static const int minSize(10000); return (std::abs(bamRead.pos()-bamRead.mate_pos()) >= minSize); }
static bool isGoodShadow( const bam_record& bamRead, const std::string& lastQname) { #ifdef DEBUG_IS_SHADOW static const std::string logtag("isGoodShadow"); #endif if (! bamRead.is_paired()) return false; if (bamRead.isNonStrictSupplement()) return false; // sanity check that this is a shadow read: if (!bamRead.is_unmapped()) return false; if (bamRead.is_mate_unmapped()) return false; static const unsigned minAvgQualShadow = 25; if (get_avg_quality(bamRead) < minAvgQualShadow) { return false; } if (strcmp(bamRead.qname(),lastQname.c_str()) != 0) { // something went wrong here, shadows should have their singleton partner // preceding them in the BAM file. #ifdef DEBUG_IS_SHADOW log_os << logtag << " ERROR: Shadow without matching singleton : " << bamRead.qname() << " vs " << lastQname << std::endl; #endif return false; } #ifdef DEBUG_IS_SHADOW log_os << logtag << " Found shadow!\n"; << logtag << " this mapq = " << ((unsigned int)bamRead.map_qual()) << std::endl;
/// 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 }
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); }