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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_quals.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_quals.cpp,v 1000.1 2004/06/01 19:43:25 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:  Aaron Ucko, NCBI
  35. *
  36. * File Description:
  37. *   new (early 2003) flat-file generator -- qualifier types
  38. *   (mainly of interest to implementors)
  39. *
  40. * ===========================================================================
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <objtools/flat/flat_quals.hpp>
  44. #include <serial/enumvalues.hpp>
  45. #include <objects/general/Object_id.hpp>
  46. #include <objects/seq/seqport_util.hpp>
  47. #include <objects/seqfeat/Code_break.hpp>
  48. #include <objects/seqfeat/Genetic_code_table.hpp>
  49. #include <objmgr/scope.hpp>
  50. #include <objmgr/seq_vector.hpp>
  51. BEGIN_NCBI_SCOPE
  52. BEGIN_SCOPE(objects)
  53. // in Ncbistdaa order
  54. static const char* kAANames[] = {
  55.     "---", "Ala", "Asx", "Cys", "Asp", "Glu", "Phe", "Gly", "His", "Ile",
  56.     "Lys", "Leu", "Met", "Asn", "Pro", "Glu", "Arg", "Ser", "Thr", "Val",
  57.     "Trp", "Xaa", "Tyr", "Glx", "Sec", "TERM"
  58. };
  59. inline
  60. static const char* s_AAName(unsigned char aa, bool is_ascii)
  61. {
  62.     if (is_ascii) {
  63.         aa = CSeqportUtil::GetMapToIndex
  64.             (CSeq_data::e_Ncbieaa, CSeq_data::e_Ncbistdaa, aa);
  65.     }
  66.     return (aa < sizeof(kAANames)/sizeof(*kAANames)) ? kAANames[aa] : "OTHER";
  67. }
  68. inline
  69. static bool s_IsNote(CFlatContext& ctx, IFlatQV::TFlags flags)
  70. {
  71.     return ((flags & IFlatQV::fIsNote)
  72.             &&  ctx.GetFormatter().GetMode() != IFlatFormatter::eMode_Dump);
  73. }
  74. void CFlatStringQV::Format(TFlatQuals& q, const string& name,
  75.                            CFlatContext& ctx, IFlatQV::TFlags flags) const
  76. {
  77.     x_AddFQ(q, s_IsNote(ctx, flags) ? "note" : name, m_Value, m_Style);
  78. }
  79. void CFlatCodeBreakQV::Format(TFlatQuals& q, const string& name,
  80.                               CFlatContext& ctx, IFlatQV::TFlags) const
  81. {
  82.     ITERATE (CCdregion::TCode_break, it, m_Value) {
  83.         string pos = CFlatLoc((*it)->GetLoc(), ctx).GetString();
  84.         string aa  = "OTHER";
  85.         switch ((*it)->GetAa().Which()) {
  86.         case CCode_break::C_Aa::e_Ncbieaa:
  87.             aa = s_AAName((*it)->GetAa().GetNcbieaa(), true);
  88.             break;
  89.         case CCode_break::C_Aa::e_Ncbi8aa:
  90.             aa = s_AAName((*it)->GetAa().GetNcbi8aa(), false);
  91.             break;
  92.         case CCode_break::C_Aa::e_Ncbistdaa:
  93.             aa = s_AAName((*it)->GetAa().GetNcbistdaa(), false);
  94.             break;
  95.         default:
  96.             return;
  97.         }
  98.         x_AddFQ(q, name, "(pos:" + pos + ",aa:" + aa + ')');
  99.     }
  100. }
  101. CFlatCodonQV::CFlatCodonQV(unsigned int codon, unsigned char aa, bool is_ascii)
  102.     : m_Codon(CGen_code_table::IndexToCodon(codon)),
  103.       m_AA(s_AAName(aa, is_ascii)), m_Checked(true)
  104. {
  105. }
  106. void CFlatCodonQV::Format(TFlatQuals& q, const string& name, CFlatContext& ctx,
  107.                           IFlatQV::TFlags) const
  108. {
  109.     if ( !m_Checked ) {
  110.         // ...
  111.     }
  112.     x_AddFQ(q, name, "(seq:"" + m_Codon + "",aa:" + m_AA + ')');
  113. }
  114. void CFlatExpEvQV::Format(TFlatQuals& q, const string& name,
  115.                           CFlatContext&, IFlatQV::TFlags) const
  116. {
  117.     const char* s = 0;
  118.     switch (m_Value) {
  119.     case CSeq_feat::eExp_ev_experimental:      s = "experimental";      break;
  120.     case CSeq_feat::eExp_ev_not_experimental:  s = "not_experimental";  break;
  121.     default:                                   break;
  122.     }
  123.     if (s) {
  124.         x_AddFQ(q, name, s, CFlatQual::eUnquoted);
  125.     }
  126. }
  127. void CFlatIllegalQV::Format(TFlatQuals& q, const string&, CFlatContext &ctx,
  128.                             IFlatQV::TFlags) const
  129. {
  130.     // XXX - return if too strict
  131.     x_AddFQ(q, m_Value->GetQual(), m_Value->GetVal());
  132. }
  133. void CFlatMolTypeQV::Format(TFlatQuals& q, const string& name,
  134.                             CFlatContext& ctx, IFlatQV::TFlags flags) const
  135. {
  136.     const char* s = 0;
  137.     switch (m_Biomol) {
  138.     case CMolInfo::eBiomol_genomic:
  139.         switch (m_Mol) {
  140.         case CSeq_inst::eMol_dna:  s = "genomic DNA";  break;
  141.         case CSeq_inst::eMol_rna:  s = "genomic RNA";  break;
  142.         default:                   break;
  143.         }
  144.         break;
  145.     case CMolInfo::eBiomol_pre_RNA:  s = "pre-mRNA";  break;
  146.     case CMolInfo::eBiomol_mRNA:     s = "mRNA";      break;
  147.     case CMolInfo::eBiomol_rRNA:     s = "rRNA";      break;
  148.     case CMolInfo::eBiomol_tRNA:     s = "tRNA";      break;
  149.     case CMolInfo::eBiomol_snRNA:    s = "snRNA";     break;
  150.     case CMolInfo::eBiomol_scRNA:    s = "scRNA";     break;
  151.     case CMolInfo::eBiomol_other_genetic:
  152.     case CMolInfo::eBiomol_other:
  153.         switch (m_Mol) {
  154.         case CSeq_inst::eMol_dna:  s = "other DNA";  break;
  155.         case CSeq_inst::eMol_rna:  s = "other RNA";  break;
  156.         default:                   break;
  157.         }
  158.         break;
  159.     case CMolInfo::eBiomol_cRNA:
  160.     case CMolInfo::eBiomol_transcribed_RNA:  s = "other RNA";  break;
  161.     case CMolInfo::eBiomol_snoRNA:           s = "snoRNA";     break;
  162.     }
  163.     if (s) {
  164.         x_AddFQ(q, name, s);
  165.     }
  166. }
  167. void CFlatOrgModQV::Format(TFlatQuals& q, const string& name,
  168.                            CFlatContext& ctx, IFlatQV::TFlags flags) const
  169. {
  170.     switch (m_Value->GetSubtype()) {
  171.     case COrgMod::eSubtype_other:
  172.         x_AddFQ(q, "note", m_Value->GetSubname());
  173.         break;
  174.     default:
  175.         if (s_IsNote(ctx, flags)) {
  176.             x_AddFQ(q, "note", name + ": " + m_Value->GetSubname());
  177.         } else {
  178.             x_AddFQ(q, name, m_Value->GetSubname());
  179.         }
  180.         break;
  181.     }
  182. }
  183. void CFlatOrganelleQV::Format(TFlatQuals& q, const string& name,
  184.                               CFlatContext&, IFlatQV::TFlags) const
  185. {
  186.     const string& organelle
  187.         = CBioSource::GetTypeInfo_enum_EGenome()->FindName(m_Value, true);
  188.     switch (m_Value) {
  189.     case CBioSource::eGenome_chloroplast: case CBioSource::eGenome_chromoplast:
  190.     case CBioSource::eGenome_cyanelle:    case CBioSource::eGenome_apicoplast:
  191.     case CBioSource::eGenome_leucoplast:  case CBioSource::eGenome_proplastid:
  192.         x_AddFQ(q, name, "plastid:" + organelle);
  193.         break;
  194.     case CBioSource::eGenome_kinetoplast:
  195.         x_AddFQ(q, name, "mitochondrion:kinetoplast");
  196.         break;
  197.     case CBioSource::eGenome_mitochondrion: case CBioSource::eGenome_plastid:
  198.     case CBioSource::eGenome_nucleomorph:
  199.         x_AddFQ(q, name, organelle);
  200.         break;
  201.     case CBioSource::eGenome_macronuclear: case CBioSource::eGenome_proviral:
  202.     case CBioSource::eGenome_virion:
  203.         x_AddFQ(q, organelle, kEmptyStr, CFlatQual::eEmpty);
  204.         break;
  205.     case CBioSource::eGenome_plasmid: case CBioSource::eGenome_transposon:
  206.         x_AddFQ(q, organelle, kEmptyStr);
  207.         break;
  208.     case CBioSource::eGenome_insertion_seq:
  209.         x_AddFQ(q, "insertion_seq", kEmptyStr);
  210.         break;
  211.     default:
  212.         break;
  213.     }
  214.     
  215. }
  216. void CFlatPubSetQV::Format(TFlatQuals& q, const string& name,
  217.                            CFlatContext& ctx, IFlatQV::TFlags) const
  218. {
  219.     bool found = false;
  220.     ITERATE (vector<CRef<CFlatReference> >, it, ctx.GetReferences()) {
  221.         if ((*it)->Matches(*m_Value)) {
  222.             x_AddFQ(q, name, '[' + NStr::IntToString((*it)->GetSerial()) + ']',
  223.                     CFlatQual::eUnquoted);
  224.             found = true;
  225.         }
  226.     }
  227.     // complain if not found?
  228. }
  229. void CFlatSeqDataQV::Format(TFlatQuals& q, const string& name,
  230.                             CFlatContext& ctx, IFlatQV::TFlags) const
  231. {
  232.     string s;
  233.     CSeqVector v = ctx.GetHandle().GetScope().GetBioseqHandle(*m_Value)
  234.         .GetSequenceView(*m_Value, CBioseq_Handle::eViewConstructed,
  235.                          CBioseq_Handle::eCoding_Iupac);
  236.     v.GetSeqData(0, v.size(), s);
  237.     x_AddFQ(q, name, s);
  238. }
  239. void CFlatSeqIdQV::Format(TFlatQuals& q, const string& name,
  240.                           CFlatContext& ctx, IFlatQV::TFlags) const
  241. {
  242.     // XXX - add link in HTML mode
  243.     x_AddFQ(q, name, ctx.GetPreferredSynonym(*m_Value).GetSeqIdString(true));
  244. }
  245. void CFlatSubSourceQV::Format(TFlatQuals& q, const string& name,
  246.                               CFlatContext& ctx, IFlatQV::TFlags flags) const
  247. {
  248.     switch (m_Value->GetSubtype()) {
  249.     case CSubSource::eSubtype_germline:
  250.     case CSubSource::eSubtype_rearranged:
  251.     case CSubSource::eSubtype_transgenic:
  252.     case CSubSource::eSubtype_environmental_sample:
  253.         x_AddFQ(q, name, kEmptyStr, CFlatQual::eEmpty);
  254.         break;
  255.     case CSubSource::eSubtype_other:
  256.         x_AddFQ(q, "note", m_Value->GetName());
  257.         break;
  258.     default:
  259.         if (s_IsNote(ctx, flags)) {
  260.             x_AddFQ(q, "note", name + ": " + m_Value->GetName());
  261.         } else {
  262.             x_AddFQ(q, name, m_Value->GetName());
  263.         }
  264.         break;
  265.     }
  266. }
  267. void CFlatXrefQV::Format(TFlatQuals& q, const string& name,
  268.                          CFlatContext& ctx, IFlatQV::TFlags flags) const
  269. {
  270.     // XXX - add link in HTML mode?
  271.     ITERATE (TXref, it, m_Value) {
  272.         string s((*it)->GetDb());
  273.         const CObject_id& id = (*it)->GetTag();
  274.         switch (id.Which()) {
  275.         case CObject_id::e_Id: s += ':' + NStr::IntToString(id.GetId()); break;
  276.         case CObject_id::e_Str: s += ':' + id.GetStr(); break;
  277.         default: break; // complain?
  278.         }
  279.         x_AddFQ(q, name, s);
  280.     }
  281. }
  282. END_SCOPE(objects)
  283. END_NCBI_SCOPE
  284. /*
  285. * ===========================================================================
  286. *
  287. * $Log: flat_quals.cpp,v $
  288. * Revision 1000.1  2004/06/01 19:43:25  gouriano
  289. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  290. *
  291. * Revision 1.5  2004/05/21 21:42:53  gorelenk
  292. * Added PCH ncbi_pch.hpp
  293. *
  294. * Revision 1.4  2003/06/02 16:06:42  dicuccio
  295. * Rearranged src/objects/ subtree.  This includes the following shifts:
  296. *     - src/objects/asn2asn --> arc/app/asn2asn
  297. *     - src/objects/testmedline --> src/objects/ncbimime/test
  298. *     - src/objects/objmgr --> src/objmgr
  299. *     - src/objects/util --> src/objmgr/util
  300. *     - src/objects/alnmgr --> src/objtools/alnmgr
  301. *     - src/objects/flat --> src/objtools/flat
  302. *     - src/objects/validator --> src/objtools/validator
  303. *     - src/objects/cddalignview --> src/objtools/cddalignview
  304. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  305. * replaces the three libmmdb? libs.
  306. *
  307. * Revision 1.3  2003/03/21 18:49:17  ucko
  308. * Turn most structs into (accessor-requiring) classes; replace some
  309. * formerly copied fields with pointers to the original data.
  310. *
  311. * Revision 1.2  2003/03/11 15:37:51  kuznets
  312. * iterate -> ITERATE
  313. *
  314. * Revision 1.1  2003/03/10 16:39:09  ucko
  315. * Initial check-in of new flat-file generator
  316. *
  317. *
  318. * ===========================================================================
  319. */