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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: qualifiers.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:45:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: qualifiers.cpp,v 1000.1 2004/06/01 19:45:20 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 <corelib/ncbistd.hpp>
  44. #include <serial/enumvalues.hpp>
  45. #include <objects/general/Dbtag.hpp>
  46. #include <objects/general/Object_id.hpp>
  47. #include <objects/pub/Pub_set.hpp>
  48. #include <objects/seqfeat/Seq_feat.hpp>
  49. #include <objects/seqfeat/Cdregion.hpp>
  50. #include <objects/seqfeat/BioSource.hpp>
  51. #include <objects/seqfeat/Code_break.hpp>
  52. #include <objects/seqfeat/Genetic_code_table.hpp>
  53. #include <objects/seqfeat/Gb_qual.hpp>
  54. #include <objects/seqfeat/OrgMod.hpp>
  55. #include <objects/seqfeat/SubSource.hpp>
  56. #include <objects/seq/Seq_inst.hpp>
  57. #include <objects/seq/MolInfo.hpp>
  58. #include <objects/seq/seqport_util.hpp>
  59. #include <objmgr/seq_vector.hpp>
  60. #include <objtools/format/items/qualifiers.hpp>
  61. #include <objtools/format/context.hpp>
  62. #include "utils.hpp"
  63. BEGIN_NCBI_SCOPE
  64. BEGIN_SCOPE(objects)
  65. const string IFlatQVal::kSemicolon = "; ";
  66. const string IFlatQVal::kComma     = ", ";
  67. const string IFlatQVal::kEOL       = "n";
  68. static bool s_IsNote(IFlatQVal::TFlags flags)
  69. {
  70.     return (flags & IFlatQVal::fIsNote);
  71. }
  72. static bool s_StringIsJustQuotes(const string& str)
  73. {
  74.     ITERATE(string, it, str) {
  75.         if ( (*it != '"')  ||  (*it != ''') ) {
  76.             return false;
  77.         }
  78.     }
  79.     return true;
  80. }
  81. static string s_GetGOText(const CUser_field& field, bool is_ftable)
  82. {
  83.     string text_string, evidence, go_id;
  84.     int pmid = 0;
  85.     ITERATE (CUser_field::C_Data::TFields, it, field.GetData().GetFields()) {
  86.         if ( !(*it)->CanGetLabel()  ||  !(*it)->GetLabel().IsStr() ) {
  87.             continue;
  88.         }
  89.         
  90.         const string& label = (*it)->GetLabel().GetStr();
  91.         const CUser_field::C_Data& data = (*it)->GetData();
  92.         
  93.         if ( label == "text string"  &&  data.IsStr() ) {
  94.             text_string = data.GetStr();
  95.         }
  96.         
  97.         if ( label == "go id" ) {
  98.             if ( data.IsStr() ) {
  99.                 go_id = data.GetStr();
  100.             } else if ( data.IsInt() ) {
  101.                 go_id = NStr::IntToString(data.GetInt());
  102.             }
  103.         }
  104.         
  105.         if ( label == "evidence"  &&  data.IsStr() ) {
  106.             evidence = data.GetStr();
  107.         }
  108.         
  109.         if ( label == "pubmed id"  &&  data.IsInt() ) {
  110.             pmid = data.GetInt();
  111.         }
  112.     }
  113.     
  114.     CNcbiOstrstream text;
  115.     
  116.     text << text_string;
  117.     if ( is_ftable ) {
  118.         text << "|" << go_id << "|";
  119.         if ( pmid != 0 ) {
  120.             text <<  pmid;
  121.         }
  122.         if ( !evidence.empty() ) {
  123.             text << "|" << evidence;
  124.         }
  125.     } else { 
  126.         if ( !go_id.empty() ) {
  127.             text << " [goid " << go_id << "]";
  128.             if ( !evidence.empty() ) {
  129.                 text << " [evidence " << evidence << "]";
  130.             }
  131.             if ( pmid != 0 ) {
  132.                 text << " [pmid " << pmid << "]";
  133.             }
  134.         }
  135.     }
  136.     return NStr::TruncateSpaces(CNcbiOstrstreamToString(text));
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // CFormatQual - low-level formatted qualifier
  140. CFormatQual::CFormatQual
  141. (const string& name,
  142.  const string& value, 
  143.  const string& prefix,
  144.  const string& suffix,
  145.  TStyle style) :
  146.     m_Name(name), m_Value(value), m_Prefix(prefix), m_Suffix(suffix),
  147.     m_Style(style)
  148. {
  149. }
  150. CFormatQual::CFormatQual(const string& name, const string& value, TStyle style) :
  151.     m_Name(name), m_Value(value), m_Prefix(kEmptyStr), m_Suffix(kEmptyStr),
  152.     m_Style(style)
  153. {
  154. }
  155. ////////////////////////////////////////////////////////////////////////////
  156. //
  157. // CFlatStringQVal {
  158. CFlatStringQVal::CFlatStringQVal(const string& value, TStyle style)
  159.     :  IFlatQVal(&kEmptyStr, &kSemicolon),
  160.        m_Value(NStr::TruncateSpaces(value)), m_Style(style)
  161. {
  162. }
  163. CFlatStringQVal::CFlatStringQVal
  164. (const string& value,
  165.  const string& pfx,
  166.  const string& sfx,
  167.  TStyle style)
  168.     :   IFlatQVal(&pfx, &sfx),
  169.         m_Value(NStr::TruncateSpaces(value)),
  170.         m_Style(style)
  171. {
  172. }
  173. void CFlatStringQVal::Format(TFlatQuals& q, const string& name,
  174.                            CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  175. {
  176.     x_AddFQ(q, (s_IsNote(flags) ? "note" : name), m_Value, m_Style);
  177. }
  178. // }
  179. ////////////////////////////////////////////////////////////////////////////
  180. //
  181. // CFlatStringListQVal {
  182. void CFlatStringListQVal::Format(TFlatQuals& q, const string& name,
  183.                            CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  184. {
  185.     if ( s_IsNote(flags) ) {
  186.         m_Suffix = &kSemicolon;
  187.     }
  188.     x_AddFQ(q, 
  189.             (s_IsNote(flags) ? "note" : name),
  190.             JoinNoRedund(m_Value, "; "),
  191.             m_Style);
  192. }
  193. // }
  194. void CFlatCodeBreakQVal::Format(TFlatQuals& q, const string& name,
  195.                               CBioseqContext& ctx, IFlatQVal::TFlags) const
  196. {
  197.     ITERATE (CCdregion::TCode_break, it, m_Value) {
  198.         string pos = CFlatSeqLoc((*it)->GetLoc(), ctx).GetString();
  199.         string aa  = "OTHER";
  200.         switch ((*it)->GetAa().Which()) {
  201.         case CCode_break::C_Aa::e_Ncbieaa:
  202.             aa = GetAAName((*it)->GetAa().GetNcbieaa(), true);
  203.             break;
  204.         case CCode_break::C_Aa::e_Ncbi8aa:
  205.             aa = GetAAName((*it)->GetAa().GetNcbi8aa(), false);
  206.             break;
  207.         case CCode_break::C_Aa::e_Ncbistdaa:
  208.             aa = GetAAName((*it)->GetAa().GetNcbistdaa(), false);
  209.             break;
  210.         default:
  211.             return;
  212.         }
  213.         x_AddFQ(q, name, "(pos:" + pos + ",aa:" + aa + ')', 
  214.             CFormatQual::eUnquoted);
  215.     }
  216. }
  217. CFlatCodonQVal::CFlatCodonQVal(unsigned int codon, unsigned char aa, bool is_ascii)
  218.     : m_Codon(CGen_code_table::IndexToCodon(codon)),
  219.       m_AA(GetAAName(aa, is_ascii)), m_Checked(true)
  220. {
  221. }
  222. void CFlatCodonQVal::Format(TFlatQuals& q, const string& name, CBioseqContext& ctx,
  223.                           IFlatQVal::TFlags) const
  224. {
  225.     if ( !m_Checked ) {
  226.         // ...
  227.     }
  228.     x_AddFQ(q, name, "(seq:"" + m_Codon + "",aa:" + m_AA + ')');
  229. }
  230. void CFlatExpEvQVal::Format(TFlatQuals& q, const string& name,
  231.                           CBioseqContext&, IFlatQVal::TFlags) const
  232. {
  233.     const char* s = 0;
  234.     switch (m_Value) {
  235.     case CSeq_feat::eExp_ev_experimental:      s = "experimental";      break;
  236.     case CSeq_feat::eExp_ev_not_experimental:  s = "not_experimental";  break;
  237.     default:                                   break;
  238.     }
  239.     if (s) {
  240.         x_AddFQ(q, name, s, CFormatQual::eUnquoted);
  241.     }
  242. }
  243. void CFlatIllegalQVal::Format(TFlatQuals& q, const string&, CBioseqContext &ctx,
  244.                             IFlatQVal::TFlags) const
  245. {
  246.     // XXX - return if too strict
  247.     x_AddFQ(q, m_Value->GetQual(), m_Value->GetVal());
  248. }
  249. void CFlatMolTypeQVal::Format(TFlatQuals& q, const string& name,
  250.                             CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  251. {
  252.     const char* s = 0;
  253.     switch ( m_Biomol ) {
  254.     case CMolInfo::eBiomol_unknown:
  255.         switch ( m_Mol ) {
  256.         case CSeq_inst::eMol_dna:  s = "unassigned DNA"; break;
  257.         case CSeq_inst::eMol_rna:  s = "unassigned RNA"; break;
  258.         default:                   break;
  259.         }
  260.         break;
  261.     case CMolInfo::eBiomol_genomic:
  262.         switch ( m_Mol ) {
  263.         case CSeq_inst::eMol_dna:  s = "genomic DNA";  break;
  264.         case CSeq_inst::eMol_rna:  s = "genomic RNA";  break;
  265.         default:                   break;
  266.         }
  267.         break;
  268.     case CMolInfo::eBiomol_pre_RNA:  s = "pre-mRNA";  break;
  269.     case CMolInfo::eBiomol_mRNA:     s = "mRNA";      break;
  270.     case CMolInfo::eBiomol_rRNA:     s = "rRNA";      break;
  271.     case CMolInfo::eBiomol_tRNA:     s = "tRNA";      break;
  272.     case CMolInfo::eBiomol_snRNA:    s = "snRNA";     break;
  273.     case CMolInfo::eBiomol_scRNA:    s = "scRNA";     break;
  274.     case CMolInfo::eBiomol_other_genetic:
  275.     case CMolInfo::eBiomol_other:
  276.         switch ( m_Mol ) {
  277.         case CSeq_inst::eMol_dna:  s = "other DNA";  break;
  278.         case CSeq_inst::eMol_rna:  s = "other RNA";  break;
  279.         default:                   break;
  280.         }
  281.         break;
  282.     case CMolInfo::eBiomol_cRNA:
  283.     case CMolInfo::eBiomol_transcribed_RNA:  s = "other RNA";  break;
  284.     case CMolInfo::eBiomol_snoRNA:           s = "snoRNA";     break;
  285.     }
  286.     if ( s == 0 ) {
  287.         switch ( m_Mol ) {
  288.         case CSeq_inst::eMol_rna:
  289.             s = "unassigned RNA";
  290.             break;
  291.         case CSeq_inst::eMol_aa:
  292.             s = 0;
  293.             break;
  294.         case CSeq_inst::eMol_dna:
  295.         default:
  296.             s = "unassigned DNA";
  297.             break;
  298.         }
  299.     }
  300.     if ( s != 0 ) {
  301.         x_AddFQ(q, name, s);
  302.     }
  303. }
  304. void CFlatOrgModQVal::Format(TFlatQuals& q, const string& name,
  305.                            CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  306. {
  307.     string subname = m_Value->GetSubname();
  308.     if ( s_StringIsJustQuotes(subname) ) {
  309.         subname = kEmptyStr;
  310.     }
  311.     if ( subname.empty() ) {
  312.         return;
  313.     }
  314.     if ( s_IsNote(flags) ) {
  315.         m_Suffix = (m_Value->GetSubtype() == COrgMod::eSubtype_other ? &kEOL : &kSemicolon);
  316.         if ( name != "orgmod_note" ) {
  317.             x_AddFQ(q, "note", name + ": " + subname);
  318.         } else {
  319.             x_AddFQ(q, "note", subname);
  320.         }
  321.     } else {
  322.         x_AddFQ(q, name, subname);
  323.     }
  324. }
  325. void CFlatOrganelleQVal::Format(TFlatQuals& q, const string& name,
  326.                               CBioseqContext&, IFlatQVal::TFlags) const
  327. {
  328.     const string& organelle
  329.         = CBioSource::GetTypeInfo_enum_EGenome()->FindName(m_Value, true);
  330.     switch (m_Value) {
  331.     case CBioSource::eGenome_chloroplast: case CBioSource::eGenome_chromoplast:
  332.     case CBioSource::eGenome_cyanelle:    case CBioSource::eGenome_apicoplast:
  333.     case CBioSource::eGenome_leucoplast:  case CBioSource::eGenome_proplastid:
  334.         x_AddFQ(q, name, "plastid:" + organelle);
  335.         break;
  336.     case CBioSource::eGenome_kinetoplast:
  337.         x_AddFQ(q, name, "mitochondrion:kinetoplast");
  338.         break;
  339.     case CBioSource::eGenome_mitochondrion: case CBioSource::eGenome_plastid:
  340.     case CBioSource::eGenome_nucleomorph:
  341.         x_AddFQ(q, name, organelle);
  342.         break;
  343.     case CBioSource::eGenome_macronuclear: case CBioSource::eGenome_proviral:
  344.     case CBioSource::eGenome_virion:
  345.         x_AddFQ(q, organelle, kEmptyStr, CFormatQual::eEmpty);
  346.         break;
  347.     case CBioSource::eGenome_plasmid: case CBioSource::eGenome_transposon:
  348.         x_AddFQ(q, organelle, kEmptyStr);
  349.         break;
  350.     case CBioSource::eGenome_insertion_seq:
  351.         x_AddFQ(q, "insertion_seq", kEmptyStr);
  352.         break;
  353.     default:
  354.         break;
  355.     }
  356.     
  357. }
  358. void CFlatPubSetQVal::Format(TFlatQuals& q, const string& name,
  359.                            CBioseqContext& ctx, IFlatQVal::TFlags) const
  360. {
  361.     ITERATE (vector< CRef<CReferenceItem> >, it, ctx.GetReferences()) {
  362.         if ((*it)->Matches(*m_Value)) {
  363.             x_AddFQ(q, name, '[' + NStr::IntToString((*it)->GetSerial()) + ']',
  364.                     CFormatQual::eUnquoted);
  365.         }
  366.     }
  367. }
  368. void CFlatSeqIdQVal::Format(TFlatQuals& q, const string& name,
  369.                           CBioseqContext& ctx, IFlatQVal::TFlags) const
  370. {
  371.     // XXX - add link in HTML mode
  372.     string id_str;
  373.     if ( m_Value->IsGi() ) {
  374.         if ( m_GiPrefix ) {
  375.             id_str = "GI:";
  376.         }
  377.         m_Value->GetLabel(&id_str, CSeq_id::eContent);
  378.     } else {
  379.         id_str = m_Value->GetSeqIdString(true);
  380.     }
  381.     x_AddFQ(q, name, id_str);
  382. }
  383. void CFlatSubSourceQVal::Format(TFlatQuals& q, const string& name,
  384.                               CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  385. {
  386.     string subname = m_Value->CanGetName() ? m_Value->GetName() : kEmptyStr;
  387.     if ( s_StringIsJustQuotes(subname) ) {
  388.         subname = kEmptyStr;
  389.     }
  390.     if ( s_IsNote(flags) ) {
  391.         bool note = false;
  392.         if ( m_Value->GetSubtype() == CSubSource::eSubtype_other ) {
  393.             m_Suffix = &kEOL;
  394.             note = true;
  395.         } else {
  396.             m_Suffix = &kSemicolon;
  397.         }
  398.         x_AddFQ(q, "note", note ? subname : name + ": " + subname);
  399.     } else {
  400.         CSubSource::TSubtype subtype = m_Value->GetSubtype();
  401.         if ( subtype == CSubSource::eSubtype_germline            ||
  402.              subtype == CSubSource::eSubtype_rearranged          ||
  403.              subtype == CSubSource::eSubtype_transgenic          ||
  404.              subtype == CSubSource::eSubtype_environmental_sample ) {
  405.             x_AddFQ(q, name, kEmptyStr, CFormatQual::eEmpty);
  406.         } else {
  407.             x_AddFQ(q, name, subname);
  408.         }
  409.     }
  410. }
  411. void CFlatXrefQVal::Format(TFlatQuals& q, const string& name,
  412.                          CBioseqContext& ctx, IFlatQVal::TFlags flags) const
  413. {
  414.     // XXX - add link in HTML mode?
  415.     ITERATE (TXref, it, m_Value) {
  416.         if ( !m_Quals.Empty()  &&  x_XrefInGeneXref(**it) ) {
  417.             continue;
  418.         }
  419.         string s((*it)->GetDb());
  420.         const CObject_id& id = (*it)->GetTag();
  421.         switch ( id.Which() ) {
  422.         case CObject_id::e_Id:
  423.             s += ':' + NStr::IntToString(id.GetId());
  424.             break;
  425.         case CObject_id::e_Str:
  426.             s += ':' + id.GetStr();
  427.             break;
  428.         default:
  429.             break;
  430.         }
  431.         x_AddFQ(q, name, s);
  432.     }
  433. }
  434. bool CFlatXrefQVal::x_XrefInGeneXref(const CDbtag& dbtag) const
  435. {
  436.     if ( !m_Quals->HasQual(eFQ_gene_xref) ) {
  437.         return false;
  438.     }
  439.     typedef TQuals::const_iterator TQCI;
  440.     pair<TQCI, TQCI> gxrefs = m_Quals->GetQuals(eFQ_gene_xref);
  441.     for ( TQCI it = gxrefs.first; it != gxrefs.second; ++it ) {
  442.         const CFlatXrefQVal* xrefqv =
  443.             dynamic_cast<const CFlatXrefQVal*>(it->second.GetPointerOrNull());
  444.         if ( xrefqv != 0 ) {
  445.             ITERATE (TXref, dbt, xrefqv->m_Value) {
  446.                 if ( dbtag.Match(**dbt) ) {
  447.                     return true;
  448.                 }
  449.             }
  450.         }
  451.     }
  452.     return false;
  453. }
  454. void CFlatModelEvQVal::Format
  455. (TFlatQuals& q,
  456.  const string& name,
  457.  CBioseqContext& ctx,
  458.  IFlatQVal::TFlags flags) const
  459. {
  460.     const string* method = 0;
  461.     if ( m_Value->HasField("Method") ) {
  462.         const CUser_field& uf = m_Value->GetField("Method");
  463.         if ( uf.GetData().IsStr() ) {
  464.             method = &uf.GetData().GetStr();
  465.         }
  466.     }
  467.     size_t nm = 0;
  468.     if ( m_Value->HasField("mRNA") ) {
  469.         const CUser_field& field = m_Value->GetField("mRNA");
  470.         if ( field.GetData().IsFields() ) {
  471.             ITERATE (CUser_field::C_Data::TFields, it1, field.GetData().GetFields()) {
  472.                 const CUser_field& uf = **it1;
  473.                 if ( !uf.CanGetData()  ||  !uf.GetData().IsFields() ) {
  474.                     continue;
  475.                 }
  476.                 ITERATE (CUser_field::C_Data::TFields, it2, uf.GetData().GetFields()) {
  477.                     if ( !(*it2)->CanGetLabel() ) {
  478.                         continue;
  479.                     }
  480.                     const CObject_id& oid = (*it2)->GetLabel();
  481.                     if ( oid.IsStr() ) {
  482.                         if ( oid.GetStr() == "accession" ) {
  483.                             ++nm;
  484.                         }
  485.                     }
  486.                 }
  487.             }
  488.         }
  489.     }
  490.     CNcbiOstrstream text;
  491.     text << "Derived by automated computational analysis";
  492.     if ( method != 0  &&  !method->empty() ) {
  493.          text << " using gene prediction method: " << *method;
  494.     }
  495.     text << ".";
  496.     if ( nm > 0 ) {
  497.         text << " Supporting evidence includes similarity to: " << nm << " mRNA";
  498.         if ( nm > 1 ) {
  499.             text << "s";
  500.         }
  501.     }
  502.     x_AddFQ(q, name, CNcbiOstrstreamToString(text));
  503. }
  504. void CFlatGoQVal::Format
  505. (TFlatQuals& q,
  506.  const string& name,
  507.  CBioseqContext& ctx,
  508.  IFlatQVal::TFlags flags) const
  509. {
  510.     _ASSERT(m_Value->GetData().IsFields());
  511.     bool is_ftable = ctx.Config().IsFormatFTable();
  512.     if ( s_IsNote(flags) ) {
  513.         static const string sfx = ";";
  514.         m_Prefix = &kEOL;
  515.         m_Suffix = &sfx;
  516.         x_AddFQ(q, "note", name + ": " + s_GetGOText(*m_Value, is_ftable));
  517.     } else {
  518.         x_AddFQ(q, name, s_GetGOText(*m_Value, is_ftable));
  519.     }
  520. }
  521. void CFlatAnticodonQVal::Format
  522. (TFlatQuals& q,
  523.  const string& name,
  524.  CBioseqContext& ctx,
  525.  IFlatQVal::TFlags flags) const
  526. {
  527.     if ( !m_Anticodon->IsInt()  ||  !m_Aa.empty() ) {
  528.         return;
  529.     }
  530.     CSeq_loc::TRange range = m_Anticodon->GetTotalRange();
  531.     CNcbiOstrstream text;
  532.     text << "(pos:" << range.GetFrom() + 1 << ".." << range.GetTo() + 1
  533.          << ",aa:" << m_Aa << ")";
  534.     x_AddFQ(q, name, CNcbiOstrstreamToString(text), CFormatQual::eUnquoted);
  535. }
  536. void CFlatTrnaCodonsQVal::Format
  537. (TFlatQuals& q,
  538.  const string& name,
  539.  CBioseqContext& ctx,
  540.  IFlatQVal::TFlags flags) const
  541. {
  542.     // !!!
  543. }
  544. void CFlatProductQVal::Format
  545. (TFlatQuals& q,
  546.  const string& n,
  547.  CBioseqContext& ctx,
  548.  TFlags) const
  549. {
  550.     // !!!
  551.     /*
  552.     if ( ctx.DropIllegalQuals() ) {
  553.         if ( !s_LegalQualForFeature(eFQ_product, m_Subtype)
  554.     */
  555. }
  556. END_SCOPE(objects)
  557. END_NCBI_SCOPE
  558. /*
  559. * ===========================================================================
  560. *
  561. * $Log: qualifiers.cpp,v $
  562. * Revision 1000.1  2004/06/01 19:45:20  gouriano
  563. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  564. *
  565. * Revision 1.15  2004/05/21 21:42:54  gorelenk
  566. * Added PCH ncbi_pch.hpp
  567. *
  568. * Revision 1.14  2004/05/06 17:58:52  shomrat
  569. * CFlatQual -> CFormatQual
  570. *
  571. * Revision 1.13  2004/04/27 15:13:16  shomrat
  572. * fixed SubSource formatting
  573. *
  574. * Revision 1.12  2004/04/22 15:57:06  shomrat
  575. * Changes in context
  576. *
  577. * Revision 1.11  2004/04/07 14:28:44  shomrat
  578. * Fixed GO quals formatting for FTable format
  579. *
  580. * Revision 1.10  2004/03/30 20:32:53  shomrat
  581. * Fixed go and modelev qual formatting
  582. *
  583. * Revision 1.9  2004/03/25 20:46:19  shomrat
  584. * implement CFlatPubSetQVal formatting
  585. *
  586. * Revision 1.8  2004/03/18 15:43:27  shomrat
  587. * Fixes to quals formatting
  588. *
  589. * Revision 1.7  2004/03/08 21:01:44  shomrat
  590. * GI prefix flag for Seq-id quals
  591. *
  592. * Revision 1.6  2004/03/08 15:24:27  dicuccio
  593. * FIxed dereference of string pointer
  594. *
  595. * Revision 1.5  2004/03/05 18:47:32  shomrat
  596. * Added qualifier classes
  597. *
  598. * Revision 1.4  2004/02/11 16:55:38  shomrat
  599. * changes in formatting of OrgMod and SubSource quals
  600. *
  601. * Revision 1.3  2004/01/14 16:18:07  shomrat
  602. * uncomment code
  603. *
  604. * Revision 1.2  2003/12/18 17:43:35  shomrat
  605. * context.hpp moved
  606. *
  607. * Revision 1.1  2003/12/17 20:24:04  shomrat
  608. * Initial Revision (adapted from flat lib)
  609. *
  610. * Revision 1.4  2003/06/02 16:06:42  dicuccio
  611. * Rearranged src/objects/ subtree.  This includes the following shifts:
  612. *     - src/objects/asn2asn --> arc/app/asn2asn
  613. *     - src/objects/testmedline --> src/objects/ncbimime/test
  614. *     - src/objects/objmgr --> src/objmgr
  615. *     - src/objects/util --> src/objmgr/util
  616. *     - src/objects/alnmgr --> src/objtools/alnmgr
  617. *     - src/objects/flat --> src/objtools/flat
  618. *     - src/objects/validator --> src/objtools/validator
  619. *     - src/objects/cddalignview --> src/objtools/cddalignview
  620. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  621. * replaces the three libmmdb? libs.
  622. *
  623. * Revision 1.3  2003/03/21 18:49:17  ucko
  624. * Turn most structs into (accessor-requiring) classes; replace some
  625. * formerly copied fields with pointers to the original data.
  626. *
  627. * Revision 1.2  2003/03/11 15:37:51  kuznets
  628. * iterate -> ITERATE
  629. *
  630. * Revision 1.1  2003/03/10 16:39:09  ucko
  631. * Initial check-in of new flat-file generator
  632. *
  633. *
  634. * ===========================================================================
  635. */