readfeat.cpp

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

CPP
1,648
字号
            }        default:            break;    }    return false;}bool CFeature_table_reader_imp::x_AddQualifierToBioSrc (CSeqFeatData& sfdata,                                                        EOrgRef rtype, const string& val){    CBioSource& bsp = sfdata.SetBiosrc ();    switch (rtype) {        case eOrgRef_organism:            {                CBioSource::TOrg& orp = bsp.SetOrg ();                orp.SetTaxname (val);                return true;            }        case eOrgRef_organelle:            {                if (m_GenomeKeys.find (val) != m_GenomeKeys.end ()) {                    CBioSource::EGenome gtype = m_GenomeKeys [val];                    bsp.SetGenome (gtype);                    return true;                }            }        case eOrgRef_div:            {                CBioSource::TOrg& orp = bsp.SetOrg ();                COrg_ref::TOrgname& onp = orp.SetOrgname ();                onp.SetDiv (val);                return true;            }        case eOrgRef_lineage:            {                CBioSource::TOrg& orp = bsp.SetOrg ();                COrg_ref::TOrgname& onp = orp.SetOrgname ();                onp.SetLineage (val);                return true;            }        case eOrgRef_gcode:            {                CBioSource::TOrg& orp = bsp.SetOrg ();                COrg_ref::TOrgname& onp = orp.SetOrgname ();                int code = NStr::StringToInt (val);                onp.SetGcode (code);                return true;            }        case eOrgRef_mgcode:            {                CBioSource::TOrg& orp = bsp.SetOrg ();                COrg_ref::TOrgname& onp = orp.SetOrgname ();                int code = NStr::StringToInt (val);                onp.SetMgcode (code);                return true;            }        default:            break;    }    return false;}bool CFeature_table_reader_imp::x_AddQualifierToBioSrc (CSeqFeatData& sfdata,                                                        CSubSource::ESubtype stype, const string& val){    CBioSource& bsp = sfdata.SetBiosrc ();    CBioSource::TSubtype& slist = bsp.SetSubtype ();    CRef<CSubSource> ssp (new CSubSource);    ssp->SetSubtype (stype);    ssp->SetName (val);    slist.push_back (ssp);    return true;}bool CFeature_table_reader_imp::x_AddQualifierToBioSrc (CSeqFeatData& sfdata,                                                        COrgMod::ESubtype  mtype, const string& val){    CBioSource& bsp = sfdata.SetBiosrc ();    CBioSource::TOrg& orp = bsp.SetOrg ();    COrg_ref::TOrgname& onp = orp.SetOrgname ();    COrgName::TMod& mlist = onp.SetMod ();    CRef<COrgMod> omp (new COrgMod);    omp->SetSubtype (mtype);    omp->SetSubname (val);    mlist.push_back (omp);    return true;}bool CFeature_table_reader_imp::x_AddQualifierToFeature (CRef<CSeq_feat> sfp,                                                         const string& qual, const string& val){    CSeqFeatData&          sfdata = sfp->SetData ();    CSeqFeatData::E_Choice typ = sfdata.Which ();    if (typ == CSeqFeatData::e_Biosrc) {        if (m_OrgRefKeys.find (qual) != m_OrgRefKeys.end ()) {            EOrgRef rtype = m_OrgRefKeys [qual];            if (x_AddQualifierToBioSrc (sfdata, rtype, val)) return true;        } else if (m_SubSrcKeys.find (qual) != m_SubSrcKeys.end ()) {            CSubSource::ESubtype stype = m_SubSrcKeys [qual];            if (x_AddQualifierToBioSrc (sfdata, stype, val)) return true;        } else if (m_OrgModKeys.find (qual) != m_OrgModKeys.end ()) {            COrgMod::ESubtype  mtype = m_OrgModKeys [qual];            if (x_AddQualifierToBioSrc (sfdata, mtype, val)) return true;        }    } else if (m_QualKeys.find (qual) != m_QualKeys.end ()) {        EQual qtype = m_QualKeys [qual];        switch (typ) {            case CSeqFeatData::e_Gene:                if (x_AddQualifierToGene (sfdata, qtype, val)) return true;                break;            case CSeqFeatData::e_Cdregion:                if (x_AddQualifierToCdregion (sfp, sfdata, qtype, val)) return true;                break;            case CSeqFeatData::e_Rna:                if (x_AddQualifierToRna (sfdata, qtype, val)) return true;                break;           case CSeqFeatData::e_Imp:                if (x_AddQualifierToImp (sfp, sfdata, qtype, qual, val)) return true;                break;            case CSeqFeatData::e_Region:                if (qtype == eQual_region_name) {                    sfdata.SetRegion (val);                    return true;                }                break;            case CSeqFeatData::e_Bond:                if (qtype == eQual_bond_type) {                    if (m_BondKeys.find (val) != m_BondKeys.end ()) {                        CSeqFeatData::EBond btyp = m_BondKeys [val];                        sfdata.SetBond (btyp);                        return true;                    }                }                break;            case CSeqFeatData::e_Site:                if (qtype == eQual_site_type) {                    if (m_SiteKeys.find (val) != m_SiteKeys.end ()) {                        CSeqFeatData::ESite styp = m_SiteKeys [val];                        sfdata.SetSite (styp);                        return true;                    }                }                break;            default:                break;        }        switch (qtype) {            case eQual_pseudo:                sfp->SetPseudo (true);                return true;            case eQual_partial:                sfp->SetPartial (true);                return true;            case eQual_exception:                sfp->SetExcept (true);                sfp->SetExcept_text (val);                return true;            case eQual_evidence:                if (val == "experimental") {                    sfp->SetExp_ev (CSeq_feat::eExp_ev_experimental);                } else if (val == "not_experimental" || val == "non_experimental" ||                           val == "not-experimental" || val == "non-experimental") {                    sfp->SetExp_ev (CSeq_feat::eExp_ev_not_experimental);                }                return true;            case eQual_note:                {                    if (sfp->CanGetComment ()) {                        const CSeq_feat::TComment& comment = sfp->GetComment ();                        CSeq_feat::TComment revised = comment + "; " + val;                        sfp->SetComment (revised);                    } else {                        sfp->SetComment (val);                    }                    return true;                }            case eQual_allele:            case eQual_bound_moiety:            case eQual_clone:            case eQual_cons_splice:            case eQual_direction:            case eQual_EC_number:            case eQual_frequency:            case eQual_function:            case eQual_insertion_seq:            case eQual_label:            case eQual_map:            case eQual_number:            case eQual_operon:            case eQual_organism:            case eQual_PCR_conditions:            case eQual_phenotype:            case eQual_product:            case eQual_protein_id:            case eQual_replace:            case eQual_rpt_family:            case eQual_rpt_type:            case eQual_rpt_unit:            case eQual_standard_name:            case eQual_transcript_id:            case eQual_transposon:            case eQual_usedin:                {                    CSeq_feat::TQual& qlist = sfp->SetQual ();                    CRef<CGb_qual> gbq (new CGb_qual);                    gbq->SetQual (qual);                    gbq->SetVal (val);                    qlist.push_back (gbq);                    return true;                }            case eQual_gene:                {                    CGene_ref& grp = sfp->SetGeneXref ();                    if (val == "-") {                        grp.SetLocus ("");                    } else {                        grp.SetLocus (val);                    }                    return true;                }            case eQual_gene_desc:                {                    CGene_ref& grp = sfp->SetGeneXref ();                    grp.SetDesc (val);                    return true;                }            case eQual_gene_syn:                {                    CGene_ref& grp = sfp->SetGeneXref ();                    CGene_ref::TSyn& syn = grp.SetSyn ();                    syn.push_back (val);                    return true;                }            case eQual_locus_tag:                {                    CGene_ref& grp = sfp->SetGeneXref ();                    grp.SetLocus_tag (val);                    return true;                }            case eQual_db_xref:                {                    string db, tag;                    if (NStr::SplitInTwo (val, ":", db, tag)) {                        CSeq_feat::TDbxref& dblist = sfp->SetDbxref ();                        CRef<CDbtag> dbt (new CDbtag);                        dbt->SetDb (db);                        CRef<CObject_id> oid (new CObject_id);                        oid->SetStr (tag);                        dbt->SetTag (*oid);                        dblist.push_back (dbt);                        return true;                    }                    return true;                }            default:                break;        }    }    return false;}bool CFeature_table_reader_imp::x_AddIntervalToFeature (CRef<CSeq_feat> sfp, CSeq_loc_mix *mix,                                                        const string& seqid, Int4 start, Int4 stop,                                                        bool partial5, bool partial3){    CSeq_interval::TStrand strand = eNa_strand_plus;    if (start > stop) {        Int4 flip = start;        start = stop;        stop = flip;        strand = eNa_strand_minus;    }    if (start == stop) {        // just a point        CRef<CSeq_loc> loc(new CSeq_loc);        CSeq_point& point = loc->SetPnt();        point.SetPoint(start);        point.SetStrand(strand);        CSeq_id seq_id(seqid);        point.SetId().Assign (seq_id);        mix->Set().push_back(loc);    } else {        // interval        CRef<CSeq_loc> loc(new CSeq_loc);        CSeq_interval& ival = loc->SetInt();        ival.SetFrom(start);        ival.SetTo(stop);        ival.SetStrand(strand);        CSeq_id seq_id(seqid);        ival.SetId().Assign (seq_id);        mix->Set().push_back(loc);    }    if (partial5 || partial3) {        sfp->SetPartial (true);    }    return true;}CRef<CSeq_annot> CFeature_table_reader_imp::ReadSequinFeatureTable (    CNcbiIstream& ifs,    const string& seqid,    const string& annotname,    const CFeature_table_reader::TFlags flags)

⌨️ 快捷键说明

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