// Coalesce a set of alignments into distinct locations void HapgenUtil::coalesceAlignments(HapgenAlignmentVector& alignments) { if(alignments.empty()) return; // Sort the alignments by reference id, then position std::sort(alignments.begin(), alignments.end()); HapgenAlignmentVector outAlignments; // Iterate over the alignments in sorted order // If an alignment is distinct (=does not overlap) from the // previous alignment, add it to the output collection. // First alignment is always ok outAlignments.push_back(alignments[alignments.size()-1]); // Kees: start from back because alignments are sorted in order of increasing score for(size_t i = alignments.size()-1; i-- > 0;) { // Check this alignment against the last alignment added to the output set HapgenAlignment& prevAlign = outAlignments.back(); const HapgenAlignment& currAlign = alignments[i]; int s1 = prevAlign.position; int e1 = s1 + prevAlign.length; int s2 = currAlign.position; int e2 = s2 + currAlign.length; bool intersecting = Interval::isIntersecting(s1, e1, s2, e2); if(prevAlign.referenceID != currAlign.referenceID || !intersecting) { outAlignments.push_back(currAlign); } else { // merge the intersecting alignment into a window that covers both prevAlign.position = std::min(s1, s2); prevAlign.length = std::max(e1, e2) - prevAlign.position; } } alignments = outAlignments; }