seq_id_tree.cpp

来自「ncbi源码」· C++ 代码 · 共 1,683 行 · 第 1/3 页

CPP
1,683
字号
            ver.push_back(info);        }        if ( tid.IsSetName() ) {            TVersions& ver = m_ByName[tid.GetName()];            ITERATE(TVersions, vit, ver) {                _ASSERT(!x_Get(*(*vit)->GetSeqId()).Equals(tid));            }            ver.push_back(info);        }    }    return CSeq_id_Handle(info);}void CSeq_id_Textseq_Tree::x_Unindex(const CSeq_id_Info* info){    _ASSERT(x_Check(*info->GetSeqId()));    const CTextseq_id& tid = x_Get(*info->GetSeqId());    if ( tid.IsSetAccession() ) {        TStringMap::iterator it =            m_ByAccession.find(tid.GetAccession());        if (it != m_ByAccession.end()) {            NON_CONST_ITERATE(TVersions, vit, it->second) {                if (*vit == info) {                    it->second.erase(vit);                    break;                }            }            if (it->second.empty())                m_ByAccession.erase(it);        }    }    if ( tid.IsSetName() ) {        TStringMap::iterator it = m_ByName.find(tid.GetName());        if (it != m_ByName.end()) {            NON_CONST_ITERATE(TVersions, vit, it->second) {                if (*vit == info) {                    it->second.erase(vit);                    break;                }            }            if (it->second.empty())                m_ByName.erase(it);        }    }}void CSeq_id_Textseq_Tree::x_FindVersionMatch(const TVersions& ver_list,                                              const CTextseq_id& tid,                                              TSeq_id_MatchList& id_list) const{    int ver = 0;    string rel;    if ( tid.IsSetVersion() )        ver = tid.GetVersion();    if ( tid.IsSetRelease() )        rel = tid.GetRelease();    ITERATE(TVersions, vit, ver_list) {        int ver_it = 0;        string rel_it;        const CTextseq_id& vit_ref = x_Get(*(*vit)->GetSeqId());        if ( vit_ref.IsSetVersion() )            ver_it = vit_ref.GetVersion();        if ( vit_ref.IsSetRelease() )            rel_it = vit_ref.GetRelease();        if (ver != 0 && ver != ver_it) {            continue;        }        if (!rel.empty() && rel != rel_it) {            continue;        }        id_list.insert(CSeq_id_Handle(*vit));    }}void CSeq_id_Textseq_Tree::FindMatch(const CSeq_id_Handle& id,                                     TSeq_id_MatchList& id_list) const{    //_ASSERT(id && id == FindInfo(id.GetSeqId()));    const CTextseq_id& tid = x_Get(*id.GetSeqId());    if ( tid.IsSetAccession() ) {        TReadLockGuard guard(m_TreeLock);        TStringMap::const_iterator it = m_ByAccession.find(tid.GetAccession());        if (it != m_ByAccession.end()) {            x_FindVersionMatch(it->second, tid, id_list);        }    }    else if ( tid.IsSetName() ) {        TReadLockGuard guard(m_TreeLock);        TStringMap::const_iterator it = m_ByName.find(tid.GetName());        if (it != m_ByName.end()) {            x_FindVersionMatch(it->second, tid, id_list);        }    }}void CSeq_id_Textseq_Tree::FindMatchStr(string sid,                                        TSeq_id_MatchList& id_list) const{    TReadLockGuard guard(m_TreeLock);    // ignore '.' in the search string - cut it out    sid = sid.substr(0, sid.find('.'));    // Find by accession    TStringMap::const_iterator it = m_ByAccession.find(sid);    if (it == m_ByAccession.end()) {        it = m_ByName.find(sid);        if (it == m_ByName.end())            return;    }    ITERATE(TVersions, vit, it->second) {        id_list.insert(CSeq_id_Handle(*vit));    }}bool CSeq_id_Textseq_Tree::IsBetterVersion(const CSeq_id_Handle& h1,                                           const CSeq_id_Handle& h2) const{    CConstRef<CSeq_id> id1 = h1.GetSeqId();    _ASSERT(x_Check(*id1));    CConstRef<CSeq_id> id2 = h2.GetSeqId();    _ASSERT(x_Check(*id2));    const CTextseq_id& tid1 = x_Get(*id1);    const CTextseq_id& tid2 = x_Get(*id2);    // Compare versions. If only one of the two ids has version,    // consider it is better.    if ( tid1.IsSetVersion() ) {        if ( tid2.IsSetVersion() )            return tid1.GetVersion() > tid2.GetVersion();        else            return true; // Only h1 has version    }    return false; // h1 has no version, so it can not be better than h2}bool CSeq_id_Textseq_Tree::HaveReverseMatch(const CSeq_id_Handle&) const{    return true;}void CSeq_id_Textseq_Tree::FindReverseMatch(const CSeq_id_Handle& id,                                            TSeq_id_MatchList& id_list){    id_list.insert(id);    CConstRef<CSeq_id> orig_id = id.GetSeqId();    const CTextseq_id& orig_tid = x_Get(*orig_id);    CRef<CSeq_id> tmp(new CSeq_id);    tmp->Assign(*orig_id);    CTextseq_id& tid = const_cast<CTextseq_id&>(x_Get(*tmp));    bool A = orig_tid.IsSetAccession();    bool N = orig_tid.IsSetName();    bool v = orig_tid.IsSetVersion();    bool r = orig_tid.IsSetRelease();    if ( A  &&  (N  ||  v  ||  r) ) {        // A only        tid.Reset();        tid.SetAccession(orig_tid.GetAccession());        id_list.insert(FindOrCreate(*tmp));        if ( v  &&  (N  ||  r) ) {            // A.v            tid.SetVersion(orig_tid.GetVersion());            id_list.insert(FindOrCreate(*tmp));        }        if ( N ) {            // N only            tid.Reset();            tid.SetName(orig_tid.GetName());            id_list.insert(FindOrCreate(*tmp));            if ( v  ||  r ) {                if ( r ) {                    // N.r                    tid.SetRelease(orig_tid.GetRelease());                    id_list.insert(FindOrCreate(*tmp));                    tid.ResetRelease();                }                // A + N                tid.SetAccession(orig_tid.GetAccession());                id_list.insert(FindOrCreate(*tmp));                if ( v  &&  r ) {                    // A.v + N                    tid.SetVersion(orig_tid.GetVersion());                    id_list.insert(FindOrCreate(*tmp));                    // A + N.r                    tid.ResetVersion();                    tid.SetRelease(orig_tid.GetRelease());                    id_list.insert(FindOrCreate(*tmp));                }            }        }    }    else if ( N  &&  (v  ||  r) ) {        // N only        tid.Reset();        tid.SetName(orig_tid.GetName());        id_list.insert(FindOrCreate(*tmp));        if ( v  &&  r ) {            tid.SetRelease(orig_tid.GetRelease());            id_list.insert(FindOrCreate(*tmp));        }    }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_GB_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_GB_Tree::x_Check(const CSeq_id& id) const{    return id.IsGenbank()  ||  id.IsEmbl()  ||  id.IsDdbj();}const CTextseq_id& CSeq_id_GB_Tree::x_Get(const CSeq_id& id) const{    switch ( id.Which() ) {    case CSeq_id::e_Genbank:        return id.GetGenbank();    case CSeq_id::e_Embl:        return id.GetEmbl();    case CSeq_id::e_Ddbj:        return id.GetDdbj();    default:        NCBI_THROW(CObjMgrException, eIdMapperError, "Invalid seq-id type");    }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Pir_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Pir_Tree::x_Check(const CSeq_id& id) const{    return id.IsPir();}const CTextseq_id& CSeq_id_Pir_Tree::x_Get(const CSeq_id& id) const{    return id.GetPir();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Swissprot_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Swissprot_Tree::x_Check(const CSeq_id& id) const{    return id.IsSwissprot();}const CTextseq_id& CSeq_id_Swissprot_Tree::x_Get(const CSeq_id& id) const{    return id.GetSwissprot();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Prf_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Prf_Tree::x_Check(const CSeq_id& id) const{    return id.IsPrf();}const CTextseq_id& CSeq_id_Prf_Tree::x_Get(const CSeq_id& id) const{    return id.GetPrf();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Tpd_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Tpg_Tree::x_Check(const CSeq_id& id) const{    return id.IsTpg();}const CTextseq_id& CSeq_id_Tpg_Tree::x_Get(const CSeq_id& id) const{    return id.GetTpg();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Tpe_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Tpe_Tree::x_Check(const CSeq_id& id) const{    return id.IsTpe();}const CTextseq_id& CSeq_id_Tpe_Tree::x_Get(const CSeq_id& id) const{    return id.GetTpe();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Tpd_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Tpd_Tree::x_Check(const CSeq_id& id) const{    return id.IsTpd();}const CTextseq_id& CSeq_id_Tpd_Tree::x_Get(const CSeq_id& id) const{    return id.GetTpd();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Other_Tree/////////////////////////////////////////////////////////////////////////////bool CSeq_id_Other_Tree::x_Check(const CSeq_id& id) const{    return id.IsOther();}const CTextseq_id& CSeq_id_Other_Tree::x_Get(const CSeq_id& id) const{    return id.GetOther();}/////////////////////////////////////////////////////////////////////////////// CSeq_id_Local_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_Local_Tree::CSeq_id_Local_Tree(void){}CSeq_id_Local_Tree::~CSeq_id_Local_Tree(void){}bool CSeq_id_Local_Tree::Empty(void) const{    return m_ByStr.empty() && m_ById.empty();}CSeq_id_Info* CSeq_id_Local_Tree::x_FindInfo(const CObject_id& oid) const{    if ( oid.IsStr() ) {        TByStr::const_iterator it = m_ByStr.find(oid.GetStr());        if (it != m_ByStr.end()) {            return it->second;        }    }    else if ( oid.IsId() ) {        TById::const_iterator it = m_ById.find(oid.GetId());        if (it != m_ById.end()) {            return it->second;        }    }    // Not found    return 0;}CSeq_id_Handle CSeq_id_Local_Tree::FindInfo(const CSeq_id& id) const{    _ASSERT( id.IsLocal() );    const CObject_id& oid = id.GetLocal();    TReadLockGuard guard(m_TreeLock);    return CSeq_id_Handle(x_FindInfo(oid));}CSeq_id_Handle CSeq_id_Local_Tree::FindOrCreate(const CSeq_id& id){    _ASSERT(id.IsLocal());    const CObject_id& oid = id.GetLocal();    TWriteLockGuard guard(m_TreeLock);    CSeq_id_Info* info = x_FindInfo(oid);    if ( !info ) {        info = CreateInfo(id);        if ( oid.IsStr() ) {            _VERIFY(m_ByStr.insert(TByStr::value_type(oid.GetStr(),                                                      info)).second);        }        else if ( oid.IsId() ) {            _VERIFY(m_ById.insert(TById::value_type(oid.GetId(),                                                    info)).second);        }        else {            NCBI_THROW(CObjMgrException, eIdMapperError,                       "Can not create index for an empty local seq-id");        }    }    return CSeq_id_Handle(info);}void CSeq_id_Local_Tree::x_Unindex(const CSeq_id_Info* info){    CConstRef<CSeq_id> id = info->GetSeqId();    _ASSERT(id->IsLocal());    const CObject_id& oid = id->GetLocal();    if ( oid.IsStr() ) {        _VERIFY(m_ByStr.erase(oid.GetStr()));    }    else if ( oid.IsId() ) {        _VERIFY(m_ById.erase(oid.GetId()));    }}bool CSeq_id_Local_Tree::HaveMatch(const CSeq_id_Handle& ) const{    // Only one entry can match each id    return false;}void CSeq_id_Local_Tree::FindMatch(const CSeq_id_Handle& id,                                   TSeq_id_MatchList& id_list) const{    // Only one entry can match each id    //_ASSERT(id && id == FindInfo(id.GetSeqId()));    id_list.insert(id);}void CSeq_id_Local_Tree::FindMatchStr(string sid,                                      TSeq_id_MatchList& id_list) const{    TReadLockGuard guard(m_TreeLock);    // In any case search in strings    TByStr::const_iterator str_it = m_ByStr.find(sid);    if (str_it != m_ByStr.end()) {        id_list.insert(CSeq_id_Handle(str_it->second));    }    else {        try {            int value = NStr::StringToInt(sid);            TById::const_iterator int_it = m_ById.find(value);            if (int_it != m_ById.end()) {                id_list.insert(CSeq_id_Handle(int_it->second));            }        }        catch (const CStringException& /*ignored*/) {            // Not an integer value            return;        }    }}/////////////////////////////////////////////////////////////////////////////// CSeq_id_General_Tree/////////////////////////////////////////////////////////////////////////////CSeq_id_General_Tree::CSeq_id_General_Tree(void){}CSeq_id_General_Tree::~CSeq_id_General_Tree(void){}bool CSeq_id_General_Tree::Empty(void) const{    return m_DbMap.empty();}CSeq_id_Info* CSeq_id_General_Tree::x_FindInfo(const CDbtag& dbid) const{    TDbMap::const_iterator db = m_DbMap.find(dbid.GetDb());    if (db == m_DbMap.end())        return 0;    const STagMap& tm = db->second;    const CObject_id& oid = dbid.GetTag();    if ( oid.IsStr() ) {        STagMap::TByStr::const_iterator it = tm.m_ByStr.find(oid.GetStr());        if (it != tm.m_ByStr.end()) {            return it->second;        }    }    else if ( oid.IsId() ) {        STagMap::TById::const_iterator it = tm.m_ById.find(oid.GetId());        if (it != tm.m_ById.end()) {            return it->second;        }    }    // Not found    return 0;}CSeq_id_Handle CSeq_id_General_Tree::FindInfo(const CSeq_id& id) const{    _ASSERT( id.IsGeneral() );    const CDbtag& dbid = id.GetGeneral();    TReadLockGuard guard(m_TreeLock);    return CSeq_id_Handle(x_FindInfo(dbid));}CSeq_id_Handle CSeq_id_General_Tree::FindOrCreate(const CSeq_id& id){    _ASSERT( id.IsGeneral() );    const CDbtag& dbid = id.GetGeneral();    TWriteLockGuard guard(m_TreeLock);    CSeq_id_Info* info = x_FindInfo(dbid);    if ( !info ) {        info = CreateInfo(id);        STagMap& tm = m_DbMap[dbid.GetDb()];        const CObject_id& oid = dbid.GetTag();        if ( oid.IsStr() ) {            _VERIFY(tm.m_ByStr.insert                    (STagMap::TByStr::value_type(oid.GetStr(), info)).second);        }        else if ( oid.IsId() ) {            _VERIFY(tm.m_ById.insert(STagMap::TById::value_type(oid.GetId(),                                                                info)).second);        }        else {            NCBI_THROW(CObjMgrException, eIdMapperError,                       "Can not create index for an empty db-tag");        }    }    return CSeq_id_Handle(info);}void CSeq_id_General_Tree::x_Unindex(const CSeq_id_Info* info)

⌨️ 快捷键说明

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