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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_map_ci.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:27:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___SEQ_MAP_CI__HPP
  10. #define OBJECTS_OBJMGR___SEQ_MAP_CI__HPP
  11. /*  $Id: seq_map_ci.hpp,v 1000.2 2004/04/12 17:27:51 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. *           Eugene Vasilchenko
  38. *
  39. * File Description:
  40. *   CSeqMap -- formal sequence map to describe sequence parts in general,
  41. *   i.e. location and type only, without providing real data
  42. *
  43. */
  44. #include <objmgr/seq_map.hpp>
  45. #include <objmgr/scope.hpp>
  46. #include <objmgr/seq_id_handle.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. class CScope;
  50. class CSeqMap;
  51. class CSeq_entry;
  52. class NCBI_XOBJMGR_EXPORT CSeqMap_CI_SegmentInfo
  53. {
  54. public:
  55.     CSeqMap_CI_SegmentInfo(void);
  56.     CSeqMap_CI_SegmentInfo(const CConstRef<CSeqMap>& seqMap, size_t index);
  57.     TSeqPos GetRefPosition(void) const;
  58.     bool GetRefMinusStrand(void) const;
  59.     const CSeqMap& x_GetSeqMap(void) const;
  60.     size_t x_GetIndex(void) const;
  61.     const CSeqMap::CSegment& x_GetSegment(void) const;
  62.     const CSeqMap::CSegment& x_GetNextSegment(void) const;
  63.     bool InRange(void) const;
  64.     CSeqMap::ESegmentType GetType(void) const;
  65.     bool x_Move(bool minusStrand, CScope* scope);
  66.     TSeqPos x_GetLevelRealPos(void) const;
  67.     TSeqPos x_GetLevelRealEnd(void) const;
  68.     TSeqPos x_GetLevelPos(void) const;
  69.     TSeqPos x_GetLevelEnd(void) const;
  70.     TSeqPos x_GetSkipBefore(void) const;
  71.     TSeqPos x_GetSkipAfter(void) const;
  72.     TSeqPos x_CalcLength(void) const;
  73.     TSeqPos x_GetTopOffset(void) const;
  74. private:
  75.     // seqmap
  76.     CConstRef<CSeqMap> m_SeqMap;
  77.     // index of segment in seqmap
  78.     size_t             m_Index;
  79.     // position inside m_SeqMap
  80.     // m_RangeEnd >= m_RangePos
  81.     TSeqPos            m_LevelRangePos;
  82.     TSeqPos            m_LevelRangeEnd;
  83.     bool               m_MinusStrand;
  84.     friend class CSeqMap_CI;
  85. };
  86. struct NCBI_XOBJMGR_EXPORT SSeqMapSelector
  87. {
  88.     typedef CSeqMap::TFlags TFlags;
  89.     SSeqMapSelector()
  90.         : m_Position(0), m_Length(kInvalidSeqPos),
  91.           m_MaxResolveCount(0),
  92.           m_Flags(CSeqMap::fDefaultFlags)
  93.         {
  94.         }
  95.     SSeqMapSelector& SetPosition(TSeqPos pos)
  96.         {
  97.             m_Position = pos;
  98.             return *this;
  99.         }
  100.     SSeqMapSelector& SetRange(TSeqPos start, TSeqPos length)
  101.         {
  102.             m_Position = start;
  103.             m_Length = length;
  104.             return *this;
  105.         }
  106.     SSeqMapSelector& SetResolveCount(size_t res_cnt)
  107.         {
  108.             m_MaxResolveCount = res_cnt;
  109.             return *this;
  110.         }
  111.     SSeqMapSelector& SetLimitTSE(const CSeq_entry* tse);
  112.     SSeqMapSelector& SetLimitTSE(const CSeq_entry_Handle& tse);
  113.     SSeqMapSelector& SetFlags(TFlags flags)
  114.         {
  115.             m_Flags = flags;
  116.             return *this;
  117.         }
  118.     bool CanResolve(void) const
  119.         {
  120.             return m_MaxResolveCount > 0;
  121.         }
  122.     void PushResolve(void)
  123.         {
  124.             _ASSERT(CanResolve());
  125.             --m_MaxResolveCount;
  126.         }
  127.     void PopResolve(void)
  128.         {
  129.             ++m_MaxResolveCount;
  130.             _ASSERT(CanResolve());
  131.         }
  132. private:
  133.     friend class CSeqMap_CI;
  134.     // position of segment in whole sequence in residues
  135.     TSeqPos             m_Position;
  136.     // length of current segment
  137.     TSeqPos             m_Length;
  138.     // maximum resolution level
  139.     size_t              m_MaxResolveCount;
  140.     // limit search to single TSE
  141.     CConstRef<CSeq_entry> m_TSE;
  142.     CConstRef<CObject>  m_TSE_Info;
  143.     // return all intermediate resolved sequences
  144.     TFlags              m_Flags;
  145. };
  146. // iterator through CSeqMap
  147. class NCBI_XOBJMGR_EXPORT CSeqMap_CI
  148. {
  149. public:
  150.     typedef SSeqMapSelector::TFlags TFlags;
  151.     CSeqMap_CI(void);
  152.     CSeqMap_CI(const CConstRef<CSeqMap>& seqmap,
  153.                CScope* scope,
  154.                TSeqPos position,
  155.                size_t maxResolveCount = 0,
  156.                TFlags flags = CSeqMap::fDefaultFlags);
  157.     CSeqMap_CI(const CConstRef<CSeqMap>& seqMap,
  158.                CScope* scope,
  159.                TSeqPos position,
  160.                ENa_strand strand,
  161.                size_t maxResolveCount,
  162.                TFlags flags = CSeqMap::fDefaultFlags);
  163.     CSeqMap_CI(const CConstRef<CSeqMap>& seqmap,
  164.                CScope* scope,
  165.                SSeqMapSelector& selector);
  166.     CSeqMap_CI(const CConstRef<CSeqMap>& seqmap,
  167.                CScope* scope,
  168.                SSeqMapSelector& selector,
  169.                ENa_strand strand);
  170.     ~CSeqMap_CI(void);
  171.     bool IsInvalid(void) const;
  172.     operator bool(void) const;
  173.     bool operator==(const CSeqMap_CI& seg) const;
  174.     bool operator!=(const CSeqMap_CI& seg) const;
  175.     bool operator< (const CSeqMap_CI& seg) const;
  176.     bool operator> (const CSeqMap_CI& seg) const;
  177.     bool operator<=(const CSeqMap_CI& seg) const;
  178.     bool operator>=(const CSeqMap_CI& seg) const;
  179.     // go to next/next segment, return false if no more segments
  180.     // if no_resolve_current == true, do not resolve current segment
  181.     bool Next(bool resolveExternal = true);
  182.     bool Prev(void);
  183.     TFlags GetFlags(void) const;
  184.     void SetFlags(TFlags flags);
  185.     CSeqMap_CI& operator++(void);
  186.     CSeqMap_CI& operator--(void);
  187.     // return position of current segment in sequence
  188.     TSeqPos      GetPosition(void) const;
  189.     // return length of current segment
  190.     TSeqPos      GetLength(void) const;
  191.     // return end position of current segment in sequence (exclusive)
  192.     TSeqPos      GetEndPosition(void) const;
  193.     CSeqMap::ESegmentType GetType(void) const;
  194.     // will allow only regular data segments (whole, plus strand)
  195.     const CSeq_data& GetData(void) const;
  196.     // will allow any data segments, user should check for position and strand
  197.     const CSeq_data& GetRefData(void) const;
  198.     // The following function makes sense only
  199.     // when the segment is a reference to another seq.
  200.     CSeq_id_Handle GetRefSeqid(void) const;
  201.     TSeqPos GetRefPosition(void) const;
  202.     TSeqPos GetRefEndPosition(void) const;
  203.     bool GetRefMinusStrand(void) const;
  204.     CScope* GetScope(void) const;
  205.     CConstRef<CSeqMap> x_GetSubSeqMap(bool resolveExternal) const;
  206.     CConstRef<CSeqMap> x_GetSubSeqMap(void) const;
  207. private:
  208.     typedef CSeqMap_CI_SegmentInfo TSegmentInfo;
  209.     const TSegmentInfo& x_GetSegmentInfo(void) const;
  210.     TSegmentInfo& x_GetSegmentInfo(void);
  211.     // Check if the current reference can be resolved in the TSE
  212.     // set by selector
  213.     bool x_RefTSEMatch(const CSeqMap::CSegment& seg) const;
  214.     bool x_CanResolve(const CSeqMap::CSegment& seg) const;
  215.     // valid iterator
  216.     const CSeqMap& x_GetSeqMap(void) const;
  217.     size_t x_GetIndex(void) const;
  218.     const CSeqMap::CSegment& x_GetSegment(void) const;
  219.     TSeqPos x_GetTopOffset(void) const;
  220.     void x_Resolve(TSeqPos pos);
  221.     bool x_Found(void) const;
  222.     bool x_Push(TSeqPos offset, bool resolveExternal);
  223.     bool x_Push(TSeqPos offset);
  224.     void x_Push(const CConstRef<CSeqMap>& seqMap,
  225.                 TSeqPos from, TSeqPos length, bool minusStrand, TSeqPos pos);
  226.     bool x_Pop(void);
  227.     bool x_Next(bool resolveExternal);
  228.     bool x_Next(void);
  229.     bool x_Prev(void);
  230.     bool x_TopNext(void);
  231.     bool x_TopPrev(void);
  232.     bool x_SettleNext(void);
  233.     bool x_SettlePrev(void);
  234.     typedef vector<TSegmentInfo> TStack;
  235.     // position stack
  236.     TStack               m_Stack;
  237.     // scope for length resolution
  238.     CHeapScope           m_Scope;
  239.     // iterator parameters
  240.     SSeqMapSelector      m_Selector;
  241. };
  242. #include <objmgr/seq_map_ci.inl>
  243. END_SCOPE(objects)
  244. END_NCBI_SCOPE
  245. /*
  246. * ---------------------------------------------------------------------------
  247. * $Log: seq_map_ci.hpp,v $
  248. * Revision 1000.2  2004/04/12 17:27:51  gouriano
  249. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  250. *
  251. * Revision 1.13  2004/03/16 15:47:26  vasilche
  252. * Added CBioseq_set_Handle and set of EditHandles
  253. *
  254. * Revision 1.12  2004/01/27 17:11:13  ucko
  255. * Remove redundant forward declaration of CTSE_Info
  256. *
  257. * Revision 1.11  2003/11/10 18:12:09  grichenk
  258. * Removed extra EFlags declaration from seq_map_ci.hpp
  259. *
  260. * Revision 1.10  2003/09/30 16:21:59  vasilche
  261. * Updated internal object manager classes to be able to load ID2 data.
  262. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  263. * Scope caches results of requests for data to data loaders.
  264. * Optimized CSeq_id_Handle for gis.
  265. * Optimized bioseq lookup in scope.
  266. * Reduced object allocations in annotation iterators.
  267. * CScope is allowed to be destroyed before other objects using this scope are
  268. * deleted (feature iterators, bioseq handles etc).
  269. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  270. * Added 'adaptive' option to objmgr_demo application.
  271. *
  272. * Revision 1.9  2003/08/27 21:24:16  vasilche
  273. * Added CSeqMap_CI::IsInvalid() method.
  274. *
  275. * Revision 1.8  2003/07/14 21:13:22  grichenk
  276. * Added possibility to resolve seq-map iterator withing a single TSE
  277. * and to skip intermediate references during this resolving.
  278. *
  279. * Revision 1.7  2003/06/02 16:01:36  dicuccio
  280. * Rearranged include/objects/ subtree.  This includes the following shifts:
  281. *     - include/objects/alnmgr --> include/objtools/alnmgr
  282. *     - include/objects/cddalignview --> include/objtools/cddalignview
  283. *     - include/objects/flat --> include/objtools/flat
  284. *     - include/objects/objmgr/ --> include/objmgr/
  285. *     - include/objects/util/ --> include/objmgr/util/
  286. *     - include/objects/validator --> include/objtools/validator
  287. *
  288. * Revision 1.6  2003/05/20 20:36:13  vasilche
  289. * Added FindResolved() with strand argument.
  290. *
  291. * Revision 1.5  2003/05/20 15:44:37  vasilche
  292. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  293. * Fixed some warnings on WorkShop.
  294. * Added workaround for memory leak on WorkShop.
  295. *
  296. * Revision 1.4  2003/02/05 15:55:26  vasilche
  297. * Added eSeqEnd segment at the beginning of seq map.
  298. * Added flags to CSeqMap_CI to stop on data, gap, or references.
  299. *
  300. * Revision 1.3  2003/01/22 20:11:53  vasilche
  301. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  302. * CSeqMap_CI now supports resolution and iteration over sequence range.
  303. * Added several caches to CScope.
  304. * Optimized CSeqVector().
  305. * Added serveral variants of CBioseqHandle::GetSeqVector().
  306. * Tried to optimize annotations iterator (not much success).
  307. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  308. *
  309. * Revision 1.2  2002/12/26 20:51:36  dicuccio
  310. * Added Win32 export specifier
  311. *
  312. * Revision 1.1  2002/12/26 16:39:22  vasilche
  313. * Object manager class CSeqMap rewritten.
  314. *
  315. *
  316. * ===========================================================================
  317. */
  318. #endif  // OBJECTS_OBJMGR___SEQ_MAP_CI__HPP