⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    CTaxon1Node* pSubgen = ( NULL );    CTaxon1Node* pNode = ( &node );    string::size_type pos(0);    do {        int rank( pNode->GetRank() );        if( rank == GetSubspeciesRank())            pSubspec = pNode;        else if( rank == GetSpeciesRank())            pSpec = pNode;        else if( rank == GetSubgenusRank())            pSubgen = pNode;        else if(rank == GetGenusRank()) {            pGenus = pNode;            break;        }        pNode = pNode->GetParent();    } while( pNode && !pNode->IsRoot() );    pNode = &node;    if( !pGenus ) {        if( !pSubgen )            return false;        else            pGenus = pSubgen;    }    CBinomialOrgName& bon = ( on.SetName().SetBinomial() );    bon.SetGenus( pGenus->GetName() );    if( pSpec ) { // we have a species in lineage        bon.SetSpecies().assign( pSpec->GetName(),                                 pos=s_AfterPrefix( pSpec->GetName(),                                                    pGenus->GetName() ),                                 pSpec->GetName().size() - pos );        if( pSubspec ) { // we also have a subspecies in lineage            bon.SetSubspecies().assign( pSubspec->GetName(),                                        pos=s_AfterPrefix(pSubspec->GetName(),                                                          pSpec->GetName()),                                        pSubspec->GetName().size() - pos );        }        if( pNode != pSpec ) {            BuildOrgModifier( pNode, on );        }        return true;    }    // no species in lineage    if( pSubspec ) { // we have no species but we have subspecies        bon.SetSubspecies().assign( pSubspec->GetName(),                                    pos=s_AfterPrefix(pSubspec->GetName(),                                                      pGenus->GetName()),                                    pSubspec->GetName().size() - pos );        BuildOrgModifier( pNode, on,                          pNode==pSubspec ? pGenus : pSubspec );        return true;    }      // we have no species, no subspecies    // but we are under species level (varietas or forma)    BuildOrgModifier( pNode, on, pGenus );    return true;}boolCOrgRefCache::SetPartialName( CTaxon1Node& node, COrgName& on ){    CTaxElement* pTaxElem = ( new CTaxElement );    int rank_id= node.GetRank();        CPartialOrgName& pon = ( on.SetName().SetPartial() );    pon.Set().push_back(CRef<CTaxElement>(pTaxElem));    if( rank_id == GetFamilyRank()) {        pTaxElem->SetFixed_level( CTaxElement_Base::eFixed_level_family );    }    else if(rank_id == GetOrderRank()) {        pTaxElem->SetFixed_level( CTaxElement_Base::eFixed_level_order );    }    else if(rank_id == GetClassRank()) {        pTaxElem->SetFixed_level( CTaxElement_Base::eFixed_level_class );    }    else {        pTaxElem->SetFixed_level( CTaxElement_Base::eFixed_level_other );        pTaxElem->SetLevel( GetRankName( rank_id ) );    }    pTaxElem->SetName( node.GetName() );    return true;}boolCOrgRefCache::BuildOrgRef( CTaxon1Node& node, COrg_ref& org, bool& is_species ){    // Init ranks here    if( !InitRanks() || !InitNameClasses() || !InitDivisions() )        return false;    CTaxon1_req  req;    CTaxon1_resp resp;    req.SetGetorgnames( node.GetTaxId() );    if( m_host.SendRequest( req, resp ) ) {        if( resp.IsGetorgnames() ) {            // Correct response, return object            list< CRef< CTaxon1_name > >&                lLin = ( resp.SetGetorgnames() );            // Save taxname            org.SetTaxname().swap( lLin.front()->SetOname() );            lLin.pop_front();            list< CRef< CTaxon1_name > >::iterator i;            // Find preferred common name            int pref_cls = GetPreferredCommonNameClass();            for( i = lLin.begin(); i != lLin.end(); ++i ) {                if( (*i)->CanGetCde() && (*i)->GetCde() == pref_cls ) {                    org.SetCommon().swap( (*i)->SetOname() );                    lLin.erase( i );                    break;                }            }            int syn_cls(GetSynonymNameClass());            int comm_cls(GetCommonNameClass());            for( i = lLin.begin(); i != lLin.end(); ++i ) {		if( (*i)->CanGetCde() ) {		    int cls = (*i)->GetCde();		    if( cls == syn_cls || cls == comm_cls ) {			org.SetSyn().push_back( (*i)->GetOname() );		    }		}            }            // Set taxid as db tag            org.SetTaxId( node.GetTaxId() );            COrgName& on = ( org.SetOrgname() );            short div_id( node.GetDivision() );            if( GetDivisionCode( div_id ) ) {                on.SetDiv( GetDivisionCode( div_id ) );            }            on.SetGcode( node.GetGC() );	    if( node.GetMGC() > 0 ) {		on.SetMgcode( node.GetMGC() );	    }            // Build lineage            CTaxon1Node* pNode;            if( !node.IsRoot() ) {                pNode = node.GetParent();		on.SetLineage(kEmptyStr);                s_BuildLineage( on.SetLineage(), pNode, 0,				GetSpeciesRank() );                if( on.GetLineage().empty() ) {                    on.ResetLineage();		}            }            // Set rank            int rank_id( node.GetRank() );            is_species = (rank_id >= GetSpeciesRank());            // correct level by lineage if node has no rank            if( rank_id < 0 && !node.IsRoot() ) {                pNode = node.GetParent();                while( !pNode->IsRoot() ) {                    int rank( pNode->GetRank() );                    if(rank >= 0) {                        is_species= (rank >= GetSpeciesRank()-1);                        break;                    }                    pNode = pNode->GetParent();                }            }            // Create name            if(is_species) {                /* we are on species level or below */	                     /* check for viruses */                if( div_id == GetVirusesDivision()                    || div_id == GetPhagesDivision() ) {                    /* this is a virus */                    /* virus */                    if( rank_id == GetSpeciesRank() ) {                        /* we are on species level */                        on.SetName().SetVirus( node.GetName() );                    } else {                        /* we are below species */                        /* first try to find species or min rank which                           below species but above us */                        pNode = 0;                        CTaxon1Node* pTmp = ( node.GetParent() );			                        while( pTmp && !pTmp->IsRoot() ) {                            int rank(pTmp->GetRank());                            if( rank >= GetSpeciesRank() ) {                                pNode = pTmp;                                if( rank == GetSpeciesRank() )                                    break;                            } else if( rank >= 0 )                                break;                            pTmp = pTmp->GetParent();                        }                        if( !pNode ) {// we have species or something above us                            pNode = &node;                        }                        on.SetName().SetVirus( pNode->GetName() );                        // Add modifier to orgname                        BuildOrgModifier( &node, on );                    } // non species rank                } else if( !SetBinomialName( node, on ) ) {                    // name is not binomial: set partial                    SetPartialName( node, on );                }            } else { // above species                SetPartialName( node, on );            }	    // Add some genbank names as organism modifiers	    if( org.IsSetOrgname() ) { // OrgName is not empty		for( i = lLin.begin(); i != lLin.end(); ++i ) {		    if( (*i)->CanGetCde() ) {			int cde = (*i)->GetCde();			COrgMod::ESubtype stype = (COrgMod::ESubtype)0;			if( cde == GetGBAcronymNameClass() ) {			    stype = COrgMod::eSubtype_gb_acronym;			} else if( cde == GetGBSynonymNameClass() ) {			    stype = COrgMod::eSubtype_gb_synonym;			} else if( cde == GetGBAnamorphNameClass() ) {			    stype = COrgMod::eSubtype_gb_anamorph;			}			if( stype ) {			    CRef<COrgMod> pMod( new COrgMod );			    pMod->SetSubname().swap( (*i)->SetOname() );			    pMod->SetSubtype( stype );			    on.SetMod().push_back( pMod );			}		    }		}	    }        } else {            m_host.SetLastError                ("Unable to get orgref: Response is not Getorgnames");            return false;        }    } else        return false;    return true;}boolCOrgRefCache::Insert1( CTaxon1Node& node ){    bool is_species( false );    struct SCacheEntry* pEntry = ( new SCacheEntry );    pEntry->m_pTax1 = new CTaxon1_data;    pEntry->m_pTax2 = NULL;    pEntry->m_pTreeNode = &node;    COrg_ref& org = ( pEntry->m_pTax1->SetOrg() );    if( !BuildOrgRef( node, org, is_species ) ) {        delete pEntry;        return false;    }    // Set division code    if( GetDivisionCode(node.GetDivision()) ) {        pEntry->m_pTax1->SetDiv()            .assign( GetDivisionCode(node.GetDivision()) );    }    // Set species level    pEntry->m_pTax1->SetIs_species_level( is_species );    // Remove last element from list    if( m_lCache.size() >= m_nCacheCapacity ) {        CTaxon1Node* pNode = ( m_lCache.back()->m_pTreeNode );        pNode->m_cacheEntry = NULL;        delete m_lCache.back();        m_lCache.pop_back();    }        node.m_cacheEntry = pEntry;    m_lCache.push_front( pEntry );    return true;}boolCOrgRefCache::Insert2( CTaxon1Node& node ){    bool is_species( false );    struct SCacheEntry* pEntry = ( new SCacheEntry );    pEntry->m_pTax1 = NULL;    pEntry->m_pTax2 = new CTaxon2_data;    pEntry->m_pTreeNode = &node;    pEntry->m_pTax2->SetIs_uncultured( node.IsUncultured() );    COrg_ref& org = pEntry->m_pTax2->SetOrg();    if( !BuildOrgRef( node, org, is_species ) ) {        delete pEntry;        return false;    }    // Set blast names    CTaxon1Node* pNode = ( &node );    while( !pNode->IsRoot() ) {        if( !pNode->GetBlastName().empty() ) {            pEntry->m_pTax2->SetBlast_name()                .push_back( pNode->GetBlastName() );        }        pNode = pNode->GetParent();    }    // Set species level    pEntry->m_pTax2->SetIs_species_level( is_species );    // Remove last element from list    if( m_lCache.size() >= m_nCacheCapacity ) {        pNode = m_lCache.back()->m_pTreeNode;        pNode->m_cacheEntry = NULL;        delete m_lCache.back();        m_lCache.pop_back();    }        node.m_cacheEntry = pEntry;    m_lCache.push_front( pEntry );    return true;}CTaxon1_data*COrgRefCache::SCacheEntry::GetData1(){    if( ! m_pTax1 ) {        m_pTax1 = new CTaxon1_data;        if( m_pTax2->IsSetOrg() ) {            m_pTax1->SetOrg( m_pTax2->SetOrg() );	}        if( m_pTax2->GetOrg().GetOrgname().CanGetDiv() ) {            m_pTax1->SetDiv( m_pTax2->GetOrg().GetOrgname().GetDiv() );        } else {            m_pTax1->SetDiv( kEmptyStr );	}        m_pTax1->SetIs_species_level(m_pTax2->GetIs_species_level());    }    return m_pTax1;}CTaxon2_data*COrgRefCache::SCacheEntry::GetData2(){    if( ! m_pTax2 ) {        m_pTax2 = new CTaxon2_data;        if( m_pTax1->IsSetOrg() ) {            m_pTax2->SetOrg( m_pTax1->SetOrg() );	}        CTaxon1Node* pNode = ( m_pTreeNode );        while( !pNode->IsRoot() ) {            if( !pNode->GetBlastName().empty() ) {                m_pTax2->SetBlast_name().push_back( pNode->GetBlastName() );            }            pNode = pNode->GetParent();        }        m_pTax2->SetIs_uncultured( m_pTreeNode->IsUncultured() );        m_pTax2->SetIs_species_level(m_pTax1->GetIs_species_level());    }    return m_pTax2;}intCOrgRefCache::FindRankByName( const char* pchName ) const{    for( TRankMapCI ci = m_rankStorage.begin();         ci != m_rankStorage.end();         ++ci )        if( ci->second.compare( pchName ) == 0 )            return ci->first;    return -1000;}const char*COrgRefCache::GetRankName( int rank ) const{    TRankMapCI ci( m_rankStorage.find( rank ) );    if( ci != m_rankStorage.end() ) {        return ci->second.c_str();    }    return NULL;}boolCOrgRefCache::InitRanks(){    if( m_rankStorage.size() == 0 ) {        CTaxon1_req  req;        CTaxon1_resp resp;        req.SetGetranks();        if( m_host.SendRequest( req, resp ) ) {            if( resp.IsGetranks() ) {                // Correct response, return object                const list< CRef< CTaxon1_info > >&                    lRanks = ( resp.GetGetranks() );                // Fill in storage                for( list< CRef< CTaxon1_info > >::const_iterator                         i = lRanks.begin();                     i != lRanks.end(); ++i ) {                    m_rankStorage                        .insert( TRankMap::value_type((*i)->GetIval1(),                                                      (*i)->GetSval()) );		}            } else { // Internal: wrong respond type                m_host.SetLastError( "Response type is not Getranks" );                return false;            }        }        m_nSuperkingdomRank = FindRankByName( "superkingdom" );        if( m_nSuperkingdomRank < -10 ) {            m_host.SetLastError( "Superkingdom rank was not found" );            return false;        }        m_nFamilyRank = FindRankByName( "family" );        if( m_nFamilyRank < -10 ) {            m_host.SetLastError( "Family rank was not found" );            return false;        }        m_nOrderRank = FindRankByName( "order" );        if( m_nOrderRank < -10 ) {            m_host.SetLastError( "Order rank was not found" );            return false;        }        m_nClassRank = FindRankByName( "class" );        if( m_nClassRank < -10 ) {            m_host.SetLastError( "Class rank was not found" );            return false;        }        m_nGenusRank = FindRankByName( "genus" );        if( m_nGenusRank < -10 ) {            m_host.SetLastError( "Genus rank was not found" );            return false;        }        m_nSubgenusRank = FindRankByName( "subgenus" );        if( m_nSubgenusRank < -10 ) {            m_host.SetLastError( "Subgenus rank was not found" );            return false;        }        m_nSpeciesRank = FindRankByName( "species" );        if( m_nSpeciesRank < -10 ) {            m_host.SetLastError( "Species rank was not found" );            return false;        }        m_nSubspeciesRank = FindRankByName( "subspecies" );        if( m_nSubspeciesRank < -10 ) {            m_host.SetLastError( "Subspecies rank was not found" );            return false;        }        m_nFormaRank = FindRankByName( "forma" );        if( m_nFormaRank < -10 ) {            m_host.SetLastError( "Forma rank was not found" );            return false;        }        m_nVarietyRank = FindRankByName( "varietas" );        if( m_nVarietyRank < -10 ) {            m_host.SetLastError( "Variety rank was not found" );            return false;        }    }    return true;}const char*COrgRefCache::GetNameClassName( short nc ) const{    TNameClassMapCI ci( m_ncStorage.find( nc ) );    if( ci != m_ncStorage.end() ) {        return ci->second.c_str();    }    return NULL;}shortCOrgRefCache::FindNameClassByName( const char* pchName ) const{    for( TNameClassMapCI ci = m_ncStorage.begin();         ci != m_ncStorage.end();         ++ci )        if( ci->second.compare( pchName ) == 0 )            return ci->first;

⌨️ 快捷键说明

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