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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bioseq_base_info.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bioseq_base_info.cpp,v 1000.1 2004/06/01 19:22:50 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. *   Bioseq info for data source
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/bioseq_info.hpp>
  42. #include <objmgr/impl/seq_entry_info.hpp>
  43. #include <objmgr/impl/seq_annot_info.hpp>
  44. #include <objmgr/objmgr_exception.hpp>
  45. #include <objects/seq/Seq_descr.hpp>
  46. #include <objects/seq/Seqdesc.hpp>
  47. #include <algorithm>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(objects)
  50. ////////////////////////////////////////////////////////////////////
  51. //
  52. //  CBioseq_Info::
  53. //
  54. //    Structure to keep bioseq's parent seq-entry along with the list
  55. //    of seq-id synonyms for the bioseq.
  56. //
  57. CBioseq_Base_Info::CBioseq_Base_Info(void)
  58. {
  59. }
  60. CBioseq_Base_Info::~CBioseq_Base_Info(void)
  61. {
  62. }
  63. const CSeq_entry_Info& CBioseq_Base_Info::GetParentSeq_entry_Info(void) const
  64. {
  65.     return static_cast<const CSeq_entry_Info&>(GetBaseParent_Info());
  66. }
  67. CSeq_entry_Info& CBioseq_Base_Info::GetParentSeq_entry_Info(void)
  68. {
  69.     return static_cast<CSeq_entry_Info&>(GetBaseParent_Info());
  70. }
  71. void CBioseq_Base_Info::x_DSAttachContents(CDataSource& ds)
  72. {
  73.     TParent::x_DSAttachContents(ds);
  74.     // members
  75.     NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  76.         (*it)->x_DSAttach(ds);
  77.     }
  78. }
  79. void CBioseq_Base_Info::x_DSDetachContents(CDataSource& ds)
  80. {
  81.     // members
  82.     NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  83.         (*it)->x_DSDetach(ds);
  84.     }
  85.     TParent::x_DSDetachContents(ds);
  86. }
  87. void CBioseq_Base_Info::x_TSEAttachContents(CTSE_Info& tse)
  88. {
  89.     TParent::x_TSEAttachContents(tse);
  90.     // members
  91.     NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  92.         (*it)->x_TSEAttach(tse);
  93.     }
  94. }
  95. void CBioseq_Base_Info::x_TSEDetachContents(CTSE_Info& tse)
  96. {
  97.     // members
  98.     NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  99.         (*it)->x_TSEDetach(tse);
  100.     }
  101.     TParent::x_TSEDetachContents(tse);
  102. }
  103. void CBioseq_Base_Info::x_ParentAttach(CSeq_entry_Info& parent)
  104. {
  105.     x_BaseParentAttach(parent);
  106. }
  107. void CBioseq_Base_Info::x_ParentDetach(CSeq_entry_Info& parent)
  108. {
  109.     x_BaseParentDetach(parent);
  110. }
  111. void CBioseq_Base_Info::x_SetAnnot(void)
  112. {
  113.     _ASSERT(m_ObjAnnot == 0);
  114.     m_ObjAnnot = &x_SetObjAnnot();
  115.     ITERATE( TObjAnnot, it, *m_ObjAnnot ) {
  116.         CRef<CSeq_annot_Info> info(new CSeq_annot_Info(**it));
  117.         m_Annot.push_back(info);
  118.         x_AttachAnnot(info);
  119.     }
  120. }
  121. void CBioseq_Base_Info::x_SetAnnot(const CBioseq_Base_Info& annot)
  122. {
  123.     m_ObjAnnot = &x_SetObjAnnot();
  124.     _ASSERT(m_ObjAnnot->size() == annot.m_Annot.size());
  125.     m_ObjAnnot->clear();
  126.     ITERATE ( TAnnot, it, annot.m_Annot ) {
  127.         AddAnnot(Ref(new CSeq_annot_Info(**it)));
  128.     }
  129. }
  130. void CBioseq_Base_Info::x_UpdateAnnotIndexContents(CTSE_Info& tse)
  131. {
  132.     TParent::x_UpdateAnnotIndexContents(tse);
  133.     NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  134.         (*it)->x_UpdateAnnotIndex(tse);
  135.     }
  136. }
  137. void CBioseq_Base_Info::x_DoUpdateObject(void)
  138. {
  139.     if ( IsSetAnnot() ) {
  140.         _ASSERT(m_ObjAnnot && m_ObjAnnot->size() == m_Annot.size());
  141.         TObjAnnot::iterator it2 = m_ObjAnnot->begin();
  142.         NON_CONST_ITERATE ( TAnnot, it, m_Annot ) {
  143.             (*it)->x_UpdateObject();
  144.             it2->Reset(const_cast<CSeq_annot*>(&(*it)->x_GetObject()));
  145.             ++it2;
  146.         }
  147.     }
  148.     TParent::x_DoUpdateObject();
  149. }
  150. bool CBioseq_Base_Info::AddSeqdesc(CSeqdesc& d)
  151. {
  152.     TDescr::Tdata& s = x_SetDescr().Set();
  153.     ITERATE ( TDescr::Tdata, it, s ) {
  154.         if ( it->GetPointer() == &d ) {
  155.             return false;
  156.         }
  157.     }
  158.     s.push_back(Ref(&d));
  159.     return true;
  160. }
  161. bool CBioseq_Base_Info::RemoveSeqdesc(const CSeqdesc& d)
  162. {
  163.     if ( !IsSetDescr() ) {
  164.         return false;
  165.     }
  166.     TDescr::Tdata& s = x_SetDescr().Set();
  167.     NON_CONST_ITERATE ( TDescr::Tdata, it, s ) {
  168.         if ( it->GetPointer() == &d ) {
  169.             s.erase(it);
  170.             if ( s.empty() ) {
  171.                 ResetDescr();
  172.             }
  173.             return true;
  174.         }
  175.     }
  176.     return false;
  177. }
  178. void CBioseq_Base_Info::AddSeq_descr(TDescr& v)
  179. {
  180.     TDescr::Tdata& s = x_SetDescr().Set();
  181.     TDescr::Tdata& src = v.Set();
  182.     NON_CONST_ITERATE ( TDescr::Tdata, it, src ) {
  183.         s.push_back(*it);
  184.     }
  185. }
  186. void CBioseq_Base_Info::x_AttachAnnot(CRef<CSeq_annot_Info> annot)
  187. {
  188.     _ASSERT(!annot->HasParent_Info());
  189.     annot->x_ParentAttach(*this);
  190.     _ASSERT(&annot->GetParentBioseq_Base_Info() == this);
  191.     x_AttachObject(*annot);
  192. }
  193. void CBioseq_Base_Info::x_DetachAnnot(CRef<CSeq_annot_Info> annot)
  194. {
  195.     _ASSERT(&annot->GetParentBioseq_Base_Info() == this);
  196.     x_DetachObject(*annot);
  197.     annot->x_ParentDetach(*this);
  198.     _ASSERT(!annot->HasParent_Info());
  199. }
  200. CRef<CSeq_annot_Info> CBioseq_Base_Info::AddAnnot(const CSeq_annot& annot)
  201. {
  202.     CRef<CSeq_annot_Info> info(new CSeq_annot_Info(annot));
  203.     AddAnnot(info);
  204.     return info;
  205. }
  206. void CBioseq_Base_Info::AddAnnot(CRef<CSeq_annot_Info> info)
  207. {
  208.     _ASSERT(!info->HasParent_Info());
  209.     if ( !IsSetAnnot() ) {
  210.         m_ObjAnnot = &x_SetObjAnnot();
  211.     }
  212.     _ASSERT(m_ObjAnnot->size() == m_Annot.size());
  213.     CRef<CSeq_annot> obj(const_cast<CSeq_annot*>(&info->x_GetObject()));
  214.     m_ObjAnnot->push_back(obj);
  215.     m_Annot.push_back(info);
  216.     x_AttachAnnot(info);
  217. }
  218. void CBioseq_Base_Info::RemoveAnnot(CRef<CSeq_annot_Info> info)
  219. {
  220.     if ( &info->GetBaseParent_Info() != this ) {
  221.         NCBI_THROW(CObjMgrException, eAddDataError,
  222.                    "CSeq_entry_Info::x_RemoveAnnot: "
  223.                    "not an owner");
  224.     }
  225.     _ASSERT(IsSetAnnot());
  226.     _ASSERT(m_ObjAnnot->size() == m_Annot.size());
  227.     CRef<CSeq_annot> obj(const_cast<CSeq_annot*>(&info->x_GetObject()));
  228.     TAnnot::iterator info_it = find(m_Annot.begin(), m_Annot.end(), info);
  229.     TObjAnnot::iterator obj_it = find(m_ObjAnnot->begin(), m_ObjAnnot->end(),
  230.                                       obj);
  231.     _ASSERT(info_it != m_Annot.end());
  232.     _ASSERT(obj_it != m_ObjAnnot->end());
  233.     x_DetachAnnot(info);
  234.     m_Annot.erase(info_it);
  235.     m_ObjAnnot->erase(obj_it);
  236. }
  237. END_SCOPE(objects)
  238. END_NCBI_SCOPE
  239. /*
  240. * ---------------------------------------------------------------------------
  241. * $Log: bioseq_base_info.cpp,v $
  242. * Revision 1000.1  2004/06/01 19:22:50  gouriano
  243. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  244. *
  245. * Revision 1.5  2004/05/21 21:42:12  gorelenk
  246. * Added PCH ncbi_pch.hpp
  247. *
  248. * Revision 1.4  2004/03/31 17:08:07  vasilche
  249. * Implemented ConvertSeqToSet and ConvertSetToSeq.
  250. *
  251. * Revision 1.3  2004/03/24 18:57:35  vasilche
  252. * Added include <algorithm> for find().
  253. *
  254. * Revision 1.2  2004/03/24 18:30:29  vasilche
  255. * Fixed edit API.
  256. * Every *_Info object has its own shallow copy of original object.
  257. *
  258. * Revision 1.1  2004/03/16 15:47:27  vasilche
  259. * Added CBioseq_set_Handle and set of EditHandles
  260. *
  261. * Revision 1.15  2003/12/11 17:02:50  grichenk
  262. * Fixed CRef resetting in constructors.
  263. *
  264. * Revision 1.14  2003/11/19 22:18:02  grichenk
  265. * All exceptions are now CException-derived. Catch "exception" rather
  266. * than "runtime_error".
  267. *
  268. * Revision 1.13  2003/11/12 16:53:17  grichenk
  269. * Modified CSeqMap to work with const objects (CBioseq, CSeq_loc etc.)
  270. *
  271. * Revision 1.12  2003/09/30 16:22:02  vasilche
  272. * Updated internal object manager classes to be able to load ID2 data.
  273. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  274. * Scope caches results of requests for data to data loaders.
  275. * Optimized CSeq_id_Handle for gis.
  276. * Optimized bioseq lookup in scope.
  277. * Reduced object allocations in annotation iterators.
  278. * CScope is allowed to be destroyed before other objects using this scope are
  279. * deleted (feature iterators, bioseq handles etc).
  280. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  281. * Added 'adaptive' option to objmgr_demo application.
  282. *
  283. * Revision 1.11  2003/06/02 16:06:37  dicuccio
  284. * Rearranged src/objects/ subtree.  This includes the following shifts:
  285. *     - src/objects/asn2asn --> arc/app/asn2asn
  286. *     - src/objects/testmedline --> src/objects/ncbimime/test
  287. *     - src/objects/objmgr --> src/objmgr
  288. *     - src/objects/util --> src/objmgr/util
  289. *     - src/objects/alnmgr --> src/objtools/alnmgr
  290. *     - src/objects/flat --> src/objtools/flat
  291. *     - src/objects/validator --> src/objtools/validator
  292. *     - src/objects/cddalignview --> src/objtools/cddalignview
  293. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  294. * replaces the three libmmdb? libs.
  295. *
  296. * Revision 1.10  2003/04/24 16:12:38  vasilche
  297. * Object manager internal structures are splitted more straightforward.
  298. * Removed excessive header dependencies.
  299. *
  300. * Revision 1.9  2003/03/14 19:10:41  grichenk
  301. * + SAnnotSelector::EIdResolving; fixed operator=() for several classes
  302. *
  303. * Revision 1.8  2003/03/11 15:51:06  kuznets
  304. * iterate -> ITERATE
  305. *
  306. * Revision 1.7  2003/02/05 17:59:17  dicuccio
  307. * Moved formerly private headers into include/objects/objmgr/impl
  308. *
  309. * Revision 1.6  2002/12/26 20:55:17  dicuccio
  310. * Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree
  311. *
  312. * Revision 1.5  2002/11/04 21:29:12  grichenk
  313. * Fixed usage of const CRef<> and CRef<> constructor
  314. *
  315. * Revision 1.4  2002/07/08 20:51:01  grichenk
  316. * Moved log to the end of file
  317. * Replaced static mutex (in CScope, CDataSource) with the mutex
  318. * pool. Redesigned CDataSource data locking.
  319. *
  320. * Revision 1.3  2002/05/29 21:21:13  gouriano
  321. * added debug dump
  322. *
  323. * Revision 1.2  2002/02/21 19:27:05  grichenk
  324. * Rearranged includes. Added scope history. Added searching for the
  325. * best seq-id match in data sources and scopes. Updated tests.
  326. *
  327. * Revision 1.1  2002/02/07 21:25:05  grichenk
  328. * Initial revision
  329. *
  330. *
  331. * ===========================================================================
  332. */