Seq_feat.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:10k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Seq_feat.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:34:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Seq_feat.cpp,v 1000.2 2004/06/01 19:34:12 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  .......
  35.  *
  36.  * File Description:
  37.  *   .......
  38.  *
  39.  * Remark:
  40.  *   This code was originally generated by application DATATOOL
  41.  *   using specifications from the ASN data definition file
  42.  *   'seqfeat.asn'.
  43.  */
  44. // generated includes
  45. #include <ncbi_pch.hpp>
  46. #include <objects/seqfeat/Seq_feat.hpp>
  47. #include <objects/seqloc/Seq_loc.hpp>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_objects_SCOPE // namespace ncbi::objects::
  50. // destructor
  51. CSeq_feat::~CSeq_feat(void)
  52. {
  53. }
  54. static int s_TypeOrder[] = {
  55.     3, // e_not_set = 0,
  56.     0, // e_Gene,
  57.     3, // e_Org,
  58.     2, // e_Cdregion,
  59.     3, // e_Prot,
  60.     1, // e_Rna,
  61.     3  // e_Pub, and the rest
  62. };
  63. int CSeq_feat::GetTypeSortingOrder(CSeqFeatData::E_Choice type)
  64. {
  65.     return s_TypeOrder[min(size_t(type),
  66.                            sizeof(s_TypeOrder)/sizeof(s_TypeOrder[0])-1)];
  67. }
  68. // Corresponds to SortFeatItemListByPos from the C toolkit
  69. int CSeq_feat::CompareNonLocation(const CSeq_feat& f2,
  70.                                   const CSeq_loc& loc1,
  71.                                   const CSeq_loc& loc2) const
  72. {
  73.     const CSeqFeatData& data1 = GetData();
  74.     const CSeqFeatData& data2 = f2.GetData();
  75.     CSeqFeatData::E_Choice type1 = data1.Which();
  76.     CSeqFeatData::E_Choice type2 = data2.Which();
  77.     if ( type1 != type2 ) { // order by feature type
  78.         int order1 = GetTypeSortingOrder(type1);
  79.         int order2 = GetTypeSortingOrder(type2);
  80.         int diff = order1 - order2;
  81.         if ( diff != 0 )
  82.             return diff;
  83.     }
  84.     // compare internal intervals
  85.     if ( loc1.IsMix()  &&  loc2.IsMix() ) {
  86.         const CSeq_loc_mix::Tdata& l1 = loc1.GetMix().Get();
  87.         const CSeq_loc_mix::Tdata& l2 = loc2.GetMix().Get();
  88.         for ( CSeq_loc_mix::Tdata::const_iterator
  89.                   it1 = l1.begin(), it2 = l2.begin(); ;  it1++, it2++) {
  90.             if ( it1 == l1.end() ) {
  91.                 if ( it2 == l2.end() ) {
  92.                     break;
  93.                 }
  94.                 else {
  95.                     // f1 loc is shorter
  96.                     return -1;
  97.                 }
  98.             }
  99.             if ( it2 == l2.end() ) {
  100.                 // f2 loc is shorter
  101.                 return 1;
  102.             }
  103.             int diff = (*it1)->Compare(**it2);
  104.             if ( diff != 0 )
  105.                 return diff;
  106.         }
  107.     }
  108.     {{ // compare subtypes
  109.         CSeqFeatData::ESubtype subtype1 = data1.GetSubtype();
  110.         CSeqFeatData::ESubtype subtype2 = data2.GetSubtype();
  111.         int diff = subtype1 - subtype2;
  112.         if ( diff != 0 )
  113.             return diff;
  114.     }}
  115.     // compare frames of identical CDS ranges
  116.     if ( type1 == CSeqFeatData::e_Cdregion &&
  117.          type2 == CSeqFeatData::e_Cdregion ) {
  118.         CCdregion::EFrame frame1 = data1.GetCdregion().GetFrame();
  119.         CCdregion::EFrame frame2 = data2.GetCdregion().GetFrame();
  120.         if (frame1 > CCdregion::eFrame_one
  121.             ||  frame2 > CCdregion::eFrame_one) {
  122.             int diff = frame1 - frame2;
  123.             if ( diff != 0 )
  124.                 return diff;
  125.         }
  126.     }
  127.     // compare labels
  128.     // if imp features
  129.     if ( type1 == CSeqFeatData::e_Imp && type2 == CSeqFeatData::e_Imp ) {
  130.         int diff = NStr::CompareNocase(data1.GetImp().GetKey(),
  131.                                        data2.GetImp().GetKey());
  132.         if ( diff != 0 )
  133.             return diff;
  134.     }
  135.     // XXX - should compare parent seq-annots
  136.     // XXX 1. parent Seq-annot idx.itemID
  137.     // XXX 2. features itemID
  138.     return 0; // unknown
  139. }
  140. const CGene_ref* CSeq_feat::GetGeneXref(void) const
  141. {
  142.     ITERATE(CSeq_feat::TXref, it, GetXref ()) {
  143.         if ((*it)->IsSetData () && (*it)->GetData ().IsGene ()) {
  144.             return &((*it)->GetData ().GetGene ());
  145.         }
  146.     }
  147.     return 0;
  148. }
  149. void CSeq_feat::SetGeneXref(CGene_ref& value)
  150. {
  151.     NON_CONST_ITERATE(CSeq_feat::TXref, it, SetXref ()) {
  152.         if ((*it)->IsSetData () && (*it)->GetData ().IsGene ()) {
  153.             (*it)->SetData ().SetGene ().Assign(value);
  154.             return;
  155.         }
  156.     }
  157.     TXref& xref = SetXref ();
  158.     CRef<CSeqFeatXref> gref (new CSeqFeatXref);
  159.     xref.push_back (gref);
  160.     gref->SetData ().SetGene ().Assign (value);
  161. }
  162. CGene_ref& CSeq_feat::SetGeneXref(void)
  163. {
  164.     NON_CONST_ITERATE(CSeq_feat::TXref, it, SetXref ()) {
  165.         if ((*it)->IsSetData () && (*it)->GetData ().IsGene ()) {
  166.             return ((*it)->SetData ().SetGene ());
  167.         }
  168.     }
  169.     TXref& xref = SetXref ();
  170.     CRef<CSeqFeatXref> gref (new CSeqFeatXref);
  171.     xref.push_back (gref);
  172.     return gref->SetData ().SetGene ();
  173. }
  174. const CProt_ref* CSeq_feat::GetProtXref(void) const
  175. {
  176.     ITERATE(CSeq_feat::TXref, it, GetXref ()) {
  177.         if ((*it)->IsSetData () && (*it)->GetData ().IsProt ()) {
  178.             return &((*it)->GetData ().GetProt ());
  179.         }
  180.     }
  181.     return 0;
  182. }
  183. void CSeq_feat::SetProtXref(CProt_ref& value)
  184. {
  185.     NON_CONST_ITERATE(CSeq_feat::TXref, it, SetXref ()) {
  186.         if ((*it)->IsSetData () && (*it)->GetData ().IsProt ()) {
  187.             (*it)->SetData ().SetProt ().Assign(value);
  188.             return;
  189.         }
  190.     }
  191.     TXref& xref = SetXref ();
  192.     CRef<CSeqFeatXref> pref (new CSeqFeatXref);
  193.     xref.push_back (pref);
  194.     pref->SetData ().SetProt ().Assign (value);
  195. }
  196. CProt_ref& CSeq_feat::SetProtXref(void)
  197. {
  198.     NON_CONST_ITERATE(CSeq_feat::TXref, it, SetXref ()) {
  199.         if ((*it)->IsSetData () && (*it)->GetData ().IsProt ()) {
  200.             return ((*it)->SetData ().SetProt ());
  201.         }
  202.     }
  203.     TXref& xref = SetXref ();
  204.     CRef<CSeqFeatXref> pref (new CSeqFeatXref);
  205.     xref.push_back (pref);
  206.     return pref->SetData ().SetProt ();
  207. }
  208. void CSeq_feat::AddQualifier(const string& qual_name, const string& qual_val)
  209. {
  210.     CRef<CGb_qual> qual(new CGb_qual());
  211.     qual->SetQual(qual_name);
  212.     qual->SetVal(qual_val);
  213.     SetQual().push_back(qual);
  214. }
  215. void CSeq_feat::AddDbxref(const string& db, const string& tag)
  216. {
  217.     CRef<CDbtag> dbtag(new CDbtag());
  218.     dbtag->SetDb(db);
  219.     dbtag->SetTag().SetStr(tag);
  220.     SetDbxref().push_back(dbtag);
  221. }
  222. void CSeq_feat::AddDbxref(const string& db, int tag)
  223. {
  224.     CRef<CDbtag> dbtag(new CDbtag());
  225.     dbtag->SetDb(db);
  226.     dbtag->SetTag().SetId(tag);
  227.     SetDbxref().push_back(dbtag);
  228. }
  229. END_objects_SCOPE // namespace ncbi::objects::
  230. END_NCBI_SCOPE
  231. /*
  232.  * ===========================================================================
  233.  *
  234.  * $Log: Seq_feat.cpp,v $
  235.  * Revision 1000.2  2004/06/01 19:34:12  gouriano
  236.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.19
  237.  *
  238.  * Revision 6.19  2004/05/19 17:26:04  gorelenk
  239.  * Added include of PCH - ncbi_pch.hpp
  240.  *
  241.  * Revision 6.18  2004/02/09 14:45:07  vasilche
  242.  * Do not check type order if types are equal.
  243.  *
  244.  * Revision 6.17  2004/01/05 19:16:57  dicuccio
  245.  * Added APIs to ease adding qualifiers and dbxrefs
  246.  *
  247.  * Revision 6.16  2003/12/31 15:36:08  grichenk
  248.  * Moved CompareLocations() from CSeq_feat to CSeq_loc,
  249.  * renamed it to Compare().
  250.  *
  251.  * Revision 6.15  2003/08/07 21:42:31  kans
  252.  * added SetGeneXref and SetProtXref
  253.  *
  254.  * Revision 6.14  2003/04/24 16:15:32  vasilche
  255.  * Fixed CSeq_feat::Compare().
  256.  *
  257.  * Revision 6.13  2003/04/18 19:40:39  kans
  258.  * changed iterate to ITERATE
  259.  *
  260.  * Revision 6.12  2003/02/26 17:53:06  vasilche
  261.  * Added public version of feature comparison assuming that
  262.  * total range check is done already.
  263.  *
  264.  * Revision 6.11  2003/02/24 18:52:57  vasilche
  265.  * Added optional mapped locations arguments to feature comparison.
  266.  *
  267.  * Revision 6.10  2003/02/10 15:52:08  grichenk
  268.  * CSeq_feat::Compare() takes optional seq-locs for remapped features
  269.  *
  270.  * Revision 6.9  2003/02/06 22:24:23  vasilche
  271.  * Added int CSeq_feat::Compare().
  272.  * Fixed slow comparison of CSeq_feat with mix seq locs.
  273.  *
  274.  * Revision 6.8  2003/01/29 17:43:23  vasilche
  275.  * Added Compare(CSeq_feat, CSeq_feat) returning int for easier comparison.
  276.  * operator<(CSeq_feat, CSeq_feat) uses Compare().
  277.  *
  278.  * Revision 6.7  2002/12/19 21:31:29  kans
  279.  * added GetGeneXref and GetProtXref
  280.  *
  281.  * Revision 6.6  2002/09/18 18:31:11  ucko
  282.  * operator <: Remove bogus comparison of feature type labels.
  283.  * operator <: Mention content labels in to-do comment.
  284.  * general: Move CVS log to end per current practice.
  285.  *
  286.  * Revision 6.5  2002/06/06 20:55:48  clausen
  287.  * Moved GetLabel to objects/util/feature.cpp
  288.  *
  289.  * Revision 6.4  2002/05/06 03:39:11  vakatov
  290.  * OM/OM1 renaming
  291.  *
  292.  * Revision 6.3  2002/01/10 19:53:48  clausen
  293.  * Added GetLabel
  294.  *
  295.  * Revision 6.2  2002/01/09 15:59:28  grichenk
  296.  * Fixed includes
  297.  *
  298.  * Revision 6.1  2001/10/30 20:25:58  ucko
  299.  * Implement feature labels/keys, subtypes, and sorting
  300.  *
  301.  *
  302.  * ===========================================================================
  303.  */
  304. /* Original file checksum: lines: 61, chars: 1885, CRC32: 417ca6e0 */