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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: keywords_item.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:44:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: keywords_item.cpp,v 1000.1 2004/06/01 19:44:58 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 -- keywords item implementation
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <objects/seqblock/PIR_block.hpp>
  43. #include <objects/seqblock/PRF_block.hpp>
  44. #include <objects/seqblock/GB_block.hpp>
  45. #include <objects/seqblock/SP_block.hpp>
  46. #include <objects/seqblock/EMBL_block.hpp>
  47. #include <objects/seq/MolInfo.hpp>
  48. #include <objmgr/seqdesc_ci.hpp>
  49. #include <algorithm>
  50. #include <objtools/format/formatter.hpp>
  51. #include <objtools/format/text_ostream.hpp>
  52. #include <objtools/format/items/keywords_item.hpp>
  53. #include <objtools/format/context.hpp>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. CKeywordsItem::CKeywordsItem(CBioseqContext& ctx) :
  57.     CFlatItem(&ctx)
  58. {
  59.     x_GatherInfo(ctx);
  60. }
  61. void CKeywordsItem::Format
  62. (IFormatter& formatter,
  63.  IFlatTextOStream& text_os) const
  64. {
  65.     formatter.FormatKeywords(*this, text_os);
  66. }
  67. const list<string>& CKeywordsItem::GetKeywords(void) const 
  68.     return m_Keywords; 
  69. }
  70. /***************************************************************************/
  71. /*                                  PRIVATE                                */
  72. /***************************************************************************/
  73. enum ETechFlags {
  74.     eEST = 1<<0,
  75.     eSTS = 1<<1,
  76.     eGSS = 1<<2
  77. };
  78. void CKeywordsItem::x_GatherInfo(CBioseqContext& ctx)
  79. {
  80.     // add TPA keywords
  81.     if ( ctx.IsTPA() ) {
  82.         x_AddKeyword("Third Party Annotation");
  83.         x_AddKeyword("TPA");
  84.     }
  85.     
  86.     // add keywords based on mol-info
  87.     Uint4 flags = 0;
  88.     switch ( ctx.GetTech() ) {
  89.     case CMolInfo::eTech_est:
  90.         flags |= eEST;
  91.         x_AddKeyword("EST");
  92.         break;
  93.         
  94.     case CMolInfo::eTech_sts:
  95.         flags |= eSTS;
  96.         x_AddKeyword("STS");
  97.         break;
  98.         
  99.     case CMolInfo::eTech_survey:
  100.         flags |= eGSS;
  101.         x_AddKeyword("GSS");
  102.         break;
  103.         
  104.     case CMolInfo::eTech_htgs_0:
  105.         x_AddKeyword("HTG");
  106.         x_AddKeyword("HTGS_PHASE0");
  107.         break;
  108.         
  109.     case CMolInfo::eTech_htgs_1:
  110.         x_AddKeyword("HTG");
  111.         x_AddKeyword("HTGS_PHASE1");
  112.         break;
  113.         
  114.     case CMolInfo::eTech_htgs_2:
  115.         x_AddKeyword("HTG");
  116.         x_AddKeyword("HTGS_PHASE2");
  117.         break;
  118.         
  119.     case CMolInfo::eTech_htgs_3:
  120.         x_AddKeyword("HTG");
  121.         break;
  122.         
  123.     case CMolInfo::eTech_fli_cdna:
  124.         x_AddKeyword("FLI_CDNA");
  125.         break;
  126.         
  127.     case CMolInfo::eTech_htc:
  128.         x_AddKeyword("HTC");
  129.         break;
  130.         
  131.     case CMolInfo::eTech_wgs:
  132.         x_AddKeyword("WGS");
  133.         break;
  134.         
  135.     default:
  136.         break;
  137.     }
  138.     
  139.     for (CSeqdesc_CI it(ctx.GetHandle());  it;  ++it) {
  140.         const list<string>* keywords = 0;
  141.         
  142.         switch (it->Which()) {
  143.             
  144.         case CSeqdesc::e_Pir:
  145.             if ( it->GetPir().CanGetKeywords() ) {
  146.                 keywords = &(it->GetPir().GetKeywords());
  147.             }
  148.             break;
  149.             
  150.         case CSeqdesc::e_Genbank:
  151.             if (it->GetGenbank().CanGetKeywords()) {
  152.                 keywords = &(it->GetGenbank().GetKeywords());
  153.             }
  154.             break;
  155.             
  156.         case CSeqdesc::e_Sp:
  157.             if (it->GetSp().CanGetKeywords()) {
  158.                 keywords = &(it->GetSp().GetKeywords());
  159.             }
  160.             break;
  161.             
  162.         case CSeqdesc::e_Embl:
  163.             if (it->GetEmbl().CanGetKeywords()) {
  164.                 keywords = &(it->GetEmbl().GetKeywords());
  165.             }
  166.             break;
  167.             
  168.         case CSeqdesc::e_Prf:
  169.             if (it->GetPrf().CanGetKeywords()) {
  170.                 keywords = &(it->GetPrf().GetKeywords());
  171.             }
  172.             break;
  173.             
  174.         default:
  175.             break;
  176.         }
  177.         
  178.         if ( keywords ) {
  179.             ITERATE ( list<string>, kwd, *keywords ) {
  180.                 if ( x_CheckSpecialKeyword(*kwd, flags) ) {
  181.                     x_AddKeyword(*kwd);
  182.                 }
  183.             }
  184.         }
  185.     }
  186. }
  187. // Add a keyword to the list 
  188. void CKeywordsItem::x_AddKeyword(const string& keyword, Uint4 flags)
  189. {
  190.     list<string>::const_iterator begin = m_Keywords.begin();
  191.     list<string>::const_iterator end = m_Keywords.end();
  192.     if ( find(begin, end, keyword) == end ) {
  193.         m_Keywords.push_back(keyword);
  194.     }
  195. }
  196. // EST keywords
  197. static const string s_EST_kw[] = {
  198.   "EST", "EST PROTO((expressed sequence tag)", "expressed sequence tag",
  199.   "EST (expressed sequence tag)", "EST(expressed sequence tag)",
  200.   "partial cDNA sequence", "transcribed sequence fragment", "TSR",
  201.   "putatively transcribed partial sequence", "UK putts"
  202. };
  203. static const string* s_EST_kw_end = s_EST_kw + 
  204.     sizeof(s_EST_kw) / sizeof(string);
  205. // GSS keywords
  206. static const string s_GSS_kw[] = {
  207.   "GSS", "trapped exon"
  208. };
  209. static const string* s_GSS_kw_end = s_GSS_kw + 
  210.     sizeof(s_GSS_kw) / sizeof(string);
  211. // STS keywords
  212. static const string s_STS_kw[] = {
  213.   "STS", "STS(sequence tagged site)", "STS (sequence tagged site)",
  214.   "STS sequence", "sequence tagged site"
  215. };
  216. static const string* s_STS_kw_end = s_STS_kw + 
  217.     sizeof(s_STS_kw) / sizeof(string);
  218. bool CKeywordsItem::x_CheckSpecialKeyword(const string& keyword, Uint4 flags) const
  219. {
  220.     if ( flags & eEST ) {
  221.         if ( find(s_STS_kw, s_STS_kw_end, keyword) != s_STS_kw_end ) {
  222.             return false;
  223.         }
  224.         if ( find(s_GSS_kw, s_GSS_kw_end, keyword) != s_GSS_kw_end ) {
  225.             return false;
  226.         }
  227.     }
  228.     
  229.     if ( flags & eSTS ) {
  230.         if ( find(s_EST_kw, s_EST_kw_end, keyword) != s_EST_kw_end ) {
  231.             return false;
  232.         }
  233.         if ( find(s_GSS_kw, s_GSS_kw_end, keyword) != s_GSS_kw_end ) {
  234.             return false;
  235.         }
  236.     }
  237.     
  238.     if ( flags & eGSS ) {
  239.         if ( find(s_EST_kw, s_EST_kw_end, keyword) != s_EST_kw_end ) {
  240.             return false;
  241.         }
  242.         if ( find(s_STS_kw, s_STS_kw_end, keyword) != s_STS_kw_end ) {
  243.             return false;
  244.         }
  245.     }
  246.     
  247.     return true;
  248. }
  249. END_SCOPE(objects)
  250. END_NCBI_SCOPE
  251. /*
  252. * ===========================================================================
  253. *
  254. * $Log: keywords_item.cpp,v $
  255. * Revision 1000.1  2004/06/01 19:44:58  gouriano
  256. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  257. *
  258. * Revision 1.6  2004/05/21 21:42:54  gorelenk
  259. * Added PCH ncbi_pch.hpp
  260. *
  261. * Revision 1.5  2004/04/22 15:58:42  shomrat
  262. * Changes in context
  263. *
  264. * Revision 1.4  2004/03/31 17:14:42  shomrat
  265. * EFlags -> ETechFlags
  266. *
  267. * Revision 1.3  2004/03/25 20:44:42  shomrat
  268. * remove redundant include directive
  269. *
  270. * Revision 1.2  2003/12/18 17:43:35  shomrat
  271. * context.hpp moved
  272. *
  273. * Revision 1.1  2003/12/17 20:23:26  shomrat
  274. * Initial Revision (adapted from flat lib)
  275. *
  276. *
  277. * ===========================================================================
  278. */