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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: qualifiers.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:39:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_FORMAT_ITEMS___QUALIFIERS__HPP
  10. #define OBJTOOLS_FORMAT_ITEMS___QUALIFIERS__HPP
  11. /*  $Id: qualifiers.hpp,v 1000.1 2004/06/01 19:39:59 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author:  Aaron Ucko, Mati Shomrat
  37. *
  38. * File Description:
  39. *   new (early 2003) flat-file generator -- qualifier types
  40. *   (mainly of interest to implementors)
  41. *
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbiobj.hpp>
  45. #include <objects/general/Dbtag.hpp>
  46. #include <objects/general/User_object.hpp>
  47. #include <objects/general/User_field.hpp>
  48. #include <objects/pub/Pub_set.hpp>
  49. #include <objects/seqfeat/Seq_feat.hpp>
  50. #include <objects/seqfeat/Cdregion.hpp>
  51. #include <objects/seqfeat/BioSource.hpp>
  52. #include <objects/seqfeat/OrgMod.hpp>
  53. #include <objects/seqfeat/SubSource.hpp>
  54. #include <objects/seqfeat/Gb_qual.hpp>
  55. #include <objects/seqfeat/Code_break.hpp>
  56. #include <objects/seqfeat/Trna_ext.hpp>
  57. #include <objects/seq/Seq_inst.hpp>
  58. #include <objects/seq/MolInfo.hpp>
  59. #include <objtools/format/items/flat_seqloc.hpp>
  60. #include <objtools/format/items/flat_qual_slots.hpp>
  61. BEGIN_NCBI_SCOPE
  62. BEGIN_SCOPE(objects)
  63. class CBioseqContext;
  64. /////////////////////////////////////////////////////////////////////////////
  65. // low-level formatted qualifier
  66. class CFormatQual : public CObject
  67. {
  68. public:
  69.     enum EStyle {
  70.         eEmpty,   // /name [value ignored]
  71.         eQuoted,  // /name="value"
  72.         eUnquoted // /name=value
  73.     };
  74.     typedef EStyle  TStyle;
  75.     CFormatQual(const string& name,
  76.               const string& value, 
  77.               const string& prefix,
  78.               const string& suffix,
  79.               TStyle style = eQuoted);
  80.     CFormatQual(const string& name,
  81.               const string& value,
  82.               TStyle style = eQuoted);
  83.     const string& GetName  (void) const { return m_Name;   }
  84.     const string& GetValue (void) const { return m_Value;  }
  85.     TStyle        GetStyle (void) const { return m_Style;  }
  86.     const string& GetPrefix(void) const { return m_Prefix; }
  87.     const string& GetSuffix(void) const { return m_Suffix; }
  88. private:
  89.     string m_Name, m_Value, m_Prefix, m_Suffix;
  90.     TStyle m_Style;
  91. };
  92. typedef CRef<CFormatQual>      TFlatQual;
  93. typedef vector<TFlatQual>    TFlatQuals;
  94. /////////////////////////////////////////////////////////////////////////////
  95. // abstract qualifier value
  96. class IFlatQVal : public CObject
  97. {
  98. public:
  99.     enum EFlags {
  100.         fIsNote   = 0x1,
  101.         fIsSource = 0x2
  102.     };
  103.     typedef int TFlags; // binary OR of EFlags
  104.     static const string kSemicolon;  // "; "
  105.     static const string kComma;      // ", "
  106.     static const string kEOL;        // "n" - end of line
  107.     virtual void Format(TFlatQuals& quals, const string& name,
  108.         CBioseqContext& ctx, TFlags flags = 0) const = 0;
  109. protected:
  110.     typedef CFormatQual::TStyle   TStyle;
  111.     IFlatQVal(const string* pfx = &kEmptyStr, const string* sfx = &kEmptyStr)
  112.         : m_Prefix(pfx), m_Suffix(sfx)
  113.     { }
  114.     /*
  115.     static void x_AddFQ(TFlatQuals& q, const string& n, const string& v,
  116.         const srting& sfx, const string& pfx
  117.         TStyle st = CFormatQual::eQuoted) {
  118.         q.push_back(TFlatQual(new CFormatQual(n, v, pfx, sfx, st))); 
  119.     }
  120.     */  
  121.     void x_AddFQ(TFlatQuals& q, const string& n, const string& v,
  122.         TStyle st = CFormatQual::eQuoted) const {
  123.         q.push_back(TFlatQual(new CFormatQual(n, v, *m_Prefix, *m_Suffix, st))); 
  124.     }
  125.     mutable const string* m_Prefix;
  126.     mutable const string* m_Suffix;
  127. };
  128. /////////////////////////////////////////////////////////////////////////////
  129. // qualifiers container
  130. template<typename Key>
  131. class CQualContainer : public CObject
  132. {
  133. public:
  134.     // typedef
  135.     typedef multimap<Key, CConstRef<IFlatQVal> > TQualMMap;
  136.     typedef typename TQualMMap::const_iterator   const_iterator;
  137.     typedef typename TQualMMap::iterator         iterator;
  138.     typedef typename TQualMMap::size_type        size_type;
  139.     // constructor
  140.     CQualContainer(void) {}
  141.     
  142.     iterator begin(void) { return m_Quals.begin(); }
  143.     const_iterator begin(void) const { return m_Quals.begin(); }
  144.     iterator end(void) { return m_Quals.end(); }
  145.     const_iterator end(void) const { return m_Quals.end(); }
  146.     
  147.     void AddQual(const Key& key, const IFlatQVal* value) {
  148.         typedef typename TQualMMap::value_type TMapPair;
  149.         m_Quals.insert(TMapPair(key, CConstRef<IFlatQVal>(value)));
  150.     }
  151.     
  152.     bool HasQual(const Key& key) const {
  153.         return Find(key) != m_Quals.end();
  154.     }
  155.     pair<iterator, iterator> GetQuals(const Key& key) {
  156.         return m_Quals.equal_range(key);
  157.     }
  158.     pair<const_iterator, const_iterator> GetQuals(const Key& key) const {
  159.         return m_Quals.equal_range(key);
  160.     }
  161.     iterator Erase(iterator it) {
  162.         iterator next = it;
  163.         if ( next != end() ) {
  164.             ++next;
  165.             m_Quals.erase(it);
  166.         }
  167.         return next;
  168.     }
  169.     void RemoveQuals(const Key& key) {
  170.         m_Quals.erase(key);
  171.     }
  172.     iterator Find(const Key& key) {
  173.         return m_Quals.find(key);
  174.     }
  175.     const_iterator Find(const Key& key) const {
  176.         return m_Quals.find(key);
  177.     }
  178.     size_type Size() const {
  179.         return m_Quals.size();
  180.     }
  181. private:
  182.     TQualMMap m_Quals;
  183. };
  184. /////////////////////////////////////////////////////////////////////////////
  185. // concrete qualifiers
  186. class CFlatBoolQVal : public IFlatQVal
  187. {
  188. public:
  189.     CFlatBoolQVal(bool value) : m_Value(value) { }
  190.     void Format(TFlatQuals& q, const string& n, CBioseqContext&, TFlags) const
  191.         { if (m_Value) { x_AddFQ(q, n, kEmptyStr, CFormatQual::eEmpty); } }
  192. private:
  193.     bool m_Value;
  194. };
  195. class CFlatIntQVal : public IFlatQVal
  196. {
  197. public:
  198.     CFlatIntQVal(int value) : m_Value(value) { }
  199.     void Format(TFlatQuals& q, const string& n, CBioseqContext&, TFlags) const
  200.         { x_AddFQ(q, n, NStr::IntToString(m_Value), CFormatQual::eUnquoted); }
  201. private:
  202.     int m_Value;
  203. };
  204. // potential flags:
  205. //  tilde mode?
  206. //  expand SGML entities?
  207. // (handle via subclasses?)
  208. class CFlatStringQVal : public IFlatQVal
  209. {
  210. public:
  211.     CFlatStringQVal(const string& value, TStyle style = CFormatQual::eQuoted);
  212.     CFlatStringQVal(const string& value, const string& pfx, const string& sfx,
  213.         TStyle style = CFormatQual::eQuoted);
  214.         
  215.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  216.                 TFlags flags) const;
  217.     const string& GetValue(void) const { return m_Value; }
  218. private:
  219.     string  m_Value;
  220.     TStyle  m_Style;
  221. };
  222. class CFlatStringListQVal : public IFlatQVal
  223. {
  224. public:
  225.     CFlatStringListQVal(const list<string>& value,
  226.         TStyle style = CFormatQual::eQuoted)
  227.         :   m_Value(value), m_Style(style) { }
  228.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  229.                 TFlags flags) const;
  230. private:
  231.     list<string> m_Value;
  232.     TStyle       m_Style;
  233. };
  234. class CFlatCodeBreakQVal : public IFlatQVal
  235. {
  236. public:
  237.     CFlatCodeBreakQVal(const CCdregion::TCode_break value) : m_Value(value) { }
  238.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  239.                 TFlags flags) const;
  240. private:
  241.     CCdregion::TCode_break m_Value;
  242. };
  243. class CFlatCodonQVal : public IFlatQVal
  244. {
  245. public:
  246.     CFlatCodonQVal(unsigned int codon, unsigned char aa, bool is_ascii = true);
  247.     CFlatCodonQVal(const string& value); // for imports
  248.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  249.                 TFlags flags) const;
  250. private:
  251.     string m_Codon, m_AA;
  252.     bool   m_Checked;
  253. };
  254. class CFlatExpEvQVal : public IFlatQVal
  255. {
  256. public:
  257.     CFlatExpEvQVal(CSeq_feat::TExp_ev value) : m_Value(value) { }
  258.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  259.                 TFlags flags) const;
  260. private:
  261.     CSeq_feat::TExp_ev m_Value;
  262. };
  263. class CFlatIllegalQVal : public IFlatQVal
  264. {
  265. public:
  266.     CFlatIllegalQVal(const CGb_qual& value) : m_Value(&value) { }
  267.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  268.                 TFlags flags) const;
  269. private:
  270.     CConstRef<CGb_qual> m_Value;
  271. };
  272. class CFlatLabelQVal : public CFlatStringQVal
  273. {
  274. public:
  275.     CFlatLabelQVal(const string& value)
  276.         : CFlatStringQVal(value, CFormatQual::eUnquoted) { }
  277.     // XXX - should override Format to check syntax
  278. };
  279. class CFlatMolTypeQVal : public IFlatQVal
  280. {
  281. public:
  282.     typedef CMolInfo::TBiomol TBiomol;
  283.     typedef CSeq_inst::TMol   TMol;
  284.     CFlatMolTypeQVal(TBiomol biomol, TMol mol) : m_Biomol(biomol), m_Mol(mol) { }
  285.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  286.                 TFlags flags) const;
  287. private:
  288.     TBiomol m_Biomol;
  289.     TMol    m_Mol;
  290. };
  291. class CFlatOrgModQVal : public IFlatQVal
  292. {
  293. public:
  294.     CFlatOrgModQVal(const COrgMod& value) : m_Value(&value) { }
  295.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  296.                 TFlags flags) const;
  297. private:
  298.     CConstRef<COrgMod> m_Value;
  299. };
  300. class CFlatOrganelleQVal : public IFlatQVal
  301. {
  302. public:
  303.     CFlatOrganelleQVal(CBioSource::TGenome value) : m_Value(value) { }
  304.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  305.                 TFlags flags) const;
  306. private:
  307.     CBioSource::TGenome m_Value;
  308. };
  309. class CFlatPubSetQVal : public IFlatQVal
  310. {
  311. public:
  312.     CFlatPubSetQVal(const CPub_set& value) : m_Value(&value) { }
  313.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  314.                 TFlags flags) const;
  315. private:
  316.     CConstRef<CPub_set> m_Value;
  317. };
  318. class CFlatSeqIdQVal : public IFlatQVal
  319. {
  320. public:
  321.     CFlatSeqIdQVal(const CSeq_id& value, bool add_gi_prefix = false) 
  322.         : m_Value(&value), m_GiPrefix(add_gi_prefix) { }
  323.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  324.                 TFlags flags) const;
  325. private:
  326.     CConstRef<CSeq_id> m_Value;
  327.     bool               m_GiPrefix;
  328. };
  329. class CFlatSeqLocQVal : public IFlatQVal
  330. {
  331. public:
  332.     CFlatSeqLocQVal(const CSeq_loc& value) : m_Value(&value) { }
  333.     void Format(TFlatQuals& q, const string& n, CBioseqContext& ctx,
  334.                 TFlags) const
  335.         { x_AddFQ(q, n, CFlatSeqLoc(*m_Value, ctx).GetString()); }
  336. private:
  337.     CConstRef<CSeq_loc> m_Value;
  338. };
  339. class CFlatSubSourceQVal : public IFlatQVal
  340. {
  341. public:
  342.     CFlatSubSourceQVal(const CSubSource& value) : m_Value(&value) { }
  343.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  344.                 TFlags flags) const;
  345. private:
  346.     CConstRef<CSubSource> m_Value;
  347. };
  348. class CFlatXrefQVal : public IFlatQVal
  349. {
  350. public:
  351.     typedef CSeq_feat::TDbxref                       TXref;
  352.     typedef CQualContainer<EFeatureQualifier> TQuals;
  353.     CFlatXrefQVal(const TXref& value, const TQuals* quals = 0) 
  354.         :   m_Value(value), m_Quals(quals) { }
  355.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  356.                 TFlags flags) const;
  357. private:
  358.     bool x_XrefInGeneXref(const CDbtag& dbtag) const;
  359.     TXref             m_Value;
  360.     CConstRef<TQuals> m_Quals;
  361. };
  362. class CFlatModelEvQVal : public IFlatQVal
  363. {
  364. public:
  365.     CFlatModelEvQVal(const CUser_object& value) : m_Value(&value) { }
  366.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  367.                 TFlags flags) const;
  368. private:
  369.     CConstRef<CUser_object> m_Value;
  370. };
  371. class CFlatGoQVal : public IFlatQVal
  372. {
  373. public:
  374.     CFlatGoQVal(const CUser_field& value) : m_Value(&value) { }
  375.     void Format(TFlatQuals& quals, const string& name, CBioseqContext& ctx,
  376.                 TFlags flags) const;
  377. private:
  378.     CConstRef<CUser_field> m_Value;
  379. };
  380. class CFlatAnticodonQVal : public IFlatQVal
  381. {
  382. public:
  383.     CFlatAnticodonQVal(const CSeq_loc& ac, const string& aa) :
  384.         m_Anticodon(&ac), m_Aa(aa) { }
  385.     void Format(TFlatQuals& q, const string& n, CBioseqContext& ctx,
  386.                 TFlags) const;
  387. private:
  388.     CConstRef<CSeq_loc> m_Anticodon;
  389.     string              m_Aa;
  390. };
  391. class CFlatTrnaCodonsQVal : public IFlatQVal
  392. {
  393. public:
  394.     CFlatTrnaCodonsQVal(const CTrna_ext& trna) : m_Value(&trna) { }
  395.     void Format(TFlatQuals& q, const string& n, CBioseqContext& ctx,
  396.                 TFlags) const;
  397. private:
  398.     CConstRef<CTrna_ext> m_Value;
  399. };
  400. class CFlatProductQVal : public CFlatStringQVal
  401. {
  402. public:
  403.     typedef CSeqFeatData::ESubtype  TSubtype;
  404.     CFlatProductQVal(const string& value, TSubtype subtype) :
  405.         CFlatStringQVal(value), m_Subtype(subtype)
  406.     {}
  407.     void Format(TFlatQuals& q, const string& n, CBioseqContext& ctx,
  408.                 TFlags) const;
  409. private:
  410.     TSubtype m_Subtype;
  411. };
  412. // ...
  413. END_SCOPE(objects)
  414. END_NCBI_SCOPE
  415. /*
  416. * ===========================================================================
  417. *
  418. * $Log: qualifiers.hpp,v $
  419. * Revision 1000.1  2004/06/01 19:39:59  gouriano
  420. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  421. *
  422. * Revision 1.12  2004/05/19 14:44:38  shomrat
  423. * + CQualContainer::Erase(..)
  424. *
  425. * Revision 1.11  2004/05/06 17:43:00  shomrat
  426. * CFlatQual -> CFormatQual to prevent name collisions in ncbi_seqext lib
  427. *
  428. * Revision 1.10  2004/04/26 21:11:23  ucko
  429. * Tweak previous fix so that it compiles with MSVC.
  430. *
  431. * Revision 1.9  2004/04/26 16:49:27  ucko
  432. * Add an explicit "typename" annotation required by GCC 3.4.
  433. *
  434. * Revision 1.8  2004/04/22 15:39:05  shomrat
  435. * Changes in context
  436. *
  437. * Revision 1.7  2004/03/31 15:57:49  ucko
  438. * Add missing "typename"s in CQualContainer's typedefs.
  439. *
  440. * Revision 1.6  2004/03/30 20:25:26  shomrat
  441. * + class CQualContainer
  442. *
  443. * Revision 1.5  2004/03/18 15:28:45  shomrat
  444. * Fixes to quals formatting; + new Product qual
  445. *
  446. * Revision 1.4  2004/03/08 20:59:02  shomrat
  447. * + GI prefix flag for Seq-id qualifiers
  448. *
  449. * Revision 1.3  2004/03/05 18:50:48  shomrat
  450. * Added new qualifier classes
  451. *
  452. * Revision 1.2  2004/02/11 16:37:20  shomrat
  453. * added CFlatStringListQVal class and an optional suffix to CFormatQual
  454. *
  455. * Revision 1.1  2003/12/17 19:49:19  shomrat
  456. * Initial revision (adapted from flat lib)
  457. *
  458. *
  459. * ===========================================================================
  460. */
  461. #endif  /* OBJTOOLS_FORMAT_ITEMS___QUALIFIERS__HPP */