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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bioseq_set_info.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:23:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bioseq_set_info.cpp,v 1000.1 2004/06/01 19:23:03 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_set_info.hpp>
  45. #include <objmgr/impl/data_source.hpp>
  46. #include <objmgr/objmgr_exception.hpp>
  47. #include <objects/general/Object_id.hpp>
  48. #include <objects/seqloc/Seq_id.hpp>
  49. #include <objects/seqset/Seq_entry.hpp>
  50. #include <objects/seqset/Bioseq_set.hpp>
  51. #include <objects/seq/Bioseq.hpp>
  52. #include <objects/seq/Seq_annot.hpp>
  53. #include <algorithm>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. CBioseq_set_Info::CBioseq_set_Info(void)
  57.     : m_Bioseq_set_Id(-1)
  58. {
  59. }
  60. CBioseq_set_Info::CBioseq_set_Info(TObject& seqset)
  61.     : m_Bioseq_set_Id(-1)
  62. {
  63.     x_SetObject(seqset);
  64. }
  65. CBioseq_set_Info::CBioseq_set_Info(const CBioseq_set_Info& info)
  66.     : m_Bioseq_set_Id(-1)
  67. {
  68.     x_SetObject(info);
  69. }
  70. CBioseq_set_Info::~CBioseq_set_Info(void)
  71. {
  72. }
  73. CConstRef<CBioseq_set> CBioseq_set_Info::GetCompleteBioseq_set(void) const
  74. {
  75.     return GetBioseq_setCore();
  76. }
  77. CConstRef<CBioseq_set> CBioseq_set_Info::GetBioseq_setCore(void) const
  78. {
  79.     x_UpdateObject();
  80.     _ASSERT(!x_NeedUpdateObject());
  81.     return m_Object;
  82. }
  83. void CBioseq_set_Info::x_DSAttachContents(CDataSource& ds)
  84. {
  85.     TParent::x_DSAttachContents(ds);
  86.     //ds.x_MapSeq_entry(*this);
  87.     // members
  88.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  89.         (*it)->x_DSAttach(ds);
  90.     }
  91. }
  92. void CBioseq_set_Info::x_DSDetachContents(CDataSource& ds)
  93. {
  94.     // members
  95.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  96.         (*it)->x_DSDetach(ds);
  97.     }
  98.     //ds.x_UnmapSeq_entry(*this);
  99.     TParent::x_DSDetachContents(ds);
  100. }
  101. void CBioseq_set_Info::x_TSEAttachContents(CTSE_Info& tse)
  102. {
  103.     TParent::x_TSEAttachContents(tse);
  104.     _ASSERT(m_Bioseq_set_Id < 0);
  105.     if ( IsSetId() ) {
  106.         m_Bioseq_set_Id = x_GetBioseq_set_Id(GetId());
  107.         if ( m_Bioseq_set_Id >= 0 ) {
  108.             tse.x_SetBioseq_setId(m_Bioseq_set_Id, this);
  109.         }
  110.     }
  111.     // members
  112.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  113.         (*it)->x_TSEAttach(tse);
  114.     }
  115. }
  116. void CBioseq_set_Info::x_TSEDetachContents(CTSE_Info& tse)
  117. {
  118.     // members
  119.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  120.         (*it)->x_TSEDetach(tse);
  121.     }
  122.     if ( m_Bioseq_set_Id >= 0 ) {
  123.         tse.x_ResetBioseq_setId(m_Bioseq_set_Id, this);
  124.         m_Bioseq_set_Id = -1;
  125.     }
  126.     TParent::x_TSEDetachContents(tse);
  127. }
  128. void CBioseq_set_Info::x_ParentAttach(CSeq_entry_Info& parent)
  129. {
  130.     TParent::x_ParentAttach(parent);
  131.     CSeq_entry& entry = parent.x_GetObject();
  132.     _ASSERT(entry.IsSet() && &entry.GetSet() == m_Object);
  133.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  134.         if ( (*it)->x_GetObject().GetParentEntry() != &entry ) {
  135.             entry.ParentizeOneLevel();
  136.             break;
  137.         }
  138.     }
  139. #ifdef _DEBUG
  140.     TSeq_set::const_iterator it2 = m_Seq_set.begin();
  141.     NON_CONST_ITERATE ( CBioseq_set::TSeq_set, it,
  142.                         entry.SetSet().SetSeq_set() ) {
  143.         _ASSERT(it2 != m_Seq_set.end());
  144.         _ASSERT(&(*it2)->x_GetObject() == *it);
  145.         _ASSERT((*it)->GetParentEntry() == &entry);
  146.         ++it2;
  147.     }
  148.     _ASSERT(it2 == m_Seq_set.end());
  149. #endif
  150. }
  151. void CBioseq_set_Info::x_ParentDetach(CSeq_entry_Info& parent)
  152. {
  153.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  154.         (*it)->x_GetObject().ResetParentEntry();
  155.     }
  156.     TParent::x_ParentDetach(parent);
  157. }
  158. void CBioseq_set_Info::x_DoUpdateObject(void)
  159. {
  160.     if ( !m_Seq_set.empty() ) {
  161.         const CBioseq_set::TSeq_set& seq_set = m_Object->GetSeq_set();
  162.         _ASSERT(seq_set.size() == m_Seq_set.size());
  163.         CBioseq_set::TSeq_set::const_iterator it2 = seq_set.begin();
  164.         NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  165.             (*it)->x_UpdateObject();
  166.             _ASSERT(it2->GetPointer() == &(*it)->x_GetObject());
  167.             ++it2;
  168.         }
  169.     }
  170.     TParent::x_DoUpdateObject();
  171. }
  172. void CBioseq_set_Info::x_SetObject(TObject& obj)
  173. {
  174.     _ASSERT(!m_Object);
  175.     m_Object.Reset(&obj);
  176.     if ( obj.IsSetSeq_set() ) {
  177.         NON_CONST_ITERATE ( TObject::TSeq_set, it, obj.SetSeq_set() ) {
  178.             CRef<CSeq_entry_Info> info(new CSeq_entry_Info(**it));
  179.             m_Seq_set.push_back(info);
  180.             x_AttachEntry(info);
  181.         }
  182.     }
  183.     if ( obj.IsSetAnnot() ) {
  184.         x_SetAnnot();
  185.     }
  186. }
  187. void CBioseq_set_Info::x_SetObject(const CBioseq_set_Info& info)
  188. {
  189.     _ASSERT(!m_Object);
  190.     m_Object = sx_ShallowCopy(info.x_GetObject());
  191.     if ( info.IsSetSeq_set() ) {
  192.         _ASSERT(m_Object->GetSeq_set().size() == info.m_Seq_set.size());
  193.         ITERATE ( TSeq_set, it, info.m_Seq_set ) {
  194.             CRef<CSeq_entry_Info> info2(new CSeq_entry_Info(**it));
  195.             m_Seq_set.push_back(info2);
  196.             x_AttachEntry(info2);
  197.         }
  198.     }
  199.     if ( info.IsSetAnnot() ) {
  200.         x_SetAnnot(info);
  201.     }
  202. }
  203. CRef<CBioseq_set> CBioseq_set_Info::sx_ShallowCopy(const CBioseq_set& src)
  204. {
  205.     CRef<TObject> obj(new TObject);
  206.     if ( src.IsSetId() ) {
  207.         obj->SetId(const_cast<TId&>(src.GetId()));
  208.     }
  209.     if ( src.IsSetColl() ) {
  210.         obj->SetColl(const_cast<TColl&>(src.GetColl()));
  211.     }
  212.     if ( src.IsSetLevel() ) {
  213.         obj->SetLevel(src.GetLevel());
  214.     }
  215.     if ( src.IsSetClass() ) {
  216.         obj->SetClass(src.GetClass());
  217.     }
  218.     if ( src.IsSetRelease() ) {
  219.         obj->SetRelease(src.GetRelease());
  220.     }
  221.     if ( src.IsSetDate() ) {
  222.         obj->SetDate(const_cast<TDate&>(src.GetDate()));
  223.     }
  224.     if ( src.IsSetDescr() ) {
  225.         obj->SetDescr(const_cast<TDescr&>(src.GetDescr()));
  226.     }
  227.     if ( src.IsSetSeq_set() ) {
  228.         obj->SetSeq_set() = src.GetSeq_set();
  229.     }
  230.     if ( src.IsSetAnnot() ) {
  231.         obj->SetAnnot() = src.GetAnnot();
  232.     }
  233.     return obj;
  234. }
  235. int CBioseq_set_Info::x_GetBioseq_set_Id(const CObject_id& object_id)
  236. {
  237.     int ret = -1;
  238.     if ( object_id.Which() == object_id.e_Id ) {
  239.         ret = object_id.GetId();
  240.     }
  241.     return ret;
  242. }
  243. bool CBioseq_set_Info::IsSetDescr(void) const
  244. {
  245.     return m_Object->IsSetDescr();
  246. }
  247. bool CBioseq_set_Info::CanGetDescr(void) const
  248. {
  249.     return bool(m_Object)  &&  m_Object->CanGetDescr();
  250. }
  251. const CSeq_descr& CBioseq_set_Info::GetDescr(void) const
  252. {
  253.     return m_Object->GetDescr();
  254. }
  255. void CBioseq_set_Info::SetDescr(TDescr& v)
  256. {
  257.     m_Object->SetDescr(v);
  258. }
  259. CSeq_descr& CBioseq_set_Info::x_SetDescr(void)
  260. {
  261.     return m_Object->SetDescr();
  262. }
  263. void CBioseq_set_Info::ResetDescr(void)
  264. {
  265.     m_Object->ResetDescr();
  266. }
  267. CBioseq_set::TAnnot& CBioseq_set_Info::x_SetObjAnnot(void)
  268. {
  269.     return m_Object->SetAnnot();
  270. }
  271. void CBioseq_set_Info::x_ResetObjAnnot(void)
  272. {
  273.     m_Object->ResetAnnot();
  274. }
  275. CRef<CSeq_entry_Info> CBioseq_set_Info::AddEntry(CSeq_entry& entry,
  276.                                                    int index)
  277. {
  278.     CRef<CSeq_entry_Info> info(new CSeq_entry_Info(entry));
  279.     AddEntry(info, index);
  280.     return info;
  281. }
  282. void CBioseq_set_Info::AddEntry(CRef<CSeq_entry_Info> info, int index)
  283. {
  284.     _ASSERT(!info->HasParent_Info());
  285.     CBioseq_set::TSeq_set& obj_seq_set = m_Object->SetSeq_set();
  286.     CRef<CSeq_entry> obj(&info->x_GetObject());
  287.     _ASSERT(obj_seq_set.size() == m_Seq_set.size());
  288.     if ( size_t(index) >= m_Seq_set.size() ) {
  289.         obj_seq_set.push_back(obj);
  290.         m_Seq_set.push_back(info);
  291.     }
  292.     else {
  293.         CBioseq_set::TSeq_set::iterator obj_it = obj_seq_set.begin();
  294.         for ( int i = 0; i < index; ++i ) {
  295.             ++obj_it;
  296.         }
  297.         obj_seq_set.insert(obj_it, obj);
  298.         m_Seq_set.insert(m_Seq_set.begin()+index, info);
  299.     }
  300.     x_AttachEntry(info);
  301. }
  302. void CBioseq_set_Info::RemoveEntry(CRef<CSeq_entry_Info> info)
  303. {
  304.     if ( &info->GetParentBioseq_set_Info() != this ) {
  305.         NCBI_THROW(CObjMgrException, eAddDataError,
  306.                    "CBioseq_set_Info::x_RemoveEntry: "
  307.                    "not a parent");
  308.     }
  309.     CRef<CSeq_entry> obj(const_cast<CSeq_entry*>(&info->x_GetObject()));
  310.     CBioseq_set::TSeq_set& obj_seq_set = m_Object->SetSeq_set();
  311.     TSeq_set::iterator info_it =
  312.         find(m_Seq_set.begin(), m_Seq_set.end(), info);
  313.     CBioseq_set::TSeq_set::iterator obj_it =
  314.         find(obj_seq_set.begin(), obj_seq_set.end(), obj);
  315.     _ASSERT(info_it != m_Seq_set.end());
  316.     _ASSERT(obj_it != obj_seq_set.end());
  317.     x_DetachEntry(info);
  318.     m_Seq_set.erase(info_it);
  319.     obj_seq_set.erase(obj_it);
  320. }
  321. void CBioseq_set_Info::x_AttachEntry(CRef<CSeq_entry_Info> entry)
  322. {
  323.     _ASSERT(!entry->HasParent_Info());
  324.     entry->x_ParentAttach(*this);
  325.     _ASSERT(&entry->GetParentBioseq_set_Info() == this);
  326.     x_AttachObject(*entry);
  327. }
  328. void CBioseq_set_Info::x_DetachEntry(CRef<CSeq_entry_Info> entry)
  329. {
  330.     _ASSERT(&entry->GetParentBioseq_set_Info() == this);
  331.     x_DetachObject(*entry);
  332.     entry->x_ParentDetach(*this);
  333.     _ASSERT(!entry->HasParent_Info());
  334. }
  335. void CBioseq_set_Info::UpdateAnnotIndex(void) const
  336. {
  337.     if ( x_DirtyAnnotIndex() ) {
  338.         GetTSE_Info().UpdateAnnotIndex(*this);
  339.         _ASSERT(!x_DirtyAnnotIndex());
  340.     }
  341. }
  342. void CBioseq_set_Info::x_UpdateAnnotIndexContents(CTSE_Info& tse)
  343. {
  344.     TParent::x_UpdateAnnotIndexContents(tse);
  345.     NON_CONST_ITERATE ( TSeq_set, it, m_Seq_set ) {
  346.         (*it)->x_UpdateAnnotIndex(tse);
  347.     }
  348. }
  349. END_SCOPE(objects)
  350. END_NCBI_SCOPE
  351. /*
  352.  * ===========================================================================
  353.  * $Log: bioseq_set_info.cpp,v $
  354.  * Revision 1000.1  2004/06/01 19:23:03  gouriano
  355.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  356.  *
  357.  * Revision 1.7  2004/05/21 21:42:12  gorelenk
  358.  * Added PCH ncbi_pch.hpp
  359.  *
  360.  * Revision 1.6  2004/05/06 17:32:37  grichenk
  361.  * Added CanGetXXXX() methods
  362.  *
  363.  * Revision 1.5  2004/03/31 17:08:07  vasilche
  364.  * Implemented ConvertSeqToSet and ConvertSetToSeq.
  365.  *
  366.  * Revision 1.4  2004/03/24 20:05:17  vasilche
  367.  * Fixed compilation error on Sun.
  368.  *
  369.  * Revision 1.3  2004/03/24 18:57:35  vasilche
  370.  * Added include <algorithm> for find().
  371.  *
  372.  * Revision 1.2  2004/03/24 18:30:29  vasilche
  373.  * Fixed edit API.
  374.  * Every *_Info object has its own shallow copy of original object.
  375.  *
  376.  * Revision 1.1  2004/03/16 15:47:27  vasilche
  377.  * Added CBioseq_set_Handle and set of EditHandles
  378.  *
  379.  * Revision 1.10  2004/02/03 19:02:18  vasilche
  380.  * Fixed broken 'dirty annot index' state after RemoveEntry().
  381.  *
  382.  * Revision 1.9  2004/02/02 14:46:44  vasilche
  383.  * Several performance fixed - do not iterate whole tse set in CDataSource.
  384.  *
  385.  * Revision 1.8  2004/01/29 19:33:07  vasilche
  386.  * Fixed coredump on WorkShop when invalid Seq-entry is added to CScope.
  387.  *
  388.  * Revision 1.7  2004/01/22 20:10:40  vasilche
  389.  * 1. Splitted ID2 specs to two parts.
  390.  * ID2 now specifies only protocol.
  391.  * Specification of ID2 split data is moved to seqsplit ASN module.
  392.  * For now they are still reside in one resulting library as before - libid2.
  393.  * As the result split specific headers are now in objects/seqsplit.
  394.  * 2. Moved ID2 and ID1 specific code out of object manager.
  395.  * Protocol is processed by corresponding readers.
  396.  * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  397.  * 3. Updated OBJMGR_LIBS correspondingly.
  398.  *
  399.  * Revision 1.6  2003/12/18 16:38:07  grichenk
  400.  * Added CScope::RemoveEntry()
  401.  *
  402.  * Revision 1.5  2003/12/11 17:02:50  grichenk
  403.  * Fixed CRef resetting in constructors.
  404.  *
  405.  * Revision 1.4  2003/11/19 22:18:03  grichenk
  406.  * All exceptions are now CException-derived. Catch "exception" rather
  407.  * than "runtime_error".
  408.  *
  409.  * Revision 1.3  2003/09/30 16:22:03  vasilche
  410.  * Updated internal object manager classes to be able to load ID2 data.
  411.  * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  412.  * Scope caches results of requests for data to data loaders.
  413.  * Optimized CSeq_id_Handle for gis.
  414.  * Optimized bioseq lookup in scope.
  415.  * Reduced object allocations in annotation iterators.
  416.  * CScope is allowed to be destroyed before other objects using this scope are
  417.  * deleted (feature iterators, bioseq handles etc).
  418.  * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  419.  * Added 'adaptive' option to objmgr_demo application.
  420.  *
  421.  * Revision 1.2  2003/06/02 16:06:38  dicuccio
  422.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  423.  *     - src/objects/asn2asn --> arc/app/asn2asn
  424.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  425.  *     - src/objects/objmgr --> src/objmgr
  426.  *     - src/objects/util --> src/objmgr/util
  427.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  428.  *     - src/objects/flat --> src/objtools/flat
  429.  *     - src/objects/validator --> src/objtools/validator
  430.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  431.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  432.  * replaces the three libmmdb? libs.
  433.  *
  434.  * Revision 1.1  2003/04/24 16:12:38  vasilche
  435.  * Object manager internal structures are splitted more straightforward.
  436.  * Removed excessive header dependencies.
  437.  *
  438.  *
  439.  * ===========================================================================
  440.  */