feature.cpp

来自「ncbi源码」· C++ 代码 · 共 710 行 · 第 1/2 页

CPP
710
字号
        } catch (CSeqportUtil::CBadIndex&) {            // fall back to comment (if any)            s_GetRnaRefLabelFromComment(feat, label, label_type, type_label);        }                break;    }}       }// Appends a label to tlabel for a CImp_feat. A return value of true indicates // that the label was created for a CImp_feat key = "Site-ref" inlinestatic bool s_GetImpLabel(const CSeq_feat&      feat,  string*               tlabel, ELabelType            label_type, const string*         type_label){    // Return if tlablel does not exist or feature data is not Imp-feat    if (!tlabel  ||  !feat.GetData().IsImp()) {        return false;    }        const string& key = feat.GetData().GetImp().GetKey();    bool empty = true;        // If the key is Site-ref    if (!NStr::CompareNocase(key, "Site-ref")) {        if (feat.IsSetCit()) {            // Create label based on Pub-set            feat.GetCit().GetLabel(tlabel);            return true;        }    // else if the key is not Site-ref    } else if (label_type == eContent) {        // If the key is CDS        if (!NStr::CompareNocase(key, "CDS")) {            *tlabel += "[CDS]";        // else if the key is repeat_unit or repeat_region        } else if (!NStr::CompareNocase(key, "repeat_unit")  ||                   !NStr::CompareNocase(key, "repeat_region")) {            if (feat.IsSetQual()) {                // Loop thru the feature qualifiers                ITERATE( CSeq_feat::TQual, it, feat.GetQual()) {                    // If qualifier qual is rpt_family append qualifier val                    if (!NStr::CompareNocase((*it)->GetQual(),"rpt_family")) {                         *tlabel += (*it)->GetVal();                        empty = false;                        break;                    }                }            }                        // If nothing has been appended yet            if (empty) {                *tlabel += type_label ? *type_label : string("");            }        // else if the key is STS        } else if (!NStr::CompareNocase(key, "STS")) {            if (feat.IsSetQual()) {                ITERATE( CSeq_feat::TQual, it, feat.GetQual()) {                    if (!NStr::CompareNocase((*it)->GetQual(),"standard_name"))                    {                            *tlabel = (*it)->GetVal();                           empty = false;                           break;                    }                }            }                        // If nothing has been appended yet            if (empty) {                if (feat.IsSetComment()) {                    size_t pos = feat.GetComment().find(";");                    if (pos == string::npos) {                        *tlabel += feat.GetComment();                    } else {                        *tlabel += feat.GetComment().substr(0, pos);                    }                 } else {                    *tlabel += type_label ? *type_label : string("");                }            }        // else if the key is misc_feature        } else if (NStr::CompareNocase(key, "misc_feature")) {            if (feat.IsSetQual()) {                // Look for a single qualifier qual in order of preference                 // "standard_name", "function", "number", any and                // append to tlabel and return if found                ITERATE(CSeq_feat::TQual, it, feat.GetQual()) {                    if (!NStr::CompareNocase((*it)->GetQual(),"standard_name"))                    {                         *tlabel += (*it)->GetVal();                         return false;                    }                }                ITERATE(CSeq_feat::TQual, it, feat.GetQual()) {                    if (!NStr::CompareNocase((*it)->GetQual(), "function")) {                         *tlabel += (*it)->GetVal();                         return false;                    }                }                ITERATE(CSeq_feat::TQual, it, feat.GetQual()) {                    if (!NStr::CompareNocase((*it)->GetQual(), "number")) {                        *tlabel += (*it)->GetVal();                        return false;                    }                }                ITERATE(CSeq_feat::TQual, it, feat.GetQual()) {                    *tlabel += (*it)->GetVal();                    return false;                }                // Append type_label if there is one                if (empty) {                    *tlabel += type_label ? *type_label : string("");                    return false;                }            }        }                    }     return false;                } // Return a label based on the content of the featurevoid s_GetContentLabel(const CSeq_feat&      feat, string*               label, const string*         type_label, ELabelType            label_type,  CScope*               scope){    string tlabel;        // Get a content label dependent on the type of the feature data    switch (feat.GetData().Which()) {    case CSeqFeatData::e_Gene:        feat.GetData().GetGene().GetLabel(&tlabel);        break;    case CSeqFeatData::e_Org:        feat.GetData().GetOrg().GetLabel(&tlabel);        break;    case CSeqFeatData::e_Cdregion:        s_GetCdregionLabel(feat, &tlabel, scope);        break;    case CSeqFeatData::e_Prot:        feat.GetData().GetProt().GetLabel(&tlabel);        break;    case CSeqFeatData::e_Rna:        s_GetRnaRefLabel(feat, &tlabel, label_type, type_label);        break;      case CSeqFeatData::e_Pub:        feat.GetData().GetPub().GetPub().GetLabel(&tlabel);         break;    case CSeqFeatData::e_Seq:        break;    case CSeqFeatData::e_Imp:        if (s_GetImpLabel(feat, &tlabel, label_type, type_label)) {            *label += tlabel;            return;        }        break;    case CSeqFeatData::e_Region:        if (feat.GetData().GetRegion().find("Domain") != string::npos  &&                 feat.IsSetComment()) {            tlabel += feat.GetComment();        } else {            tlabel += feat.GetData().GetRegion();        }        break;    case CSeqFeatData::e_Comment:        tlabel += feat.IsSetComment() ? feat.GetComment() : string("");        break;    case CSeqFeatData::e_Bond:        // Get the ASN string name for the enumerated EBond type        tlabel += CSeqFeatData::GetTypeInfo_enum_EBond()            ->FindName(feat.GetData().GetBond(), true);        break;    case CSeqFeatData::e_Site:        // Get the ASN string name for the enumerated ESite type        tlabel += CSeqFeatData::GetTypeInfo_enum_ESite()            ->FindName(feat.GetData().GetSite(), true);        break;    case CSeqFeatData::e_Rsite:        switch (feat.GetData().GetRsite().Which()) {        case CRsite_ref::e_Str:            tlabel += feat.GetData().GetRsite().GetStr();            break;        case CRsite_ref::e_Db:            tlabel += feat.GetData().GetRsite().GetDb().GetTag().IsStr() ?                feat.GetData().GetRsite().GetDb().GetTag().GetStr() :                 string("?");            break;        default:            break;        }        break;    case CSeqFeatData::e_User:        if (feat.GetData().GetUser().IsSetClass()) {            tlabel += feat.GetData().GetUser().GetClass();        } else if (feat.GetData().GetUser().GetType().IsStr()) {            tlabel += feat.GetData().GetUser().GetType().GetStr();        }    case CSeqFeatData::e_Txinit:        break;    case CSeqFeatData::e_Num:        break;    case CSeqFeatData::e_Psec_str:        tlabel += CSeqFeatData::GetTypeInfo_enum_EPsec_str()            ->FindName(feat.GetData().GetPsec_str(), true);        break;        case CSeqFeatData::e_Non_std_residue:        tlabel += feat.GetData().GetNon_std_residue();        break;    case CSeqFeatData::e_Het:        tlabel += feat.GetData().GetHet().Get();        break;            case CSeqFeatData::e_Biosrc:        feat.GetData().GetBiosrc().GetOrg().GetLabel(&tlabel);        break;            default:        break;    }        // Return if a label has been calculated above    if (!tlabel.empty()) {        *label += tlabel;        return;    }        // Put Seq-feat qual into label    if (feat.IsSetQual()) {        string prefix("/");        ITERATE(CSeq_feat::TQual, it, feat.GetQual()) {            tlabel += prefix + (**it).GetQual();            prefix = " ";            if (!(**it).GetVal().empty()) {                tlabel += "=" + (**it).GetVal();            }        }    }        // Put Seq-feat comment into label    if (feat.IsSetComment()) {        if (tlabel.empty()) {            tlabel = feat.GetComment();        } else {            tlabel += "; " + feat.GetComment();        }    }        *label += tlabel;}void GetLabel(const CSeq_feat&    feat, string*             label, ELabelType          label_type, CScope*             scope){     // Ensure that label exists    if (!label) {        return;    }        // Get the type label    string type_label;    s_GetTypeLabel(feat, &type_label);        // Append the type label and return if content label not required    if (label_type == eBoth) {        *label += type_label + ": ";    } else if (label_type == eType) {        *label += type_label;        return;    }        // Append the content label    size_t label_len = label->size();    s_GetContentLabel(feat, label, &type_label, label_type, scope);        // If there is no content label, append the type label    if (label->size() == label_len  &&  label_type == eContent) {        *label += type_label;    }}END_SCOPE(feature)END_SCOPE(objects)END_NCBI_SCOPE/** ===========================================================================* $Log: feature.cpp,v $* Revision 1000.1  2004/06/01 19:25:23  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13** Revision 1.13  2004/05/21 21:42:14  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.12  2003/08/21 12:09:08  dicuccio* Added processing of CDS in case the CDS is just an open reading frame** Revision 1.11  2003/08/08 18:12:19  dicuccio* Fixed bug in s_GetRnaRefLabel(): inadverted '&' instead of '&&'** Revision 1.10  2003/07/22 21:48:26  vasilche* Use typedef for member access.** Revision 1.9  2003/06/02 16:06:39  dicuccio* Rearranged src/objects/ subtree.  This includes the following shifts:*     - src/objects/asn2asn --> arc/app/asn2asn*     - src/objects/testmedline --> src/objects/ncbimime/test*     - src/objects/objmgr --> src/objmgr*     - src/objects/util --> src/objmgr/util*     - src/objects/alnmgr --> src/objtools/alnmgr*     - src/objects/flat --> src/objtools/flat*     - src/objects/validator --> src/objtools/validator*     - src/objects/cddalignview --> src/objtools/cddalignview* In addition, libseq now includes six of the objects/seq... libs, and libmmdb* replaces the three libmmdb? libs.** Revision 1.8  2003/03/11 16:00:58  kuznets* iterate -> ITERATE** Revision 1.7  2002/12/31 15:09:58  dicuccio* Removed unneeded headers for Featdef classes** Revision 1.6  2002/12/26 21:17:06  dicuccio* Minor tweaks to avoid compiler warnings in MSVC (remove unused variables)** Revision 1.5  2002/08/26 16:29:41  ucko* Be even more careful with TRNA extensions.** Revision 1.4  2002/08/21 15:30:30  ucko* Handle empty tRNA extensions.** Revision 1.3  2002/08/20 20:01:50  ucko* s_GetRnaRefLabel: factor out code to look at comments, and fall back* on it for bogus TRNA extensions.** Revision 1.2  2002/06/07 16:11:21  ucko* Move everything into the "feature" namespace.** Revision 1.1  2002/06/06 18:45:03  clausen* Initial version** ===========================================================================*/

⌨️ 快捷键说明

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