⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nw_formatter.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                line3[jPos] = c2;            }            ss << line2 << endl << line3 << endl << endl;        }    }    break;    case eFormatAsn: {        CSeq_align seq_align;        AsSeqAlign(&seq_align);        CObjectOStreamAsn asn_stream (ss);        asn_stream << seq_align;        asn_stream << Separator;    }    break;    case eFormatFastA: {        vector<char> v1, v2;        size_t aln_size = x_ApplyTranscript(&v1, &v2);                ss << '>' << m_Seq1Id << endl;        const vector<char>* pv = &v1;        for(size_t i = 0; i < aln_size; ++i) {            for(size_t j = 0; j < line_width && i < aln_size; ++j, ++i) {                ss << (*pv)[i];            }            ss << endl;        }        ss << '>' << m_Seq2Id << endl;        pv = &v2;        for(size_t i = 0; i < aln_size; ++i) {            for(size_t j = 0; j < line_width && i < aln_size; ++j, ++i) {                ss << (*pv)[i];            }            ss << endl;        }    }    break;        case eFormatExonTable:    case eFormatExonTableEx: {        ss.precision(3);        bool esfL1, esfR1, esfL2, esfR2;        m_aligner->GetEndSpaceFree(&esfL1, &esfR1, &esfL2, &esfR2);        const size_t len2 = m_aligner->GetSeqLen2();        const char* start1 = m_aligner->GetSeq1();        const char* start2 = m_aligner->GetSeq2();        const char* p1 = start1;        const char* p2 = start2;        int tr_idx_hi0 = transcript.size() - 1, tr_idx_hi = tr_idx_hi0;        int tr_idx_lo0 = 0, tr_idx_lo = tr_idx_lo0;        if(esfL1 && transcript[tr_idx_hi0] == CNWAligner::eTS_Insert) {            while(esfL1 && transcript[tr_idx_hi] == CNWAligner::eTS_Insert) {                --tr_idx_hi;                ++p2;            }        }        if(esfL2 && transcript[tr_idx_hi0] == CNWAligner::eTS_Delete) {            while(esfL2 && transcript[tr_idx_hi] == CNWAligner::eTS_Delete) {                --tr_idx_hi;                ++p1;            }        }        if(esfR1 && transcript[tr_idx_lo0] == CNWAligner::eTS_Insert) {            while(esfR1 && transcript[tr_idx_lo] == CNWAligner::eTS_Insert) {                ++tr_idx_lo;            }        }        if(esfR2 && transcript[tr_idx_lo0] == CNWAligner::eTS_Delete) {            while(esfR2 && transcript[tr_idx_lo] == CNWAligner::eTS_Delete) {                ++tr_idx_lo;            }        }        bool type_ex = type == eFormatExonTableEx;        vector<char> trans_ex (tr_idx_hi - tr_idx_lo + 1);        for(int tr_idx = tr_idx_hi; tr_idx >= tr_idx_lo;) {            const char* p1_beg = p1;            const char* p2_beg = p2;            size_t matches = 0, exon_aln_size = 0;            vector<char>::iterator ii_ex = trans_ex.begin();            while(tr_idx >= tr_idx_lo &&                   transcript[tr_idx] < CNWAligner::eTS_Intron) {                                bool noins = transcript[tr_idx] != CNWAligner::eTS_Insert;                bool nodel = transcript[tr_idx] != CNWAligner::eTS_Delete;                if(noins && nodel) {                    if(*p1++ == *p2++) {                        ++matches;                        if(type_ex) *ii_ex++ = 'M';                    }                    else {                        if(type_ex) *ii_ex++ = 'R';                    }                } else if( noins ) {                    ++p1;                    if(type_ex) *ii_ex++ = 'D';                } else {                    ++p2;                    if(type_ex) *ii_ex++ = 'I';                }                --tr_idx;                ++exon_aln_size;            }            if(exon_aln_size > 0) {                if(m_Seq1Id.size() && m_Seq2Id.size()) {                    ss << m_Seq1Id << '\t' << m_Seq2Id << '\t';                }		else {		    ss << "-\t-\t";		}                float identity = float(matches) / exon_aln_size;                ss << identity << '\t' << exon_aln_size << '\t';                size_t beg1  = p1_beg - start1, end1 = p1 - start1 - 1;                size_t beg2  = p2_beg - start2, end2 = p2 - start2 - 1;		if(beg1 <= end1) {		    ss << beg1 << '\t' << end1 << '\t';		}		else {		    ss << "-\t-\t";		}		ss << beg2 << '\t' << end2 << '\t';                char c1 = (p2_beg >= start2 + 2)? *(p2_beg - 2): ' ';                char c2 = (p2_beg >= start2 + 1)? *(p2_beg - 1): ' ';                char c3 = (p2 < start2 + len2)? *(p2): ' ';                char c4 = (p2 < start2 + len2 - 1)? *(p2+1): ' ';                ss << c1 << c2 << "<exon>" << c3 << c4;                if(type == eFormatExonTableEx) {                    ss << '\t';                    copy(trans_ex.begin(), ii_ex, ostream_iterator<char>(ss));                }                ss << endl;            }            // find next exon            while(tr_idx >= tr_idx_lo &&                  (transcript[tr_idx] == CNWAligner::eTS_Intron)) {                --tr_idx;                ++p2;            }        }    }    break;    default: {        NCBI_THROW(CAlgoAlignException, eBadParameter,                   "Incorrect format specified");    }    }    *output = CNcbiOstrstreamToString(ss);}// Transform source sequences according to the transcript.// Write the results to v1 and v2 leaving source sequences intact.// Return alignment size.size_t CNWFormatter::x_ApplyTranscript(vector<char>* pv1, vector<char>* pv2)    const{    const vector<CNWAligner::ETranscriptSymbol>& transcript =         *(m_aligner->GetTranscript());    vector<char>& v1 = *pv1;    vector<char>& v2 = *pv2;    vector<CNWAligner::ETranscriptSymbol>::const_reverse_iterator        ib = transcript.rbegin(),        ie = transcript.rend(),        ii;    const char* iv1 = m_aligner->GetSeq1();    const char* iv2 = m_aligner->GetSeq2();    v1.clear();    v2.clear();    for (ii = ib;  ii != ie;  ii++) {        CNWAligner::ETranscriptSymbol ts = *ii;        char c1, c2;        switch ( ts ) {        case CNWAligner::eTS_Insert:            c1 = '-';            c2 = *iv2++;            break;        case CNWAligner::eTS_Delete:            c2 = '-';            c1 = *iv1++;            break;        case CNWAligner::eTS_Match:        case CNWAligner::eTS_Replace:            c1 = *iv1++;            c2 = *iv2++;            break;        case CNWAligner::eTS_Intron:            c1 = '+';            c2 = *iv2++;            break;        default:            c1 = c2 = '?';            break;        }        v1.push_back(c1);        v2.push_back(c2);    }    return v1.size();}END_NCBI_SCOPE/* * =========================================================================== * $Log: nw_formatter.cpp,v $ * Revision 1000.2  2004/06/01 18:04:54  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10 * * Revision 1.10  2004/05/21 21:41:02  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.9  2004/05/18 21:43:40  kapustin * Code cleanup * * Revision 1.8  2004/05/17 14:50:56  kapustin * Add/remove/rearrange some includes and object declarations * * Revision 1.7  2004/03/18 16:30:24  grichenk * Changed type of seq-align containers from list to vector. * * Revision 1.6  2003/10/14 19:26:59  kapustin * Format void exons properly * * Revision 1.5  2003/09/26 14:43:18  kapustin * Remove exception specifications * * Revision 1.4  2003/09/15 21:32:03  kapustin * Minor code cleanup * * Revision 1.3  2003/09/12 19:43:04  kapustin * Add checking for empty transcript * * Revision 1.2  2003/09/03 01:19:32  ucko * +<iterator> (needed for ostream_iterator<> with some compilers) * * Revision 1.1  2003/09/02 22:34:49  kapustin * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -