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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: feature.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:54:56  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_OBJUTILS___FEATURE__HPP
  10. #define GUI_OBJUTILS___FEATURE__HPP
  11. /*  $Id: feature.hpp,v 1000.0 2004/06/01 19:54:56 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.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *    CLayoutFeat -- utility class to arrange CSeq_feat objects in hierarchical
  40.  *                (tree) order.
  41.  */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <gui/gui.hpp>
  44. #include <gui/objutils/layout.hpp>
  45. #include <objmgr/feat_ci.hpp>
  46. #include <objects/seqfeat/SeqFeatData.hpp>
  47. #include <objects/seqfeat/Seq_feat.hpp>
  48. #include <objects/seqloc/Seq_loc.hpp>
  49. #include <list>
  50. /** @addtogroup GUI_OBJUTILS
  51.  *
  52.  * @{
  53.  */
  54. BEGIN_NCBI_SCOPE
  55. //
  56. // Class for storing a set of nested features.
  57. // A feature describes the genetic location in true gene coordinates of any
  58. // sort of genetic object (gene / protein / RNA / etc).  Each feature has an
  59. // overall extent as well as a series of subregions
  60. //
  61. class NCBI_GUIOBJUTILS_EXPORT CLayoutFeat : public CLayoutObject
  62. {
  63. public:
  64.     typedef vector< CRef<CLayoutFeat> > TFeatList;
  65.     // ctors
  66.     CLayoutFeat(const objects::CMappedFeat& feat);
  67.     //
  68.     // pure virtual requirements
  69.     //
  70.     // Access the feature's remapped location
  71.     const objects::CSeq_loc& GetLocation(void) const;
  72.     // Comparators
  73.     bool LessByPos (const CLayoutObject& obj) const;
  74.     bool LessBySize(const CLayoutObject& obj) const;
  75.     // retrieve the type of this object
  76.     EType GetType() const;
  77.     //
  78.     // type-sepcific accessors
  79.     //
  80.     // Retrieve the feature as an object.  For safety's sake,
  81.     // this returns the remapped feature.
  82.     const CObject* GetObject(TSeqPos pos) const;
  83.     
  84.     bool HasObject(const CObject* obj) const;
  85.     // Access the original feature.  The location on this feature
  86.     // may not be correct, as it hasn't been remapped
  87.     const objects::CSeq_feat&        GetFeature(void) const;
  88.     // Access a new, fully remapped feature
  89.     // This is useful for passing exact features to plugins
  90.     const objects::CMappedFeat&      GetMappedFeature(void) const;
  91.     // Access the size of this feature
  92.     TSeqPos                 size(void) const;
  93.     // Access the sub-intervals in this feature
  94.     const vector<TSeqRange>&   GetIntervals(void) const;
  95.     // Access a text string describing this feature
  96.     //const string&           GetTextId(void) const;
  97.     // Accessors for parent-child relationships in features
  98.     const CLayoutFeat*      GetParent  (void) const;
  99.     const TFeatList&        GetChildren(void) const;
  100.     void                    SetParent(CLayoutFeat* feat);
  101.     TFeatList&              SetChildren(void);
  102.     bool                    IsHiddenLabel(void) const;
  103.     void                    HideLabels();
  104. protected:
  105.     // we store a mapped feature object
  106.     objects::CMappedFeat    m_Feature;
  107.     bool                    m_HideLabel;
  108.     
  109.     // parent / child relationships for this feature
  110.     CLayoutFeat*            m_Parent;
  111.     TFeatList               m_Children;
  112.     // some sort of identifier for this gene
  113.     // this is usually a locus name
  114.     //string                  m_TextId;
  115.     // individual features in this range
  116.     mutable vector<TSeqRange>  m_Intervals;
  117.     // calculate our intervals
  118.     void    x_CalcIntervals(void) const;
  119. };
  120. //
  121. // Predicates for sorting gene info
  122. //
  123. //
  124. // SFeatureBySize()
  125. // arrange features by length of (extent of) feature
  126. //
  127. struct NCBI_GUIOBJUTILS_EXPORT SFeatureBySize
  128. {
  129.     bool operator() (const CLayoutFeat& g0, const CLayoutFeat& g1) const {
  130.         return (g0.size() > g1.size());
  131.     }
  132.     bool operator() (const CLayoutFeat* g0, const CLayoutFeat* g1) const {
  133.         return (g0->size() > g1->size());
  134.     }
  135. };
  136. //
  137. // SFeatureByPos()
  138. // arrange features by position.  in essence, this sorts features as a
  139. // CSeq_feat is sorted
  140. //
  141. struct NCBI_GUIOBJUTILS_EXPORT SFeatureByPos
  142. {
  143.     bool operator() (const CLayoutFeat& g0, const CLayoutFeat& g1) const {
  144.         return (g0.GetFeature().Compare(g1.GetFeature(),
  145.                                         g0.GetLocation(),
  146.                                         g1.GetLocation()) < 0);
  147.     }
  148.     bool operator() (const CLayoutFeat* g0, const CLayoutFeat* g1) const {
  149.         return (*this)(*g0, *g1);
  150.     }
  151. };
  152. inline
  153. bool CLayoutFeat::IsHiddenLabel(void) const
  154. {
  155.     return m_HideLabel;
  156. }
  157. inline
  158. void CLayoutFeat::HideLabels()
  159. {
  160.     m_HideLabel = true;
  161. }
  162. inline
  163. const objects::CSeq_feat& CLayoutFeat::GetFeature(void) const
  164. {
  165.     return m_Feature.GetOriginalFeature();
  166. }
  167. inline
  168. const CObject* CLayoutFeat::GetObject(TSeqPos pos) const
  169. {
  170.     TSeqRange r = GetLocation().GetTotalRange();
  171.     if (pos >= r.GetFrom()  &&  pos <= r.GetTo()) {
  172.         return &m_Feature.GetOriginalFeature();
  173.     }
  174.     return NULL;
  175. }
  176. inline
  177. bool CLayoutFeat::HasObject(const CObject* obj) const
  178. {
  179.     return &m_Feature.GetOriginalFeature() == obj;
  180. }
  181. inline
  182. const objects::CMappedFeat& CLayoutFeat::GetMappedFeature(void) const
  183. {
  184.     return m_Feature;
  185. }
  186. inline
  187. const objects::CSeq_loc& CLayoutFeat::GetLocation(void) const
  188. {
  189.     return m_Feature.GetLocation();
  190. }
  191. inline
  192. TSeqPos CLayoutFeat::size(void) const
  193. {
  194.     return GetLocation().GetTotalRange().GetLength();
  195. }
  196. // Accessors for parent-child relationships in features
  197. inline
  198. const CLayoutFeat* CLayoutFeat::GetParent(void) const
  199. {
  200.     return m_Parent;
  201. }
  202. inline
  203. const CLayoutFeat::TFeatList& CLayoutFeat::GetChildren(void) const
  204. {
  205.     return m_Children;
  206. }
  207. inline
  208. void CLayoutFeat::SetParent(CLayoutFeat* feat)
  209. {
  210.     m_Parent = feat;
  211. }
  212. inline
  213. CLayoutFeat::TFeatList& CLayoutFeat::SetChildren(void)
  214. {
  215.     return m_Children;
  216. }
  217. inline
  218. bool CLayoutFeat::LessByPos(const CLayoutObject& obj) const
  219. {
  220.     const CLayoutFeat* feat = dynamic_cast<const CLayoutFeat*>(&obj);
  221.     if (feat) {
  222.         // two features - we sort in feature order
  223.         SFeatureByPos comp;
  224.         return (comp(*this, *feat));
  225.     } else {
  226.         // default: compare by ranges
  227.         TSeqRange r0 = GetLocation().GetTotalRange();
  228.         TSeqRange r1 = obj.GetLocation().GetTotalRange();
  229.         return (r0.GetFrom() < r1.GetFrom());
  230.     }
  231. }
  232. inline
  233. bool CLayoutFeat::LessBySize(const CLayoutObject& obj) const
  234. {
  235.     TSeqRange r0 = GetLocation().GetTotalRange();
  236.     TSeqRange r1 = obj.GetLocation().GetTotalRange();
  237.     return (r0.GetLength() < r1.GetLength());
  238. }
  239. // Access the sub-intervals in this feature
  240. inline
  241. const vector<TSeqRange>& CLayoutFeat::GetIntervals(void) const
  242. {
  243.     if (m_Intervals.size() == 0) {
  244.         x_CalcIntervals();
  245.     }
  246.     return m_Intervals;
  247. }
  248. inline
  249. CLayoutFeat::EType CLayoutFeat::GetType() const
  250. {
  251.     return eFeat;
  252. }
  253. END_NCBI_SCOPE
  254. /* @} */
  255. /*
  256.  * ===========================================================================
  257.  * $Log: feature.hpp,v $
  258.  * Revision 1000.0  2004/06/01 19:54:56  gouriano
  259.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  260.  *
  261.  * Revision 1.4  2004/05/14 14:24:47  dicuccio
  262.  * Added new pure virtual requirement on CLayoutObject(): GetType(), returns enum
  263.  * defined in CLayoutObject
  264.  *
  265.  * Revision 1.3  2004/05/03 13:34:54  dicuccio
  266.  * FIxed include guards, doxygen groups
  267.  *
  268.  * Revision 1.2  2004/05/03 12:41:35  dicuccio
  269.  * Fixed #includes and export specifiers
  270.  *
  271.  * Revision 1.1  2004/04/30 11:52:53  dicuccio
  272.  * Split out from gui/utils
  273.  *
  274.  * Revision 1.24  2004/04/16 14:27:17  dicuccio
  275.  * Added doxygen module tag
  276.  *
  277.  * Revision 1.23  2004/04/15 12:57:43  lebedev
  278.  * Changed GetObject to return NULL or const pointer based on given position
  279.  *
  280.  * Revision 1.22  2004/04/12 16:48:28  dicuccio
  281.  * MOved #include guard
  282.  *
  283.  * Revision 1.21  2004/03/11 17:19:32  dicuccio
  284.  * Use TSeqRange instead of TRange.  Use gui/gui instead of gui/types
  285.  *
  286.  * Revision 1.20  2004/02/24 14:34:49  lebedev
  287.  * Option to hide feature label added
  288.  *
  289.  * Revision 1.19  2003/09/30 19:49:26  dicuccio
  290.  * When requesting the object behind a feature, always return the original feature
  291.  * not remapped to another sequence (solves selection issues in graphical widget)
  292.  *
  293.  * Revision 1.18  2003/09/29 15:20:08  dicuccio
  294.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp
  295.  *
  296.  * Revision 1.17  2003/08/22 15:57:11  dicuccio
  297.  * Removed 'USING_SCOPE(objects)'.  Removed export specifier from inline structs
  298.  *
  299.  * Revision 1.16  2003/08/18 14:53:26  dicuccio
  300.  * Changed nales: CFeature -> CLayoutFeat; CAlignment -> CLayoutAlign; CGraph ->
  301.  * CLayoutGraph; CProtProduct -> CLayoutProtProd.
  302.  * Removed USING_SCOPE(objects);
  303.  *
  304.  * Revision 1.15  2003/07/21 19:24:09  dicuccio
  305.  * Changed storage mechanism: CLayoutObject::GetObject() is pure virtual.  Also,
  306.  * CFeature now stores a CMappedFeat object instead of a CSeq_feat / CSeq_loc pair
  307.  *
  308.  * Revision 1.14  2003/07/11 15:24:05  dicuccio
  309.  * Fix compilation error for gcc
  310.  *
  311.  * Revision 1.13  2003/07/11 12:40:01  dicuccio
  312.  * Code clean-ups.  Fixed sorting of features to perform correct feature-order
  313.  * sorting
  314.  *
  315.  * Revision 1.12  2003/07/11 11:46:58  dicuccio
  316.  * Removed dead code
  317.  *
  318.  * Revision 1.11  2003/06/10 13:32:42  dicuccio
  319.  * Rewored CFeature to inherit from CLayoutObject.  Removed a lot fo dead code.
  320.  *
  321.  * Revision 1.10  2003/05/07 17:26:17  dicuccio
  322.  * Removed dead predeclaration; reformatted CVS comments
  323.  *
  324.  * Revision 1.9  2003/05/07 12:30:00  dicuccio
  325.  * Removed CFeature::GetExtent().  Fixed long-standing bug with misreporting of
  326.  * feature locations
  327.  *
  328.  * Revision 1.8  2003/02/25 14:42:48  dicuccio
  329.  * FIxed compilation issue related to API change in CSeq_feat::Compare()
  330.  *
  331.  * Revision 1.7  2003/02/10 18:19:41  dicuccio
  332.  * Fixed compilation errors relating to change in CFeat_CI API
  333.  *
  334.  * Revision 1.6  2003/01/15 20:57:37  dicuccio
  335.  * Dropped private feature sort mechanism in favor of toolkit standard sort.
  336.  *
  337.  * Revision 1.5  2003/01/13 13:11:42  dicuccio
  338.  * Namespace clean-up.  Retired namespace gui -> converted to namespace ncbi.
  339.  * Moved all FLUID-generated code into namespace ncbi.
  340.  *
  341.  * Revision 1.4  2002/12/19 18:13:03  dicuccio
  342.  * Added export specifiers for Win32.
  343.  *
  344.  * Revision 1.3  2002/12/11 19:00:06  dicuccio
  345.  * Re-enabled selection
  346.  *
  347.  * Revision 1.2  2002/12/06 14:08:17  dicuccio
  348.  * Moved feature sorting predicates into feature.[h,c]pp
  349.  *
  350.  * Revision 1.1  2002/11/29 15:28:10  dicuccio
  351.  * Initial revision - moved from gui/core/view/graphic
  352.  *
  353.  * Revision 1.2  2002/11/09 20:57:08  dicuccio
  354.  * Performance improvements:  Implemented smarter widget update (use update
  355.  * flags to specify update conditions); use a more intuitive (and flexible)
  356.  * mechanism to obtain features from the object manager.
  357.  *
  358.  * Revision 1.1  2002/11/07 16:27:26  dicuccio
  359.  * Initial revision
  360.  *
  361.  * ===========================================================================
  362.  */
  363. #endif  // GUI_OBJUTILS___FEATURE__HPP