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 + -
显示快捷键?