gbseq_formatter.cpp

来自「ncbi源码」· C++ 代码 · 共 632 行 · 第 1/2 页

CPP
632
字号
/////////////////////////////////////////////////////////////////////////////// Sourcevoid CGBSeqFormatter::FormatSource(const CSourceItem& source, IFlatTextOStream&){    _ASSERT(m_GBSeq);    CNcbiOstrstream source_line;    source_line << source.GetOrganelle() << source.GetTaxname();    if ( !source.GetCommon().empty() ) {        source_line << (source.IsUsingAnamorph() ? " (anamorph: " : " (")                     << source.GetCommon() << ")";    }    m_GBSeq->SetSource(CNcbiOstrstreamToString(source_line));    m_GBSeq->SetOrganism(source.GetTaxname());    m_GBSeq->SetTaxonomy(source.GetLineage());}/////////////////////////////////////////////////////////////////////////////// Keywordsvoid CGBSeqFormatter::FormatKeywords(const CKeywordsItem& keys, IFlatTextOStream&){    ITERATE (CKeywordsItem::TKeywords, it, keys.GetKeywords()) {        m_GBSeq->SetKeywords().push_back(CGBKeyword(*it));    }}/////////////////////////////////////////////////////////////////////////////// REFERENCEvoid CGBSeqFormatter::FormatReference(const CReferenceItem& ref, IFlatTextOStream&){    _ASSERT(m_GBSeq);    CBioseqContext& ctx = *ref.GetContext();    CRef<CGBReference> gbref(new CGBReference);    const CSeq_loc* loc = (ref.GetLoc() != 0) ?        ref.GetLoc() : &ctx.GetLocation();    CNcbiOstrstream refstr;    refstr << ref.GetSerial() << ' ';    x_FormatRefLocation(refstr, *loc, " to ", "; ", ctx);    gbref->SetReference(CNcbiOstrstreamToString(refstr));    list<string> authors;    CReferenceItem::GetAuthNames(authors, ref.GetAuthors());    ITERATE (list<string>, it, authors) {        CGBAuthor author(*it);        gbref->SetAuthors().push_back(author);    }    if ( !ref.GetConsortium().empty() ) {        gbref->SetConsortium(ref.GetConsortium());    }    if ( !ref.GetTitle().empty() ) {        if ( NStr::EndsWith(ref.GetTitle(), ".") ) {            string title = ref.GetTitle();            title.resize(title.length() - 1);            gbref->SetTitle(title);        } else {            gbref->SetTitle(ref.GetTitle());        }    }    string journal;    x_FormatRefJournal(journal, ref);    NON_CONST_ITERATE (string, it, journal) {        if ( (*it == '\n')  ||  (*it == '\t')  ||  (*it == '\r') ) {            *it = ' ';        }    }    if ( !journal.empty() ) {        gbref->SetJournal(journal);    }    if ( ref.GetMUID() != 0 ) {        gbref->SetMedline(ref.GetMUID());    }    if ( ref.GetPMID() != 0 ) {        gbref->SetPubmed(ref.GetPMID());    }    if ( !ref.GetRemark().empty() ) {        gbref->SetRemark(ref.GetRemark());    }    m_GBSeq->SetReferences().push_back(gbref);}/////////////////////////////////////////////////////////////////////////////// COMMENTvoid CGBSeqFormatter::FormatComment(const CCommentItem& comment, IFlatTextOStream&){    string str = comment.GetComment();    s_GBSeqStringCleanup(str);        if ( !m_GBSeq->IsSetComment() ) {        m_GBSeq->SetComment(str);    } else {            m_GBSeq->SetComment() += "; ";        m_GBSeq->SetComment() += str;    }}/////////////////////////////////////////////////////////////////////////////// FEATURESstatic void s_SetIntervals(CGBFeature::TIntervals& intervals,                    const CSeq_loc& loc,                    CScope& scope){    for (CSeq_loc_CI it(loc); it; ++it) {        CRef<CGBInterval> ival(new CGBInterval);        CSeq_loc_CI::TRange range = it.GetRange();        CConstRef<CSeq_id> best(&it.GetSeq_id());        if ( best->IsGi() ) {            CConstRef<CSynonymsSet> syns = scope.GetSynonyms(*best);            vector< CRef<CSeq_id> > ids;            ITERATE (CSynonymsSet, id_iter, *syns) {                CConstRef<CSeq_id> id = (*id_iter)->first.GetSeqId();                CRef<CSeq_id> sip(const_cast<CSeq_id*>(id.GetPointerOrNull()));                ids.push_back(sip);            }            best.Reset(FindBestChoice(ids, CSeq_id::Score));        }        ival->SetAccession(best->GetSeqIdString(true));          if ( range.GetLength() == 1 ) {  // point            ival->SetPoint(range.GetFrom() + 1);        } else {            TSeqPos from, to;            if ( range.IsWhole() ) {                from = 1;                to = sequence::GetLength(it.GetSeq_loc(), &scope);            } else {                from = range.GetFrom() + 1;                to = range.GetTo() + 1;            }            if ( it.GetStrand() == eNa_strand_minus ) {                swap(from, to);            }            ival->SetFrom(from);            ival->SetTo(to);        }                intervals.push_back(ival);    }}static void s_SetQuals(CGBFeature::TQuals& gbquals,                       const CFlatFeature::TQuals& quals){    ITERATE (CFlatFeature::TQuals, it, quals) {        CRef<CGBQualifier> qual(new CGBQualifier);        qual->SetName((*it)->GetName());        if ((*it)->GetStyle() != CFormatQual::eEmpty) {            qual->SetValue((*it)->GetValue());            s_GBSeqQualCleanup(qual->SetValue());        }        gbquals.push_back(qual);    }}void CGBSeqFormatter::FormatFeature(const CFeatureItemBase& f, IFlatTextOStream&){    CConstRef<CFlatFeature> feat = f.Format();    CRef<CGBFeature>    gbfeat(new CGBFeature);    gbfeat->SetKey(feat->GetKey());        string location = feat->GetLoc().GetString();    s_GBSeqStringCleanup(location, true);    gbfeat->SetLocation(location);    if ( feat->GetKey() != "source" ) {        s_SetIntervals(gbfeat->SetIntervals(), f.GetLoc(),             f.GetContext()->GetScope());    }    if ( !feat->GetQuals().empty() ) {        s_SetQuals(gbfeat->SetQuals(), feat->GetQuals());    }        m_GBSeq->SetFeature_table().push_back(gbfeat);}/////////////////////////////////////////////////////////////////////////////// SEQUENCEvoid CGBSeqFormatter::FormatSequence(const CSequenceItem& seq, IFlatTextOStream&){    string data;    CSeqVector_CI vec_ci(seq.GetSequence());    vec_ci.GetSeqData(data, seq.GetSequence().size());    if ( !m_GBSeq->IsSetSequence() ) {        m_GBSeq->SetSequence(kEmptyStr);    }    m_GBSeq->SetSequence() += data;}/////////////////////////////////////////////////////////////////////////////// CONTIGvoid CGBSeqFormatter::FormatContig(const CContigItem& contig, IFlatTextOStream&){    string assembly = CFlatSeqLoc(contig.GetLoc(), *contig.GetContext(),         CFlatSeqLoc::eType_assembly).GetString();    s_GBSeqStringCleanup(assembly, true);    m_GBSeq->SetContig(assembly);}//=========================================================================////                                Private                                  ////=========================================================================//void CGBSeqFormatter::x_WriteFileHeader(IFlatTextOStream& text_os){    m_Out.reset(CObjectOStream::Open(eSerial_Xml, m_StrStream));    const CClassTypeInfo* gbset_info        = dynamic_cast<const CClassTypeInfo*>(CGBSet::GetTypeInfo());    m_Out->WriteFileHeader(gbset_info);    x_StrOStreamToTextOStream(text_os);}void CGBSeqFormatter::x_StartWriteGBSet(IFlatTextOStream& text_os){    m_Cont.reset(new SOStreamContainer(*m_Out, CGBSet::GetTypeInfo()));    x_StrOStreamToTextOStream(text_os);}void CGBSeqFormatter::x_WriteGBSeq(IFlatTextOStream& text_os){    m_Cont->WriteElement(ConstObjectInfo(*m_GBSeq));    x_StrOStreamToTextOStream(text_os);}void CGBSeqFormatter::x_EndWriteGBSet(IFlatTextOStream& text_os){    m_Cont.reset();    x_StrOStreamToTextOStream(text_os);}void CGBSeqFormatter::x_StrOStreamToTextOStream(IFlatTextOStream& text_os){    list<string> l;    // flush ObjectOutputStream to underlying strstream    m_Out->Flush();    // read text from strstream    NStr::Split(CNcbiOstrstreamToString(m_StrStream), "\n", l);    // add text to TextOStream    text_os.AddParagraph(l);    // reset strstream    m_StrStream.seekp(0);}END_SCOPE(objects)END_NCBI_SCOPE/** ===========================================================================** $Log: gbseq_formatter.cpp,v $* Revision 1000.1  2004/06/01 19:44:34  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4** Revision 1.4  2004/05/21 21:42:54  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.3  2004/05/06 17:52:53  shomrat* CFlatQual -> CFormatQual** Revision 1.2  2004/04/22 15:53:26  shomrat* Changes in context** Revision 1.1  2004/04/13 16:49:54  shomrat* Initial revision*** ===========================================================================*/

⌨️ 快捷键说明

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