source_item.cpp

来自「ncbi源码」· C++ 代码 · 共 337 行

CPP
337
字号
/* * =========================================================================== * PRODUCTION $Log: source_item.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 19:45:31  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7 * PRODUCTION * =========================================================================== *//*  $Id: source_item.cpp,v 1000.1 2004/06/01 19:45:31 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Author:  Mati Shomrat, NCBI** File Description:*   flat-file generator -- source item implementation**/#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <objects/seqblock/GB_block.hpp>#include <objects/seqfeat/BioSource.hpp>#include <objects/seqfeat/OrgMod.hpp>#include <objects/seqfeat/OrgName.hpp>#include <objects/seqfeat/Org_ref.hpp>#include <objmgr/seqdesc_ci.hpp>#include <objmgr/feat_ci.hpp>#include <objmgr/util/sequence.hpp>#include <objtools/format/formatter.hpp>#include <objtools/format/text_ostream.hpp>#include <objtools/format/items/source_item.hpp>#include <objtools/format/context.hpp>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)/////////////////////////////////////////////////////////////////////////////// SOURCE//   ORGANISMCSourceItem::CSourceItem(CBioseqContext& ctx) :    CFlatItem(&ctx),    m_Taxname(&scm_Unknown), m_Common(&kEmptyStr),    m_Organelle(&kEmptyStr), m_Lineage(&scm_Unclassified),    m_SourceLine(&kEmptyStr), m_Mod(&scm_EmptyList),    m_UsingAnamorph(false){    x_GatherInfo(ctx);}void CSourceItem::Format(IFormatter& formatter, IFlatTextOStream& text_os) const{    formatter.FormatSource(*this, text_os);}/***************************************************************************//*                                  PRIVATE                                *//***************************************************************************/// static members initializationconst string       CSourceItem::scm_Unknown        = "Unknown.";const string       CSourceItem::scm_Unclassified   = "Unclassified.";const list<string> CSourceItem::scm_EmptyList;void CSourceItem::x_GatherInfo(CBioseqContext& ctx){    // For DDBJ format first try a GB-Block descriptor (old style)    if ( ctx.Config().IsFormatDDBJ() ) {        CSeqdesc_CI gb_it(ctx.GetHandle(), CSeqdesc::e_Genbank);        if ( gb_it ) {            const CGB_block& gb = gb_it->GetGenbank();            if ( gb.CanGetSource()  &&  !gb.GetSource().empty() ) {                x_SetSource(gb, *gb_it);                return;            }        }    }        // find a biosource descriptor    CSeqdesc_CI dsrc_it(ctx.GetHandle(), CSeqdesc::e_Source);    if ( dsrc_it ) {        x_SetSource(dsrc_it->GetSource(), *dsrc_it);        return;    }         // if no descriptor was found, try a source feature    CFeat_CI fsrc_it(ctx.GetHandle(), 0, 0, CSeqFeatData::e_Biosrc);    if ( fsrc_it ) {        const CSeq_feat& src_feat = fsrc_it->GetOriginalFeature();        x_SetSource(src_feat.GetData().GetBiosrc(), src_feat);    }   }// for old-stylevoid CSourceItem::x_SetSource(const CGB_block&  gb, const CSeqdesc& desc){    x_SetObject(desc);    // set source line    if ( gb.CanGetSource() ) {        m_SourceLine = &(gb.GetSource());    }}static const string s_old_organelle_prefix[] = {  kEmptyStr,  kEmptyStr,  "Chloroplast ",  "Chromoplast ",  "Kinetoplast ",  "Mitochondrion ",  "Plastid ",  kEmptyStr,  kEmptyStr,  kEmptyStr,  kEmptyStr,  kEmptyStr,  "Cyanelle ",  kEmptyStr,  kEmptyStr,  "Nucleomorph ",  "Apicoplast ",  "Leucoplast ",  "Proplastid ",  kEmptyStr};static const string s_organelle_prefix[] = {  kEmptyStr,  kEmptyStr,  "chloroplast ",  "chromoplast ",  "kinetoplast ",  "mitochondrion ",  "plastid ",  kEmptyStr,  kEmptyStr,  kEmptyStr,  kEmptyStr,  kEmptyStr,  "cyanelle ",  kEmptyStr,  kEmptyStr,  "nucleomorph ",  "apicoplast ",  "leucoplast ",  "proplastid ",  kEmptyStr};void CSourceItem::x_SetSource(const CBioSource& bsrc, const CSerialObject& obj){    x_SetObject(obj);    if ( !bsrc.CanGetOrg() ) {        return;    }    const COrg_ref& org = bsrc.GetOrg();        // Taxname    {{        if ( org.CanGetTaxname() ) {            m_Taxname = &(org.GetTaxname());        }    }}    // Organelle    {{        CBioSource::TGenome genome = bsrc.CanGetGenome() ? bsrc.GetGenome()             : CBioSource::eGenome_unknown;                m_Organelle = &(s_old_organelle_prefix[genome]);                // If the organelle prefix is already on the  name, don't add it.        if ( NStr::StartsWith(*m_Taxname, *m_Organelle, NStr::eNocase) ) {            m_Organelle = &(kEmptyStr);        }    }}    // Mod    {{        m_Mod = &org.GetMod();    }}    // Common    {{        const string* common = &kEmptyStr;        if ( org.CanGetCommon() ) {            common = &(org.GetCommon());        }                if ( org.CanGetOrgname() ) {            const COrgName& org_name = org.GetOrgname();                        const string *com = 0, *acr = 0, *syn = 0, *ana = 0,                *gbacr = 0, *gbana = 0, *gbsyn = 0;            ITERATE( COrgName::TMod, mod, org_name.GetMod() ) {                if ( (*mod)->CanGetSubtype()  &&  (*mod)->CanGetSubname() ) {                    switch ( (*mod)->GetSubtype() ) {                    case COrgMod::eSubtype_common:                        com = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_acronym:                        acr = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_synonym:                        syn = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_anamorph:                        ana = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_gb_acronym:                        gbacr = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_gb_anamorph:                        gbana = &((*mod)->GetSubname());                        break;                    case COrgMod::eSubtype_gb_synonym:                        gbsyn = &((*mod)->GetSubname());                        break;                    default:                        break;                    }                }            }                        if ( m_Common->empty()  &&  syn != 0 ) {                m_Common = syn;            } else if ( m_Common->empty()  &&  acr != 0 ) {                m_Common = acr;            } else if ( m_Common->empty()  &&  ana != 0 ) {                m_Common = ana;                m_UsingAnamorph = true;            } else if ( m_Common->empty()  &&  com != 0 ) {                m_Common = com;            } else if ( m_Common->empty()  &&  gbsyn != 0 ) {                m_Common = gbsyn;            } else if ( m_Common->empty()  &&  gbacr != 0 ) {                m_Common = gbacr;            } else if ( m_Common->empty()  &&  gbana != 0 ) {                m_Common = gbana;                m_UsingAnamorph = true;            } else if ( m_Common->empty() ) {                m_Common = common;            }        }    }}    // Lineage    {{        if ( org.CanGetOrgname() ) {            const COrgName& org_name = org.GetOrgname();            if ( org_name.CanGetLineage() ) {                m_Lineage = &(org_name.GetLineage());            }        }    }}}END_SCOPE(objects)END_NCBI_SCOPE/** ===========================================================================** $Log: source_item.cpp,v $* Revision 1000.1  2004/06/01 19:45:31  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7** Revision 1.7  2004/05/21 21:42:54  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.6  2004/04/22 15:53:09  shomrat* Changes in context** Revision 1.5  2004/03/25 20:46:49  shomrat* remove redundant include directive** Revision 1.4  2004/03/05 22:02:47  shomrat* fixed gathering of common name** Revision 1.3  2004/02/11 22:56:14  shomrat* use IsFormatDDBJ method** Revision 1.2  2003/12/18 17:43:36  shomrat* context.hpp moved** Revision 1.1  2003/12/17 20:24:48  shomrat* Initial Revision (adapted from flat lib)*** ===========================================================================*/

⌨️ 快捷键说明

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