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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_map_ci.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:24:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_map_ci.cpp,v 1000.3 2004/06/01 19:24:19 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:
  35. *           Eugene Vasilchenko
  36. *
  37. * File Description:
  38. *   Sequence map for the Object Manager. Describes sequence as a set of
  39. *   segments of different types (data, reference, gap or end).
  40. *
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <objmgr/seq_map_ci.hpp>
  44. #include <objmgr/seq_map.hpp>
  45. #include <objmgr/seq_entry_handle.hpp>
  46. #include <objmgr/impl/scope_impl.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. /////////////////////////////////////////////////////////////////////////////
  50. // SSeqMapSelector
  51. /////////////////////////////////////////////////////////////////////////////
  52. SSeqMapSelector& SSeqMapSelector::SetLimitTSE(const CSeq_entry* tse)
  53. {
  54.     m_TSE.Reset(tse);
  55.     m_TSE_Info.Reset();
  56.     return *this;
  57. }
  58. SSeqMapSelector& SSeqMapSelector::SetLimitTSE(const CSeq_entry_Handle& tse)
  59. {
  60.     if ( tse ) {
  61.         m_TSE_Info = tse.GetTSE_Info();
  62.         m_TSE = tse.GetSeq_entryCore();
  63.     }
  64.     else {
  65.         m_TSE_Info.Reset();
  66.         m_TSE.Reset();
  67.     }
  68.     return *this;
  69. }
  70. ////////////////////////////////////////////////////////////////////
  71. // CSeqMap_CI_SegmentInfo
  72. bool CSeqMap_CI_SegmentInfo::x_Move(bool minusStrand, CScope* scope)
  73. {
  74.     const CSeqMap& seqMap = *m_SeqMap;
  75.     size_t index = m_Index;
  76.     const CSeqMap::CSegment& old_seg = seqMap.x_GetSegment(index);
  77.     if ( !minusStrand ) {
  78.         if ( old_seg.m_Position > m_LevelRangeEnd ||
  79.              index == seqMap.x_GetSegmentsCount() )
  80.             return false;
  81.         m_Index = ++index;
  82.         seqMap.x_GetSegmentLength(index, scope); // Update length of segment
  83.         return seqMap.x_GetSegmentPosition(index, scope) < m_LevelRangeEnd;
  84.     }
  85.     else {
  86.         if ( old_seg.m_Position + old_seg.m_Length < m_LevelRangePos ||
  87.              index == 0 )
  88.             return false;
  89.         m_Index = --index;
  90.         return old_seg.m_Position > m_LevelRangePos;
  91.     }
  92. }
  93. ////////////////////////////////////////////////////////////////////
  94. // CSeqMap_CI
  95. inline
  96. bool CSeqMap_CI::x_Push(TSeqPos pos)
  97. {
  98.     return x_Push(pos, m_Selector.CanResolve());
  99. }
  100. CSeqMap_CI::CSeqMap_CI(void)
  101. {
  102.     m_Selector.SetPosition(kInvalidSeqPos)
  103.         .SetResolveCount(0)
  104.         .SetFlags(CSeqMap::fDefaultFlags);
  105. }
  106. CSeqMap_CI::CSeqMap_CI(const CConstRef<CSeqMap>& seqMap,
  107.                        CScope* scope,
  108.                        TSeqPos pos,
  109.                        size_t maxResolveCount,
  110.                        TFlags flags)
  111.     : m_Scope(scope)
  112. {
  113.     m_Selector
  114.         .SetResolveCount(maxResolveCount)
  115.         .SetFlags(flags);
  116.     if (pos >= seqMap->GetLength(scope)) {
  117.         // Special case - end of seq map
  118.         m_Selector.SetRange(seqMap->GetLength(scope), 0);
  119.         TSegmentInfo push;
  120.         push.m_SeqMap = seqMap;
  121.         push.m_LevelRangePos = 0;
  122.         push.m_LevelRangeEnd = GetPosition();
  123.         push.m_MinusStrand = false;
  124.         push.m_Index = seqMap->x_GetSegmentsCount();
  125.         m_Stack.push_back(push);
  126.         return;
  127.     }
  128.     x_Push(seqMap, 0, seqMap->GetLength(scope), false, pos);
  129.     while ( !x_Found() ) {
  130.         if ( !x_Push(pos - GetPosition()) ) {
  131.             x_SettleNext();
  132.             break;
  133.         }
  134.     }
  135. }
  136. CSeqMap_CI::CSeqMap_CI(const CConstRef<CSeqMap>& seqMap,
  137.                        CScope* scope,
  138.                        TSeqPos pos,
  139.                        ENa_strand strand,
  140.                        size_t maxResolveCount,
  141.                        TFlags flags)
  142.     : m_Scope(scope)
  143. {
  144.     m_Selector
  145.         .SetResolveCount(maxResolveCount)
  146.         .SetFlags(flags);
  147.     if (pos >= seqMap->GetLength(scope)) {
  148.         // Special case - end of seq map
  149.         m_Selector.SetRange(seqMap->GetLength(scope), 0);
  150.         TSegmentInfo push;
  151.         push.m_SeqMap = seqMap;
  152.         push.m_LevelRangePos = 0;
  153.         push.m_LevelRangeEnd = GetPosition();
  154.         push.m_MinusStrand = false;
  155.         push.m_Index = seqMap->x_GetSegmentsCount();
  156.         m_Stack.push_back(push);
  157.         return;
  158.     }
  159.     x_Push(seqMap, 0, seqMap->GetLength(scope), IsReverse(strand), pos);
  160.     while ( !x_Found() ) {
  161.         if ( !x_Push(pos - GetPosition()) ) {
  162.             x_SettleNext();
  163.             break;
  164.         }
  165.     }
  166. }
  167. CSeqMap_CI::CSeqMap_CI(const CConstRef<CSeqMap>& seqMap,
  168.                        CScope* scope,
  169.                        SSeqMapSelector& selector,
  170.                        ENa_strand strand)
  171.     : m_Scope(scope),
  172.       m_Selector(selector)
  173. {
  174.     TSeqPos pos = GetPosition();
  175.     x_Push(seqMap,
  176.            m_Selector.m_Position,
  177.            m_Selector.m_Length,
  178.            IsReverse(strand), 0);
  179.     while ( !x_Found() ) {
  180.         if ( !x_Push(pos - GetPosition()) ) {
  181.             x_SettleNext();
  182.             break;
  183.         }
  184.     }
  185. }
  186. CSeqMap_CI::CSeqMap_CI(const CConstRef<CSeqMap>& seqMap,
  187.                        CScope* scope,
  188.                        SSeqMapSelector& selector)
  189.     : m_Scope(scope),
  190.       m_Selector(selector)
  191. {
  192.     TSeqPos pos = GetPosition();
  193.     if (m_Selector.m_Length == kInvalidSeqPos) {
  194.         m_Selector.SetRange(pos, seqMap->GetLength(scope));
  195.     }
  196.     x_Push(seqMap,
  197.            m_Selector.m_Position,
  198.            m_Selector.m_Length,
  199.            false, 0);
  200.     while ( !x_Found() ) {
  201.         if ( !x_Push(pos - GetPosition()) ) {
  202.             x_SettleNext();
  203.             break;
  204.         }
  205.     }
  206. }
  207. CSeqMap_CI::~CSeqMap_CI(void)
  208. {
  209. }
  210. const CSeq_data& CSeqMap_CI::GetData(void) const
  211. {
  212.     if ( !*this ) {
  213.         NCBI_THROW(CSeqMapException, eOutOfRange,
  214.                    "Iterator out of range");
  215.     }
  216.     if ( GetRefPosition() != 0 || GetRefMinusStrand() ) {
  217.         NCBI_THROW(CSeqMapException, eDataError,
  218.                    "Non standard Seq_data: use methods "
  219.                    "GetRefData/GetRefPosition/GetRefMinusStrand");
  220.     }
  221.     return GetRefData();
  222. }
  223. const CSeq_data& CSeqMap_CI::GetRefData(void) const
  224. {
  225.     if ( !*this ) {
  226.         NCBI_THROW(CSeqMapException, eOutOfRange,
  227.                    "Iterator out of range");
  228.     }
  229.     return x_GetSeqMap().x_GetSeq_data(x_GetSegment());
  230. }
  231. CSeq_id_Handle CSeqMap_CI::GetRefSeqid(void) const
  232. {
  233.     if ( !*this ) {
  234.         NCBI_THROW(CSeqMapException, eOutOfRange,
  235.                    "Iterator out of range");
  236.     }
  237.     return CSeq_id_Mapper::GetSeq_id_Mapper().
  238.         GetHandle(x_GetSeqMap().x_GetRefSeqid(x_GetSegment()));
  239. }
  240. TSeqPos CSeqMap_CI_SegmentInfo::GetRefPosition(void) const
  241. {
  242.     if ( !InRange() ) {
  243.         NCBI_THROW(CSeqMapException, eOutOfRange,
  244.                    "Iterator out of range");
  245.     }
  246.     const CSeqMap::CSegment& seg = x_GetSegment();
  247.     TSignedSeqPos skip;
  248.     if ( !seg.m_RefMinusStrand ) {
  249.         skip = m_LevelRangePos - seg.m_Position;
  250.     }
  251.     else {
  252.         skip = (seg.m_Position + seg.m_Length) - m_LevelRangeEnd;
  253.     }
  254.     if ( skip < 0 )
  255.         skip = 0;
  256.     return seg.m_RefPosition + skip;
  257. }
  258. TSeqPos CSeqMap_CI_SegmentInfo::x_GetTopOffset(void) const
  259. {
  260.     TSignedSeqPos offset;
  261.     if ( !m_MinusStrand ) {
  262.         offset = min(x_GetLevelRealPos(), m_LevelRangeEnd) - m_LevelRangePos;
  263.     }
  264.     else {
  265.         offset = m_LevelRangeEnd - max(x_GetLevelRealEnd(), m_LevelRangePos);
  266.     }
  267.     if ( offset < 0 )
  268.         offset = 0;
  269.     return offset;
  270. }
  271. TSeqPos CSeqMap_CI::x_GetTopOffset(void) const
  272. {
  273.     return x_GetSegmentInfo().x_GetTopOffset();
  274. }
  275. bool CSeqMap_CI::x_RefTSEMatch(const CSeqMap::CSegment& seg) const
  276. {
  277.     _ASSERT(m_Selector.m_TSE);
  278.     _ASSERT(CSeqMap::ESegmentType(seg.m_SegType) == CSeqMap::eSeqRef);
  279.     CSeq_id_Handle id = CSeq_id_Mapper::GetSeq_id_Mapper().
  280.         GetHandle(x_GetSeqMap().x_GetRefSeqid(seg));
  281.     CSeq_entry_Handle tse_info;
  282.     CScope& scope = *m_Scope;
  283.     if ( m_Selector.m_TSE_Info ) {
  284.         tse_info =
  285.             CSeq_entry_Handle(scope,
  286.                               static_cast<const CTSE_Info&>
  287.                               (*m_Selector.m_TSE_Info));
  288.     }
  289.     else {
  290.         tse_info = scope.GetSeq_entryHandle(*m_Selector.m_TSE);
  291.         const_cast<SSeqMapSelector&>(m_Selector).m_TSE_Info =
  292.             tse_info.GetTSE_Info();
  293.     }
  294.     return scope.GetBioseqHandleFromTSE(id, tse_info);
  295. }
  296. inline
  297. bool CSeqMap_CI::x_CanResolve(const CSeqMap::CSegment& seg) const
  298. {
  299.     return m_Selector.CanResolve() &&
  300.         (!m_Selector.m_TSE || x_RefTSEMatch(seg));
  301. }
  302. bool CSeqMap_CI::x_Push(TSeqPos pos, bool resolveExternal)
  303. {
  304.     const TSegmentInfo& info = x_GetSegmentInfo();
  305.     const CSeqMap::CSegment& seg = info.x_GetSegment();
  306.     CSeqMap::ESegmentType type = CSeqMap::ESegmentType(seg.m_SegType);
  307.     if ( !(type == CSeqMap::eSeqSubMap  ||
  308.            type == CSeqMap::eSeqRef  &&  resolveExternal) ) {
  309.         return false;
  310.     }
  311.     // Check TSE limit
  312.     if ( bool(m_Selector.m_TSE)  &&  !x_RefTSEMatch(seg) ) {
  313.         return false;
  314.     }
  315.     x_Push(info.m_SeqMap->x_GetSubSeqMap(seg, GetScope(), resolveExternal),
  316.            GetRefPosition(), GetLength(), GetRefMinusStrand(), pos);
  317.     if ( type == CSeqMap::eSeqRef ) {
  318.         m_Selector.PushResolve();
  319.     }
  320.     return true;
  321. }
  322. void CSeqMap_CI::x_Push(const CConstRef<CSeqMap>& seqMap,
  323.                         TSeqPos from, TSeqPos length,
  324.                         bool minusStrand,
  325.                         TSeqPos pos)
  326. {
  327.     TSegmentInfo push;
  328.     push.m_SeqMap = seqMap;
  329.     push.m_LevelRangePos = from;
  330.     push.m_LevelRangeEnd = from + length;
  331.     push.m_MinusStrand = minusStrand;
  332.     TSeqPos findOffset = !minusStrand? pos: length - 1 - pos;
  333.     push.m_Index = seqMap->x_FindSegment(from + findOffset, GetScope());
  334.     if ( push.m_Index == size_t(-1) ) {
  335.         _ASSERT(length == 0);
  336.         push.m_Index = !minusStrand? seqMap->x_GetSegmentsCount(): 0;
  337.     }
  338.     else {
  339.         _ASSERT(push.m_Index < seqMap->x_GetSegmentsCount());
  340.     }
  341.     // update length of current segment
  342.     seqMap->x_GetSegmentLength(push.m_Index, GetScope());
  343.     m_Stack.push_back(push);
  344.     // update position
  345.     m_Selector.m_Position += x_GetTopOffset();
  346.     // update length
  347.     m_Selector.m_Length = push.x_CalcLength();
  348. }
  349. bool CSeqMap_CI::x_Pop(void)
  350. {
  351.     if ( m_Stack.size() <= 1 ) {
  352.         return false;
  353.     }
  354.     m_Selector.m_Position -= x_GetTopOffset();
  355.     m_Stack.pop_back();
  356.     if ( x_GetSegment().m_SegType == CSeqMap::eSeqRef ) {
  357.         m_Selector.PopResolve();
  358.     }
  359.     m_Selector.m_Length = x_GetSegmentInfo().x_CalcLength();
  360.     return true;
  361. }
  362. bool CSeqMap_CI::x_TopNext(void)
  363. {
  364.     TSegmentInfo& top = x_GetSegmentInfo();
  365.     m_Selector.m_Position += m_Selector.m_Length;
  366.     if ( !top.x_Move(top.m_MinusStrand, GetScope()) ) {
  367.         m_Selector.m_Length = 0;
  368.         return false;
  369.     }
  370.     else {
  371.         m_Selector.m_Length = x_GetSegmentInfo().x_CalcLength();
  372.         return true;
  373.     }
  374. }
  375. bool CSeqMap_CI::x_TopPrev(void)
  376. {
  377.     TSegmentInfo& top = x_GetSegmentInfo();
  378.     if ( !top.x_Move(!top.m_MinusStrand, GetScope()) ) {
  379.         m_Selector.m_Length = 0;
  380.         return false;
  381.     }
  382.     else {
  383.         m_Selector.m_Length = x_GetSegmentInfo().x_CalcLength();
  384.         m_Selector.m_Position -= m_Selector.m_Length;
  385.         return true;
  386.     }
  387. }
  388. inline
  389. bool CSeqMap_CI::x_Next(void)
  390. {
  391.     return x_Next(m_Selector.CanResolve());
  392. }
  393. bool CSeqMap_CI::x_Next(bool resolveExternal)
  394. {
  395.     if ( x_Push(0, resolveExternal) ) {
  396.         return true;
  397.     }
  398.     do {
  399.         if ( x_TopNext() )
  400.             return true;
  401.     } while ( x_Pop() );
  402.     return false;
  403. }
  404. bool CSeqMap_CI::x_Prev(void)
  405. {
  406.     if ( !x_TopPrev() )
  407.         return x_Pop();
  408.     while ( x_Push(m_Selector.m_Length-1) ) {
  409.     }
  410.     return true;
  411. }
  412. bool CSeqMap_CI::x_Found(void) const
  413. {
  414.     switch ( x_GetSegment().m_SegType ) {
  415.     case CSeqMap::eSeqRef:
  416.         if ( (GetFlags() & CSeqMap::fFindLeafRef) != 0 ) {
  417.             if ( (GetFlags() & CSeqMap::fFindInnerRef) != 0 ) {
  418.                 // both
  419.                 return true;
  420.             }
  421.             else {
  422.                 // leaf only
  423.                 return !x_CanResolve(x_GetSegment());
  424.             }
  425.         }
  426.         else {
  427.             if ( (GetFlags() & CSeqMap::fFindInnerRef) != 0 ) {
  428.                 // inner only
  429.                 return x_CanResolve(x_GetSegment());
  430.             }
  431.             else {
  432.                 // none
  433.                 return false;
  434.             }
  435.         }
  436.     case CSeqMap::eSeqData:
  437.         return (GetFlags() & CSeqMap::fFindData) != 0;
  438.     case CSeqMap::eSeqGap:
  439.         return (GetFlags() & CSeqMap::fFindGap) != 0;
  440.     case CSeqMap::eSeqSubMap:
  441.         return false; // always skip submaps
  442.     default:
  443.         return true;
  444.     }
  445. }
  446. bool CSeqMap_CI::x_SettleNext(void)
  447. {
  448.     while ( !x_Found() ) {
  449.         if ( !x_Next() )
  450.             return false;
  451.     }
  452.     return true;
  453. }
  454. bool CSeqMap_CI::x_SettlePrev(void)
  455. {
  456.     while ( !x_Found() ) {
  457.         if ( !x_Prev() )
  458.             return false;
  459.     }
  460.     return true;
  461. }
  462. bool CSeqMap_CI::Next(bool resolveCurrentExternal)
  463. {
  464.     return x_Next(resolveCurrentExternal && m_Selector.CanResolve()) &&
  465.         x_SettleNext();
  466. }
  467. bool CSeqMap_CI::Prev(void)
  468. {
  469.     return x_Prev() && x_SettlePrev();
  470. }
  471. void CSeqMap_CI::SetFlags(TFlags flags)
  472. {
  473.     m_Selector.SetFlags(flags);
  474. }
  475. END_SCOPE(objects)
  476. END_NCBI_SCOPE
  477. /*
  478. * ---------------------------------------------------------------------------
  479. * $Log: seq_map_ci.cpp,v $
  480. * Revision 1000.3  2004/06/01 19:24:19  gouriano
  481. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  482. *
  483. * Revision 1.23  2004/05/21 21:42:13  gorelenk
  484. * Added PCH ncbi_pch.hpp
  485. *
  486. * Revision 1.22  2004/04/12 16:49:16  vasilche
  487. * Allow null scope in CSeqMap_CI and CSeqVector.
  488. *
  489. * Revision 1.21  2004/03/16 15:47:28  vasilche
  490. * Added CBioseq_set_Handle and set of EditHandles
  491. *
  492. * Revision 1.20  2003/11/10 18:12:09  grichenk
  493. * Removed extra EFlags declaration from seq_map_ci.hpp
  494. *
  495. * Revision 1.19  2003/09/30 16:22:04  vasilche
  496. * Updated internal object manager classes to be able to load ID2 data.
  497. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  498. * Scope caches results of requests for data to data loaders.
  499. * Optimized CSeq_id_Handle for gis.
  500. * Optimized bioseq lookup in scope.
  501. * Reduced object allocations in annotation iterators.
  502. * CScope is allowed to be destroyed before other objects using this scope are
  503. * deleted (feature iterators, bioseq handles etc).
  504. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  505. * Added 'adaptive' option to objmgr_demo application.
  506. *
  507. * Revision 1.18  2003/09/05 17:29:40  grichenk
  508. * Structurized Object Manager exceptions
  509. *
  510. * Revision 1.17  2003/08/27 14:27:19  vasilche
  511. * Use Reverse(ENa_strand) function.
  512. *
  513. * Revision 1.16  2003/07/17 22:51:31  vasilche
  514. * Fixed unused variables warnings.
  515. *
  516. * Revision 1.15  2003/07/14 21:13:26  grichenk
  517. * Added possibility to resolve seq-map iterator withing a single TSE
  518. * and to skip intermediate references during this resolving.
  519. *
  520. * Revision 1.14  2003/06/02 16:06:38  dicuccio
  521. * Rearranged src/objects/ subtree.  This includes the following shifts:
  522. *     - src/objects/asn2asn --> arc/app/asn2asn
  523. *     - src/objects/testmedline --> src/objects/ncbimime/test
  524. *     - src/objects/objmgr --> src/objmgr
  525. *     - src/objects/util --> src/objmgr/util
  526. *     - src/objects/alnmgr --> src/objtools/alnmgr
  527. *     - src/objects/flat --> src/objtools/flat
  528. *     - src/objects/validator --> src/objtools/validator
  529. *     - src/objects/cddalignview --> src/objtools/cddalignview
  530. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  531. * replaces the three libmmdb? libs.
  532. *
  533. * Revision 1.13  2003/05/23 16:32:21  vasilche
  534. * Fixed backward traversal of CSeqMap_CI.
  535. *
  536. * Revision 1.12  2003/05/20 20:36:14  vasilche
  537. * Added FindResolved() with strand argument.
  538. *
  539. * Revision 1.11  2003/05/20 15:44:38  vasilche
  540. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  541. * Fixed some warnings on WorkShop.
  542. * Added workaround for memory leak on WorkShop.
  543. *
  544. * Revision 1.10  2003/02/27 16:29:19  vasilche
  545. * Fixed lost features from first segment.
  546. *
  547. * Revision 1.9  2003/02/25 14:48:29  vasilche
  548. * Removed performance warning on Windows.
  549. *
  550. * Revision 1.8  2003/02/24 18:57:22  vasilche
  551. * Make feature gathering in one linear pass using CSeqMap iterator.
  552. * Do not use feture index by sub locations.
  553. * Sort features at the end of gathering in one vector.
  554. * Extracted some internal structures and classes in separate header.
  555. * Delay creation of mapped features.
  556. *
  557. * Revision 1.7  2003/02/11 19:26:18  vasilche
  558. * Fixed CSeqMap_CI with ending NULL segment.
  559. *
  560. * Revision 1.6  2003/02/05 17:59:17  dicuccio
  561. * Moved formerly private headers into include/objects/objmgr/impl
  562. *
  563. * Revision 1.5  2003/02/05 15:55:26  vasilche
  564. * Added eSeqEnd segment at the beginning of seq map.
  565. * Added flags to CSeqMap_CI to stop on data, gap, or references.
  566. *
  567. * Revision 1.4  2003/01/29 22:03:46  grichenk
  568. * Use single static CSeq_id_Mapper instead of per-OM model.
  569. *
  570. * Revision 1.3  2003/01/24 20:14:08  vasilche
  571. * Fixed processing zero length references.
  572. *
  573. * Revision 1.2  2003/01/22 20:11:54  vasilche
  574. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  575. * CSeqMap_CI now supports resolution and iteration over sequence range.
  576. * Added several caches to CScope.
  577. * Optimized CSeqVector().
  578. * Added serveral variants of CBioseqHandle::GetSeqVector().
  579. * Tried to optimize annotations iterator (not much success).
  580. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  581. *
  582. * Revision 1.1  2002/12/26 16:39:24  vasilche
  583. * Object manager class CSeqMap rewritten.
  584. *
  585. *
  586. * ===========================================================================
  587. */