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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Bioseq_set.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:34:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Bioseq_set.cpp,v 1000.1 2004/06/01 19:34:50 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.  *   'seqset.asn'.
  43.  *
  44.  */
  45. // standard includes
  46. #include <ncbi_pch.hpp>
  47. #include <serial/serial.hpp>
  48. #include <serial/iterator.hpp>
  49. #include <serial/enumvalues.hpp>
  50. // generated includes
  51. #include <objects/seqset/Bioseq_set.hpp>
  52. #include <objects/seq/Bioseq.hpp>
  53. #include <objects/seq/Seq_annot.hpp> // to make KCC happy
  54. #include <objects/seq/Seq_inst.hpp>
  55. #include <objects/seqloc/Seq_id.hpp>
  56. #include <objects/seqloc/Textseq_id.hpp>
  57. // generated classes
  58. BEGIN_NCBI_SCOPE
  59. BEGIN_objects_SCOPE // namespace ncbi::objects::
  60. // destructor
  61. CBioseq_set::~CBioseq_set(void)
  62. {
  63. }
  64. static bool s_is_na(const CBioseq& seq)
  65. {
  66.     switch (seq.GetInst().GetMol()) {
  67.     case CSeq_inst::eMol_dna:
  68.     case CSeq_inst::eMol_rna:
  69.     case CSeq_inst::eMol_na:
  70.         return true;
  71.     default:
  72.         return false;
  73.     }
  74. }
  75. static bool s_has_gb(const CSeq_id& id)
  76. {
  77.     switch (id.Which()) {
  78.     case CSeq_id::e_Genbank:
  79.     case CSeq_id::e_Embl:
  80.     case CSeq_id::e_Ddbj:
  81.     case CSeq_id::e_Other:
  82.     case CSeq_id::e_Tpg:
  83.     case CSeq_id::e_Tpe:
  84.     case CSeq_id::e_Tpd:
  85.         return true;
  86.     default:
  87.         return false;
  88.     }
  89. }
  90. static bool s_has_accession(const CSeq_id& id)
  91. {
  92.     if (!id.GetTextseq_Id()) {
  93.         return false;
  94.     } else if (id.GetTextseq_Id()->IsSetAccession()) {
  95.         return true;
  96.     } else {
  97.         return false;
  98.     }
  99. }
  100. void CBioseq_set::GetLabel(string* label, ELabelType type) const
  101. {
  102.     // If no label, just return
  103.     if (!label) {
  104.         return;
  105.     }
  106.     // Get type label
  107.     if (IsSetClass()  &&  type != eContent) {
  108.         const CEnumeratedTypeValues* tv =
  109.             CBioseq_set::GetTypeInfo_enum_EClass();
  110.         const string& cn = tv->FindName(GetClass(), true);
  111.         *label += cn;
  112.         if (type != eType) {
  113.             *label += ": ";
  114.         }
  115.     }
  116.     if (type == eType) {
  117.         return;
  118.     }
  119.     // Loop through CBioseqs looking for the best one to use for a label
  120.     bool best_is_na = false, best_has_gb = false, best_has_accession = false;
  121.     const CBioseq* best = 0;
  122.     for (CTypeConstIterator<CBioseq> si(ConstBegin(*this)); si; ++si) {
  123.         bool takeit = false, is_na, has_gb = false, has_accession = false;
  124.         is_na = s_is_na(*si);
  125.         for (CTypeConstIterator<CSeq_id> ii(ConstBegin(*si)); ii; ++ii) {
  126.             has_gb = has_gb ? true : s_has_gb(*ii);
  127.             has_accession = has_accession ? true : s_has_accession(*ii);
  128.         }
  129.         if (!best) {
  130.             takeit = true;
  131.         } else {
  132.             bool longer = false;
  133.             if (si->GetInst().GetLength() > best->GetInst().GetLength()) {
  134.                 longer = true;
  135.             }
  136.             if(best_has_accession) {
  137.                 if (has_accession) {
  138.                     if(longer) {
  139.                         takeit = true;
  140.                     }
  141.                 }
  142.             } else if (has_accession) {
  143.                 takeit = true;
  144.             } else if (best_has_gb) {
  145.                 if (has_gb) {
  146.                     if (longer) {
  147.                         takeit = true;
  148.                     }
  149.                 }
  150.             } else if (has_gb) {
  151.                 takeit = true;
  152.             } else if (best_is_na) {
  153.                 if (is_na) {
  154.                     if (longer) {
  155.                         takeit = true;
  156.                     }
  157.                 }
  158.             } else if (is_na) {
  159.                 takeit = true;
  160.             } else if (longer) {
  161.                 takeit = true;
  162.             }
  163.         }
  164.         if (takeit) {
  165.             best = &(*si);
  166.             best_has_accession = has_accession;
  167.             best_has_gb = has_gb;
  168.             best_is_na = is_na;
  169.         }
  170.     }
  171.     // Add content to label.
  172.     if (!best) {
  173.         *label += "(No Bioseqs)";
  174.     } else {
  175.         CNcbiOstrstream os;
  176.         if (best->GetFirstId()) {
  177.             os << best->GetFirstId()->DumpAsFasta();
  178.             *label += CNcbiOstrstreamToString(os);
  179.         }
  180.     }
  181. }
  182. END_objects_SCOPE // namespace ncbi::objects::
  183. END_NCBI_SCOPE
  184. /*
  185.  * ===========================================================================
  186.  * $Log: Bioseq_set.cpp,v $
  187.  * Revision 1000.1  2004/06/01 19:34:50  gouriano
  188.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  189.  *
  190.  * Revision 1.9  2004/05/19 17:26:48  gorelenk
  191.  * Added include of PCH - ncbi_pch.hpp
  192.  *
  193.  * Revision 1.8  2002/12/30 13:21:24  clausen
  194.  * Replaced os.str() with CNcbiOstrstreamToString(os)
  195.  *
  196.  * Revision 1.7  2002/10/07 17:10:54  ucko
  197.  * Include Seq-annot.hpp to make KCC happy.
  198.  *
  199.  * Revision 1.6  2002/10/03 18:57:12  clausen
  200.  * Removed extra whitespace
  201.  *
  202.  * Revision 1.5  2002/10/03 17:18:19  clausen
  203.  * Added GetLabel()
  204.  *
  205.  * Revision 1.4  2000/11/01 20:38:33  vasilche
  206.  * Removed ECanDelete enum and related constructors.
  207.  *
  208.  *
  209.  * ===========================================================================
  210.  */