seq_id_tree.cpp
来自「ncbi源码」· C++ 代码 · 共 1,683 行 · 第 1/3 页
CPP
1,683 行
{ CConstRef<CSeq_id> id = info->GetSeqId(); _ASSERT( id->IsGeneral() ); const CDbtag& dbid = id->GetGeneral(); TDbMap::iterator db_it = m_DbMap.find(dbid.GetDb()); _ASSERT(db_it != m_DbMap.end()); STagMap& tm = db_it->second; const CObject_id& oid = dbid.GetTag(); if ( oid.IsStr() ) { _VERIFY(tm.m_ByStr.erase(oid.GetStr())); } else if ( oid.IsId() ) { _VERIFY(tm.m_ById.erase(oid.GetId())); } if (tm.m_ByStr.empty() && tm.m_ById.empty()) m_DbMap.erase(db_it);}bool CSeq_id_General_Tree::HaveMatch(const CSeq_id_Handle& ) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); return false;}void CSeq_id_General_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); id_list.insert(id);}void CSeq_id_General_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ int value; bool ok; try { value = NStr::StringToInt(sid); ok = true; } catch (const CStringException&) { // Not an integer value value = -1; ok = false; } TReadLockGuard guard(m_TreeLock); ITERATE(TDbMap, db_it, m_DbMap) { // In any case search in strings STagMap::TByStr::const_iterator str_it = db_it->second.m_ByStr.find(sid); if (str_it != db_it->second.m_ByStr.end()) { id_list.insert(CSeq_id_Handle(str_it->second)); } if ( ok ) { STagMap::TById::const_iterator int_it = db_it->second.m_ById.find(value); if (int_it != db_it->second.m_ById.end()) { id_list.insert(CSeq_id_Handle(int_it->second)); } } }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Giim_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_Giim_Tree::CSeq_id_Giim_Tree(void){}CSeq_id_Giim_Tree::~CSeq_id_Giim_Tree(void){}bool CSeq_id_Giim_Tree::Empty(void) const{ return m_IdMap.empty();}CSeq_id_Info* CSeq_id_Giim_Tree::x_FindInfo(const CGiimport_id& gid) const{ TIdMap::const_iterator id_it = m_IdMap.find(gid.GetId()); if (id_it == m_IdMap.end()) return 0; ITERATE (TGiimList, dbr_it, id_it->second) { CConstRef<CSeq_id> id = (*dbr_it)->GetSeqId(); const CGiimport_id& gid2 = id->GetGiim(); // Both Db and Release must be equal if ( !gid.Equals(gid2) ) { return *dbr_it; } } // Not found return 0;}CSeq_id_Handle CSeq_id_Giim_Tree::FindInfo(const CSeq_id& id) const{ _ASSERT( id.IsGiim() ); const CGiimport_id& gid = id.GetGiim(); TReadLockGuard guard(m_TreeLock); return CSeq_id_Handle(x_FindInfo(gid));}CSeq_id_Handle CSeq_id_Giim_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT( id.IsGiim() ); const CGiimport_id& gid = id.GetGiim(); TWriteLockGuard guard(m_TreeLock); CSeq_id_Info* info = x_FindInfo(gid); if ( !info ) { info = CreateInfo(id); m_IdMap[gid.GetId()].push_back(info); } return CSeq_id_Handle(info);}void CSeq_id_Giim_Tree::x_Unindex(const CSeq_id_Info* info){ CConstRef<CSeq_id> id = info->GetSeqId(); _ASSERT( id->IsGiim() ); const CGiimport_id& gid = id->GetGiim(); TIdMap::iterator id_it = m_IdMap.find(gid.GetId()); _ASSERT(id_it != m_IdMap.end()); TGiimList& giims = id_it->second; NON_CONST_ITERATE(TGiimList, dbr_it, giims) { if (*dbr_it == info) { giims.erase(dbr_it); break; } } if ( giims.empty() ) m_IdMap.erase(id_it);}bool CSeq_id_Giim_Tree::HaveMatch(const CSeq_id_Handle& ) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); return false;}void CSeq_id_Giim_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); id_list.insert(id);}void CSeq_id_Giim_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ TReadLockGuard guard(m_TreeLock); try { int value = NStr::StringToInt(sid); TIdMap::const_iterator it = m_IdMap.find(value); if (it == m_IdMap.end()) return; ITERATE(TGiimList, git, it->second) { id_list.insert(CSeq_id_Handle(*git)); } } catch (CStringException) { // Not an integer value return; }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Patent_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_Patent_Tree::CSeq_id_Patent_Tree(void){}CSeq_id_Patent_Tree::~CSeq_id_Patent_Tree(void){}bool CSeq_id_Patent_Tree::Empty(void) const{ return m_CountryMap.empty();}CSeq_id_Info* CSeq_id_Patent_Tree::x_FindInfo(const CPatent_seq_id& pid) const{ const CId_pat& cit = pid.GetCit(); TByCountry::const_iterator cntry_it = m_CountryMap.find(cit.GetCountry()); if (cntry_it == m_CountryMap.end()) return 0; const string* number; const SPat_idMap::TByNumber* by_number; if ( cit.GetId().IsNumber() ) { number = &cit.GetId().GetNumber(); by_number = &cntry_it->second.m_ByNumber; } else if ( cit.GetId().IsApp_number() ) { number = &cit.GetId().GetApp_number(); by_number = &cntry_it->second.m_ByApp_number; } else { return 0; } SPat_idMap::TByNumber::const_iterator num_it = by_number->find(*number); if (num_it == by_number->end()) return 0; SPat_idMap::TBySeqid::const_iterator seqid_it = num_it->second.find(pid.GetSeqid()); if (seqid_it != num_it->second.end()) { return seqid_it->second; } // Not found return 0;}CSeq_id_Handle CSeq_id_Patent_Tree::FindInfo(const CSeq_id& id) const{ _ASSERT( id.IsPatent() ); const CPatent_seq_id& pid = id.GetPatent(); TReadLockGuard guard(m_TreeLock); return CSeq_id_Handle(x_FindInfo(pid));}CSeq_id_Handle CSeq_id_Patent_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT( id.IsPatent() ); const CPatent_seq_id& pid = id.GetPatent(); TWriteLockGuard guard(m_TreeLock); CSeq_id_Info* info = x_FindInfo(pid); if ( !info ) { const CId_pat& cit = pid.GetCit(); SPat_idMap& country = m_CountryMap[cit.GetCountry()]; if ( cit.GetId().IsNumber() ) { SPat_idMap::TBySeqid& num = country.m_ByNumber[cit.GetId().GetNumber()]; _ASSERT(num.find(pid.GetSeqid()) == num.end()); info = CreateInfo(id); num[pid.GetSeqid()] = info; } else if ( cit.GetId().IsApp_number() ) { SPat_idMap::TBySeqid& app = country.m_ByApp_number[ cit.GetId().GetApp_number()]; _ASSERT(app.find(pid.GetSeqid()) == app.end()); info = CreateInfo(id); app[pid.GetSeqid()] = info; } else { // Can not index empty patent number NCBI_THROW(CObjMgrException, eIdMapperError, "Cannot index empty patent number"); } } return CSeq_id_Handle(info);}void CSeq_id_Patent_Tree::x_Unindex(const CSeq_id_Info* info){ CConstRef<CSeq_id> id = info->GetSeqId(); _ASSERT( id->IsPatent() ); const CPatent_seq_id& pid = id->GetPatent(); TByCountry::iterator country_it = m_CountryMap.find(pid.GetCit().GetCountry()); _ASSERT(country_it != m_CountryMap.end()); SPat_idMap& pats = country_it->second; if ( pid.GetCit().GetId().IsNumber() ) { SPat_idMap::TByNumber::iterator num_it = pats.m_ByNumber.find(pid.GetCit().GetId().GetNumber()); _ASSERT(num_it != pats.m_ByNumber.end()); SPat_idMap::TBySeqid::iterator seqid_it = num_it->second.find(pid.GetSeqid()); _ASSERT(seqid_it != num_it->second.end()); _ASSERT(seqid_it->second == info); num_it->second.erase(seqid_it); if ( num_it->second.empty() ) pats.m_ByNumber.erase(num_it); } else if ( pid.GetCit().GetId().IsApp_number() ) { SPat_idMap::TByNumber::iterator app_it = pats.m_ByApp_number.find(pid.GetCit().GetId().GetApp_number()); _ASSERT(app_it == pats.m_ByApp_number.end()); SPat_idMap::TBySeqid::iterator seqid_it = app_it->second.find(pid.GetSeqid()); _ASSERT(seqid_it != app_it->second.end()); _ASSERT(seqid_it->second == info); app_it->second.erase(seqid_it); if ( app_it->second.empty() ) pats.m_ByNumber.erase(app_it); } if (country_it->second.m_ByNumber.empty() && country_it->second.m_ByApp_number.empty()) m_CountryMap.erase(country_it);}bool CSeq_id_Patent_Tree::HaveMatch(const CSeq_id_Handle& ) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); return false;}void CSeq_id_Patent_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); id_list.insert(id);}void CSeq_id_Patent_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ TReadLockGuard guard(m_TreeLock); ITERATE (TByCountry, cit, m_CountryMap) { SPat_idMap::TByNumber::const_iterator nit = cit->second.m_ByNumber.find(sid); if (nit != cit->second.m_ByNumber.end()) { ITERATE(SPat_idMap::TBySeqid, iit, nit->second) { id_list.insert(CSeq_id_Handle(iit->second)); } } SPat_idMap::TByNumber::const_iterator ait = cit->second.m_ByApp_number.find(sid); if (ait != cit->second.m_ByApp_number.end()) { ITERATE(SPat_idMap::TBySeqid, iit, nit->second) { id_list.insert(CSeq_id_Handle(iit->second)); } } }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_PDB_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_PDB_Tree::CSeq_id_PDB_Tree(void){}CSeq_id_PDB_Tree::~CSeq_id_PDB_Tree(void){}bool CSeq_id_PDB_Tree::Empty(void) const{ return m_MolMap.empty();}inline string CSeq_id_PDB_Tree::x_IdToStrKey(const CPDB_seq_id& id) const{// this is an attempt to follow the undocumented rules of PDB// ("documented" as code written elsewhere) string skey = id.GetMol().Get(); switch (char chain = (char)id.GetChain()) { case '\0': skey += " "; break; case '|': skey += "VB"; break; default: skey += chain; break; } return skey;}CSeq_id_Info* CSeq_id_PDB_Tree::x_FindInfo(const CPDB_seq_id& pid) const{ TMolMap::const_iterator mol_it = m_MolMap.find(x_IdToStrKey(pid)); if (mol_it == m_MolMap.end()) return 0; ITERATE(TSubMolList, it, mol_it->second) { CConstRef<CSeq_id> id = (*it)->GetSeqId(); if (pid.Equals(id->GetPdb())) { return *it; } } // Not found return 0;}CSeq_id_Handle CSeq_id_PDB_Tree::FindInfo(const CSeq_id& id) const{ _ASSERT( id.IsPdb() ); const CPDB_seq_id& pid = id.GetPdb(); TReadLockGuard guard(m_TreeLock); return CSeq_id_Handle(x_FindInfo(pid));}CSeq_id_Handle CSeq_id_PDB_Tree::FindOrCreate(const CSeq_id& id){ _ASSERT( id.IsPdb() ); const CPDB_seq_id& pid = id.GetPdb(); TWriteLockGuard guard(m_TreeLock); CSeq_id_Info* info = x_FindInfo(pid); if ( !info ) { info = CreateInfo(id); TSubMolList& sub = m_MolMap[x_IdToStrKey(id.GetPdb())]; ITERATE(TSubMolList, sub_it, sub) { _ASSERT(!info->GetSeqId()->GetPdb() .Equals((*sub_it)->GetSeqId()->GetPdb())); } sub.push_back(info); } return CSeq_id_Handle(info);}void CSeq_id_PDB_Tree::x_Unindex(const CSeq_id_Info* info){ CConstRef<CSeq_id> id = info->GetSeqId(); _ASSERT( id->IsPdb() ); const CPDB_seq_id& pid = id->GetPdb(); TMolMap::iterator mol_it = m_MolMap.find(x_IdToStrKey(pid)); _ASSERT(mol_it != m_MolMap.end()); NON_CONST_ITERATE(TSubMolList, it, mol_it->second) { if (*it == info) { CConstRef<CSeq_id> id2 = (*it)->GetSeqId(); _ASSERT(pid.Equals(id2->GetPdb())); mol_it->second.erase(it); break; } } if ( mol_it->second.empty() ) m_MolMap.erase(mol_it);}void CSeq_id_PDB_Tree::FindMatch(const CSeq_id_Handle& id, TSeq_id_MatchList& id_list) const{ //_ASSERT(id && id == FindInfo(id.GetSeqId())); CConstRef<CSeq_id> seq_id = id.GetSeqId(); const CPDB_seq_id& pid = seq_id->GetPdb(); TReadLockGuard guard(m_TreeLock); TMolMap::const_iterator mol_it = m_MolMap.find(x_IdToStrKey(pid)); if (mol_it == m_MolMap.end()) return; ITERATE(TSubMolList, it, mol_it->second) { CConstRef<CSeq_id> seq_id2 = (*it)->GetSeqId(); const CPDB_seq_id& pid2 = seq_id2->GetPdb(); // Ignore date if not set in id if ( pid.IsSetRel() ) { if ( !pid2.IsSetRel() || !pid.GetRel().Equals(pid2.GetRel()) ) continue; } id_list.insert(CSeq_id_Handle(*it)); }}void CSeq_id_PDB_Tree::FindMatchStr(string sid, TSeq_id_MatchList& id_list) const{ TReadLockGuard guard(m_TreeLock); TMolMap::const_iterator mit = m_MolMap.find(sid); if (mit == m_MolMap.end()) return; ITERATE(TSubMolList, sub_it, mit->second) { id_list.insert(CSeq_id_Handle(*sub_it)); }}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: seq_id_tree.cpp,v $* Revision 1000.4 2004/06/01 19:24:07 gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13** Revision 1.13 2004/05/21 21:42:13 gorelenk* Added PCH ncbi_pch.hpp** Revision 1.12 2004/04/29 13:17:51 grichenk* Fixed reverse ID matching** Revision 1.11 2004/04/21 19:55:05 grichenk* Fixed textseq-id matching.** Revision 1.10 2004/04/21 13:37:13 grichenk* Fixed reverse matching IDs** Revision 1.9 2004/02/19 17:53:09 vasilche* Explicit creation of CSeq_id_Handle.** Revision 1.8 2004/02/19 17:25:35 vasilche* Use CRef<> to safely hold pointer to CSeq_id_Info.* CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.* Reduce number of calls to CSeq_id_Handle.GetSeqId().** Revision 1.7 2004/02/10 21:15:16 grichenk* Added reverse ID matching.** Revision 1.6 2004/02/09 14:41:50 vasilche* Fixed processing of version & release in Textseq-id.** Revision 1.5 2004/01/07 20:42:02 grichenk* Fixed matching of accession to accession.version** Revision 1.4 2003/09/30 16:22:03 vasilche* Updated internal object manager classes to be able to load ID2 data.* SNP blobs are loaded as ID2 split blobs - readers convert them automatically.* Scope caches results of requests for data to data loaders.* Optimized CSeq_id_Handle for gis.* Optimized bioseq lookup in scope.* Reduced object allocations in annotation iterators.* CScope is allowed to be destroyed before other objects using this scope are* deleted (feature iterators, bioseq handles etc).* Optimized lookup for matching Seq-ids in CSeq_id_Mapper.* Added 'adaptive' option to objmgr_demo application.** Revision 1.3 2003/09/05 17:29:40 grichenk* Structurized Object Manager exceptions** Revision 1.2 2003/06/30 18:40:04 vasilche* Fixed warning (unused argument).** Revision 1.1 2003/06/10 19:06:35 vasilche* Simplified CSeq_id_Mapper and CSeq_id_Handle.*** ===========================================================================*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?