seq_id_tree.cpp
来自「ncbi源码」· C++ 代码 · 共 1,683 行 · 第 1/3 页
CPP
1,683 行
/* * =========================================================================== * PRODUCTION $Log: seq_id_tree.cpp,v $ * PRODUCTION Revision 1000.4 2004/06/01 19:24:07 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13 * PRODUCTION * =========================================================================== *//* $Id: seq_id_tree.cpp,v 1000.4 2004/06/01 19:24:07 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:* Seq-id mapper for Object Manager**/#include <ncbi_pch.hpp>#include <objmgr/impl/seq_id_tree.hpp>#include <objmgr/objmgr_exception.hpp>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)/////////////////////////////////////////////////////////////////////////////// to make map<string, something> case-insensitivestruct seqid_string_less{ bool operator()(const string& s1, const string& s2) const { return (NStr::CompareNocase(s1, s2) < 0); }};//////////////////////////////////////////////////////////////////////// CSeq_id_***_Tree:://// Seq-id sub-type specific trees//CSeq_id_Which_Tree::CSeq_id_Which_Tree(void){}CSeq_id_Which_Tree::~CSeq_id_Which_Tree(void){}bool CSeq_id_Which_Tree::HaveMatch(const CSeq_id_Handle& ) const{ return true; // Assume have matches by default}bool CSeq_id_Which_Tree::IsBetterVersion(const CSeq_id_Handle& /*h1*/, const CSeq_id_Handle& /*h2*/) const{ return false; // No id version by default}inlineCSeq_id_Info* CSeq_id_Which_Tree::CreateInfo(void){ return new CSeq_id_Info(this);}bool CSeq_id_Which_Tree::HaveReverseMatch(const CSeq_id_Handle& ) const{ return false; // Assume no reverse matches by default}void CSeq_id_Which_Tree::FindReverseMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list){ id_list.insert(id); return;}CSeq_id_Info* CSeq_id_Which_Tree::CreateInfo(const CSeq_id& id){ CRef<CSeq_id> id_ref(new CSeq_id); id_ref->Assign(id); return new CSeq_id_Info(this, id_ref);}void CSeq_id_Which_Tree::DropInfo(const CSeq_id_Info* info){ if ( info->GetCounter() > 0 ) { return; } {{ TWriteLockGuard guard(m_TreeLock); if ( info->GetCounter() > 0 ) { return; } x_Unindex(info); }} delete info;}CSeq_id_Handle CSeq_id_Which_Tree::GetGiHandle(int /*gi*/){ NCBI_THROW(CObjMgrException, eIdMapperError, "Invalid seq-id type");}void CSeq_id_Which_Tree::Initialize(vector<CRef<CSeq_id_Which_Tree> >& v){ v.resize(CSeq_id::e_Tpd+1); v[CSeq_id::e_not_set].Reset(new CSeq_id_not_set_Tree); v[CSeq_id::e_Local].Reset(new CSeq_id_Local_Tree); v[CSeq_id::e_Gibbsq].Reset(new CSeq_id_Gibbsq_Tree); v[CSeq_id::e_Gibbmt].Reset(new CSeq_id_Gibbmt_Tree); v[CSeq_id::e_Giim].Reset(new CSeq_id_Giim_Tree); // These three types share the same accessions space CRef<CSeq_id_Which_Tree> gb(new CSeq_id_GB_Tree); v[CSeq_id::e_Genbank] = gb; v[CSeq_id::e_Embl] = gb; v[CSeq_id::e_Ddbj] = gb; v[CSeq_id::e_Pir].Reset(new CSeq_id_Pir_Tree); v[CSeq_id::e_Swissprot].Reset(new CSeq_id_Swissprot_Tree); v[CSeq_id::e_Patent].Reset(new CSeq_id_Patent_Tree); v[CSeq_id::e_Other].Reset(new CSeq_id_Other_Tree); v[CSeq_id::e_General].Reset(new CSeq_id_General_Tree); v[CSeq_id::e_Gi].Reset(new CSeq_id_Gi_Tree); // see above v[CSeq_id::e_Ddbj] = gb; v[CSeq_id::e_Prf].Reset(new CSeq_id_Prf_Tree); v[CSeq_id::e_Pdb].Reset(new CSeq_id_PDB_Tree); v[CSeq_id::e_Tpg].Reset(new CSeq_id_Tpg_Tree); v[CSeq_id::e_Tpe].Reset(new CSeq_id_Tpe_Tree); v[CSeq_id::e_Tpd].Reset(new CSeq_id_Tpd_Tree);}/////////////////////////////////////////////////////////////////////////////// CSeq_id_not_set_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_not_set_Tree::CSeq_id_not_set_Tree(void){}CSeq_id_not_set_Tree::~CSeq_id_not_set_Tree(void){}bool CSeq_id_not_set_Tree::Empty(void) const{ return true;}inlinebool CSeq_id_not_set_Tree::x_Check(const CSeq_id& id) const{ return id.Which() == CSeq_id::e_not_set;}void CSeq_id_not_set_Tree::DropInfo(const CSeq_id_Info* /*info*/){}void CSeq_id_not_set_Tree::x_Unindex(const CSeq_id_Info* /*info*/){}CSeq_id_Handle CSeq_id_not_set_Tree::FindInfo(const CSeq_id& /*id*/) const{ LOG_POST(Warning << "CSeq_id_Mapper::GetHandle() -- uninitialized seq-id"); return CSeq_id_Handle();}CSeq_id_Handle CSeq_id_not_set_Tree::FindOrCreate(const CSeq_id& /*id*/){ LOG_POST(Warning << "CSeq_id_Mapper::GetHandle() -- uninitialized seq-id"); return CSeq_id_Handle();}bool CSeq_id_not_set_Tree::HaveMatch(const CSeq_id_Handle& ) const{ return false;}void CSeq_id_not_set_Tree::FindMatch(const CSeq_id_Handle& /*id*/, TSeq_id_MatchList& /*id_list*/) const{ LOG_POST(Warning << "CSeq_id_Mapper::GetMatchingHandles() -- " "uninitialized seq-id");}void CSeq_id_not_set_Tree::FindMatchStr(string /*sid*/, TSeq_id_MatchList& /*id_list*/) const{}bool CSeq_id_not_set_Tree::HaveReverseMatch(const CSeq_id_Handle& /*id*/) const{ return false;}void CSeq_id_not_set_Tree::FindReverseMatch(const CSeq_id_Handle& /*id*/, TSeq_id_MatchList& /*id_list*/){ LOG_POST(Warning << "CSeq_id_Mapper::GetReverseMatchingHandles() -- " "uninitialized seq-id");}/////////////////////////////////////////////////////////////////////////////// CSeq_id_int_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_int_Tree::CSeq_id_int_Tree(void){}CSeq_id_int_Tree::~CSeq_id_int_Tree(void){}bool CSeq_id_int_Tree::Empty(void) const{ return m_IntMap.empty();}CSeq_id_Handle CSeq_id_int_Tree::FindInfo(const CSeq_id& id) const{ _ASSERT(x_Check(id)); int value = x_Get(id); TReadLockGuard guard(m_TreeLock); TIntMap::const_iterator it = m_IntMap.find(value); if (it != m_IntMap.end()) { return CSeq_id_Handle(it->second); } return CSeq_id_Handle();}CSeq_id_Handle CSeq_id_int_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT(x_Check(id)); int value = x_Get(id); TWriteLockGuard guard(m_TreeLock); pair<TIntMap::iterator, bool> ins = m_IntMap.insert(TIntMap::value_type(value, 0)); if ( ins.second ) { ins.first->second = CreateInfo(id); } return CSeq_id_Handle(ins.first->second);}void CSeq_id_int_Tree::x_Unindex(const CSeq_id_Info* info){ _ASSERT(x_Check(*info->GetSeqId())); int value = x_Get(*info->GetSeqId()); _VERIFY(m_IntMap.erase(value));}bool CSeq_id_int_Tree::HaveMatch(const CSeq_id_Handle& ) const{ // Only one instance of each int id return false;}void CSeq_id_int_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ // Only one instance of each int id //_ASSERT(id && id == FindInfo(id.GetSeqId())); id_list.insert(id);}void CSeq_id_int_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ int value; try { value = NStr::StringToInt(sid); } catch (const CStringException& /*ignored*/) { // Not an integer value return; } TReadLockGuard guard(m_TreeLock); TIntMap::const_iterator it = m_IntMap.find(value); if (it != m_IntMap.end()) { id_list.insert(CSeq_id_Handle(it->second)); }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Gibbsq_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Gibbsq_Tree::x_Check(const CSeq_id& id) const{ return id.IsGibbsq();}int CSeq_id_Gibbsq_Tree::x_Get(const CSeq_id& id) const{ return id.GetGibbsq();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Gibbmt_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Gibbmt_Tree::x_Check(const CSeq_id& id) const{ return id.IsGibbmt();}int CSeq_id_Gibbmt_Tree::x_Get(const CSeq_id& id) const{ return id.GetGibbmt();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Gi_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_Gi_Tree::CSeq_id_Gi_Tree(void) : m_Info(CreateInfo()){}CSeq_id_Gi_Tree::~CSeq_id_Gi_Tree(void){ _ASSERT(m_Info); m_Info.Reset();}bool CSeq_id_Gi_Tree::Empty(void) const{ return true;}inlinebool CSeq_id_Gi_Tree::x_Check(const CSeq_id& id) const{ return id.IsGi();}inlineint CSeq_id_Gi_Tree::x_Get(const CSeq_id& id) const{ return id.GetGi();}void CSeq_id_Gi_Tree::DropInfo(const CSeq_id_Info* info){ _ASSERT(!m_Info); delete info;}void CSeq_id_Gi_Tree::x_Unindex(const CSeq_id_Info* /*info*/){}CSeq_id_Handle CSeq_id_Gi_Tree::GetGiHandle(int gi){ return CSeq_id_Handle(m_Info, gi);}CSeq_id_Handle CSeq_id_Gi_Tree::FindInfo(const CSeq_id& id) const{ _ASSERT(x_Check(id)); return CSeq_id_Handle(m_Info, x_Get(id));}CSeq_id_Handle CSeq_id_Gi_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT(x_Check(id)); return CSeq_id_Handle(m_Info, x_Get(id));}bool CSeq_id_Gi_Tree::HaveMatch(const CSeq_id_Handle& ) const{ // Only one instance of each int id return false;}void CSeq_id_Gi_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ // Only one instance of each int id id_list.insert(id);}void CSeq_id_Gi_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ int value; try { value = NStr::StringToInt(sid); } catch (const CStringException& /*ignored*/) { // Not an integer value return; } id_list.insert(CSeq_id_Handle(m_Info, value));}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Textseq_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_Textseq_Tree::CSeq_id_Textseq_Tree(void){}CSeq_id_Textseq_Tree::~CSeq_id_Textseq_Tree(void){}bool CSeq_id_Textseq_Tree::Empty(void) const{ return m_ByName.empty() && m_ByAccession.empty();}CSeq_id_Info*CSeq_id_Textseq_Tree::x_FindVersionEqual(const TVersions& ver_list, const CTextseq_id& tid) const{ ITERATE(TVersions, vit, ver_list) { if (x_Get(*(*vit)->GetSeqId()).Equals(tid)) { return *vit; } } return 0;}CSeq_id_Info* CSeq_id_Textseq_Tree::x_FindInfo(const CTextseq_id& tid) const{ TStringMap::const_iterator it; if ( tid.IsSetAccession() ) { it = m_ByAccession.find(tid.GetAccession()); if (it == m_ByAccession.end()) { return 0; } } else if ( tid.IsSetName() ) { it = m_ByName.find(tid.GetName()); if (it == m_ByName.end()) { return 0; } } else { return 0; } return x_FindVersionEqual(it->second, tid);}CSeq_id_Handle CSeq_id_Textseq_Tree::FindInfo(const CSeq_id& id) const{ // Note: if a record is found by accession, no name is checked // even if it is also set. _ASSERT(x_Check(id)); const CTextseq_id& tid = x_Get(id); // Can not compare if no accession given TReadLockGuard guard(m_TreeLock); return CSeq_id_Handle(x_FindInfo(tid));}CSeq_id_Handle CSeq_id_Textseq_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT(x_Check(id)); const CTextseq_id& tid = x_Get(id); TWriteLockGuard guard(m_TreeLock); CSeq_id_Info* info = x_FindInfo(tid); if ( !info ) { info = CreateInfo(id); if ( tid.IsSetAccession() ) { TVersions& ver = m_ByAccession[tid.GetAccession()]; ITERATE(TVersions, vit, ver) { _ASSERT(!x_Get(*(*vit)->GetSeqId()).Equals(tid)); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?