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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_annot_ci.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:23:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_annot_ci.cpp,v 1000.2 2004/06/01 19:23:46 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. * Author: Aleksey Grichenko, Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Seq-annot iterator
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/seq_annot_ci.hpp>
  42. #include <objmgr/objmgr_exception.hpp>
  43. #include <objmgr/scope.hpp>
  44. #include <objmgr/seq_entry_handle.hpp>
  45. #include <objmgr/impl/seq_entry_info.hpp>
  46. #include <objmgr/impl/bioseq_set_info.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. CSeq_annot_CI::SEntryLevel_CI::SEntryLevel_CI(const CBioseq_set_Info& seqset,
  50.                                               const TEntry_CI& iter)
  51.     : m_Set(&seqset), m_Iter(iter)
  52. {
  53. }
  54. CSeq_annot_CI::SEntryLevel_CI::SEntryLevel_CI(const SEntryLevel_CI& l)
  55.     : m_Set(l.m_Set), m_Iter(l.m_Iter)
  56. {
  57. }
  58. CSeq_annot_CI::SEntryLevel_CI&
  59. CSeq_annot_CI::SEntryLevel_CI::operator=(const SEntryLevel_CI& l)
  60. {
  61.     m_Set = l.m_Set;
  62.     m_Iter = l.m_Iter;
  63.     return *this;
  64. }
  65. CSeq_annot_CI::SEntryLevel_CI::~SEntryLevel_CI(void)
  66. {
  67. }
  68. CSeq_annot_CI::CSeq_annot_CI(void)
  69.     : m_UpTree(false)
  70. {
  71. }
  72. CSeq_annot_CI::~CSeq_annot_CI(void)
  73. {
  74. }
  75. CSeq_annot_CI::CSeq_annot_CI(const CSeq_annot_CI& iter)
  76.     : m_UpTree(false)
  77. {
  78.     *this = iter;
  79. }
  80. CSeq_annot_CI& CSeq_annot_CI::operator=(const CSeq_annot_CI& iter)
  81. {
  82.     if (this != &iter) {
  83.         m_CurrentEntry = iter.m_CurrentEntry;
  84.         m_AnnotIter = iter.m_AnnotIter;
  85.         m_CurrentAnnot = iter.m_CurrentAnnot;
  86.         m_EntryStack = iter.m_EntryStack;
  87.         m_UpTree = iter.m_UpTree;
  88.     }
  89.     return *this;
  90. }
  91. CSeq_annot_CI::CSeq_annot_CI(CScope& scope, const CSeq_entry& entry,
  92.                              EFlags flags)
  93.     : m_Scope(scope),
  94.       m_UpTree(false)
  95. {
  96.     x_Initialize(scope.GetSeq_entryHandle(entry), flags);
  97. }
  98. CSeq_annot_CI::CSeq_annot_CI(const CSeq_entry_Handle& entry, EFlags flags)
  99.     : m_Scope(entry.GetScope()),
  100.       m_UpTree(false)
  101. {
  102.     x_Initialize(entry, flags);
  103. }
  104. CSeq_annot_CI::CSeq_annot_CI(const CBioseq_Handle& bioseq)
  105.     : m_Scope(bioseq.GetScope()),
  106.       m_UpTree(true)
  107. {
  108.     x_Initialize(bioseq.GetParentEntry(), eSearch_entry);
  109. }
  110. CSeq_annot_CI::CSeq_annot_CI(const CBioseq_set_Handle& bioseq_set,
  111.                              EFlags flags)
  112.     : m_Scope(bioseq_set.GetScope()),
  113.       m_UpTree(false)
  114. {
  115.     x_Initialize(bioseq_set.GetParentEntry(), flags);
  116. }
  117. inline
  118. void CSeq_annot_CI::x_Push(void)
  119. {
  120.     if ( m_CurrentEntry->IsSet() ) {
  121.         const CBioseq_set_Info& set = m_CurrentEntry->GetSet();
  122.         m_EntryStack.push(SEntryLevel_CI(set, set.GetSeq_set().begin()));
  123.     }
  124. }
  125. inline
  126. void CSeq_annot_CI::x_SetEntry(const CSeq_entry_Info& entry)
  127. {
  128.     m_CurrentEntry.Reset(&entry);
  129.     m_AnnotIter = entry.m_Contents->GetAnnot().begin();
  130.     if ( !m_EntryStack.empty() ) {
  131.         x_Push();
  132.     }
  133. }
  134. void CSeq_annot_CI::x_Initialize(const CSeq_entry_Handle& entry, EFlags flags)
  135. {
  136.     if ( !entry ) {
  137.         NCBI_THROW(CAnnotException, eFindFailed,
  138.                    "Can not find seq-entry in the scope");
  139.     }
  140.     if ( entry.Which() == CSeq_entry::e_not_set ) {
  141.         NCBI_THROW(CAnnotException, eFindFailed,
  142.                    "seq-entry is empty");
  143.     }
  144.     x_SetEntry(entry.x_GetInfo());
  145.     if ( flags == eSearch_recursive ) {
  146.         x_Push();
  147.     }
  148.     
  149.     x_Settle();
  150. }
  151. CSeq_annot_CI& CSeq_annot_CI::operator++(void)
  152. {
  153.     _ASSERT(*this);
  154.     ++m_AnnotIter;
  155.     x_Settle();
  156.     return *this;
  157. }
  158. void CSeq_annot_CI::x_Settle(void)
  159. {
  160.     for ( ;; ) {
  161.         if ( m_AnnotIter != m_CurrentEntry->m_Contents->GetAnnot().end() ) {
  162.             m_CurrentAnnot = CSeq_annot_Handle(GetScope(), **m_AnnotIter);
  163.             return;
  164.         }
  165.         if ( m_UpTree ) {
  166.             // Iterating from a bioseq up to its TSE
  167.             if ( m_CurrentEntry->HasParent_Info() ) {
  168.                 x_SetEntry(m_CurrentEntry->GetParentSeq_entry_Info());
  169.                 continue;
  170.             }
  171.             m_CurrentAnnot = CSeq_annot_Handle();
  172.             return;
  173.         }
  174.         if ( m_EntryStack.empty() ) {
  175.             m_CurrentAnnot = CSeq_annot_Handle();
  176.             return;
  177.         }
  178.         
  179.         if ( m_EntryStack.top().m_Iter !=
  180.              m_EntryStack.top().m_Set->GetSeq_set().end() ) {
  181.             x_SetEntry(**m_EntryStack.top().m_Iter++);
  182.         }
  183.         else {
  184.             m_EntryStack.pop();
  185.         }
  186.     }
  187. }
  188. END_SCOPE(objects)
  189. END_NCBI_SCOPE
  190. /*
  191. * ---------------------------------------------------------------------------
  192. * $Log: seq_annot_ci.cpp,v $
  193. * Revision 1000.2  2004/06/01 19:23:46  gouriano
  194. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  195. *
  196. * Revision 1.8  2004/05/21 21:42:13  gorelenk
  197. * Added PCH ncbi_pch.hpp
  198. *
  199. * Revision 1.7  2004/04/26 14:13:46  grichenk
  200. * Added constructors from bioseq-set handle and bioseq handle.
  201. *
  202. * Revision 1.6  2004/03/16 15:47:28  vasilche
  203. * Added CBioseq_set_Handle and set of EditHandles
  204. *
  205. * Revision 1.5  2003/10/08 14:14:27  vasilche
  206. * Use CHeapScope instead of CRef<CScope> internally.
  207. *
  208. * Revision 1.4  2003/09/30 16:22:03  vasilche
  209. * Updated internal object manager classes to be able to load ID2 data.
  210. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  211. * Scope caches results of requests for data to data loaders.
  212. * Optimized CSeq_id_Handle for gis.
  213. * Optimized bioseq lookup in scope.
  214. * Reduced object allocations in annotation iterators.
  215. * CScope is allowed to be destroyed before other objects using this scope are
  216. * deleted (feature iterators, bioseq handles etc).
  217. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  218. * Added 'adaptive' option to objmgr_demo application.
  219. *
  220. * Revision 1.3  2003/09/05 17:29:40  grichenk
  221. * Structurized Object Manager exceptions
  222. *
  223. * Revision 1.2  2003/07/25 21:41:30  grichenk
  224. * Implemented non-recursive mode for CSeq_annot_CI,
  225. * fixed friend declaration in CSeq_entry_Info.
  226. *
  227. * Revision 1.1  2003/07/25 15:23:42  grichenk
  228. * Initial revision
  229. *
  230. *
  231. * ===========================================================================
  232. */