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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: aln_table.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:07:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: aln_table.cpp,v 1000.1 2004/06/01 21:07:51 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/aln_table/aln_table.hpp>
  41. #include <gui/objutils/utils.hpp>
  42. #include <gui/objutils/label.hpp>
  43. #include <serial/iterator.hpp>
  44. #include <objects/seqalign/Score.hpp>
  45. #include <objects/general/Object_id.hpp>
  46. #include <serial/iterator.hpp>
  47. BEGIN_NCBI_SCOPE
  48. USING_SCOPE(objects);
  49. CAlnTableWidget::CAlnTableWidget(int x, int y, int w, int h,
  50.                                  const char* label)
  51.     : CTablePanel<SAlnProxy>(x, y, w, h, label)
  52. {
  53.     SetColumn(eLabel,   "Alignment", eString,  FL_ALIGN_LEFT, 1.0f);
  54.     SetColumn(eType,    "Type",      eString,  FL_ALIGN_LEFT, 0.2f);
  55.     SetColumn(eNumSeqs, "Sequences", eNumeric, FL_ALIGN_LEFT, 0.2f);
  56.     SetCellBox(FL_BORDER_FRAME);
  57. }
  58. void CAlnTableWidget::Add(CScope& scope, const CSeq_align& aln)
  59. {
  60.     if (m_DataSource) {
  61.         m_DataSource->Add(scope, aln);
  62.     }
  63. }
  64. void CAlnTableWidget::SetDataSource(CAlnTableDS& ds)
  65. {
  66.     m_DataSource.Reset(&ds);
  67.     Update();
  68. }
  69. void CAlnTableWidget::Update()
  70. {
  71.     Clear();
  72.     if ( !m_DataSource ) {
  73.         return;
  74.     }
  75.     const CAlnTableDS::TAlignments& aligns = m_DataSource->GetAlignments();
  76.     SetRows(aligns.size());
  77.     size_t idx = 0;
  78.     ITERATE (CAlnTableDS::TAlignments, iter, aligns) {
  79.         const CSeq_align& al    = *iter->align;
  80.         CScope&           scope = *iter->scope;
  81.         SetData(idx, *iter);
  82.         if (al.IsSetScore()) {
  83.             ITERATE (CSeq_align::TScore, score_iter, al.GetScore()) {
  84.                 const CScore& score = **score_iter;
  85.                 string str;
  86.                 if (score.GetId().IsStr()) {
  87.                     str = score.GetId().GetStr();
  88.                 } else {
  89.                     str = NStr::IntToString(score.GetId().GetId());
  90.                 }
  91.                 TColNames::iterator col_iter = m_Cols.find(str);
  92.                 if (col_iter == m_Cols.end()) {
  93.                     m_Cols[str] = eScoreStart + m_Cols.size();
  94.                     col_iter = m_Cols.find(str);
  95.                     SetColumn(col_iter->second, str, eNumeric,
  96.                               FL_ALIGN_RIGHT, 0.2f);
  97.                 }
  98.                 string& val = SetCell(idx, col_iter->second);
  99.                 if (score.GetValue().IsInt()) {
  100.                     val = NStr::IntToString(score.GetValue().GetInt());
  101.                 } else {
  102.                     val = NStr::DoubleToString(score.GetValue().GetReal());
  103.                 }
  104.             }
  105.         }
  106.         // set our label
  107.         string label;
  108.         x_GetAlnLabel(*iter, label);
  109.         SetCell(idx, eLabel, label);
  110.         // set the alignment type
  111.         switch (iter->align->GetSegs().Which()) {
  112.         case CSeq_align::TSegs::e_not_set:
  113.             SetCell(idx, eType, "unknown");
  114.             break;
  115.         case CSeq_align::TSegs::e_Denseg:
  116.             SetCell(idx, eType, "dense-seg");
  117.             break;
  118.         case CSeq_align::TSegs::e_Dendiag:
  119.             SetCell(idx, eType, "dense-diag");
  120.             break;
  121.         case CSeq_align::TSegs::e_Std:
  122.             SetCell(idx, eType, "std-seg");
  123.             break;
  124.         case CSeq_align::TSegs::e_Packed:
  125.             SetCell(idx, eType, "packed-seg");
  126.             break;
  127.         case CSeq_align::TSegs::e_Disc:
  128.             SetCell(idx, eType, "discontinuous");
  129.             break;
  130.         }
  131.         // set the number of sequences in our alignment
  132.         SetCell(idx, eNumSeqs, NStr::IntToString(x_GetNumSeqs(*iter)));
  133.         // set our score columns
  134.         ++idx;
  135.     }
  136. }
  137. void CAlnTableWidget::GetSelections(TConstScopedObjects& objs) const
  138. {
  139.     objs.clear();
  140.     for (size_t i = 0;  i < GetRows();  ++i) {
  141.         if ( !IsRowSelected(i) ) {
  142.             continue;
  143.         }
  144.         const SAlnProxy& aln = GetData(i);
  145.         objs.push_back(SConstScopedObject(*aln.align, *aln.scope));
  146.     }
  147. }
  148. void CAlnTableWidget::SetSelections(const TConstScopedObjects& objs)
  149. {
  150. }
  151. void CAlnTableWidget::x_GetAlnLabel(const SAlnProxy& proxy, string& label)
  152. {
  153.     CLabel::GetLabel(*proxy.align, &label, CLabel::eDefault, proxy.scope);
  154. }
  155. struct SSortByIdRef {
  156.     bool operator() (const CConstRef<CSeq_id>& id1,
  157.                      const CConstRef<CSeq_id>& id2) const
  158.     {
  159.         return (*id1 < *id2);
  160.     }
  161. };
  162. size_t CAlnTableWidget::x_GetNumSeqs(const SAlnProxy& proxy)
  163. {
  164.     set< CConstRef<CSeq_id>, SSortByIdRef> id_set;
  165.     CTypeConstIterator<CSeq_id> id_iter(*proxy.align);
  166.     for ( ;  id_iter;  ++id_iter) {
  167.         id_set.insert( CConstRef<CSeq_id>(&*id_iter) );
  168.     }
  169.     return id_set.size();
  170. }
  171. END_NCBI_SCOPE
  172. /*
  173.  * ===========================================================================
  174.  * $Log: aln_table.cpp,v $
  175.  * Revision 1000.1  2004/06/01 21:07:51  gouriano
  176.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  177.  *
  178.  * Revision 1.6  2004/05/21 22:27:52  gorelenk
  179.  * Added PCH ncbi_pch.hpp
  180.  *
  181.  * Revision 1.5  2004/05/20 12:41:46  dicuccio
  182.  * Added include for serial/iterator.hpp
  183.  *
  184.  * Revision 1.4  2004/05/15 03:17:05  ucko
  185.  * Add missing #includes (formerly indirect?)
  186.  *
  187.  * Revision 1.3  2004/05/07 15:36:16  dicuccio
  188.  * Use CLabel instead of CSeqUtils::GetLabel()
  189.  *
  190.  * Revision 1.2  2004/05/03 13:23:57  dicuccio
  191.  * gui/utils --> gui/objutils where needed
  192.  *
  193.  * Revision 1.1  2004/04/16 15:56:16  dicuccio
  194.  * Initial revision
  195.  *
  196.  * ===========================================================================
  197.  */