void CSplignTrim::AdjustGaps(TSegs& segments) { TSegs new_segments; int gap_start_idx (-1); if(segments.size() && segments[0].m_exon == false) { gap_start_idx = 0; } for(size_t k (0); k < segments.size(); ++k) { TSeg& s (segments[k]); if(!s.m_exon) { if(gap_start_idx == -1) { gap_start_idx = int(k); if(k > 0) { s.m_box[0] = segments[k-1].m_box[1] + 1; s.m_box[2] = segments[k-1].m_box[3] + 1; } } } else { if(gap_start_idx >= 0) { TSeg& g = segments[gap_start_idx]; g.m_box[1] = s.m_box[0] - 1; g.m_box[3] = s.m_box[2] - 1; g.m_len = g.m_box[1] - g.m_box[0] + 1; g.m_details.resize(0); new_segments.push_back(g); gap_start_idx = -1; } new_segments.push_back(s); } } if(gap_start_idx >= 0) { TSeg& g (segments[gap_start_idx]); g.m_box[1] = segments[segments.size()-1].m_box[1]; g.m_box[3] = segments[segments.size()-1].m_box[3]; g.m_len = g.m_box[1] - g.m_box[0] + 1; g.m_details.resize(0); new_segments.push_back(g); } segments.swap(new_segments); }
// aka stich holes //joins exons segments[p1] and segments[p1] into a singe exon //everithing in between becomes a regular gap in query adjacent to a regular gap in subject void CSplignTrim::JoinExons(TSegs& segments, TSeqPos p1, TSeqPos p2) { //sanity check if( p1 >= segments.size() ) return; if( p2 >= segments.size() ) return; if( !segments[p1].m_exon ) return; if( !segments[p2].m_exon ) return; size_t pos1 = min( p1, p2); size_t pos2 = max( p1, p2); if( segments[pos1].m_box[1] >= segments[pos2].m_box[0] || segments[pos1].m_box[3] >= segments[pos2].m_box[2] ) { return; // segments intersect } //join TSegs new_segments; for( size_t pos = 0; pos < pos1; ++pos) { new_segments.push_back(segments[pos]); } //joint exon TSeg s(segments[pos1]); s.m_box[1] = segments[pos2].m_box[1]; s.m_box[3] = segments[pos2].m_box[3]; if( segments[pos1].m_box[1] + 1 < segments[pos2].m_box[0]) { s.m_details.append(segments[pos2].m_box[0] - segments[pos1].m_box[1] - 1, 'D'); } if( segments[pos1].m_box[3] + 1 < segments[pos2].m_box[2]) { s.m_details.append(segments[pos2].m_box[2] - segments[pos1].m_box[3] - 1, 'I'); } s.m_details += segments[pos2].m_details; Update(s); new_segments.push_back(s); //write the rest for( size_t pos = ++pos2; pos < segments.size(); ++pos) { new_segments.push_back(segments[pos]); } segments.swap(new_segments); }