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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: annot_object.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:21:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ANNOT_OBJECT__HPP
  10. #define ANNOT_OBJECT__HPP
  11. /*  $Id: annot_object.hpp,v 1000.3 2004/06/01 19:21:53 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: Aleksey Grichenko, Michael Kimelman, Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Annotation object wrapper
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <objects/seq/Seq_annot.hpp>
  44. #include <objects/seqfeat/SeqFeatData.hpp>
  45. #include <objects/seqfeat/Seq_feat.hpp>
  46. #include <objects/seqres/Seq_graph.hpp>
  47. #include <objects/seqalign/Seq_align.hpp>
  48. #include <memory>
  49. #include <vector>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52. class CDataSource;
  53. class CHandleRangeMap;
  54. struct SAnnotTypeSelector;
  55. class CSeq_align;
  56. class CSeq_graph;
  57. class CSeq_feat;
  58. class CSeq_entry;
  59. class CSeq_entry_Info;
  60. class CSeq_annot;
  61. class CSeq_annot_Info;
  62. class CTSE_Info;
  63. class CTSE_Chunk_Info;
  64. // General Seq-annot object
  65. class NCBI_XOBJMGR_EXPORT CAnnotObject_Info
  66. {
  67. public:
  68.     typedef CSeq_annot::C_Data::E_Choice TAnnotType;
  69.     typedef CSeqFeatData::E_Choice       TFeatType;
  70.     typedef CSeqFeatData::ESubtype       TFeatSubtype;
  71.     CAnnotObject_Info(void);
  72.     CAnnotObject_Info(const CSeq_feat& feat,
  73.                       CSeq_annot_Info& annot);
  74.     CAnnotObject_Info(const CSeq_align& align,
  75.                       CSeq_annot_Info& annot);
  76.     CAnnotObject_Info(const CSeq_graph& graph,
  77.                       CSeq_annot_Info& annot);
  78.     CAnnotObject_Info(CTSE_Chunk_Info& chunk_info,
  79.                       const SAnnotTypeSelector& sel);
  80.     ~CAnnotObject_Info(void);
  81.     // Get Seq-annot, containing the element
  82.     const CSeq_annot_Info& GetSeq_annot_Info(void) const;
  83.     CSeq_annot_Info& GetSeq_annot_Info(void);
  84.     // Get Seq-entry, containing the annotation
  85.     const CSeq_entry_Info& GetSeq_entry_Info(void) const;
  86.     // Get top level Seq-entry, containing the annotation
  87.     const CTSE_Info& GetTSE_Info(void) const;
  88.     CTSE_Info& GetTSE_Info(void);
  89.     // Get CDataSource object
  90.     CDataSource& GetDataSource(void) const;
  91.     TAnnotType Which(void) const;
  92.     TAnnotType GetAnnotType(void) const;
  93.     TFeatType GetFeatType(void) const;
  94.     TFeatSubtype GetFeatSubtype(void) const;
  95.     CConstRef<CObject> GetObject(void) const;
  96.     const CObject* GetObjectPointer(void) const;
  97.     bool IsFeat(void) const;
  98.     const CSeq_feat& GetFeat(void) const;
  99.     const CSeq_feat* GetFeatFast(void) const; // unchecked & unsafe
  100.     bool IsAlign(void) const;
  101.     const CSeq_align& GetAlign(void) const;
  102.     const CSeq_align* GetAlignFast(void) const;
  103.     bool IsGraph(void) const;
  104.     const CSeq_graph& GetGraph(void) const;
  105.     const CSeq_graph* GetGraphFast(void) const; // unchecked & unsafe
  106.     void GetMaps(vector<CHandleRangeMap>& hrmaps) const;
  107.     // split support
  108.     bool IsChunkStub(void) const;
  109.     const CTSE_Chunk_Info& GetChunk_Info(void) const;
  110.     enum EMultiIdFlags {
  111.         fMultiId_Location = 0x1,
  112.         fMultiId_Product  = 0x2
  113.     };
  114.     typedef Uint1 TMultiIdFlags;
  115.     TMultiIdFlags GetMultiIdFlags(void) const {
  116.         return m_MultiId;
  117.     }
  118. private:
  119.     // Constructors used by CAnnotTypes_CI only to create fake annotations
  120.     // for sequence segments. The annot object points to the seq-annot
  121.     // containing the original annotation object.
  122.     void x_ProcessAlign(vector<CHandleRangeMap>& hrmaps,
  123.                         const CSeq_align& align,
  124.                         int loc_index_shift) const;
  125.     CSeq_annot_Info*             m_Annot_Info;
  126.     CConstRef<CObject>           m_Object;         // annot object itself
  127.     Uint2                        m_FeatSubtype;    // feature subtype
  128.     Uint1                        m_FeatType;       // feature type or e_not_set
  129.     Uint1                        m_AnnotType;      // annot object type
  130.     mutable TMultiIdFlags        m_MultiId;
  131. };
  132. /////////////////////////////////////////////////////////////////////
  133. //
  134. //  Inline methods
  135. //
  136. /////////////////////////////////////////////////////////////////////
  137. inline
  138. CAnnotObject_Info::TAnnotType CAnnotObject_Info::Which(void) const
  139. {
  140.     return TAnnotType(m_AnnotType);
  141. }
  142. inline
  143. CAnnotObject_Info::TAnnotType CAnnotObject_Info::GetAnnotType(void) const
  144. {
  145.     return TAnnotType(m_AnnotType);
  146. }
  147. inline
  148. CAnnotObject_Info::TFeatType CAnnotObject_Info::GetFeatType(void) const
  149. {
  150.     return TFeatType(m_FeatType);
  151. }
  152. inline
  153. CAnnotObject_Info::TFeatSubtype CAnnotObject_Info::GetFeatSubtype(void) const
  154. {
  155.     return TFeatSubtype(m_FeatSubtype);
  156. }
  157. inline
  158. bool CAnnotObject_Info::IsChunkStub(void) const
  159. {
  160.     return !m_Annot_Info;
  161. }
  162. inline
  163. CConstRef<CObject> CAnnotObject_Info::GetObject(void) const
  164. {
  165.     return m_Object;
  166. }
  167. inline
  168. const CObject* CAnnotObject_Info::GetObjectPointer(void) const
  169. {
  170.     return m_Object.GetPointer();
  171. }
  172. inline
  173. bool CAnnotObject_Info::IsFeat(void) const
  174. {
  175.     return m_AnnotType == CSeq_annot::C_Data::e_Ftable;
  176. }
  177. inline
  178. bool CAnnotObject_Info::IsAlign(void) const
  179. {
  180.     return m_AnnotType == CSeq_annot::C_Data::e_Align;
  181. }
  182. inline
  183. bool CAnnotObject_Info::IsGraph(void) const
  184. {
  185.     return m_AnnotType == CSeq_annot::C_Data::e_Graph;
  186. }
  187. inline
  188. const CSeq_feat* CAnnotObject_Info::GetFeatFast(void) const
  189. {
  190.     _ASSERT(IsFeat() && !IsChunkStub());
  191.     return static_cast<const CSeq_feat*>(m_Object.GetPointer());
  192. }
  193. inline
  194. const CSeq_graph* CAnnotObject_Info::GetGraphFast(void) const
  195. {
  196.     _ASSERT(IsGraph() && !IsChunkStub());
  197.     return static_cast<const CSeq_graph*>(m_Object.GetPointer());
  198. }
  199. inline
  200. const CSeq_align* CAnnotObject_Info::GetAlignFast(void) const
  201. {
  202.     _ASSERT(IsAlign() && !IsChunkStub());
  203.     return static_cast<const CSeq_align*>(m_Object.GetPointer());
  204. }
  205. inline
  206. const CSeq_annot_Info& CAnnotObject_Info::GetSeq_annot_Info(void) const
  207. {
  208.     _ASSERT(!IsChunkStub());
  209.     return *m_Annot_Info;
  210. }
  211. inline
  212. CSeq_annot_Info& CAnnotObject_Info::GetSeq_annot_Info(void)
  213. {
  214.     _ASSERT(!IsChunkStub());
  215.     return *m_Annot_Info;
  216. }
  217. END_SCOPE(objects)
  218. END_NCBI_SCOPE
  219. /*
  220. * ---------------------------------------------------------------------------
  221. * $Log: annot_object.hpp,v $
  222. * Revision 1000.3  2004/06/01 19:21:53  gouriano
  223. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  224. *
  225. * Revision 1.18  2004/05/26 14:29:20  grichenk
  226. * Redesigned CSeq_align_Mapper: preserve non-mapping intervals,
  227. * fixed strands handling, improved performance.
  228. *
  229. * Revision 1.17  2004/03/31 20:43:28  grichenk
  230. * Fixed mapping of seq-locs containing both master sequence
  231. * and its segments.
  232. *
  233. * Revision 1.16  2004/03/26 19:42:03  vasilche
  234. * Fixed premature deletion of SNP annot info object.
  235. * Removed obsolete references to chunk info.
  236. *
  237. * Revision 1.15  2004/03/16 15:47:26  vasilche
  238. * Added CBioseq_set_Handle and set of EditHandles
  239. *
  240. * Revision 1.14  2003/11/26 17:55:54  vasilche
  241. * Implemented ID2 split in ID1 cache.
  242. * Fixed loading of splitted annotations.
  243. *
  244. * Revision 1.13  2003/10/07 13:43:22  vasilche
  245. * Added proper handling of named Seq-annots.
  246. * Added feature search from named Seq-annots.
  247. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  248. * Fixed selection of blobs for loading from GenBank.
  249. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  250. * Fixed leaked split chunks annotation stubs.
  251. * Moved some classes definitions in separate *.cpp files.
  252. *
  253. * Revision 1.12  2003/09/30 16:22:00  vasilche
  254. * Updated internal object manager classes to be able to load ID2 data.
  255. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  256. * Scope caches results of requests for data to data loaders.
  257. * Optimized CSeq_id_Handle for gis.
  258. * Optimized bioseq lookup in scope.
  259. * Reduced object allocations in annotation iterators.
  260. * CScope is allowed to be destroyed before other objects using this scope are
  261. * deleted (feature iterators, bioseq handles etc).
  262. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  263. * Added 'adaptive' option to objmgr_demo application.
  264. *
  265. * Revision 1.11  2003/08/27 14:28:51  vasilche
  266. * Reduce amount of object allocations in feature iteration.
  267. *
  268. * Revision 1.10  2003/08/14 20:05:18  vasilche
  269. * Simple SNP features are stored as table internally.
  270. * They are recreated when needed using CFeat_CI.
  271. *
  272. * Revision 1.9  2003/07/17 20:07:55  vasilche
  273. * Reduced memory usage by feature indexes.
  274. * SNP data is loaded separately through PUBSEQ_OS.
  275. * String compression for SNP data.
  276. *
  277. * Revision 1.8  2003/06/02 16:01:37  dicuccio
  278. * Rearranged include/objects/ subtree.  This includes the following shifts:
  279. *     - include/objects/alnmgr --> include/objtools/alnmgr
  280. *     - include/objects/cddalignview --> include/objtools/cddalignview
  281. *     - include/objects/flat --> include/objtools/flat
  282. *     - include/objects/objmgr/ --> include/objmgr/
  283. *     - include/objects/util/ --> include/objmgr/util/
  284. *     - include/objects/validator --> include/objtools/validator
  285. *
  286. * Revision 1.7  2003/04/24 17:54:13  ucko
  287. * +<memory> (for auto_ptr<>)
  288. *
  289. * Revision 1.6  2003/04/24 16:12:37  vasilche
  290. * Object manager internal structures are splitted more straightforward.
  291. * Removed excessive header dependencies.
  292. *
  293. * Revision 1.5  2003/03/27 19:40:11  vasilche
  294. * Implemented sorting in CGraph_CI.
  295. * Added Rewind() method to feature/graph/align iterators.
  296. *
  297. * Revision 1.4  2003/03/18 21:48:28  grichenk
  298. * Removed obsolete class CAnnot_CI
  299. *
  300. * Revision 1.3  2003/02/25 14:48:07  vasilche
  301. * Added Win32 export modifier to object manager classes.
  302. *
  303. * Revision 1.2  2003/02/24 21:35:22  vasilche
  304. * Reduce checks in CAnnotObject_Ref comparison.
  305. * Fixed compilation errors on MS Windows.
  306. * Removed obsolete file src/objects/objmgr/annot_object.hpp.
  307. *
  308. * Revision 1.1  2003/02/24 18:57:21  vasilche
  309. * Make feature gathering in one linear pass using CSeqMap iterator.
  310. * Do not use feture index by sub locations.
  311. * Sort features at the end of gathering in one vector.
  312. * Extracted some internal structures and classes in separate header.
  313. * Delay creation of mapped features.
  314. *
  315. * Revision 1.16  2003/02/13 14:34:34  grichenk
  316. * Renamed CAnnotObject -> CAnnotObject_Info
  317. * + CSeq_annot_Info and CAnnotObject_Ref
  318. * Moved some members of CAnnotObject to CSeq_annot_Info
  319. * and CAnnotObject_Ref.
  320. * Added feat/align/graph to CAnnotObject_Info map
  321. * to CDataSource.
  322. *
  323. * Revision 1.15  2003/02/10 15:53:04  grichenk
  324. * + m_MappedProd, made mapping methods private
  325. *
  326. * Revision 1.14  2003/02/05 17:59:16  dicuccio
  327. * Moved formerly private headers into include/objects/objmgr/impl
  328. *
  329. * Revision 1.13  2003/02/04 21:45:19  grichenk
  330. * Added IsPartial(), IsMapped(), GetMappedLoc()
  331. *
  332. * Revision 1.12  2003/01/29 22:03:46  grichenk
  333. * Use single static CSeq_id_Mapper instead of per-OM model.
  334. *
  335. * Revision 1.11  2002/12/20 20:54:24  grichenk
  336. * Added optional location/product switch to CFeat_CI
  337. *
  338. * Revision 1.10  2002/12/06 15:36:00  grichenk
  339. * Added overlap type for annot-iterators
  340. *
  341. * Revision 1.9  2002/10/09 19:17:41  grichenk
  342. * Fixed ICC problem with dynamic_cast<>
  343. *
  344. * Revision 1.8  2002/07/08 20:51:01  grichenk
  345. * Moved log to the end of file
  346. * Replaced static mutex (in CScope, CDataSource) with the mutex
  347. * pool. Redesigned CDataSource data locking.
  348. *
  349. * Revision 1.7  2002/05/29 21:21:13  gouriano
  350. * added debug dump
  351. *
  352. * Revision 1.6  2002/04/05 21:26:19  grichenk
  353. * Enabled iteration over annotations defined on segments of a
  354. * delta-sequence.
  355. *
  356. * Revision 1.5  2002/03/07 21:25:33  grichenk
  357. * +GetSeq_annot() in annotation iterators
  358. *
  359. * Revision 1.4  2002/02/21 19:27:04  grichenk
  360. * Rearranged includes. Added scope history. Added searching for the
  361. * best seq-id match in data sources and scopes. Updated tests.
  362. *
  363. * Revision 1.3  2002/01/23 21:59:31  grichenk
  364. * Redesigned seq-id handles and mapper
  365. *
  366. * Revision 1.2  2002/01/16 16:25:57  gouriano
  367. * restructured objmgr
  368. *
  369. * Revision 1.1  2002/01/11 19:06:16  gouriano
  370. * restructured objmgr
  371. *
  372. *
  373. * ===========================================================================
  374. */
  375. #endif  // ANNOT_OBJECT__HPP