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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Bioseq.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:33:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Bioseq.cpp,v 1000.1 2004/06/01 19:33:08 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.  *   'seq.asn'.
  43.  *
  44.  */
  45. // standard includes
  46. #include <ncbi_pch.hpp>
  47. #include <vector>
  48. #include <serial/enumvalues.hpp>
  49. #include <serial/typeinfo.hpp>
  50. #include <corelib/ncbiutil.hpp>
  51. // generated includes
  52. #include <objects/seqloc/Seq_loc.hpp>
  53. #include <objects/seqloc/Seq_id.hpp>
  54. #include <objects/seqloc/Textseq_id.hpp>
  55. #include <objects/seq/Delta_seq.hpp>
  56. #include <objects/seq/Delta_ext.hpp>
  57. #include <objects/general/Object_id.hpp>
  58. #include <objects/seq/Seq_inst.hpp>
  59. #include <objects/seq/Seq_ext.hpp>
  60. #include <objects/seqloc/Seq_interval.hpp>
  61. #include <objects/seqloc/Seq_point.hpp>
  62. #include <objects/seq/Bioseq.hpp>
  63. // generated classes
  64. BEGIN_NCBI_SCOPE
  65. BEGIN_objects_SCOPE // namespace ncbi::objects::
  66. // destructor
  67. CBioseq::~CBioseq(void)
  68. {
  69. }
  70. void CBioseq::UserOp_Assign(const CSerialUserOp& /*source*/)
  71. {
  72. }
  73. bool CBioseq::UserOp_Equals(const CSerialUserOp& /*object*/) const
  74. {
  75.     return true;
  76. }
  77. int CBioseq::sm_ConstructedId = 0;
  78. void CBioseq::x_SeqLoc_To_DeltaExt(const CSeq_loc& loc, CDelta_ext& ext)
  79. {
  80.     switch ( loc.Which() ) {
  81.     case CSeq_loc::e_Packed_int:
  82.         {
  83.             // extract each range, create and add simple location
  84.             ITERATE ( CPacked_seqint::Tdata, ii, loc.GetPacked_int().Get() ) {
  85.                 CRef<CDelta_seq> dseq(new CDelta_seq);
  86.                 dseq->SetLoc().SetInt().Assign(**ii);
  87.                 ext.Set().push_back(dseq);
  88.             }
  89.             break;
  90.         }
  91.     case CSeq_loc::e_Packed_pnt:
  92.         {
  93.             // extract each point
  94.             ITERATE ( CPacked_seqpnt::TPoints, pi,
  95.                       loc.GetPacked_pnt().GetPoints() ) {
  96.                 CRef<CSeq_loc> pnt_loc(new CSeq_loc);
  97.                 pnt_loc->SetPnt().SetId().Assign(loc.GetPacked_pnt().GetId());
  98.                 pnt_loc->SetPnt().SetPoint(*pi);
  99.                 if ( loc.GetPacked_pnt().IsSetStrand() ) {
  100.                     pnt_loc->SetPnt().SetStrand(
  101.                         loc.GetPacked_pnt().GetStrand());
  102.                 }
  103.                 CRef<CDelta_seq> dseq(new CDelta_seq);
  104.                 dseq->SetLoc(*pnt_loc);
  105.                 ext.Set().push_back(CRef<CDelta_seq>(dseq));
  106.             }
  107.         }
  108.     case CSeq_loc::e_Mix:
  109.         {
  110.             // extract sub-locations
  111.             ITERATE ( CSeq_loc_mix::Tdata, li, loc.GetMix().Get() ) {
  112.                 x_SeqLoc_To_DeltaExt(**li, ext);
  113.             }
  114.             return;
  115.         }
  116.     default:
  117.         {
  118.             // Just add the location
  119.             CDelta_seq* dseq = new CDelta_seq;
  120.             CSeq_loc* cp_loc = new CSeq_loc;
  121.             SerialAssign<CSeq_loc>(*cp_loc, loc);
  122.             dseq->SetLoc(*cp_loc);
  123.             ext.Set().push_back(CRef<CDelta_seq>(dseq));
  124.         }
  125.     }
  126. }
  127. CBioseq::CBioseq(const CSeq_loc& loc, string str_id)
  128.     : m_ParentEntry(0)
  129. {
  130.     CBioseq::TId& id_list = SetId();
  131.     // Id
  132.     CSeq_id* id = new CSeq_id;
  133.     if ( str_id.empty() ) {
  134.         id->SetLocal().SetStr("constructed" + NStr::IntToString(sm_ConstructedId++));
  135.     }
  136.     else {
  137.         id->SetLocal().SetStr(str_id);
  138.     }
  139.     id_list.push_back(CRef<CSeq_id>(id));
  140.     // Inst
  141.     CSeq_inst& inst = SetInst();
  142.     inst.SetRepr(CSeq_inst::eRepr_const);
  143.     inst.SetMol(CSeq_inst::eMol_other);
  144.     CDelta_ext& ext = inst.SetExt().SetDelta();
  145.     x_SeqLoc_To_DeltaExt(loc, ext);
  146. }
  147. void CBioseq::GetLabel(string* label, ELabelType type, bool worst) const
  148. {
  149.     if (!label) {
  150.         return;
  151.     }
  152.     
  153.     if (type != eType  &&  !GetId().empty()) {
  154.         const CSeq_id* id = 0;
  155.         if (!worst) {
  156.             id = GetId().begin()->GetPointer();
  157.         } else {
  158.             const CSeq_id* wid =
  159.                 FindBestChoice(GetId(), CSeq_id::WorstRank).GetPointer();
  160.             if (wid) {
  161.                 CNcbiOstrstream wos;
  162.                 wid->WriteAsFasta(wos);
  163.                 string sid = CNcbiOstrstreamToString(wos);
  164.                 CSeq_id worst_id(sid);
  165.                 CTextseq_id* tid =
  166.                     const_cast<CTextseq_id*>(worst_id.GetTextseq_Id());
  167.                 if (tid) {
  168.                     tid->ResetAccession();
  169.                 }
  170.                 id = &worst_id;
  171.             }
  172.         }
  173.         CNcbiOstrstream os;
  174.         if (id) {
  175.             id->WriteAsFasta(os);
  176.             string s = CNcbiOstrstreamToString(os);
  177.             (*label) += s;
  178.         }
  179.     }
  180.     if (type == eContent) {
  181.         return;
  182.     }
  183.     if (!label->empty()) {
  184.         (*label) += ": ";
  185.     }
  186.     
  187.     const CEnumeratedTypeValues* tv;
  188.     tv = CSeq_inst::GetTypeInfo_enum_ERepr();
  189.     (*label) += tv->FindName(GetInst().GetRepr(), true) + ",";
  190.     tv = CSeq_inst::GetTypeInfo_enum_EMol();
  191.     (*label) += tv->FindName(GetInst().GetMol(), true);
  192.     if (GetInst().IsSetLength()) {
  193.         (*label) += string(" len=") + NStr::IntToString(GetInst().GetLength());
  194.     }
  195. }
  196. const CSeq_id* CBioseq::GetFirstId() const
  197. {
  198.     // If no ids for Bioseq, return 0 -- should not happen
  199.     if (GetId().empty()) {
  200.         return 0;
  201.     }
  202.     return *GetId().begin();
  203. }
  204. bool CBioseq::IsNa(void) const
  205. {
  206.     return GetInst ().IsNa ();
  207. }
  208. bool CBioseq::IsAa(void) const
  209. {
  210.     return GetInst ().IsAa ();
  211. }
  212. END_objects_SCOPE // namespace ncbi::objects::
  213. END_NCBI_SCOPE
  214. /*
  215.  * ===========================================================================
  216.  * $Log: Bioseq.cpp,v $
  217.  * Revision 1000.1  2004/06/01 19:33:08  gouriano
  218.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.21
  219.  *
  220.  * Revision 6.21  2004/05/19 17:25:14  gorelenk
  221.  * Added include of PCH - ncbi_pch.hpp
  222.  *
  223.  * Revision 6.20  2003/04/24 16:14:12  vasilche
  224.  * Fixed Parentize().
  225.  *
  226.  * Revision 6.19  2003/04/15 19:48:54  vasilche
  227.  * Fixed uninitialized variable.
  228.  *
  229.  * Revision 6.18  2003/03/11 15:53:25  kuznets
  230.  * iterate -> ITERATE
  231.  *
  232.  * Revision 6.17  2002/12/19 20:11:22  kans
  233.  * added IsNa and IsAa methods
  234.  *
  235.  * Revision 6.16  2002/11/04 21:29:15  grichenk
  236.  * Fixed usage of const CRef<> and CRef<> constructor
  237.  *
  238.  * Revision 6.15  2002/10/08 19:09:39  clausen
  239.  * Fixed formatting but in GetLabel()
  240.  *
  241.  * Revision 6.14  2002/10/03 21:29:59  ivanov
  242.  * Fixed error in GetLabel()
  243.  *
  244.  * Revision 6.13  2002/10/03 19:07:31  clausen
  245.  * Removed extra whitespace
  246.  *
  247.  * Revision 6.12  2002/10/03 16:57:50  clausen
  248.  * Added GetLabel() and GetFirstId()
  249.  *
  250.  * Revision 6.11  2002/05/22 14:03:38  grichenk
  251.  * CSerialUserOp -- added prefix UserOp_ to Assign() and Equals()
  252.  *
  253.  * Revision 6.10  2002/04/22 20:09:57  grichenk
  254.  * -ConstructExcludedSequence() -- use
  255.  * CBioseq_Handle::GetSequenceView() instead
  256.  *
  257.  * Revision 6.9  2002/03/28 21:21:49  grichenk
  258.  * Fixed range exclusion
  259.  *
  260.  * Revision 6.8  2002/03/18 21:46:13  grichenk
  261.  * +ConstructExcludedSequence()
  262.  *
  263.  * Revision 6.7  2002/01/16 18:56:31  grichenk
  264.  * Removed CRef<> argument from choice variant setter, updated sources to
  265.  * use references instead of CRef<>s
  266.  *
  267.  * Revision 6.6  2001/12/20 20:00:31  grichenk
  268.  * CObjectManager::ConstructBioseq(CSeq_loc) -> CBioseq::CBioseq(CSeq_loc ...)
  269.  *
  270.  * Revision 6.5  2001/10/12 19:32:57  ucko
  271.  * move BREAK to a central location; move CBioseq::GetTitle to object manager
  272.  *
  273.  * Revision 6.4  2001/10/04 19:11:54  ucko
  274.  * Centralize (rudimentary) code to get a sequence's title.
  275.  *
  276.  * Revision 6.3  2001/07/16 16:20:19  grichenk
  277.  * Initial revision
  278.  *
  279.  *
  280.  * ===========================================================================
  281.  */
  282. /* Original file checksum: lines: 61, chars: 1871, CRC32: 1d5d7d05 */