예제 #1
0
void CSplignTrim::CutFromRight(size_t len, TSeg& s) //len is length on alignment to cut
{
    if(len == 0) return;

    if(ThrowAwayShortExon(s)) return;

    string::reverse_iterator irs, irs0, irs1;
    irs0 = s.m_details.rbegin();
    irs1 = s.m_details.rend();

    if(irs1 - irs0 <= (int)len) {//cut all
        s.SetToGap();
        return;
    }
    irs1 = irs0 + len;

    int i0 = 0, i1 = 0;
    for(irs = irs0; irs != irs1; ++irs) {        
        switch(*irs) {            
        case 'M': 
        case 'R': {
            ++i0;
            ++i1;
        }
        break;
        case 'I': {
            ++i1;
        }
        break;
        case 'D': {
            ++i0;
        }
        }
    }

    // resize   
    s.m_box[1] -= i0;
    if(ThrowAwayShortExon(s)) return;//too short 
    s.m_box[3] -= i1;
    s.m_details.resize(s.m_details.size() - len);
    s.Update(m_aligner.GetNonNullPointer());
    
    // update the last two annotation chars
    const size_t adim = s.m_annot.size();
    if(adim > 2 && s.m_annot[adim - 3] == '>') {

        const char c3 (s.m_box[3] + 1 < (size_t)m_seqlen? m_seq[s.m_box[3] + 1]: ' ');
        const char c4 (s.m_box[3] + 2 < (size_t)m_seqlen? m_seq[s.m_box[3] + 2]: ' ');
        s.m_annot[adim-2] = c3;
        s.m_annot[adim-1] = c4;
    }
}
예제 #2
0
void CSplignTrim::CutFromLeft(size_t len, TSeg& s) //len is length on alignment to cut
{
    if(len == 0) return;

    if(ThrowAwayShortExon(s)) return;

    string::iterator irs, irs0, irs1;
    irs0 = s.m_details.begin();
    irs1 = s.m_details.end();

    if(irs1 - irs0 <= (int)len) {//cut all
        s.SetToGap();
        return;
    }
    irs1 = irs0 + len;

    int i0 = 0, i1 = 0;
    for(irs = irs0; irs != irs1; ++irs) {        
        switch(*irs) {            
        case 'M': 
        case 'R': {
            ++i0;
            ++i1;
        }
        break;
        case 'I': {
            ++i1;
        }
        break;
        case 'D': {
            ++i0;
        }
        }
    }

    // resize   
    s.m_box[0] += i0;
    if(ThrowAwayShortExon(s)) return;//too short 
    s.m_box[2] += i1;
    s.m_details.erase(0, len);
    s.Update(m_aligner.GetNonNullPointer());
    
    // update the first two annotation symbols      
    if(s.m_annot.size() > 2 && s.m_annot[2] == '<') {
        int  j1 = int(s.m_box[2]) - 2;
        char c1 = j1 >= 0? m_seq[j1]: ' ';
        s.m_annot[0] = c1;
        int  j2 = int(s.m_box[2]) - 1;
        char c2 = j2 >= 0? m_seq[j2]: ' ';
        s.m_annot[1] = c2;
    }
}
예제 #3
0
bool CSplignTrim::ThrowAway20_28_90(TSeg& s)
{
    if( s.m_len < 20 || // 20 rule
        ( s.m_idty < 0.9 && s.m_len < 28 ) ) {// 28_90 rule
        s.SetToGap();
        return true;
    }
    return false;
}
예제 #4
0
//legacy check
//it two short throws away and returns true
//otherwise returns false
bool CSplignTrim::ThrowAwayShortExon(TSeg& s)
{
    const size_t min_query_size = 4;
    if( int(s.m_box[1] - s.m_box[0] + 1) < int(min_query_size)) {
        s.SetToGap();
        return true;
    }
    return false;
}    
예제 #5
0
void CSplignTrim::CutToMatchLeft(TSeg& s)
{
    size_t pos = s.m_details.find('M');
    if(pos == string::npos) {
        s.SetToGap();
        return;
    }
    if(pos > 0) {
        CutFromLeft(pos, s);
    }
}
예제 #6
0
void CSplignTrim::CutToMatchRight(TSeg& s)
{
    size_t pos = s.m_details.rfind('M');
    if(pos == string::npos) {
        s.SetToGap();
        return;
    }
    size_t len = s.m_details.length() - pos - 1;//length to cut
    if(len > 0) {
        CutFromRight(len, s);
    }
}