source_item.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: source_item.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:45:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: source_item.cpp,v 1000.1 2004/06/01 19:45:31 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Mati Shomrat, NCBI
  35. *
  36. * File Description:
  37. *   flat-file generator -- source item implementation
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <objects/seqblock/GB_block.hpp>
  43. #include <objects/seqfeat/BioSource.hpp>
  44. #include <objects/seqfeat/OrgMod.hpp>
  45. #include <objects/seqfeat/OrgName.hpp>
  46. #include <objects/seqfeat/Org_ref.hpp>
  47. #include <objmgr/seqdesc_ci.hpp>
  48. #include <objmgr/feat_ci.hpp>
  49. #include <objmgr/util/sequence.hpp>
  50. #include <objtools/format/formatter.hpp>
  51. #include <objtools/format/text_ostream.hpp>
  52. #include <objtools/format/items/source_item.hpp>
  53. #include <objtools/format/context.hpp>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. ///////////////////////////////////////////////////////////////////////////
  57. //
  58. // SOURCE
  59. //   ORGANISM
  60. CSourceItem::CSourceItem(CBioseqContext& ctx) :
  61.     CFlatItem(&ctx),
  62.     m_Taxname(&scm_Unknown), m_Common(&kEmptyStr),
  63.     m_Organelle(&kEmptyStr), m_Lineage(&scm_Unclassified),
  64.     m_SourceLine(&kEmptyStr), m_Mod(&scm_EmptyList),
  65.     m_UsingAnamorph(false)
  66. {
  67.     x_GatherInfo(ctx);
  68. }
  69. void CSourceItem::Format
  70. (IFormatter& formatter,
  71.  IFlatTextOStream& text_os) const
  72. {
  73.     formatter.FormatSource(*this, text_os);
  74. }
  75. /***************************************************************************/
  76. /*                                  PRIVATE                                */
  77. /***************************************************************************/
  78. // static members initialization
  79. const string       CSourceItem::scm_Unknown        = "Unknown.";
  80. const string       CSourceItem::scm_Unclassified   = "Unclassified.";
  81. const list<string> CSourceItem::scm_EmptyList;
  82. void CSourceItem::x_GatherInfo(CBioseqContext& ctx)
  83. {
  84.     // For DDBJ format first try a GB-Block descriptor (old style)
  85.     if ( ctx.Config().IsFormatDDBJ() ) {
  86.         CSeqdesc_CI gb_it(ctx.GetHandle(), CSeqdesc::e_Genbank);
  87.         if ( gb_it ) {
  88.             const CGB_block& gb = gb_it->GetGenbank();
  89.             if ( gb.CanGetSource()  &&  !gb.GetSource().empty() ) {
  90.                 x_SetSource(gb, *gb_it);
  91.                 return;
  92.             }
  93.         }
  94.     }
  95.     
  96.     // find a biosource descriptor
  97.     CSeqdesc_CI dsrc_it(ctx.GetHandle(), CSeqdesc::e_Source);
  98.     if ( dsrc_it ) {
  99.         x_SetSource(dsrc_it->GetSource(), *dsrc_it);
  100.         return;
  101.     } 
  102.     
  103.     // if no descriptor was found, try a source feature
  104.     CFeat_CI fsrc_it(ctx.GetHandle(), 0, 0, CSeqFeatData::e_Biosrc);
  105.     if ( fsrc_it ) {
  106.         const CSeq_feat& src_feat = fsrc_it->GetOriginalFeature();
  107.         x_SetSource(src_feat.GetData().GetBiosrc(), src_feat);
  108.     }   
  109. }
  110. // for old-style
  111. void CSourceItem::x_SetSource
  112. (const CGB_block&  gb,
  113.  const CSeqdesc& desc)
  114. {
  115.     x_SetObject(desc);
  116.     // set source line
  117.     if ( gb.CanGetSource() ) {
  118.         m_SourceLine = &(gb.GetSource());
  119.     }
  120. }
  121. static const string s_old_organelle_prefix[] = {
  122.   kEmptyStr,
  123.   kEmptyStr,
  124.   "Chloroplast ",
  125.   "Chromoplast ",
  126.   "Kinetoplast ",
  127.   "Mitochondrion ",
  128.   "Plastid ",
  129.   kEmptyStr,
  130.   kEmptyStr,
  131.   kEmptyStr,
  132.   kEmptyStr,
  133.   kEmptyStr,
  134.   "Cyanelle ",
  135.   kEmptyStr,
  136.   kEmptyStr,
  137.   "Nucleomorph ",
  138.   "Apicoplast ",
  139.   "Leucoplast ",
  140.   "Proplastid ",
  141.   kEmptyStr
  142. };
  143. static const string s_organelle_prefix[] = {
  144.   kEmptyStr,
  145.   kEmptyStr,
  146.   "chloroplast ",
  147.   "chromoplast ",
  148.   "kinetoplast ",
  149.   "mitochondrion ",
  150.   "plastid ",
  151.   kEmptyStr,
  152.   kEmptyStr,
  153.   kEmptyStr,
  154.   kEmptyStr,
  155.   kEmptyStr,
  156.   "cyanelle ",
  157.   kEmptyStr,
  158.   kEmptyStr,
  159.   "nucleomorph ",
  160.   "apicoplast ",
  161.   "leucoplast ",
  162.   "proplastid ",
  163.   kEmptyStr
  164. };
  165. void CSourceItem::x_SetSource
  166. (const CBioSource& bsrc,
  167.  const CSerialObject& obj)
  168. {
  169.     x_SetObject(obj);
  170.     if ( !bsrc.CanGetOrg() ) {
  171.         return;
  172.     }
  173.     const COrg_ref& org = bsrc.GetOrg();
  174.     
  175.     // Taxname
  176.     {{
  177.         if ( org.CanGetTaxname() ) {
  178.             m_Taxname = &(org.GetTaxname());
  179.         }
  180.     }}
  181.     // Organelle
  182.     {{
  183.         CBioSource::TGenome genome = bsrc.CanGetGenome() ? bsrc.GetGenome() 
  184.             : CBioSource::eGenome_unknown;
  185.         
  186.         m_Organelle = &(s_old_organelle_prefix[genome]);
  187.         
  188.         // If the organelle prefix is already on the  name, don't add it.
  189.         if ( NStr::StartsWith(*m_Taxname, *m_Organelle, NStr::eNocase) ) {
  190.             m_Organelle = &(kEmptyStr);
  191.         }
  192.     }}
  193.     // Mod
  194.     {{
  195.         m_Mod = &org.GetMod();
  196.     }}
  197.     // Common
  198.     {{
  199.         const string* common = &kEmptyStr;
  200.         if ( org.CanGetCommon() ) {
  201.             common = &(org.GetCommon());
  202.         }
  203.         
  204.         if ( org.CanGetOrgname() ) {
  205.             const COrgName& org_name = org.GetOrgname();
  206.             
  207.             const string *com = 0, *acr = 0, *syn = 0, *ana = 0,
  208.                 *gbacr = 0, *gbana = 0, *gbsyn = 0;
  209.             ITERATE( COrgName::TMod, mod, org_name.GetMod() ) {
  210.                 if ( (*mod)->CanGetSubtype()  &&  (*mod)->CanGetSubname() ) {
  211.                     switch ( (*mod)->GetSubtype() ) {
  212.                     case COrgMod::eSubtype_common:
  213.                         com = &((*mod)->GetSubname());
  214.                         break;
  215.                     case COrgMod::eSubtype_acronym:
  216.                         acr = &((*mod)->GetSubname());
  217.                         break;
  218.                     case COrgMod::eSubtype_synonym:
  219.                         syn = &((*mod)->GetSubname());
  220.                         break;
  221.                     case COrgMod::eSubtype_anamorph:
  222.                         ana = &((*mod)->GetSubname());
  223.                         break;
  224.                     case COrgMod::eSubtype_gb_acronym:
  225.                         gbacr = &((*mod)->GetSubname());
  226.                         break;
  227.                     case COrgMod::eSubtype_gb_anamorph:
  228.                         gbana = &((*mod)->GetSubname());
  229.                         break;
  230.                     case COrgMod::eSubtype_gb_synonym:
  231.                         gbsyn = &((*mod)->GetSubname());
  232.                         break;
  233.                     default:
  234.                         break;
  235.                     }
  236.                 }
  237.             }
  238.             
  239.             if ( m_Common->empty()  &&  syn != 0 ) {
  240.                 m_Common = syn;
  241.             } else if ( m_Common->empty()  &&  acr != 0 ) {
  242.                 m_Common = acr;
  243.             } else if ( m_Common->empty()  &&  ana != 0 ) {
  244.                 m_Common = ana;
  245.                 m_UsingAnamorph = true;
  246.             } else if ( m_Common->empty()  &&  com != 0 ) {
  247.                 m_Common = com;
  248.             } else if ( m_Common->empty()  &&  gbsyn != 0 ) {
  249.                 m_Common = gbsyn;
  250.             } else if ( m_Common->empty()  &&  gbacr != 0 ) {
  251.                 m_Common = gbacr;
  252.             } else if ( m_Common->empty()  &&  gbana != 0 ) {
  253.                 m_Common = gbana;
  254.                 m_UsingAnamorph = true;
  255.             } else if ( m_Common->empty() ) {
  256.                 m_Common = common;
  257.             }
  258.         }
  259.     }}
  260.     // Lineage
  261.     {{
  262.         if ( org.CanGetOrgname() ) {
  263.             const COrgName& org_name = org.GetOrgname();
  264.             if ( org_name.CanGetLineage() ) {
  265.                 m_Lineage = &(org_name.GetLineage());
  266.             }
  267.         }
  268.     }}
  269. }
  270. END_SCOPE(objects)
  271. END_NCBI_SCOPE
  272. /*
  273. * ===========================================================================
  274. *
  275. * $Log: source_item.cpp,v $
  276. * Revision 1000.1  2004/06/01 19:45:31  gouriano
  277. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  278. *
  279. * Revision 1.7  2004/05/21 21:42:54  gorelenk
  280. * Added PCH ncbi_pch.hpp
  281. *
  282. * Revision 1.6  2004/04/22 15:53:09  shomrat
  283. * Changes in context
  284. *
  285. * Revision 1.5  2004/03/25 20:46:49  shomrat
  286. * remove redundant include directive
  287. *
  288. * Revision 1.4  2004/03/05 22:02:47  shomrat
  289. * fixed gathering of common name
  290. *
  291. * Revision 1.3  2004/02/11 22:56:14  shomrat
  292. * use IsFormatDDBJ method
  293. *
  294. * Revision 1.2  2003/12/18 17:43:36  shomrat
  295. * context.hpp moved
  296. *
  297. * Revision 1.1  2003/12/17 20:24:48  shomrat
  298. * Initial Revision (adapted from flat lib)
  299. *
  300. *
  301. * ===========================================================================
  302. */