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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tax_tree_ds.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:31:39  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: tax_tree_ds.cpp,v 1000.0 2004/06/01 21:31:39 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.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/tax_tree/tax_tree_ds.hpp>
  41. #include <objects/seq/Bioseq.hpp>
  42. #include <objmgr/util/sequence.hpp>
  43. #include <objmgr/seqdesc_ci.hpp>
  44. #include <gui/objutils/label.hpp>
  45. #include <algorithm>
  46. BEGIN_NCBI_SCOPE
  47. USING_SCOPE(objects);
  48. CTaxTreeDS_ObjMgr::CTaxTreeDS_ObjMgr(CScope& scope, const TUidVec& uids)
  49.     : m_Scope(&scope)
  50.     , m_Mode(eDisplay_Default)
  51.     , m_Ids(uids)
  52. {
  53.     m_TaxCache.Init();
  54.     TTaxMap tax_map;
  55.     GetTaxMap(tax_map);
  56.     vector<TTaxId> tax_ids_in;
  57.     vector<TTaxId> tax_ids_out;
  58.     tax_ids_in.reserve(tax_map.size());
  59.     ITERATE(TTaxMap, iter, tax_map) {
  60.         _TRACE("tax-id: " << iter->first << " seqs: " << iter->second.size());
  61.         tax_ids_in.push_back(iter->first);
  62.     }
  63.     if (tax_ids_in.size() == 0) {
  64.         NCBI_THROW(CException, eUnknown,
  65.                    "Can't generate common tree for sequences:n"
  66.                    "No taxonomy IDs found.");
  67.     }
  68.     if ( !m_TaxCache.GetPopsetJoin(tax_ids_in, tax_ids_out) ) {
  69.         NCBI_THROW(CException, eUnknown,
  70.                    "Can't generate common tree for sequences");
  71.     }
  72. }
  73. ITreeIterator& CTaxTreeDS_ObjMgr::GetIterator(EDisplayMode mode)
  74. {
  75.     if ( !m_Iter  ||  mode != m_Mode) {
  76.         // first, fill our internal tree structure
  77.         CTaxon1::EIteratorMode iter_mode = CTaxon1::eIteratorMode_Default;
  78.         switch (mode) {
  79.         default:
  80.         case eDisplay_All:
  81.             break;
  82.         case eDisplay_Best:
  83.             iter_mode = CTaxon1::eIteratorMode_Best;
  84.             break;
  85.         case eDisplay_Blast:
  86.             iter_mode = CTaxon1::eIteratorMode_Blast;
  87.             break;
  88.         }
  89.         m_Iter.Reset(m_TaxCache.GetTreeIterator(iter_mode));
  90.         m_Mode = mode;
  91.     }
  92.     return *m_Iter;
  93. }
  94. void CTaxTreeDS_ObjMgr::GetTaxMap(TTaxMap& tax_map)
  95. {
  96.     TUidVec uids;
  97.     GetUids(uids);
  98.     ITERATE (TUidVec, iter, uids) {
  99.         TTaxId tax_id = 0;
  100.         // first, see if we can get it from the sequence
  101.         CBioseq_Handle handle = m_Scope->GetBioseqHandle(**iter);
  102.         tax_id = sequence::GetTaxId(handle);
  103.         // if not, try the tax server
  104.         if ( !tax_id ) {
  105.             m_TaxCache.GetTaxId4GI(*iter, tax_id);
  106.         }
  107.         // if we've got something, add it to our cache
  108.         if (tax_id) {
  109.             tax_map[tax_id].push_back(*iter);
  110.         } else {
  111.             string str;
  112.             CLabel::GetLabel(**iter, &str, CLabel::eDefault, m_Scope);
  113.             LOG_POST(Info << "No tax-id for sequence: " << str);
  114.         }
  115.     }
  116. }
  117. void CTaxTreeDS_ObjMgr::GetUids(TUidVec& uids)
  118. {
  119.     uids = m_Ids;
  120. }
  121. void CTaxTreeDS_ObjMgr::GetTitle(const CSeq_id& id, string* title) const
  122. {
  123.     if (title) {
  124.         title->erase();
  125.         CBioseq_Handle handle = m_Scope->GetBioseqHandle(id);
  126.         const CSeq_id& best_id = sequence::GetId(handle, sequence::eGetId_Best);
  127.         best_id.GetLabel(title, CSeq_id::eContent);
  128.     }
  129. }
  130. void CTaxTreeDS_ObjMgr::GetTitle(const ITaxon1Node& node, string* title) const
  131. {
  132.     if (title) {
  133.         *title = node.GetName();
  134.     }
  135. }
  136. const CRef<objects::CScope> &  CTaxTreeDS_ObjMgr::GetScope(void)
  137. {
  138.     return m_Scope;
  139. }
  140. END_NCBI_SCOPE
  141. /*
  142.  * ===========================================================================
  143.  * $Log: tax_tree_ds.cpp,v $
  144.  * Revision 1000.0  2004/06/01 21:31:39  gouriano
  145.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  146.  *
  147.  * Revision 1.2  2004/05/21 22:27:55  gorelenk
  148.  * Added PCH ncbi_pch.hpp
  149.  *
  150.  * Revision 1.1  2004/05/13 17:31:46  dicuccio
  151.  * Renamed data source file
  152.  *
  153.  * Revision 1.8  2004/04/09 16:53:32  tereshko
  154.  * Added functionality to send/accept selections
  155.  *
  156.  * Revision 1.7  2004/04/07 13:12:44  dicuccio
  157.  * Changed internal storage of sequence information to use CConstRef<CSeq_id>
  158.  *
  159.  * Revision 1.6  2004/04/01 19:03:13  dicuccio
  160.  * Added support for limiting the list of displayed nodes.  Changed retrieval of
  161.  * tax-id to favor sequence first
  162.  *
  163.  * Revision 1.5  2004/03/05 17:43:00  dicuccio
  164.  * Use sequence::GetId() instead of CSeq-id::GetStringDescr()
  165.  *
  166.  * Revision 1.4  2004/01/27 18:49:25  dicuccio
  167.  * Restored functionality
  168.  *
  169.  * Revision 1.3  2004/01/07 18:55:36  dicuccio
  170.  * Code clean-up.  Don't forget to initialize or CTaxon1 class
  171.  *
  172.  * Revision 1.2  2003/12/23 15:39:18  dicuccio
  173.  * Altered the data source - expose an ITreeIterator; the widget no longer
  174.  * directly creates a CTaxon1 class.  Chaned storage notion from 'gi' to 'uid'
  175.  *
  176.  * Revision 1.1  2003/12/22 19:42:59  dicuccio
  177.  * Initial revision
  178.  *
  179.  * ===========================================================================
  180.  */