seq_entry_handle.cpp

来自「ncbi源码」· C++ 代码 · 共 532 行

CPP
532
字号
/* * =========================================================================== * PRODUCTION $Log: seq_entry_handle.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:23:57  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11 * PRODUCTION * =========================================================================== *//*  $Id: seq_entry_handle.cpp,v 1000.2 2004/06/01 19:23:57 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Author: Aleksey Grichenko, Eugene Vasilchenko** File Description:*    Handle to Seq-entry object**/#include <ncbi_pch.hpp>#include <objmgr/seq_entry_handle.hpp>#include <objmgr/seq_entry_ci.hpp>#include <objmgr/seq_annot_ci.hpp>#include <objmgr/bioseq_handle.hpp>#include <objmgr/bioseq_set_handle.hpp>#include <objmgr/scope.hpp>#include <objmgr/impl/seq_entry_info.hpp>#include <objmgr/impl/scope_impl.hpp>#include <objmgr/impl/bioseq_set_info.hpp>#include <objmgr/impl/bioseq_info.hpp>#include <objects/seqset/Bioseq_set.hpp>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)CSeq_entry_Handle::CSeq_entry_Handle(CScope& scope,                                     const CSeq_entry_Info& info)    : m_Scope(&scope), m_Info(&info){}void CSeq_entry_Handle::Reset(void){    m_Scope.Reset();    m_Info.Reset();}CSeq_entry::E_Choice CSeq_entry_Handle::Which(void) const{    return x_GetInfo().Which();}CConstRef<CSeq_entry> CSeq_entry_Handle::GetCompleteSeq_entry(void) const{    return x_GetInfo().GetCompleteSeq_entry();}CConstRef<CSeq_entry> CSeq_entry_Handle::GetSeq_entryCore(void) const{    return x_GetInfo().GetSeq_entryCore();}bool CSeq_entry_Handle::HasParentEntry(void) const{    return bool(m_Info)  &&  x_GetInfo().HasParent_Info();}CSeq_entry_Handle CSeq_entry_Handle::GetParentEntry(void) const{    CSeq_entry_Handle ret;    const CSeq_entry_Info& info = x_GetInfo();    if ( info.HasParent_Info() ) {        ret = CSeq_entry_Handle(GetScope(), info.GetParentSeq_entry_Info());    }    return ret;}CSeq_entry_Handle CSeq_entry_Handle::GetTopLevelEntry(void) const{    CSeq_entry_Handle ret;    const CSeq_entry_Info& info = x_GetInfo();    if ( info.HasTSE_Info() ) {        ret = CSeq_entry_Handle(GetScope(), info.GetTSE_Info());    }    return ret;}CSeq_entry_Handle CSeq_entry_Handle::GetSingleSubEntry(void) const{    if ( !IsSet() ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_Handle::GetSingleSubEntry: "                   "Seq-entry is not Bioseq-set");    }    CSeq_entry_CI iter(*this);    if ( !iter ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_Handle::GetSingleSubEntry: "                   "Seq-entry is empty");    }    CSeq_entry_Handle entry = *iter;    if ( ++iter ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_Handle::GetSingleSubEntry: "                   "Seq-entry contains more than one sub entry");    }    return entry;}CSeq_entry_EditHandle CSeq_entry_Handle::GetEditHandle(void) const{    return m_Scope->GetEditHandle(*this);}CBioseq_set_Handle CSeq_entry_Handle::GetParentBioseq_set(void) const{    CBioseq_set_Handle ret;    const CSeq_entry_Info& info = x_GetInfo();    if ( info.HasParent_Info() ) {        ret = CBioseq_set_Handle(GetScope(), info.GetParentBioseq_set_Info());    }    return ret;}CBioseq_Handle CSeq_entry_Handle::GetSeq(void) const{    return m_Scope->GetBioseqHandle(x_GetInfo().GetSeq());}CConstRef<CTSE_Info> CSeq_entry_Handle::GetTSE_Info(void) const{    CConstRef<CTSE_Info> ret;    if ( *this ) {        ret.Reset(&x_GetInfo().GetTSE_Info());    }    return ret;}CBioseq_set_Handle CSeq_entry_Handle::GetSet(void) const{    return CBioseq_set_Handle(GetScope(), x_GetInfo().GetSet());}bool CSeq_entry_Handle::IsSetDescr(void) const{    return x_GetInfo().IsSetDescr();}const CSeq_descr& CSeq_entry_Handle::GetDescr(void) const{    return x_GetInfo().GetDescr();}CConstRef<CObject> CSeq_entry_Handle::GetBlobId(void) const{    return x_GetInfo().GetTSE_Info().GetBlobId();}/////////////////////////////////////////////////////////////////////////////// CSeq_entry_EditHandleCSeq_entry_EditHandle CSeq_entry_EditHandle::GetParentEntry(void) const{    CSeq_entry_EditHandle ret;    CSeq_entry_Info& info = x_GetInfo();    if ( info.HasParent_Info() ) {        ret = CSeq_entry_EditHandle(GetScope(),                                    info.GetParentSeq_entry_Info());    }    return ret;}CSeq_entry_EditHandle CSeq_entry_EditHandle::GetSingleSubEntry(void) const{    return CSeq_entry_Handle::GetSingleSubEntry().GetEditHandle();}CBioseq_set_EditHandle CSeq_entry_EditHandle::GetParentBioseq_set(void) const{    CBioseq_set_EditHandle ret;    CSeq_entry_Info& info = x_GetInfo();    if ( info.HasParent_Info() ) {        ret = CBioseq_set_EditHandle(GetScope(),                                     info.GetParentBioseq_set_Info());    }    return ret;}CSeq_entry_Info& CSeq_entry_EditHandle::x_GetInfo(void) const{    return const_cast<CSeq_entry_Info&>(CSeq_entry_Handle::x_GetInfo());}CBioseq_set_EditHandle CSeq_entry_EditHandle::SetSet(void) const{    return CBioseq_set_EditHandle(GetScope(), x_GetInfo().SetSet());}CBioseq_EditHandle CSeq_entry_EditHandle::SetSeq(void) const{    return m_Scope->GetBioseqHandle(x_GetInfo().SetSeq()).GetEditHandle();}void CSeq_entry_EditHandle::SetDescr(TDescr& v) const{    x_GetInfo().SetDescr(v);}void CSeq_entry_EditHandle::ResetDescr(void) const{    x_GetInfo().ResetDescr();}bool CSeq_entry_EditHandle::AddSeqdesc(CSeqdesc& v) const{    return x_GetInfo().AddSeqdesc(v);}bool CSeq_entry_EditHandle::RemoveSeqdesc(const CSeqdesc& v) const{    return x_GetInfo().RemoveSeqdesc(v);}void CSeq_entry_EditHandle::AddDescr(const CSeq_entry_EditHandle& entry) const{    x_GetInfo().AddDescr(entry.x_GetInfo());}CBioseq_EditHandleCSeq_entry_EditHandle::AttachBioseq(CBioseq& seq, int index) const{    return SetSet().AttachBioseq(seq, index);}CBioseq_EditHandleCSeq_entry_EditHandle::CopyBioseq(const CBioseq_Handle& seq,                                  int index) const{    return SetSet().CopyBioseq(seq, index);}CBioseq_EditHandleCSeq_entry_EditHandle::TakeBioseq(const CBioseq_EditHandle& seq,                                  int index) const{    return SetSet().TakeBioseq(seq, index);}CSeq_entry_EditHandleCSeq_entry_EditHandle::AttachEntry(CSeq_entry& entry, int index) const{    return SetSet().AttachEntry(entry, index);}CSeq_entry_EditHandleCSeq_entry_EditHandle::CopyEntry(const CSeq_entry_Handle& entry,                                 int index) const{    return SetSet().CopyEntry(entry, index);}CSeq_entry_EditHandleCSeq_entry_EditHandle::TakeEntry(const CSeq_entry_EditHandle& entry,                                 int index) const{    return SetSet().TakeEntry(entry, index);}CSeq_annot_EditHandleCSeq_entry_EditHandle::AttachAnnot(const CSeq_annot& annot) const{    return m_Scope->AttachAnnot(*this, annot);}CSeq_annot_EditHandleCSeq_entry_EditHandle::CopyAnnot(const CSeq_annot_Handle& annot) const{    return m_Scope->CopyAnnot(*this, annot);}CSeq_annot_EditHandleCSeq_entry_EditHandle::TakeAnnot(const CSeq_annot_EditHandle& annot) const{    return m_Scope->TakeAnnot(*this, annot);}voidCSeq_entry_EditHandle::TakeAllAnnots(const CSeq_entry_EditHandle& entry) const{    vector<CSeq_annot_Handle> annots;    // we have to copy all handles as moving annots directly could break iter    for ( CSeq_annot_CI it(entry, CSeq_annot_CI::eSearch_entry); it; ++it ) {        annots.push_back(*it);    }    ITERATE ( vector<CSeq_annot_Handle>, it, annots ) {        TakeAnnot(it->GetEditHandle());    }}void CSeq_entry_EditHandle::Remove(void) const{    m_Scope->RemoveEntry(*this);}CBioseq_set_EditHandle CSeq_entry_EditHandle::SelectSet(TClass set_class) const{    CBioseq_set_EditHandle seqset = SelectSet(*new CBioseq_set);    if ( set_class != CBioseq_set::eClass_not_set ) {        seqset.SetClass(set_class);    }    return seqset;}void CSeq_entry_EditHandle::SelectNone(void) const{    m_Scope->SelectNone(*this);}CBioseq_set_EditHandleCSeq_entry_EditHandle::SelectSet(CBioseq_set& seqset) const{    return m_Scope->SelectSet(*this, seqset);}CBioseq_set_EditHandleCSeq_entry_EditHandle::CopySet(const CBioseq_set_Handle& seqset) const{    return m_Scope->CopySet(*this, seqset);}CBioseq_set_EditHandleCSeq_entry_EditHandle::TakeSet(const CBioseq_set_EditHandle& seqset) const{    return m_Scope->TakeSet(*this, seqset);}CBioseq_EditHandle CSeq_entry_EditHandle::SelectSeq(CBioseq& seq) const{    return m_Scope->SelectSeq(*this, seq);}CBioseq_EditHandleCSeq_entry_EditHandle::CopySeq(const CBioseq_Handle& seq) const{    return m_Scope->CopySeq(*this, seq);}CBioseq_EditHandleCSeq_entry_EditHandle::TakeSeq(const CBioseq_EditHandle& seq) const{    return m_Scope->TakeSeq(*this, seq);}CBioseq_set_EditHandleCSeq_entry_EditHandle::ConvertSeqToSet(TClass set_class) const{    if ( !IsSeq() ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_EditHandle::ConvertSeqToSet: "                   "Seq-entry is not in 'seq' state");    }    CRef<CBioseq_Info> seq(&x_GetInfo().SetSeq());    SetSeq().Remove();    _ASSERT(Which() == CSeq_entry::e_not_set);    CBioseq_set_EditHandle seqset = SelectSet(set_class);    m_Scope->x_SelectSeq(seqset.AddNewEntry(-1), seq);    return seqset;}void CSeq_entry_EditHandle::CollapseSet(void) const{    CSeq_entry_EditHandle entry = GetSingleSubEntry();    if ( entry.Which() == CSeq_entry::e_not_set ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_EditHandle::CollapseSet: "                   "sub entry should be non-empty");    }    entry.AddDescr(*this);    entry.TakeAllAnnots(*this);    if ( entry.IsSet() ) {        CRef<CBioseq_set_Info> info(&entry.x_GetInfo().SetSet());        SelectNone();        m_Scope->x_SelectSet(*this, info);    }    else {        CRef<CBioseq_Info> info(&entry.x_GetInfo().SetSeq());        SelectNone();        m_Scope->x_SelectSeq(*this, info);    }}CBioseq_EditHandleCSeq_entry_EditHandle::ConvertSetToSeq(void) const{    CSeq_entry_EditHandle entry = GetSingleSubEntry();    if ( !entry.IsSeq() ) {        NCBI_THROW(CObjMgrException, eModifyDataError,                   "CSeq_entry_EditHandle::ConvertSetToSeq: "                   "sub entry should contain Bioseq");    }    entry.AddDescr(*this);    entry.TakeAllAnnots(*this);    CRef<CBioseq_Info> info(&entry.x_GetInfo().SetSeq());    SelectNone();    return m_Scope->x_SelectSeq(*this, info);}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: seq_entry_handle.cpp,v $* Revision 1000.2  2004/06/01 19:23:57  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11** Revision 1.11  2004/05/21 21:42:13  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.10  2004/05/11 19:26:19  grichenk* Implemented HasParentSeq_entry()** Revision 1.9  2004/04/29 15:44:30  grichenk* Added GetTopLevelEntry()** Revision 1.8  2004/03/31 17:08:07  vasilche* Implemented ConvertSeqToSet and ConvertSetToSeq.** Revision 1.7  2004/03/29 20:13:06  vasilche* Implemented whole set of methods to modify Seq-entry object tree.* Added CBioseq_Handle::GetExactComplexityLevel().** Revision 1.6  2004/03/24 18:30:30  vasilche* Fixed edit API.* Every *_Info object has its own shallow copy of original object.** Revision 1.5  2004/03/16 21:01:32  vasilche* Added methods to move Bioseq withing Seq-entry** Revision 1.4  2004/03/16 15:47:28  vasilche* Added CBioseq_set_Handle and set of EditHandles** Revision 1.3  2004/02/09 22:09:14  grichenk* Use CConstRef for id** Revision 1.2  2004/02/09 19:18:54  grichenk* Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI* and CSeqdesc_CI to avoid using data directly.** Revision 1.1  2003/11/28 15:12:31  grichenk* Initial revision*** ===========================================================================*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?