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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_feature.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:58:49  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_FLAT___FLAT_FEATURE__HPP
  10. #define OBJECTS_FLAT___FLAT_FEATURE__HPP
  11. /*  $Id: flat_feature.hpp,v 1000.0 2003/10/29 20:58:49 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, NCBI
  37. *
  38. * File Description:
  39. *   new (early 2003) flat-file generator -- representation of features
  40. *   (mainly of interest to implementors)
  41. *
  42. */
  43. #include <objtools/flat/flat_formatter.hpp>
  44. #include <objtools/flat/flat_qual_slots.hpp>
  45. #include <objects/seqfeat/SeqFeatData.hpp>
  46. #include <objects/seqfeat/Seq_feat.hpp>
  47. #include <objmgr/feat_ci.hpp>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(objects)
  50. // low-level formatted qualifier
  51. class CFlatQual : public CObject
  52. {
  53. public:
  54.     enum EStyle {
  55.         eEmpty,   // /name [value ignored]
  56.         eQuoted,  // /name="value"
  57.         eUnquoted // /name=value
  58.     };
  59.     CFlatQual(const string& name, const string& value, EStyle style = eQuoted)
  60.         : m_Name(name), m_Value(value), m_Style(style)
  61.         { }
  62.     const string& GetName (void) const { return m_Name;  }
  63.     const string& GetValue(void) const { return m_Value; }
  64.     EStyle        GetStyle(void) const { return m_Style; }
  65. private:
  66.     string m_Name, m_Value;
  67.     EStyle m_Style;
  68. };
  69. typedef vector<CRef<CFlatQual> > TFlatQuals;
  70. // abstract qualifier value -- see flat_quals.hpp for derived classes
  71. class IFlatQV : public CObject
  72. {
  73. public:
  74.     enum EFlags {
  75.         fIsNote   = 0x1,
  76.         fIsSource = 0x2
  77.     };
  78.     typedef int TFlags; // binary OR of EFlags
  79.     virtual void Format(TFlatQuals& quals, const string& name,
  80.                         CFlatContext& ctx, TFlags flags = 0) const = 0;
  81. protected:
  82.     static void x_AddFQ(TFlatQuals& q, const string& n, const string& v,
  83.                         CFlatQual::EStyle st = CFlatQual::eQuoted)
  84.         { q.push_back(CRef<CFlatQual>(new CFlatQual(n, v, st))); }
  85. };
  86. class CFlatFeature : public CObject
  87. {
  88. public:
  89.     CFlatFeature(const string& key, const CFlatLoc& loc, const CSeq_feat& feat)
  90.         : m_Key(key), m_Loc(&loc), m_Feat(&feat) { }
  91.     typedef vector<CRef<CFlatQual> > TQuals;
  92.     const string&    GetKey  (void) const { return m_Key;   }
  93.     const CFlatLoc&  GetLoc  (void) const { return *m_Loc;  }
  94.     const TQuals&    GetQuals(void) const { return m_Quals; }
  95.     const CSeq_feat& GetFeat (void) const { return *m_Feat; }
  96.     TQuals& SetQuals(void) { return m_Quals; }
  97. private:
  98.     string               m_Key;
  99.     CConstRef<CFlatLoc>  m_Loc;
  100.     TQuals               m_Quals;
  101.     CConstRef<CSeq_feat> m_Feat;
  102. };
  103. class IFlattishFeature : public IFlatItem
  104. {
  105. public:
  106.     CRef<CFlatFeature> Format(void) const;
  107.     void Format(IFlatFormatter& f) const { f.FormatFeature(*this); }
  108.     bool operator<(const IFlattishFeature& f2) const 
  109.         { return m_Feat->Compare(*f2.m_Feat, *m_Loc, *f2.m_Loc) < 0; }
  110.     string GetKey(void) const
  111.         { return m_Feat->GetData().GetKey(CSeqFeatData::eVocabulary_genbank); }
  112.     const CSeq_loc&  GetLoc(void)  const { return *m_Loc; }
  113.     const CSeq_feat& GetFeat(void) const { return *m_Feat; }
  114. protected:
  115.     IFlattishFeature(const CSeq_feat& feat, CFlatContext& ctx,
  116.                      const CSeq_loc* loc = 0)
  117.         : m_Feat(&feat), m_Context(&ctx),
  118.           m_Loc(loc ? loc : &feat.GetLocation())
  119.         { }
  120.     virtual void x_AddQuals   (void) const = 0;
  121.     virtual void x_FormatQuals(void) const = 0;
  122.     CConstRef<CSeq_feat>        m_Feat;
  123.     mutable CRef<CFlatContext>  m_Context;
  124.     mutable CConstRef<CSeq_loc> m_Loc;
  125.     mutable CRef<CFlatFeature>  m_FF; ///< populated on demand then cached here
  126. };
  127. class CFlattishFeature : public IFlattishFeature
  128. {
  129. public:
  130.     CFlattishFeature(const CSeq_feat& feat, CFlatContext& ctx,
  131.                      const CSeq_loc* loc = 0, bool is_product = false)
  132.         : IFlattishFeature(feat, ctx, loc), m_IsProduct(is_product)
  133.         { }
  134.     CFlattishFeature(const CMappedFeat& feat, CFlatContext& ctx,
  135.                      const CSeq_loc* loc = 0, bool is_product = false)
  136.         : IFlattishFeature(feat.GetOriginalFeature(), ctx,
  137.                            loc ? loc : &feat.GetLocation()),
  138.           m_IsProduct(is_product)
  139.         { }
  140. private:
  141.     void x_AddQuals(void) const;
  142.     void x_AddQuals(const CGene_ref& gene) const;
  143.     void x_AddQuals(const CCdregion& cds)  const;
  144.     void x_AddQuals(const CProt_ref& prot) const;
  145.     // ...
  146.     // XXX - massage slot as necessary and perhaps sanity-check value's type
  147.     void x_AddQual(EFeatureQualifier slot, const IFlatQV* value) const
  148.         { m_Quals.insert(TQuals::value_type(slot,CConstRef<IFlatQV>(value))); }
  149.     void x_ImportQuals(const CSeq_feat::TQual& quals) const;
  150.     void x_FormatQuals   (void) const;
  151.     void x_FormatQual    (EFeatureQualifier slot, const string& name,
  152.                           IFlatQV::TFlags flags = 0) const;
  153.     void x_FormatNoteQual(EFeatureQualifier slot, const string& name,
  154.                           IFlatQV::TFlags flags = 0) const
  155.         { x_FormatQual(slot, name, flags | IFlatQV::fIsNote); }
  156.     typedef multimap<EFeatureQualifier, CConstRef<IFlatQV> > TQuals;
  157.     mutable CSeqFeatData::ESubtype m_Type;
  158.     mutable TQuals                 m_Quals;
  159.     bool                           m_IsProduct;
  160. };
  161. class CFlattishSourceFeature : public IFlattishFeature
  162. {
  163. public:
  164.     CFlattishSourceFeature(const CSeq_feat& feat, CFlatContext& ctx,
  165.                            const CSeq_loc* loc = 0)
  166.         : IFlattishFeature(feat, ctx, loc), m_WasDesc(false)
  167.         { }
  168.     CFlattishSourceFeature(const CMappedFeat& feat, CFlatContext& ctx,
  169.                            const CSeq_loc* loc = 0)
  170.         : IFlattishFeature(feat.GetOriginalFeature(), ctx,
  171.                            loc ? loc : &feat.GetLocation()),
  172.           m_WasDesc(false)
  173.         { }
  174.     CFlattishSourceFeature(const CBioSource& src, CFlatContext& ctx);
  175.     CFlattishSourceFeature(const COrg_ref& org,   CFlatContext& ctx);
  176. private:
  177.     void x_AddQuals(void)                  const;
  178.     void x_AddQuals(const CBioSource& src) const;
  179.     void x_AddQuals(const COrg_ref&   org) const;
  180.     // XXX - massage slot as necessary and perhaps sanity-check value's type
  181.     void x_AddQual (ESourceQualifier slot, const IFlatQV* value) const
  182.         { m_Quals.insert(TQuals::value_type(slot,CConstRef<IFlatQV>(value))); }
  183.     void x_FormatQuals   (void) const;
  184.     void x_FormatQual    (ESourceQualifier slot, const string& name,
  185.                           IFlatQV::TFlags flags = 0) const;
  186.     void x_FormatNoteQual(ESourceQualifier slot, const string& name,
  187.                           IFlatQV::TFlags flags = 0) const
  188.         { x_FormatQual(slot, name, flags | IFlatQV::fIsNote); }
  189.     typedef multimap<ESourceQualifier, CConstRef<IFlatQV> > TQuals;
  190.     bool           m_WasDesc;
  191.     mutable TQuals m_Quals;
  192. };
  193. ///////////////////////////////////////////////////////////////////////////
  194. //
  195. // INLINE METHODS
  196. inline
  197. CFlattishSourceFeature::CFlattishSourceFeature(const CBioSource& src,
  198.                                                CFlatContext& ctx)
  199.     : IFlattishFeature(*new CSeq_feat, ctx, &ctx.GetLocation()),
  200.       m_WasDesc(true)
  201. {
  202.     CSeq_feat& feat = const_cast<CSeq_feat&>(*m_Feat);
  203.     feat.SetData().SetBiosrc(const_cast<CBioSource&>(src));
  204.     feat.SetLocation().Assign(*m_Loc);
  205. }
  206. inline
  207. CFlattishSourceFeature::CFlattishSourceFeature(const COrg_ref& org,
  208.                                                CFlatContext& ctx)
  209.     : IFlattishFeature(*new CSeq_feat, ctx, &ctx.GetLocation()),
  210.       m_WasDesc(true)
  211. {
  212.     CSeq_feat& feat = const_cast<CSeq_feat&>(*m_Feat);
  213.     feat.SetData().SetOrg(const_cast<COrg_ref&>(org));
  214.     feat.SetLocation().Assign(*m_Loc);
  215. }
  216. inline
  217. void CFlattishFeature::x_FormatQual(EFeatureQualifier slot, const string& name,
  218.                                     IFlatQV::TFlags flags) const
  219. {
  220.     typedef TQuals::const_iterator TQCI;
  221.     pair<TQCI, TQCI> range
  222.         = const_cast<const TQuals&>(m_Quals).equal_range(slot);
  223.     for (TQCI it = range.first;  it != range.second;  ++it) {
  224.         it->second->Format(m_FF->SetQuals(), name, *m_Context, flags);
  225.     }
  226. }
  227. inline
  228. void CFlattishSourceFeature::x_FormatQual(ESourceQualifier slot,
  229.                                           const string& name,
  230.                                           IFlatQV::TFlags flags) const
  231. {
  232.     typedef TQuals::const_iterator TQCI;
  233.     pair<TQCI, TQCI> range
  234.         = const_cast<const TQuals&>(m_Quals).equal_range(slot);
  235.     for (TQCI it = range.first;  it != range.second;  ++it) {
  236.         it->second->Format(m_FF->SetQuals(), name, *m_Context,
  237.                            flags | IFlatQV::fIsSource);
  238.     }
  239. }
  240. END_SCOPE(objects)
  241. END_NCBI_SCOPE
  242. /*
  243. * ===========================================================================
  244. *
  245. * $Log: flat_feature.hpp,v $
  246. * Revision 1000.0  2003/10/29 20:58:49  gouriano
  247. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  248. *
  249. * Revision 1.6  2003/10/17 20:57:53  ucko
  250. * IFlattishFeature: also expose the underlying Seq-feat to permit
  251. * additional filtering prior to actual formatting.
  252. *
  253. * Revision 1.5  2003/10/08 21:10:47  ucko
  254. * Add a couple of accessors to IFlattishFeature for the GFF/GTF formatter.
  255. *
  256. * Revision 1.4  2003/06/02 16:01:39  dicuccio
  257. * Rearranged include/objects/ subtree.  This includes the following shifts:
  258. *     - include/objects/alnmgr --> include/objtools/alnmgr
  259. *     - include/objects/cddalignview --> include/objtools/cddalignview
  260. *     - include/objects/flat --> include/objtools/flat
  261. *     - include/objects/objmgr/ --> include/objmgr/
  262. *     - include/objects/util/ --> include/objmgr/util/
  263. *     - include/objects/validator --> include/objtools/validator
  264. *
  265. * Revision 1.3  2003/04/10 20:08:22  ucko
  266. * Arrange to pass the item as an argument to IFlatTextOStream::AddParagraph
  267. *
  268. * Revision 1.2  2003/03/21 18:47:47  ucko
  269. * Turn most structs into (accessor-requiring) classes; replace some
  270. * formerly copied fields with pointers to the original data.
  271. *
  272. * Revision 1.1  2003/03/10 16:39:08  ucko
  273. * Initial check-in of new flat-file generator
  274. *
  275. *
  276. * ===========================================================================
  277. */
  278. #endif  /* OBJECTS_FLAT___FLAT_FEATURE__HPP */