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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: feature_item.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:39:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_FORMAT_ITEMS___FLAT_FEATURE__HPP
  10. #define OBJTOOLS_FORMAT_ITEMS___FLAT_FEATURE__HPP
  11. /*  $Id: feature_item.hpp,v 1000.1 2004/06/01 19:39:30 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. *          Mati Shomrat
  38. *
  39. * File Description:
  40. *   new (early 2003) flat-file generator -- representation of features
  41. *   (mainly of interest to implementors)
  42. *
  43. */
  44. #include <corelib/ncbistd.hpp>
  45. #include <corelib/ncbiobj.hpp>
  46. #include <objmgr/feat_ci.hpp>
  47. #include <objtools/format/items/flat_qual_slots.hpp>
  48. #include <objtools/format/items/qualifiers.hpp>
  49. #include <objtools/format/formatter.hpp>
  50. #include <objtools/format/text_ostream.hpp>
  51. #include <objtools/format/items/item_base.hpp>
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_SCOPE(objects)
  54. class CFeatHeaderItem : public CFlatItem
  55. {
  56. public:
  57.     CFeatHeaderItem(CBioseqContext& ctx);
  58.     void Format(IFormatter& formatter,
  59.         IFlatTextOStream& text_os) const {
  60.         formatter.FormatFeatHeader(*this, text_os);
  61.     }
  62.     const CSeq_id& GetId(void) const { return *m_Id; }  // for FTable format
  63. private:
  64.     void x_GatherInfo(CBioseqContext& ctx);
  65.     // data
  66.     CConstRef<CSeq_id>  m_Id;  // for FTable format
  67. };
  68. class CFlatFeature : public CObject
  69. {
  70. public:
  71.     CFlatFeature(const string& key, const CFlatSeqLoc& loc, const CSeq_feat& feat)
  72.         : m_Key(key), m_Loc(&loc), m_Feat(&feat) { }
  73.     typedef vector<CRef<CFormatQual> > TQuals;
  74.     const string&      GetKey  (void) const { return m_Key;   }
  75.     const CFlatSeqLoc& GetLoc  (void) const { return *m_Loc;  }
  76.     const TQuals&      GetQuals(void) const { return m_Quals; }
  77.     const CSeq_feat&   GetFeat (void) const { return *m_Feat; }
  78.     TQuals& SetQuals(void) { return m_Quals; }
  79. private:
  80.     string                  m_Key;
  81.     CConstRef<CFlatSeqLoc>  m_Loc;
  82.     TQuals                  m_Quals;
  83.     CConstRef<CSeq_feat>    m_Feat;
  84. };
  85. class CFeatureItemBase : public CFlatItem
  86. {
  87. public:
  88.     CConstRef<CFlatFeature> Format(void) const;
  89.     void Format(IFormatter& formatter, IFlatTextOStream& text_os) const {
  90.         formatter.FormatFeature(*this, text_os);
  91.     }
  92.     bool operator<(const CFeatureItemBase& f2) const {
  93.         return m_Feat->Compare(*f2.m_Feat, GetLoc(), f2.GetLoc()) < 0; 
  94.     }
  95.     const CSeq_feat& GetFeat(void)  const { return *m_Feat; }
  96.     const CSeq_loc&  GetLoc(void)   const { return *m_Loc; }
  97.     virtual string GetKey(void) const { 
  98.         return m_Feat->GetData().GetKey(CSeqFeatData::eVocabulary_genbank);
  99.     }
  100. protected:
  101.     // constructor
  102.     CFeatureItemBase(const CSeq_feat& feat, CBioseqContext& ctx,
  103.                      const CSeq_loc* loc = 0);
  104.     virtual void x_AddQuals(CBioseqContext& ctx) = 0;
  105.     virtual void x_FormatQuals(CFlatFeature& ff) const = 0;
  106.     CConstRef<CSeq_feat>    m_Feat;
  107.     CConstRef<CSeq_loc>     m_Loc;
  108. };
  109. class CFeatureItem : public CFeatureItemBase
  110. {
  111. public:
  112.     enum EMapped
  113.     {
  114.         eMapped_not_mapped,
  115.         eMapped_from_genomic,
  116.         eMapped_from_cdna,
  117.         eMapped_from_prot
  118.     };
  119.     // constructors
  120.     CFeatureItem(const CSeq_feat& feat, CBioseqContext& ctx,
  121.         const CSeq_loc* loc, EMapped mapped = eMapped_not_mapped);
  122.     // fetaure key (name)
  123.     string GetKey(void) const;
  124.     // mapping
  125.     bool IsMapped           (void) const { return m_Mapped != eMapped_not_mapped;   }
  126.     bool IsMappedFromGenomic(void) const { return m_Mapped == eMapped_from_genomic; }
  127.     bool IsMappedFromCDNA   (void) const { return m_Mapped == eMapped_from_cdna;    }
  128.     bool IsMappedFromProt   (void) const { return m_Mapped == eMapped_from_prot;    }
  129. private:
  130.     void x_GatherInfo(CBioseqContext& ctx);
  131.     //void x_FixLocation(CBioseqContext& ctx);
  132.     // qualifier collection
  133.     void x_AddQuals(CBioseqContext& ctx);
  134.     void x_AddQuals(const CCdregion& cds)  const;
  135.     void x_AddQuals(const CProt_ref& prot) const;
  136.     void x_AddGeneQuals(const CSeq_feat& gene, CScope& scope) const;
  137.     void x_AddCdregionQuals(const CSeq_feat& cds, CBioseqContext& ctx,
  138.         bool& pseudo, bool& had_prot_desc) const;
  139.     const CProt_ref* x_AddProteinQuals(CBioseq_Handle& prot) const;
  140.     void x_AddProductIdQuals(CBioseq_Handle& prod, EFeatureQualifier slot) const;
  141.     void x_AddRnaQuals(const CSeq_feat& feat, CBioseqContext& ctx,
  142.         bool& pseudo) const;
  143.     void x_AddProtQuals(const CSeq_feat& feat, CBioseqContext& ctx,
  144.         bool& pseudo, bool& had_prot_desc, string& precursor_comment) const;
  145.     void x_AddRegionQuals(const CSeq_feat& feat, CBioseqContext& ctx) const;
  146.     void x_AddQuals(const CGene_ref& gene) const;
  147.     void x_AddExtQuals(const CSeq_feat::TExt& ext) const;
  148.     void x_AddGoQuals(const CUser_object& uo) const;
  149.     void x_AddExceptionQuals(CBioseqContext& ctx) const;
  150.     void x_ImportQuals(const CSeq_feat::TQual& quals) const;
  151.     void x_CleanQuals(void) const;
  152.     const CFlatStringQVal* x_GetStringQual(EFeatureQualifier slot) const;
  153.     // feature table quals
  154.     typedef vector< CRef<CFormatQual> > TQualVec;
  155.     void x_AddFTableQuals(CBioseqContext& ctx) const;
  156.     bool x_AddFTableGeneQuals(const CSeqFeatData::TGene& gene) const;
  157.     void x_AddFTableRnaQuals(const CSeq_feat& feat, CBioseqContext& ctx) const;
  158.     void x_AddFTableCdregionQuals(const CSeq_feat& feat, CBioseqContext& ctx) const;
  159.     void x_AddFTableProtQuals(const CSeq_feat& prot) const;
  160.     void x_AddFTableRegionQuals(const CSeqFeatData::TRegion& region) const;
  161.     void x_AddFTableBondQuals(const CSeqFeatData::TBond& bond) const;
  162.     void x_AddFTableSiteQuals(const CSeqFeatData::TSite& site) const;
  163.     void x_AddFTablePsecStrQuals(const CSeqFeatData::TPsec_str& psec_str) const;
  164.     void x_AddFTablePsecStrQuals(const CSeqFeatData::THet& het) const;
  165.     void x_AddFTableBiosrcQuals(const CBioSource& src) const;
  166.     void x_AddFTableDbxref(const CSeq_feat::TDbxref& dbxref) const;
  167.     void x_AddFTableExtQuals(const CSeq_feat::TExt& ext) const;
  168.     void x_AddFTableQual(const string& name, const string& val = kEmptyStr) const {
  169.         CFormatQual::EStyle style = val.empty() ? CFormatQual::eEmpty : CFormatQual::eQuoted;
  170.         m_FTableQuals.push_back(CRef<CFormatQual>(new CFormatQual(name, val, style)));
  171.     }
  172.     
  173.     // typdef
  174.     typedef CQualContainer<EFeatureQualifier> TQuals;
  175.     typedef TQuals::iterator TQI;
  176.     typedef TQuals::const_iterator TQCI;
  177.     
  178.     // qualifiers container
  179.     void x_AddQual(EFeatureQualifier slot, const IFlatQVal* value) const {
  180.         m_Quals.AddQual(slot, value);
  181.     }
  182.     void x_RemoveQuals(EFeatureQualifier slot) const {
  183.         m_Quals.RemoveQuals(slot);
  184.     }
  185.     bool x_HasQual(EFeatureQualifier slot) const { 
  186.         return m_Quals.HasQual(slot);
  187.     }
  188.     pair<TQCI, TQCI> x_GetQual(EFeatureQualifier slot) const {
  189.         return const_cast<const TQuals&>(m_Quals).GetQuals(slot);
  190.     }
  191.     void x_DropIllegalQuals(void) const;
  192.     // format
  193.     void x_FormatQuals(CFlatFeature& ff) const;
  194.     void x_FormatNoteQuals(CFlatFeature& ff) const;
  195.     void x_FormatQual(EFeatureQualifier slot, const string& name,
  196.         CFlatFeature::TQuals& qvec, IFlatQVal::TFlags flags = 0) const;
  197.     void x_FormatNoteQual(EFeatureQualifier slot, const string& name, 
  198.         CFlatFeature::TQuals& qvec, IFlatQVal::TFlags flags = 0) const 
  199.         { x_FormatQual(slot, name, qvec, flags | IFlatQVal::fIsNote); }
  200.     // data
  201.     mutable CSeqFeatData::ESubtype m_Type;
  202.     mutable TQuals                 m_Quals;
  203.     mutable TQualVec               m_FTableQuals;
  204.     EMapped                        m_Mapped;
  205. };
  206. class CSourceFeatureItem : public CFeatureItemBase
  207. {
  208. public:
  209.     typedef CRange<TSeqPos> TRange;
  210.     CSourceFeatureItem(const CBioSource& src, TRange range, CBioseqContext& ctx);
  211.     CSourceFeatureItem(const CSeq_feat& feat, CBioseqContext& ctx,
  212.                            const CSeq_loc* loc = 0)
  213.         : CFeatureItemBase(feat, ctx, loc), m_WasDesc(false)
  214.     {
  215.         x_GatherInfo(ctx);
  216.     }
  217.     CSourceFeatureItem(const CMappedFeat& feat, CBioseqContext& ctx,
  218.                            const CSeq_loc* loc = 0)
  219.         : CFeatureItemBase(feat.GetOriginalFeature(), ctx,
  220.                            loc ? loc : &feat.GetLocation()),
  221.           m_WasDesc(false)
  222.     {
  223.         x_GatherInfo(ctx);
  224.     }
  225.     bool WasDesc(void) const { return m_WasDesc; }
  226.     const CBioSource& GetSource(void) const {
  227.         return m_Feat->GetData().GetBiosrc();
  228.     }
  229.     string GetKey(void) const { return "source"; }
  230. private:
  231.     void x_GatherInfo(CBioseqContext& ctx) {
  232.         x_AddQuals(ctx);
  233.     }
  234.     void x_AddQuals(CBioseqContext& ctx);
  235.     void x_AddQuals(const CBioSource& src, CBioseqContext& ctx) const;
  236.     void x_AddQuals(const COrg_ref& org, CBioseqContext& ctx) const;
  237.     // XXX - massage slot as necessary and perhaps sanity-check value's type
  238.     void x_AddQual (ESourceQualifier slot, const IFlatQVal* value) const {
  239.         m_Quals.AddQual(slot, value); 
  240.     }
  241.     void x_FormatQuals(CFlatFeature& ff) const;
  242.     void x_FormatGBNoteQuals(CFlatFeature& ff) const;
  243.     void x_FormatNoteQuals(CFlatFeature& ff) const;
  244.     void x_FormatQual(ESourceQualifier slot, const string& name,
  245.         CFlatFeature::TQuals& qvec, IFlatQVal::TFlags flags = 0) const {
  246.             bool add_period = false;
  247.             x_FormatQual(slot, name, qvec, add_period, flags);
  248.     }
  249.     void x_FormatQual(ESourceQualifier slot, const string& name,
  250.         CFlatFeature::TQuals& qvec, bool& add_period,
  251.         IFlatQVal::TFlags flags = 0) const;
  252.     void x_FormatNoteQual(ESourceQualifier slot, const string& name,
  253.             CFlatFeature::TQuals& qvec, bool& add_period,
  254.             IFlatQVal::TFlags flags = 0) const {
  255.         x_FormatQual(slot, name, qvec, add_period, flags | IFlatQVal::fIsNote); 
  256.     }
  257.     typedef CQualContainer<ESourceQualifier> TQuals;
  258.     typedef TQuals::const_iterator           TQCI;
  259.     bool           m_WasDesc;
  260.     mutable TQuals m_Quals;
  261. };
  262. END_SCOPE(objects)
  263. END_NCBI_SCOPE
  264. /*
  265. * ===========================================================================
  266. *
  267. * $Log: feature_item.hpp,v $
  268. * Revision 1000.1  2004/06/01 19:39:30  gouriano
  269. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  270. *
  271. * Revision 1.16  2004/05/19 14:42:38  shomrat
  272. * + x_DropIllegalQuals
  273. *
  274. * Revision 1.15  2004/05/07 15:21:50  shomrat
  275. * + Helper function x_GetStringQual(..)
  276. *
  277. * Revision 1.14  2004/05/06 17:41:38  shomrat
  278. * Fixes to feature formatting
  279. *
  280. * Revision 1.13  2004/04/22 15:36:00  shomrat
  281. * Changes in context
  282. *
  283. * Revision 1.12  2004/04/13 16:42:24  shomrat
  284. * Additions due to GBSeq format
  285. *
  286. * Revision 1.11  2004/04/07 14:25:03  shomrat
  287. * Added FTable format methods
  288. *
  289. * Revision 1.10  2004/03/31 15:59:54  ucko
  290. * CFeatureItem::x_GetQual: make sure to call the const version of
  291. * GetQuals to fix WorkShop build errors.
  292. *
  293. * Revision 1.9  2004/03/30 20:26:32  shomrat
  294. * Separated quals container from feature class
  295. *
  296. * Revision 1.8  2004/03/25 20:27:52  shomrat
  297. * moved constructor body to .cpp file
  298. *
  299. * Revision 1.7  2004/03/18 15:27:25  shomrat
  300. * + GetId for ftable format
  301. *
  302. * Revision 1.6  2004/03/08 21:00:48  shomrat
  303. * Exception qualifiers gathering
  304. *
  305. * Revision 1.5  2004/03/05 18:49:26  shomrat
  306. * enhancements to qualifier collection and formatting
  307. *
  308. * Revision 1.4  2004/02/11 22:48:18  shomrat
  309. * override GetKey
  310. *
  311. * Revision 1.3  2004/02/11 16:38:51  shomrat
  312. * added methods for gathering and formatting of source features
  313. *
  314. * Revision 1.2  2004/01/14 15:57:23  shomrat
  315. * removed commented code
  316. *
  317. * Revision 1.1  2003/12/17 19:46:43  shomrat
  318. * Initial revision (adapted from flat lib)
  319. *
  320. *
  321. * ===========================================================================
  322. */
  323. #endif  /* OBJTOOLS_FORMAT_ITEMS___FLAT_FEATURE__HPP */