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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_map.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:27:48  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___SEQ_MAP__HPP
  10. #define OBJECTS_OBJMGR___SEQ_MAP__HPP
  11. /*  $Id: seq_map.hpp,v 1000.2 2004/04/12 17:27:48 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:
  37. *           Aleksey Grichenko
  38. *           Michael Kimelman
  39. *           Andrei Gourianov
  40. *           Eugene Vasilchenko
  41. *
  42. * File Description:
  43. *   CSeqMap -- formal sequence map to describe sequence parts in general,
  44. *   i.e. location and type only, without providing real data
  45. *
  46. */
  47. #include <objmgr/seq_id_handle.hpp>
  48. #include <objmgr/objmgr_exception.hpp>
  49. #include <objects/seqloc/Na_strand.hpp>
  50. #include <objects/seq/Seq_inst.hpp>
  51. #include <corelib/ncbimtx.hpp>
  52. #include <vector>
  53. #include <list>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. class CBioseq;
  57. class CDelta_seq;
  58. class CSeq_loc;
  59. class CSeq_point;
  60. class CSeq_interval;
  61. class CSeq_loc_mix;
  62. class CSeq_loc_equiv;
  63. class CSeq_literal;
  64. class CSeq_data;
  65. class CPacked_seqint;
  66. class CPacked_seqpnt;
  67. // Provided for compatibility with old code; new code should just use TSeqPos.
  68. typedef TSeqPos TSeqPosition;
  69. typedef TSeqPos TSeqLength;
  70. ////////////////////////////////////////////////////////////////////
  71. //  CSeqMap::
  72. //     Formal sequence map -- to describe sequence parts in general --
  73. //     location and type only, without providing real data
  74. class CScope;
  75. class CBioseq_Handle;
  76. class CSegmentPtr;
  77. class CSeqMap_CI;
  78. class CSeqMap_CI_SegmentInfo;
  79. class CSeqMap_Delta_seqs;
  80. class NCBI_XOBJMGR_EXPORT CSeqMap : public CObject
  81. {
  82. public:
  83.     // typedefs
  84.     enum ESegmentType {
  85.         eSeqGap,              // gap
  86.         eSeqData,             // real sequence data
  87.         eSeqSubMap,           // sub seqmap
  88.         eSeqRef,              // reference to Bioseq
  89.         eSeqEnd
  90.     };
  91.     typedef CSeq_inst::TMol TMol;
  92. protected:
  93.     class CSegment;
  94.     class SPosLessSegment;
  95.     friend class CSegment;
  96.     friend class SPosLessSegment;
  97.     friend class CSeqMap_SeqPoss;
  98.     class CSegment
  99.     {
  100.     public:
  101.         CSegment(ESegmentType seg_type = eSeqEnd,
  102.                  TSeqPos length = kInvalidSeqPos);
  103.         // Relative position of the segment in seqmap
  104.         mutable TSeqPos      m_Position;
  105.         // Length of the segment (kInvalidSeqPos if unresolved)
  106.         mutable TSeqPos      m_Length;
  107.         // Segment type
  108.         char                 m_SegType;
  109.         // reference info, valid for eSeqData, eSeqSubMap, eSeqRef
  110.         bool                 m_RefMinusStrand;
  111.         TSeqPos              m_RefPosition;
  112.         CConstRef<CObject>   m_RefObject; // CSeq_data, CSeqMap, CSeq_id
  113.         typedef list<TSeqPos>::iterator TList0_I;
  114.         TList0_I m_Iterator;
  115.     };
  116.     class SPosLessSegment
  117.     {
  118.     public:
  119.         bool operator()(TSeqPos pos, const CSegment& seg)
  120.             {
  121.                 return pos < seg.m_Position + seg.m_Length;
  122.             }
  123.     };
  124. public:
  125.     typedef CSeqMap_CI CSegmentInfo; // for compatibility
  126.     typedef CSeqMap_CI const_iterator;
  127.     typedef CSeqMap_CI TSegment_CI;
  128.     
  129.     ~CSeqMap(void);
  130.     TSeqPos GetLength(CScope* scope = 0) const;
  131.     TMol GetMol(void) const;    
  132.     // new interface
  133.     // STL style methods
  134.     const_iterator begin(CScope* scope = 0) const;
  135.     const_iterator end(CScope* scope = 0) const;
  136.     const_iterator find(TSeqPos pos, CScope* scope = 0) const;
  137.     // NCBI style methods
  138.     TSegment_CI Begin(CScope* scope = 0) const;
  139.     TSegment_CI End(CScope* scope = 0) const;
  140.     TSegment_CI FindSegment(TSeqPos pos, CScope* scope = 0) const;
  141.     enum EFlags {
  142.         fFindData     = (1<<0),
  143.         fFindGap      = (1<<1),
  144.         fFindLeafRef  = (1<<2),
  145.         fFindInnerRef = (1<<3),
  146.         fFindRef      = (fFindLeafRef | fFindInnerRef),
  147.         fFindAny      = fFindData | fFindGap | fFindRef,
  148.         fFindAnyLeaf  = fFindData | fFindGap | fFindLeafRef,
  149.         fDefaultFlags = fFindAnyLeaf
  150.     };
  151.     typedef int TFlags;
  152.     // resolved iterators
  153.     const_iterator begin_resolved(CScope* scope,
  154.                                   size_t maxResolveCount = size_t(-1),
  155.                                   TFlags flags = fDefaultFlags) const;
  156.     const_iterator find_resolved(TSeqPos pos, CScope* scope,
  157.                                  size_t maxResolveCount = size_t(-1),
  158.                                  TFlags flags = fDefaultFlags) const;
  159.     const_iterator find_resolved(TSeqPos pos, CScope* scope,
  160.                                  ENa_strand strand,
  161.                                  size_t maxResolveCount,
  162.                                  TFlags flags) const;
  163.     const_iterator end_resolved(CScope* scope,
  164.                                 size_t maxResolveCount = size_t(-1),
  165.                                 TFlags flags = fDefaultFlags) const;
  166.     TSegment_CI BeginResolved(CScope* scope,
  167.                               size_t maxResolveCount = size_t(-1),
  168.                               TFlags flags = fDefaultFlags) const;
  169.     TSegment_CI FindResolved(TSeqPos pos, CScope* scope,
  170.                              size_t maxResolveCount = size_t(-1),
  171.                              TFlags flags = fDefaultFlags) const;
  172.     TSegment_CI FindResolved(TSeqPos pos, CScope* scope,
  173.                              ENa_strand strand,
  174.                              size_t maxResolveCount = size_t(-1),
  175.                              TFlags flags = fDefaultFlags) const;
  176.     TSegment_CI EndResolved(CScope* scope,
  177.                             size_t maxResolveCount = size_t(-1),
  178.                             TFlags flags = fDefaultFlags) const;
  179.     // iterate range with plus strand coordinates
  180.     TSegment_CI ResolvedRangeIterator(CScope* scope,
  181.                                       TSeqPos from,
  182.                                       TSeqPos length,
  183.                                       ENa_strand strand = eNa_strand_plus,
  184.                                       size_t maxResolve = size_t(-1),
  185.                                       TFlags flags = fDefaultFlags) const;
  186.     // iterate range with specified strand coordinates
  187.     TSegment_CI ResolvedRangeIterator(CScope* scope,
  188.                                       ENa_strand strand,
  189.                                       TSeqPos from,
  190.                                       TSeqPos length,
  191.                                       size_t maxResolve = size_t(-1),
  192.                                       TFlags flags = fDefaultFlags) const;
  193.     
  194.     bool CanResolveRange(CScope* scope,
  195.                          TSeqPos from,
  196.                          TSeqPos length,
  197.                          ENa_strand strand = eNa_strand_plus) const;
  198.     virtual void DebugDump(CDebugDumpContext ddc, unsigned int depth) const;
  199.     static CConstRef<CSeqMap> CreateSeqMapForBioseq(const CBioseq& seq);
  200.     static CConstRef<CSeqMap> CreateSeqMapForSeq_loc(const CSeq_loc& loc,
  201.                                                      CScope* scope);
  202.     static CConstRef<CSeqMap> CreateSeqMapForStrand(CConstRef<CSeqMap> seqMap,
  203.                                                     ENa_strand strand);
  204.     static TSeqPos ResolveBioseqLength(const CSeq_id& id, CScope* scope);
  205. protected:
  206.     // 'ctors
  207.     CSeqMap(CSeqMap* parent, size_t index);
  208.     CSeqMap(void);
  209.     CSeqMap(const CSeq_data& data, TSeqPos len);
  210.     CSeqMap(const CSeq_loc& ref);
  211.     CSeqMap(TSeqPos len); // gap
  212.     void x_AddEnd(void);
  213.     CSegment& x_AddSegment(ESegmentType type, TSeqPos len);
  214.     CSegment& x_AddSegment(ESegmentType type, TSeqPos len, const CObject* object);
  215.     CSegment& x_AddSegment(ESegmentType type, const CObject* object,
  216.                            TSeqPos refPos, TSeqPos len,
  217.                            ENa_strand strand = eNa_strand_plus);
  218.     CSegment& x_AddGap(TSeqPos len);
  219.     CSegment& x_Add(CSeqMap* submap);
  220.     CSegment& x_Add(const CSeq_data& data, TSeqPos len);
  221.     CSegment& x_Add(const CPacked_seqint& seq);
  222.     CSegment& x_Add(const CPacked_seqpnt& seq);
  223.     CSegment& x_Add(const CSeq_loc_mix& seq);
  224.     CSegment& x_Add(const CSeq_loc_equiv& seq);
  225.     CSegment& x_Add(const CSeq_literal& seq);
  226.     CSegment& x_Add(const CDelta_seq& seq);
  227.     CSegment& x_Add(const CSeq_loc& seq);
  228.     CSegment& x_Add(const CSeq_id& seq);
  229.     CSegment& x_Add(const CSeq_point& seq);
  230.     CSegment& x_Add(const CSeq_interval& seq);
  231.     CSegment& x_AddUnloadedSubMap(TSeqPos len);
  232.     CSegment& x_AddUnloadedSeq_data(TSeqPos len);
  233. private:
  234.     void ResolveAll(void) const;
  235.     
  236. private:
  237.     // Prohibit copy operator and constructor
  238.     CSeqMap(const CSeqMap&);
  239.     CSeqMap& operator= (const CSeqMap&);
  240.     
  241. protected:    
  242.     // interface for iterators
  243.     size_t x_GetSegmentsCount(void) const;
  244.     const CSegment& x_GetSegment(size_t index) const;
  245.     void x_GetSegmentException(size_t index) const;
  246.     CSegment& x_SetSegment(size_t index);
  247.     size_t x_FindSegment(TSeqPos position, CScope* scope) const;
  248.     
  249.     TSeqPos x_GetSegmentLength(size_t index, CScope* scope) const;
  250.     TSeqPos x_GetSegmentPosition(size_t index, CScope* scope) const;
  251.     TSeqPos x_ResolveSegmentLength(size_t index, CScope* scope) const;
  252.     TSeqPos x_ResolveSegmentPosition(size_t index, CScope* scope) const;
  253.     CBioseq_Handle x_GetBioseqHandle(const CSegment& seg, CScope* scope) const;
  254.     CConstRef<CSeqMap> x_GetSubSeqMap(const CSegment& seg, CScope* scope,
  255.                                       bool resolveExternal = false) const;
  256.     virtual const CSeq_data& x_GetSeq_data(const CSegment& seg) const;
  257.     virtual const CSeq_id& x_GetRefSeqid(const CSegment& seg) const;
  258.     virtual TSeqPos x_GetRefPosition(const CSegment& seg) const;
  259.     virtual bool x_GetRefMinusStrand(const CSegment& seg) const;
  260.     
  261.     void x_LoadObject(const CSegment& seg) const;
  262.     const CObject* x_GetObject(const CSegment& seg) const;
  263.     CObject* x_GetObject(CSegment& seg);
  264.     virtual void x_SetSeq_data(size_t index, CSeq_data& data);
  265.     virtual void x_SetSubSeqMap(size_t index, CSeqMap_Delta_seqs* subMap);
  266.     typedef vector<CSegment> TSegments;
  267.     
  268.     // segments in this seqmap
  269.     vector<CSegment> m_Segments;
  270.     
  271.     // index of last resolved segment position
  272.     mutable size_t   m_Resolved;
  273.     
  274.     CRef<CObject>    m_Delta;
  275.     // Molecule type from seq-inst
  276.     TMol    m_Mol;
  277.     // Sequence length
  278.     mutable TSeqPos m_SeqLength;
  279.     // MT-protection
  280.     mutable CFastMutex   m_SeqMap_Mtx;
  281.     
  282.     friend class CSeqMap_CI;
  283.     friend class CSeqMap_CI_SegmentInfo;
  284. };
  285. #include <objmgr/seq_map.inl>
  286. END_SCOPE(objects)
  287. END_NCBI_SCOPE
  288. /*
  289. * ---------------------------------------------------------------------------
  290. * $Log: seq_map.hpp,v $
  291. * Revision 1000.2  2004/04/12 17:27:48  gouriano
  292. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  293. *
  294. * Revision 1.44  2004/03/16 15:47:26  vasilche
  295. * Added CBioseq_set_Handle and set of EditHandles
  296. *
  297. * Revision 1.43  2003/11/12 16:53:16  grichenk
  298. * Modified CSeqMap to work with const objects (CBioseq, CSeq_loc etc.)
  299. *
  300. * Revision 1.42  2003/09/30 16:21:59  vasilche
  301. * Updated internal object manager classes to be able to load ID2 data.
  302. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  303. * Scope caches results of requests for data to data loaders.
  304. * Optimized CSeq_id_Handle for gis.
  305. * Optimized bioseq lookup in scope.
  306. * Reduced object allocations in annotation iterators.
  307. * CScope is allowed to be destroyed before other objects using this scope are
  308. * deleted (feature iterators, bioseq handles etc).
  309. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  310. * Added 'adaptive' option to objmgr_demo application.
  311. *
  312. * Revision 1.41  2003/09/05 17:29:39  grichenk
  313. * Structurized Object Manager exceptions
  314. *
  315. * Revision 1.40  2003/07/17 19:10:27  grichenk
  316. * Added methods for seq-map and seq-vector validation,
  317. * updated demo.
  318. *
  319. * Revision 1.39  2003/06/26 19:47:25  grichenk
  320. * Added sequence length cache
  321. *
  322. * Revision 1.38  2003/06/24 14:22:46  vasilche
  323. * Fixed CSeqMap constructor from CSeq_loc.
  324. *
  325. * Revision 1.37  2003/06/11 19:32:53  grichenk
  326. * Added molecule type caching to CSeqMap, simplified
  327. * coding and sequence type calculations in CSeqVector.
  328. *
  329. * Revision 1.36  2003/06/10 19:06:34  vasilche
  330. * Simplified CSeq_id_Mapper and CSeq_id_Handle.
  331. *
  332. * Revision 1.35  2003/06/02 16:01:36  dicuccio
  333. * Rearranged include/objects/ subtree.  This includes the following shifts:
  334. *     - include/objects/alnmgr --> include/objtools/alnmgr
  335. *     - include/objects/cddalignview --> include/objtools/cddalignview
  336. *     - include/objects/flat --> include/objtools/flat
  337. *     - include/objects/objmgr/ --> include/objmgr/
  338. *     - include/objects/util/ --> include/objmgr/util/
  339. *     - include/objects/validator --> include/objtools/validator
  340. *
  341. * Revision 1.34  2003/05/20 20:36:13  vasilche
  342. * Added FindResolved() with strand argument.
  343. *
  344. * Revision 1.33  2003/02/24 18:57:21  vasilche
  345. * Make feature gathering in one linear pass using CSeqMap iterator.
  346. * Do not use feture index by sub locations.
  347. * Sort features at the end of gathering in one vector.
  348. * Extracted some internal structures and classes in separate header.
  349. * Delay creation of mapped features.
  350. *
  351. * Revision 1.32  2003/02/05 15:55:26  vasilche
  352. * Added eSeqEnd segment at the beginning of seq map.
  353. * Added flags to CSeqMap_CI to stop on data, gap, or references.
  354. *
  355. * Revision 1.31  2003/01/28 17:16:22  vasilche
  356. * Added CSeqMap::ResolvedRangeIterator with strand coordinate translation.
  357. *
  358. * Revision 1.30  2003/01/22 20:11:53  vasilche
  359. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  360. * CSeqMap_CI now supports resolution and iteration over sequence range.
  361. * Added several caches to CScope.
  362. * Optimized CSeqVector().
  363. * Added serveral variants of CBioseqHandle::GetSeqVector().
  364. * Tried to optimize annotations iterator (not much success).
  365. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  366. *
  367. * Revision 1.29  2002/12/30 19:35:47  vasilche
  368. * Removed redundant friend declarations.
  369. *
  370. * Revision 1.28  2002/12/27 21:11:09  kuznets
  371. * Fixed Windows specific syntax problem in class CSeqMap::CSegment member
  372. * m_Iterator was an unnamed structure. For correct MSVC compilation must have
  373. * a type name.
  374. *
  375. * Revision 1.27  2002/12/27 19:32:46  ucko
  376. * Add forward declarations for nested classes so they can stay protected.
  377. *
  378. * Revision 1.26  2002/12/27 19:29:41  vasilche
  379. * Fixed access to protected class on WorkShop.
  380. *
  381. * Revision 1.25  2002/12/27 19:04:46  vasilche
  382. * Fixed segmentation fault on 64 bit platforms.
  383. *
  384. * Revision 1.24  2002/12/26 20:49:28  dicuccio
  385. * Wrapped previous unimplemented ctor in #ifdef for MSWIN only
  386. *
  387. * Revision 1.22  2002/12/26 16:39:21  vasilche
  388. * Object manager class CSeqMap rewritten.
  389. *
  390. * Revision 1.21  2002/10/18 19:12:39  grichenk
  391. * Removed mutex pools, converted most static mutexes to non-static.
  392. * Protected CSeqMap::x_Resolve() with mutex. Modified code to prevent
  393. * dead-locks.
  394. *
  395. * Revision 1.20  2002/07/08 20:50:56  grichenk
  396. * Moved log to the end of file
  397. * Replaced static mutex (in CScope, CDataSource) with the mutex
  398. * pool. Redesigned CDataSource data locking.
  399. *
  400. * Revision 1.19  2002/06/30 03:27:38  vakatov
  401. * Get rid of warnings, ident the code, move CVS logs to the end of file
  402. *
  403. * Revision 1.18  2002/05/29 21:19:57  gouriano
  404. * added debug dump
  405. *
  406. * Revision 1.17  2002/05/21 18:40:15  grichenk
  407. * Prohibited copy constructor and operator =()
  408. *
  409. * Revision 1.16  2002/05/06 03:30:36  vakatov
  410. * OM/OM1 renaming
  411. *
  412. * Revision 1.15  2002/05/03 21:28:02  ucko
  413. * Introduce T(Signed)SeqPos.
  414. *
  415. * Revision 1.14  2002/04/30 18:54:50  gouriano
  416. * added GetRefSeqid function
  417. *
  418. * Revision 1.13  2002/04/11 12:07:28  grichenk
  419. * Redesigned CAnnotTypes_CI to resolve segmented sequences correctly.
  420. *
  421. * Revision 1.12  2002/04/05 21:26:17  grichenk
  422. * Enabled iteration over annotations defined on segments of a
  423. * delta-sequence.
  424. *
  425. * Revision 1.11  2002/04/02 16:40:53  grichenk
  426. * Fixed literal segments handling
  427. *
  428. * Revision 1.10  2002/03/27 15:07:53  grichenk
  429. * Fixed CSeqMap::CSegmentInfo::operator==()
  430. *
  431. * Revision 1.9  2002/03/15 18:10:05  grichenk
  432. * Removed CRef<CSeq_id> from CSeq_id_Handle, added
  433. * key to seq-id map th CSeq_id_Mapper
  434. *
  435. * Revision 1.8  2002/03/08 21:25:30  gouriano
  436. * fixed errors with unresolvable references
  437. *
  438. * Revision 1.7  2002/02/25 21:05:26  grichenk
  439. * Removed seq-data references caching. Increased MT-safety. Fixed typos.
  440. *
  441. * Revision 1.6  2002/02/21 19:27:00  grichenk
  442. * Rearranged includes. Added scope history. Added searching for the
  443. * best seq-id match in data sources and scopes. Updated tests.
  444. *
  445. * Revision 1.5  2002/02/15 20:36:29  gouriano
  446. * changed implementation of HandleRangeMap
  447. *
  448. * Revision 1.4  2002/01/30 22:08:47  gouriano
  449. * changed CSeqMap interface
  450. *
  451. * Revision 1.3  2002/01/23 21:59:29  grichenk
  452. * Redesigned seq-id handles and mapper
  453. *
  454. * Revision 1.2  2002/01/16 16:26:37  gouriano
  455. * restructured objmgr
  456. *
  457. * Revision 1.1  2002/01/11 19:04:04  gouriano
  458. * restructured objmgr
  459. *
  460. * ===========================================================================
  461. */
  462. #endif  // OBJECTS_OBJMGR___SEQ_MAP__HPP