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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_entry_info.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:24:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_entry_info.cpp,v 1000.3 2004/06/01 19:24:00 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: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   CSeq_entry_Info info -- entry for data source information about Seq-entry
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/seq_entry_info.hpp>
  42. #include <objmgr/impl/tse_info.hpp>
  43. #include <objmgr/impl/seq_annot_info.hpp>
  44. #include <objmgr/impl/bioseq_info.hpp>
  45. #include <objmgr/impl/bioseq_set_info.hpp>
  46. #include <objmgr/impl/data_source.hpp>
  47. #include <objmgr/objmgr_exception.hpp>
  48. #include <objects/general/Object_id.hpp>
  49. #include <objects/seqloc/Seq_id.hpp>
  50. #include <objects/seqset/Seq_entry.hpp>
  51. #include <objects/seqset/Bioseq_set.hpp>
  52. #include <objects/seq/Bioseq.hpp>
  53. #include <objects/seq/Seq_annot.hpp>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. CSeq_entry_Info::CSeq_entry_Info(void)
  57.     : m_Which(CSeq_entry::e_not_set)
  58. {
  59. }
  60. CSeq_entry_Info::CSeq_entry_Info(CSeq_entry& entry)
  61.     : m_Which(CSeq_entry::e_not_set)
  62. {
  63.     x_SetObject(entry);
  64. }
  65. CSeq_entry_Info::CSeq_entry_Info(const CSeq_entry_Info& info)
  66.     : m_Which(CSeq_entry::e_not_set)
  67. {
  68.     x_SetObject(info);
  69. }
  70. CSeq_entry_Info::~CSeq_entry_Info(void)
  71. {
  72. }
  73. const CBioseq_set_Info& CSeq_entry_Info::GetParentBioseq_set_Info(void) const
  74. {
  75.     return static_cast<const CBioseq_set_Info&>(GetBaseParent_Info());
  76. }
  77. CBioseq_set_Info& CSeq_entry_Info::GetParentBioseq_set_Info(void)
  78. {
  79.     return static_cast<CBioseq_set_Info&>(GetBaseParent_Info());
  80. }
  81. const CSeq_entry_Info& CSeq_entry_Info::GetParentSeq_entry_Info(void) const
  82. {
  83.     return GetParentBioseq_set_Info().GetParentSeq_entry_Info();
  84. }
  85. CSeq_entry_Info& CSeq_entry_Info::GetParentSeq_entry_Info(void)
  86. {
  87.     return GetParentBioseq_set_Info().GetParentSeq_entry_Info();
  88. }
  89. void CSeq_entry_Info::x_CheckWhich(E_Choice which) const
  90. {
  91.     if ( Which() != which ) {
  92.         NCBI_THROW(CUnassignedMember,eGet,
  93.                    which == CSeq_entry::e_Set?
  94.                    "Seq_entry.set": "Seq_entry.seq");
  95.     }
  96. }
  97. const CBioseq_Info& CSeq_entry_Info::GetSeq(void) const
  98. {
  99.     x_CheckWhich(CSeq_entry::e_Seq);
  100.     const CBioseq_Base_Info& base = *m_Contents;
  101.     return dynamic_cast<const CBioseq_Info&>(base);
  102. }
  103. CBioseq_Info& CSeq_entry_Info::SetSeq(void)
  104. {
  105.     x_CheckWhich(CSeq_entry::e_Seq);
  106.     CBioseq_Base_Info& base = *m_Contents;
  107.     return dynamic_cast<CBioseq_Info&>(base);
  108. }
  109. const CBioseq_set_Info& CSeq_entry_Info::GetSet(void) const
  110. {
  111.     x_CheckWhich(CSeq_entry::e_Set);
  112.     const CBioseq_Base_Info& base = *m_Contents;
  113.     return dynamic_cast<const CBioseq_set_Info&>(base);
  114. }
  115. CBioseq_set_Info& CSeq_entry_Info::SetSet(void)
  116. {
  117.     x_CheckWhich(CSeq_entry::e_Set);
  118.     CBioseq_Base_Info& base = *m_Contents;
  119.     return dynamic_cast<CBioseq_set_Info&>(base);
  120. }
  121. void CSeq_entry_Info::x_Select(CSeq_entry::E_Choice which,
  122.                                CRef<CBioseq_Base_Info> contents)
  123. {
  124.     if ( Which() != which || m_Contents != contents ) {
  125.         if ( m_Contents ) {
  126.             x_DetachContents();
  127.             m_Contents.Reset();
  128.         }
  129.         m_Which = which;
  130.         m_Contents = contents;
  131.         switch ( m_Which ) {
  132.         case CSeq_entry::e_Seq:
  133.             x_AttachObjectVariant(SetSeq().x_GetObject());
  134.             break;
  135.         case CSeq_entry::e_Set:
  136.             x_AttachObjectVariant(SetSet().x_GetObject());
  137.             break;
  138.         default:
  139.             x_DetachObjectVariant();
  140.             break;
  141.         }
  142.         x_AttachContents();
  143.     }
  144. }
  145. inline
  146. void CSeq_entry_Info::x_Select(CSeq_entry::E_Choice which,
  147.                                CBioseq_Base_Info* contents)
  148. {
  149.     x_Select(which, Ref(contents));
  150. }
  151. void CSeq_entry_Info::Reset(void)
  152. {
  153.     x_Select(CSeq_entry::e_not_set, 0);
  154. }
  155. CBioseq_set_Info& CSeq_entry_Info::SelectSet(CBioseq_set_Info& seqset)
  156. {
  157.     if ( Which() != CSeq_entry::e_not_set ) {
  158.         NCBI_THROW(CObjMgrException, eModifyDataError,
  159.                    "Reset CSeq_entry_Handle before selecting set");
  160.     }
  161.     x_Select(CSeq_entry::e_Set, &seqset);
  162.     return SetSet();
  163. }
  164. CBioseq_set_Info& CSeq_entry_Info::SelectSet(CBioseq_set& seqset)
  165. {
  166.     return SelectSet(*new CBioseq_set_Info(seqset));
  167. }
  168. CBioseq_set_Info& CSeq_entry_Info::SelectSet(void)
  169. {
  170.     if ( !IsSet() ) {
  171.         SelectSet(*new CBioseq_set);
  172.     }
  173.     return SetSet();
  174. }
  175. CBioseq_Info& CSeq_entry_Info::SelectSeq(CBioseq_Info& seq)
  176. {
  177.     if ( Which() != CSeq_entry::e_not_set ) {
  178.         NCBI_THROW(CObjMgrException, eModifyDataError,
  179.                    "Reset CSeq_entry_Handle before selecting seq");
  180.     }
  181.     x_Select(CSeq_entry::e_Seq, &seq);
  182.     return SetSeq();
  183. }
  184. CBioseq_Info& CSeq_entry_Info::SelectSeq(CBioseq& seq)
  185. {
  186.     return SelectSeq(*new CBioseq_Info(seq));
  187. }
  188. void CSeq_entry_Info::x_DoUpdateObject(void)
  189. {
  190.     if ( m_Contents ) {
  191.         m_Contents->x_UpdateObject();
  192.         _ASSERT(!m_Contents->x_NeedUpdateObject());
  193.         _ASSERT(!IsSet() ||
  194.                 GetSet().GetBioseq_setCore() == &m_Object->GetSet());
  195.         _ASSERT(!IsSeq() ||
  196.                 GetSeq().GetBioseqCore() == &m_Object->GetSeq());
  197.     }
  198. }
  199. CConstRef<CSeq_entry> CSeq_entry_Info::GetCompleteSeq_entry(void) const
  200. {
  201.     return GetSeq_entryCore();
  202. }
  203. CConstRef<CSeq_entry> CSeq_entry_Info::GetSeq_entryCore(void) const
  204. {
  205.     x_UpdateObject();
  206.     _ASSERT(!x_NeedUpdateObject());
  207.     return m_Object;
  208. }
  209. void CSeq_entry_Info::x_ParentAttach(CBioseq_set_Info& parent)
  210. {
  211.     x_BaseParentAttach(parent);
  212.     if ( parent.HasParent_Info() ) {
  213.         CSeq_entry& entry = parent.GetParentSeq_entry_Info().x_GetObject();
  214.         if ( m_Object->GetParentEntry() != &entry ) {
  215.             entry.ParentizeOneLevel();
  216.         }
  217.         _ASSERT(m_Object->GetParentEntry() == &entry);
  218.     }
  219. }
  220. void CSeq_entry_Info::x_ParentDetach(CBioseq_set_Info& parent)
  221. {
  222.     m_Object->ResetParentEntry();
  223.     x_BaseParentDetach(parent);
  224. }
  225. void CSeq_entry_Info::x_TSEAttachContents(CTSE_Info& tse)
  226. {
  227.     TParent::x_TSEAttachContents(tse);
  228.     if ( m_Contents ) {
  229.         m_Contents->x_TSEAttach(tse);
  230.     }
  231. }
  232. void CSeq_entry_Info::x_TSEDetachContents(CTSE_Info& tse)
  233. {
  234.     if ( m_Contents ) {
  235.         m_Contents->x_TSEDetach(tse);
  236.     }
  237.     TParent::x_TSEDetachContents(tse);
  238. }
  239. void CSeq_entry_Info::x_DSAttachContents(CDataSource& ds)
  240. {
  241.     TParent::x_DSAttachContents(ds);
  242.     x_DSMapObject(m_Object, ds);
  243.     if ( m_Contents ) {
  244.         m_Contents->x_DSAttach(ds);
  245.     }
  246. }
  247. void CSeq_entry_Info::x_DSDetachContents(CDataSource& ds)
  248. {
  249.     if ( m_Contents ) {
  250.         m_Contents->x_DSDetach(ds);
  251.     }
  252.     x_DSUnmapObject(m_Object, ds);
  253.     TParent::x_DSDetachContents(ds);
  254. }
  255. void CSeq_entry_Info::x_DSMapObject(CConstRef<TObject> obj, CDataSource& ds)
  256. {
  257.     ds.x_Map(obj, this);
  258. }
  259. void CSeq_entry_Info::x_DSUnmapObject(CConstRef<TObject> obj, CDataSource& ds)
  260. {
  261.     ds.x_Unmap(obj, this);
  262. }
  263. void CSeq_entry_Info::x_SetObject(TObject& obj)
  264. {
  265.     x_CheckWhich(CSeq_entry::e_not_set);
  266.     _ASSERT(!m_Object);
  267.     _ASSERT(!m_Contents);
  268.     m_Object.Reset(&obj);
  269.     switch ( (m_Which = obj.Which()) ) {
  270.     case CSeq_entry::e_Seq:
  271.         m_Contents.Reset(new CBioseq_Info(obj.SetSeq()));
  272.         break;
  273.     case CSeq_entry::e_Set:
  274.         m_Contents.Reset(new CBioseq_set_Info(obj.SetSet()));
  275.         break;
  276.     default:
  277.         break;
  278.     }
  279.     x_AttachContents();
  280. }
  281. void CSeq_entry_Info::x_SetObject(const CSeq_entry_Info& info)
  282. {
  283.     x_CheckWhich(CSeq_entry::e_not_set);
  284.     _ASSERT(!m_Object);
  285.     _ASSERT(!m_Contents);
  286.     m_Which = info.m_Which;
  287.     m_Object.Reset(new CSeq_entry);
  288.     switch ( m_Which ) {
  289.     case CSeq_entry::e_Seq:
  290.     {
  291.         CRef<CBioseq_Info> seq(new CBioseq_Info(info.GetSeq()));
  292.         m_Contents.Reset(seq);
  293.         x_AttachObjectVariant(seq->x_GetObject());
  294.         break;
  295.     }
  296.     case CSeq_entry::e_Set:
  297.     {
  298.         CRef<CBioseq_set_Info> seqset(new CBioseq_set_Info(info.GetSet()));
  299.         m_Contents.Reset(seqset);
  300.         x_AttachObjectVariant(seqset->x_GetObject());
  301.         break;
  302.     }
  303.     default:
  304.         break;
  305.     }
  306.     x_AttachContents();
  307. }
  308. void CSeq_entry_Info::x_DetachObjectVariant(void)
  309. {
  310.     m_Object->Reset();
  311. }
  312. void CSeq_entry_Info::x_AttachObjectVariant(CBioseq_set& seqset)
  313. {
  314.     x_DetachObjectVariant();
  315.     m_Object->SetSet(seqset);
  316. }
  317. void CSeq_entry_Info::x_AttachObjectVariant(CBioseq& seq)
  318. {
  319.     x_DetachObjectVariant();
  320.     m_Object->SetSeq(seq);
  321. }
  322. /*
  323. CRef<CSeq_entry> CSeq_entry_Info::x_CreateObject(void) const
  324. {        
  325.     CRef<TObject> obj(new TObject);
  326.     switch ( Which() ) {
  327.     case CSeq_entry::e_Set:
  328.         obj->SetSet(const_cast<CBioseq_set&>
  329.                     (*GetSet().GetCompleteBioseq_set()));
  330.         break;
  331.     case CSeq_entry::e_Seq:
  332.         obj->SetSeq(const_cast<CBioseq&>
  333.                     (*GetSeq().GetCompleteBioseq()));
  334.         break;
  335.     default:
  336.         break;
  337.     }
  338.     return obj;
  339. }
  340. */
  341. void CSeq_entry_Info::x_AttachContents(void)
  342. {
  343.     if ( m_Contents ) {
  344.         m_Contents->x_ParentAttach(*this);
  345.         x_AttachObject(*m_Contents);
  346.     }
  347. }
  348. void CSeq_entry_Info::x_DetachContents(void)
  349. {
  350.     if ( m_Contents ) {
  351.         x_DetachObject(*m_Contents);
  352.         m_Contents->x_ParentDetach(*this);
  353.     }
  354. }
  355. void CSeq_entry_Info::UpdateAnnotIndex(void) const
  356. {
  357.     if ( x_DirtyAnnotIndex() ) {
  358.         GetTSE_Info().UpdateAnnotIndex(*this);
  359.         _ASSERT(!x_DirtyAnnotIndex());
  360.     }
  361. }
  362. void CSeq_entry_Info::x_UpdateAnnotIndexContents(CTSE_Info& tse)
  363. {
  364.     m_Contents->x_UpdateAnnotIndex(tse);
  365.     TParent::x_UpdateAnnotIndexContents(tse);
  366. }
  367. bool CSeq_entry_Info::IsSetDescr(void) const
  368. {
  369.     return bool(m_Contents) && m_Contents->IsSetDescr();
  370. }
  371. const CSeq_descr& CSeq_entry_Info::GetDescr(void) const
  372. {
  373.     return m_Contents->GetDescr();
  374. }
  375. void CSeq_entry_Info::SetDescr(TDescr& v)
  376. {
  377.     m_Contents->SetDescr(v);
  378. }
  379. void CSeq_entry_Info::ResetDescr(void)
  380. {
  381.     m_Contents->ResetDescr();
  382. }
  383. bool CSeq_entry_Info::AddSeqdesc(CSeqdesc& d)
  384. {
  385.     return m_Contents->AddSeqdesc(d);
  386. }
  387. bool CSeq_entry_Info::RemoveSeqdesc(const CSeqdesc& d)
  388. {
  389.     return m_Contents->RemoveSeqdesc(d);
  390. }
  391. void CSeq_entry_Info::AddDescr(CSeq_entry_Info& src)
  392. {
  393.     if ( src.IsSetDescr() ) {
  394.         m_Contents->AddSeq_descr(src.m_Contents->x_SetDescr());
  395.     }
  396. }
  397. CRef<CSeq_annot_Info> CSeq_entry_Info::AddAnnot(const CSeq_annot& annot)
  398. {
  399.     return m_Contents->AddAnnot(annot);
  400. }
  401. void CSeq_entry_Info::AddAnnot(CRef<CSeq_annot_Info> annot)
  402. {
  403.     m_Contents->AddAnnot(annot);
  404. }
  405. void CSeq_entry_Info::RemoveAnnot(CRef<CSeq_annot_Info> annot)
  406. {
  407.     m_Contents->RemoveAnnot(annot);
  408. }
  409. CRef<CSeq_entry_Info> CSeq_entry_Info::AddEntry(CSeq_entry& entry,
  410.                                                   int index)
  411. {
  412.     x_CheckWhich(CSeq_entry::e_Set);
  413.     return SetSet().AddEntry(entry, index);
  414. }
  415. void CSeq_entry_Info::AddEntry(CRef<CSeq_entry_Info> entry, int index)
  416. {
  417.     x_CheckWhich(CSeq_entry::e_Set);
  418.     SetSet().AddEntry(entry, index);
  419. }
  420. void CSeq_entry_Info::RemoveEntry(CRef<CSeq_entry_Info> entry)
  421. {
  422.     x_CheckWhich(CSeq_entry::e_Set);
  423.     SetSet().RemoveEntry(entry);
  424. }
  425. END_SCOPE(objects)
  426. END_NCBI_SCOPE
  427. /*
  428.  * ===========================================================================
  429.  * $Log: seq_entry_info.cpp,v $
  430.  * Revision 1000.3  2004/06/01 19:24:00  gouriano
  431.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  432.  *
  433.  * Revision 1.15  2004/05/21 21:42:13  gorelenk
  434.  * Added PCH ncbi_pch.hpp
  435.  *
  436.  * Revision 1.14  2004/03/31 17:08:07  vasilche
  437.  * Implemented ConvertSeqToSet and ConvertSetToSeq.
  438.  *
  439.  * Revision 1.13  2004/03/25 19:27:44  vasilche
  440.  * Implemented MoveTo and CopyTo methods of handles.
  441.  *
  442.  * Revision 1.12  2004/03/24 18:30:30  vasilche
  443.  * Fixed edit API.
  444.  * Every *_Info object has its own shallow copy of original object.
  445.  *
  446.  * Revision 1.11  2004/03/16 15:47:28  vasilche
  447.  * Added CBioseq_set_Handle and set of EditHandles
  448.  *
  449.  * Revision 1.10  2004/02/03 19:02:18  vasilche
  450.  * Fixed broken 'dirty annot index' state after RemoveEntry().
  451.  *
  452.  * Revision 1.9  2004/02/02 14:46:44  vasilche
  453.  * Several performance fixed - do not iterate whole tse set in CDataSource.
  454.  *
  455.  * Revision 1.8  2004/01/29 19:33:07  vasilche
  456.  * Fixed coredump on WorkShop when invalid Seq-entry is added to CScope.
  457.  *
  458.  * Revision 1.7  2004/01/22 20:10:40  vasilche
  459.  * 1. Splitted ID2 specs to two parts.
  460.  * ID2 now specifies only protocol.
  461.  * Specification of ID2 split data is moved to seqsplit ASN module.
  462.  * For now they are still reside in one resulting library as before - libid2.
  463.  * As the result split specific headers are now in objects/seqsplit.
  464.  * 2. Moved ID2 and ID1 specific code out of object manager.
  465.  * Protocol is processed by corresponding readers.
  466.  * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  467.  * 3. Updated OBJMGR_LIBS correspondingly.
  468.  *
  469.  * Revision 1.6  2003/12/18 16:38:07  grichenk
  470.  * Added CScope::RemoveEntry()
  471.  *
  472.  * Revision 1.5  2003/12/11 17:02:50  grichenk
  473.  * Fixed CRef resetting in constructors.
  474.  *
  475.  * Revision 1.4  2003/11/19 22:18:03  grichenk
  476.  * All exceptions are now CException-derived. Catch "exception" rather
  477.  * than "runtime_error".
  478.  *
  479.  * Revision 1.3  2003/09/30 16:22:03  vasilche
  480.  * Updated internal object manager classes to be able to load ID2 data.
  481.  * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  482.  * Scope caches results of requests for data to data loaders.
  483.  * Optimized CSeq_id_Handle for gis.
  484.  * Optimized bioseq lookup in scope.
  485.  * Reduced object allocations in annotation iterators.
  486.  * CScope is allowed to be destroyed before other objects using this scope are
  487.  * deleted (feature iterators, bioseq handles etc).
  488.  * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  489.  * Added 'adaptive' option to objmgr_demo application.
  490.  *
  491.  * Revision 1.2  2003/06/02 16:06:38  dicuccio
  492.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  493.  *     - src/objects/asn2asn --> arc/app/asn2asn
  494.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  495.  *     - src/objects/objmgr --> src/objmgr
  496.  *     - src/objects/util --> src/objmgr/util
  497.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  498.  *     - src/objects/flat --> src/objtools/flat
  499.  *     - src/objects/validator --> src/objtools/validator
  500.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  501.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  502.  * replaces the three libmmdb? libs.
  503.  *
  504.  * Revision 1.1  2003/04/24 16:12:38  vasilche
  505.  * Object manager internal structures are splitted more straightforward.
  506.  * Removed excessive header dependencies.
  507.  *
  508.  *
  509.  * ===========================================================================
  510.  */