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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_entry_handle.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:23:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_entry_handle.cpp,v 1000.2 2004/06/01 19:23:57 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. *    Handle to Seq-entry object
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/seq_entry_handle.hpp>
  42. #include <objmgr/seq_entry_ci.hpp>
  43. #include <objmgr/seq_annot_ci.hpp>
  44. #include <objmgr/bioseq_handle.hpp>
  45. #include <objmgr/bioseq_set_handle.hpp>
  46. #include <objmgr/scope.hpp>
  47. #include <objmgr/impl/seq_entry_info.hpp>
  48. #include <objmgr/impl/scope_impl.hpp>
  49. #include <objmgr/impl/bioseq_set_info.hpp>
  50. #include <objmgr/impl/bioseq_info.hpp>
  51. #include <objects/seqset/Bioseq_set.hpp>
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_SCOPE(objects)
  54. CSeq_entry_Handle::CSeq_entry_Handle(CScope& scope,
  55.                                      const CSeq_entry_Info& info)
  56.     : m_Scope(&scope), m_Info(&info)
  57. {
  58. }
  59. void CSeq_entry_Handle::Reset(void)
  60. {
  61.     m_Scope.Reset();
  62.     m_Info.Reset();
  63. }
  64. CSeq_entry::E_Choice CSeq_entry_Handle::Which(void) const
  65. {
  66.     return x_GetInfo().Which();
  67. }
  68. CConstRef<CSeq_entry> CSeq_entry_Handle::GetCompleteSeq_entry(void) const
  69. {
  70.     return x_GetInfo().GetCompleteSeq_entry();
  71. }
  72. CConstRef<CSeq_entry> CSeq_entry_Handle::GetSeq_entryCore(void) const
  73. {
  74.     return x_GetInfo().GetSeq_entryCore();
  75. }
  76. bool CSeq_entry_Handle::HasParentEntry(void) const
  77. {
  78.     return bool(m_Info)  &&  x_GetInfo().HasParent_Info();
  79. }
  80. CSeq_entry_Handle CSeq_entry_Handle::GetParentEntry(void) const
  81. {
  82.     CSeq_entry_Handle ret;
  83.     const CSeq_entry_Info& info = x_GetInfo();
  84.     if ( info.HasParent_Info() ) {
  85.         ret = CSeq_entry_Handle(GetScope(), info.GetParentSeq_entry_Info());
  86.     }
  87.     return ret;
  88. }
  89. CSeq_entry_Handle CSeq_entry_Handle::GetTopLevelEntry(void) const
  90. {
  91.     CSeq_entry_Handle ret;
  92.     const CSeq_entry_Info& info = x_GetInfo();
  93.     if ( info.HasTSE_Info() ) {
  94.         ret = CSeq_entry_Handle(GetScope(), info.GetTSE_Info());
  95.     }
  96.     return ret;
  97. }
  98. CSeq_entry_Handle CSeq_entry_Handle::GetSingleSubEntry(void) const
  99. {
  100.     if ( !IsSet() ) {
  101.         NCBI_THROW(CObjMgrException, eModifyDataError,
  102.                    "CSeq_entry_Handle::GetSingleSubEntry: "
  103.                    "Seq-entry is not Bioseq-set");
  104.     }
  105.     CSeq_entry_CI iter(*this);
  106.     if ( !iter ) {
  107.         NCBI_THROW(CObjMgrException, eModifyDataError,
  108.                    "CSeq_entry_Handle::GetSingleSubEntry: "
  109.                    "Seq-entry is empty");
  110.     }
  111.     CSeq_entry_Handle entry = *iter;
  112.     if ( ++iter ) {
  113.         NCBI_THROW(CObjMgrException, eModifyDataError,
  114.                    "CSeq_entry_Handle::GetSingleSubEntry: "
  115.                    "Seq-entry contains more than one sub entry");
  116.     }
  117.     return entry;
  118. }
  119. CSeq_entry_EditHandle CSeq_entry_Handle::GetEditHandle(void) const
  120. {
  121.     return m_Scope->GetEditHandle(*this);
  122. }
  123. CBioseq_set_Handle CSeq_entry_Handle::GetParentBioseq_set(void) const
  124. {
  125.     CBioseq_set_Handle ret;
  126.     const CSeq_entry_Info& info = x_GetInfo();
  127.     if ( info.HasParent_Info() ) {
  128.         ret = CBioseq_set_Handle(GetScope(), info.GetParentBioseq_set_Info());
  129.     }
  130.     return ret;
  131. }
  132. CBioseq_Handle CSeq_entry_Handle::GetSeq(void) const
  133. {
  134.     return m_Scope->GetBioseqHandle(x_GetInfo().GetSeq());
  135. }
  136. CConstRef<CTSE_Info> CSeq_entry_Handle::GetTSE_Info(void) const
  137. {
  138.     CConstRef<CTSE_Info> ret;
  139.     if ( *this ) {
  140.         ret.Reset(&x_GetInfo().GetTSE_Info());
  141.     }
  142.     return ret;
  143. }
  144. CBioseq_set_Handle CSeq_entry_Handle::GetSet(void) const
  145. {
  146.     return CBioseq_set_Handle(GetScope(), x_GetInfo().GetSet());
  147. }
  148. bool CSeq_entry_Handle::IsSetDescr(void) const
  149. {
  150.     return x_GetInfo().IsSetDescr();
  151. }
  152. const CSeq_descr& CSeq_entry_Handle::GetDescr(void) const
  153. {
  154.     return x_GetInfo().GetDescr();
  155. }
  156. CConstRef<CObject> CSeq_entry_Handle::GetBlobId(void) const
  157. {
  158.     return x_GetInfo().GetTSE_Info().GetBlobId();
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. // CSeq_entry_EditHandle
  162. CSeq_entry_EditHandle CSeq_entry_EditHandle::GetParentEntry(void) const
  163. {
  164.     CSeq_entry_EditHandle ret;
  165.     CSeq_entry_Info& info = x_GetInfo();
  166.     if ( info.HasParent_Info() ) {
  167.         ret = CSeq_entry_EditHandle(GetScope(),
  168.                                     info.GetParentSeq_entry_Info());
  169.     }
  170.     return ret;
  171. }
  172. CSeq_entry_EditHandle CSeq_entry_EditHandle::GetSingleSubEntry(void) const
  173. {
  174.     return CSeq_entry_Handle::GetSingleSubEntry().GetEditHandle();
  175. }
  176. CBioseq_set_EditHandle CSeq_entry_EditHandle::GetParentBioseq_set(void) const
  177. {
  178.     CBioseq_set_EditHandle ret;
  179.     CSeq_entry_Info& info = x_GetInfo();
  180.     if ( info.HasParent_Info() ) {
  181.         ret = CBioseq_set_EditHandle(GetScope(),
  182.                                      info.GetParentBioseq_set_Info());
  183.     }
  184.     return ret;
  185. }
  186. CSeq_entry_Info& CSeq_entry_EditHandle::x_GetInfo(void) const
  187. {
  188.     return const_cast<CSeq_entry_Info&>(CSeq_entry_Handle::x_GetInfo());
  189. }
  190. CBioseq_set_EditHandle CSeq_entry_EditHandle::SetSet(void) const
  191. {
  192.     return CBioseq_set_EditHandle(GetScope(), x_GetInfo().SetSet());
  193. }
  194. CBioseq_EditHandle CSeq_entry_EditHandle::SetSeq(void) const
  195. {
  196.     return m_Scope->GetBioseqHandle(x_GetInfo().SetSeq()).GetEditHandle();
  197. }
  198. void CSeq_entry_EditHandle::SetDescr(TDescr& v) const
  199. {
  200.     x_GetInfo().SetDescr(v);
  201. }
  202. void CSeq_entry_EditHandle::ResetDescr(void) const
  203. {
  204.     x_GetInfo().ResetDescr();
  205. }
  206. bool CSeq_entry_EditHandle::AddSeqdesc(CSeqdesc& v) const
  207. {
  208.     return x_GetInfo().AddSeqdesc(v);
  209. }
  210. bool CSeq_entry_EditHandle::RemoveSeqdesc(const CSeqdesc& v) const
  211. {
  212.     return x_GetInfo().RemoveSeqdesc(v);
  213. }
  214. void CSeq_entry_EditHandle::AddDescr(const CSeq_entry_EditHandle& entry) const
  215. {
  216.     x_GetInfo().AddDescr(entry.x_GetInfo());
  217. }
  218. CBioseq_EditHandle
  219. CSeq_entry_EditHandle::AttachBioseq(CBioseq& seq, int index) const
  220. {
  221.     return SetSet().AttachBioseq(seq, index);
  222. }
  223. CBioseq_EditHandle
  224. CSeq_entry_EditHandle::CopyBioseq(const CBioseq_Handle& seq,
  225.                                   int index) const
  226. {
  227.     return SetSet().CopyBioseq(seq, index);
  228. }
  229. CBioseq_EditHandle
  230. CSeq_entry_EditHandle::TakeBioseq(const CBioseq_EditHandle& seq,
  231.                                   int index) const
  232. {
  233.     return SetSet().TakeBioseq(seq, index);
  234. }
  235. CSeq_entry_EditHandle
  236. CSeq_entry_EditHandle::AttachEntry(CSeq_entry& entry, int index) const
  237. {
  238.     return SetSet().AttachEntry(entry, index);
  239. }
  240. CSeq_entry_EditHandle
  241. CSeq_entry_EditHandle::CopyEntry(const CSeq_entry_Handle& entry,
  242.                                  int index) const
  243. {
  244.     return SetSet().CopyEntry(entry, index);
  245. }
  246. CSeq_entry_EditHandle
  247. CSeq_entry_EditHandle::TakeEntry(const CSeq_entry_EditHandle& entry,
  248.                                  int index) const
  249. {
  250.     return SetSet().TakeEntry(entry, index);
  251. }
  252. CSeq_annot_EditHandle
  253. CSeq_entry_EditHandle::AttachAnnot(const CSeq_annot& annot) const
  254. {
  255.     return m_Scope->AttachAnnot(*this, annot);
  256. }
  257. CSeq_annot_EditHandle
  258. CSeq_entry_EditHandle::CopyAnnot(const CSeq_annot_Handle& annot) const
  259. {
  260.     return m_Scope->CopyAnnot(*this, annot);
  261. }
  262. CSeq_annot_EditHandle
  263. CSeq_entry_EditHandle::TakeAnnot(const CSeq_annot_EditHandle& annot) const
  264. {
  265.     return m_Scope->TakeAnnot(*this, annot);
  266. }
  267. void
  268. CSeq_entry_EditHandle::TakeAllAnnots(const CSeq_entry_EditHandle& entry) const
  269. {
  270.     vector<CSeq_annot_Handle> annots;
  271.     // we have to copy all handles as moving annots directly could break iter
  272.     for ( CSeq_annot_CI it(entry, CSeq_annot_CI::eSearch_entry); it; ++it ) {
  273.         annots.push_back(*it);
  274.     }
  275.     ITERATE ( vector<CSeq_annot_Handle>, it, annots ) {
  276.         TakeAnnot(it->GetEditHandle());
  277.     }
  278. }
  279. void CSeq_entry_EditHandle::Remove(void) const
  280. {
  281.     m_Scope->RemoveEntry(*this);
  282. }
  283. CBioseq_set_EditHandle CSeq_entry_EditHandle::SelectSet(TClass set_class) const
  284. {
  285.     CBioseq_set_EditHandle seqset = SelectSet(*new CBioseq_set);
  286.     if ( set_class != CBioseq_set::eClass_not_set ) {
  287.         seqset.SetClass(set_class);
  288.     }
  289.     return seqset;
  290. }
  291. void CSeq_entry_EditHandle::SelectNone(void) const
  292. {
  293.     m_Scope->SelectNone(*this);
  294. }
  295. CBioseq_set_EditHandle
  296. CSeq_entry_EditHandle::SelectSet(CBioseq_set& seqset) const
  297. {
  298.     return m_Scope->SelectSet(*this, seqset);
  299. }
  300. CBioseq_set_EditHandle
  301. CSeq_entry_EditHandle::CopySet(const CBioseq_set_Handle& seqset) const
  302. {
  303.     return m_Scope->CopySet(*this, seqset);
  304. }
  305. CBioseq_set_EditHandle
  306. CSeq_entry_EditHandle::TakeSet(const CBioseq_set_EditHandle& seqset) const
  307. {
  308.     return m_Scope->TakeSet(*this, seqset);
  309. }
  310. CBioseq_EditHandle CSeq_entry_EditHandle::SelectSeq(CBioseq& seq) const
  311. {
  312.     return m_Scope->SelectSeq(*this, seq);
  313. }
  314. CBioseq_EditHandle
  315. CSeq_entry_EditHandle::CopySeq(const CBioseq_Handle& seq) const
  316. {
  317.     return m_Scope->CopySeq(*this, seq);
  318. }
  319. CBioseq_EditHandle
  320. CSeq_entry_EditHandle::TakeSeq(const CBioseq_EditHandle& seq) const
  321. {
  322.     return m_Scope->TakeSeq(*this, seq);
  323. }
  324. CBioseq_set_EditHandle
  325. CSeq_entry_EditHandle::ConvertSeqToSet(TClass set_class) const
  326. {
  327.     if ( !IsSeq() ) {
  328.         NCBI_THROW(CObjMgrException, eModifyDataError,
  329.                    "CSeq_entry_EditHandle::ConvertSeqToSet: "
  330.                    "Seq-entry is not in 'seq' state");
  331.     }
  332.     CRef<CBioseq_Info> seq(&x_GetInfo().SetSeq());
  333.     SetSeq().Remove();
  334.     _ASSERT(Which() == CSeq_entry::e_not_set);
  335.     CBioseq_set_EditHandle seqset = SelectSet(set_class);
  336.     m_Scope->x_SelectSeq(seqset.AddNewEntry(-1), seq);
  337.     return seqset;
  338. }
  339. void CSeq_entry_EditHandle::CollapseSet(void) const
  340. {
  341.     CSeq_entry_EditHandle entry = GetSingleSubEntry();
  342.     if ( entry.Which() == CSeq_entry::e_not_set ) {
  343.         NCBI_THROW(CObjMgrException, eModifyDataError,
  344.                    "CSeq_entry_EditHandle::CollapseSet: "
  345.                    "sub entry should be non-empty");
  346.     }
  347.     entry.AddDescr(*this);
  348.     entry.TakeAllAnnots(*this);
  349.     if ( entry.IsSet() ) {
  350.         CRef<CBioseq_set_Info> info(&entry.x_GetInfo().SetSet());
  351.         SelectNone();
  352.         m_Scope->x_SelectSet(*this, info);
  353.     }
  354.     else {
  355.         CRef<CBioseq_Info> info(&entry.x_GetInfo().SetSeq());
  356.         SelectNone();
  357.         m_Scope->x_SelectSeq(*this, info);
  358.     }
  359. }
  360. CBioseq_EditHandle
  361. CSeq_entry_EditHandle::ConvertSetToSeq(void) const
  362. {
  363.     CSeq_entry_EditHandle entry = GetSingleSubEntry();
  364.     if ( !entry.IsSeq() ) {
  365.         NCBI_THROW(CObjMgrException, eModifyDataError,
  366.                    "CSeq_entry_EditHandle::ConvertSetToSeq: "
  367.                    "sub entry should contain Bioseq");
  368.     }
  369.     entry.AddDescr(*this);
  370.     entry.TakeAllAnnots(*this);
  371.     CRef<CBioseq_Info> info(&entry.x_GetInfo().SetSeq());
  372.     SelectNone();
  373.     return m_Scope->x_SelectSeq(*this, info);
  374. }
  375. END_SCOPE(objects)
  376. END_NCBI_SCOPE
  377. /*
  378. * ---------------------------------------------------------------------------
  379. * $Log: seq_entry_handle.cpp,v $
  380. * Revision 1000.2  2004/06/01 19:23:57  gouriano
  381. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  382. *
  383. * Revision 1.11  2004/05/21 21:42:13  gorelenk
  384. * Added PCH ncbi_pch.hpp
  385. *
  386. * Revision 1.10  2004/05/11 19:26:19  grichenk
  387. * Implemented HasParentSeq_entry()
  388. *
  389. * Revision 1.9  2004/04/29 15:44:30  grichenk
  390. * Added GetTopLevelEntry()
  391. *
  392. * Revision 1.8  2004/03/31 17:08:07  vasilche
  393. * Implemented ConvertSeqToSet and ConvertSetToSeq.
  394. *
  395. * Revision 1.7  2004/03/29 20:13:06  vasilche
  396. * Implemented whole set of methods to modify Seq-entry object tree.
  397. * Added CBioseq_Handle::GetExactComplexityLevel().
  398. *
  399. * Revision 1.6  2004/03/24 18:30:30  vasilche
  400. * Fixed edit API.
  401. * Every *_Info object has its own shallow copy of original object.
  402. *
  403. * Revision 1.5  2004/03/16 21:01:32  vasilche
  404. * Added methods to move Bioseq withing Seq-entry
  405. *
  406. * Revision 1.4  2004/03/16 15:47:28  vasilche
  407. * Added CBioseq_set_Handle and set of EditHandles
  408. *
  409. * Revision 1.3  2004/02/09 22:09:14  grichenk
  410. * Use CConstRef for id
  411. *
  412. * Revision 1.2  2004/02/09 19:18:54  grichenk
  413. * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  414. * and CSeqdesc_CI to avoid using data directly.
  415. *
  416. * Revision 1.1  2003/11/28 15:12:31  grichenk
  417. * Initial revision
  418. *
  419. *
  420. * ===========================================================================
  421. */