Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
// 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);
}