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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_graph.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:11:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_graph.cpp,v 1000.2 2004/06/01 21:11:17 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:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <gui/widgets/hit_matrix/seq_graph.hpp>
  42. //#include <gui/graph/igraph_utils.hpp>
  43. #include <objmgr/seq_vector.hpp> 
  44. #include <objmgr/util/sequence.hpp>
  45. #include <FL/Fl.H>
  46. #include <math.h>
  47. BEGIN_NCBI_SCOPE
  48. CSequenceGraph::CSequenceGraph(bool b_horz)
  49. :   m_bHorz(b_horz),
  50.     m_pTextFont(NULL),
  51.     m_pSeqFont(NULL), 
  52.     m_BackColor(0.95f, 0.95f, 0.95f),
  53.     m_SeqBarColor(0.8f, 0.8f, 1.0f),
  54.     m_TextColor(0.0f, 0.0f, 0.0f)
  55. {
  56. }
  57. void    CSequenceGraph::SetFonts(CGlBitmapFont* txt_font, CGlBitmapFont* seq_font)
  58. {
  59.     m_pTextFont = txt_font;
  60.     m_pSeqFont = seq_font;
  61. }
  62. void    CSequenceGraph::SetBioseqHandle(CBioseq_Handle& handle)
  63. {
  64.     m_Handle = handle;
  65.     m_Label.erase();
  66.     if (m_Handle) {
  67.         const CSeq_id& best_id =
  68.             sequence::GetId(m_Handle, sequence::eGetId_Best);
  69.         best_id.GetLabel(&m_Label);
  70.     }
  71. }
  72. static int kSeparator = 6;
  73. static int kLabelOffset = 20;
  74. static int kSeqBarMargin = 3;
  75. TVPPoint CSequenceGraph::PreferredSize()
  76. {
  77.     float seq_h = m_pSeqFont->GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  78.     float w = 0, h = 0;        
  79.     if(m_bHorz) {
  80.         float text_h = m_pTextFont->GetMetric(CGlBitmapFont::eMetric_CharHeight);
  81.         h = seq_h + text_h + 2 * kSeqBarMargin + 3 * kSeparator;
  82.     
  83.         w = 2 * kLabelOffset + m_pTextFont->TextWidth(m_Label.c_str());
  84.         
  85.     } else {
  86.         float seq_sym_w = m_pSeqFont->GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  87.         float text_sym_w = m_pTextFont->GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  88.         w = seq_sym_w + text_sym_w + 2 * kSeqBarMargin + 3 * kSeparator;
  89.         h = 2 * kLabelOffset + m_Label.size() * (seq_h + 1);
  90.     }
  91.     return TVPPoint( (int) ceil(w), (int) ceil(h));
  92. }
  93. void    CSequenceGraph::Render(CGlPane& pane)
  94. {
  95.     if(m_Handle)    {
  96.         _ASSERT(m_pTextFont  &&  m_pSeqFont);
  97.         
  98.         glColorC(m_BackColor);
  99.         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  100.         const   TVPRect&    rc_VP = pane.GetViewport();
  101.         float seq_h = m_pSeqFont->GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  102.         float seq_sym_w = m_pSeqFont->GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  103.         if(m_bHorz) {
  104.             float bar_h = seq_h + kSeqBarMargin * 2;
  105.             pane.OpenPixels();
  106.             
  107.             // fill background
  108.             glRectd(rc_VP.Left(), rc_VP.Bottom(), rc_VP.Right(), rc_VP.Top());
  109.             // draw seq label
  110.             glColorC(m_TextColor);
  111.             float text_h = m_pTextFont->GetMetric(CGlBitmapFont::eMetric_CharHeight);
  112.             float x = rc_VP.Left() + kLabelOffset;
  113.             float y = rc_VP.Bottom() + kSeparator;
  114.             m_pTextFont->TextOut(x, y, m_Label.c_str());
  115.             // draw sequence bar
  116.             glColorC(m_SeqBarColor);
  117.             y = text_h + 2 * kSeparator;
  118.             glRectd(rc_VP.Left(),  y, rc_VP.Right(), y + bar_h);
  119.             pane.Close();
  120.             
  121.             // draw sequence
  122.             double min_w = 1.0 / seq_sym_w;
  123.             TModelUnit scale_x = pane.GetScaleX();
  124.             if(min_w > scale_x)    {    // sequence is visible
  125.                 pane.OpenOrtho();    
  126.                 TModelRect rc_model = pane.GetVisibleRect();    
  127.                 TSeqPos start = (TSeqPos) floor(rc_model.Left());
  128.                 TSeqPos stop = (TSeqPos) ceil(rc_model.Right());
  129.             
  130.                 // get the sequence                
  131.                 CSeqVector v_seq = m_Handle.GetSeqVector();
  132.                 string seq;
  133.                 v_seq.GetSeqData(start, stop, seq);
  134.                 fill(seq.begin(), seq.end(), 'G'); // ### temp hack
  135.                 
  136.                 glColorC(m_TextColor);
  137.                 x = start + 0.5;
  138.                 y += kSeqBarMargin;
  139.                 m_pSeqFont->ArrayTextOut(x, y, 1.0f, 0.0f, seq.c_str(), 
  140.                                          (float) scale_x, 0.0f);
  141.                 pane.Close();            
  142.             }
  143.             
  144.         } else { // vertical orientation
  145.             float bar_w = seq_sym_w + kSeqBarMargin * 2;
  146.             pane.OpenPixels();
  147.             
  148.             // fill background
  149.             glRectd(rc_VP.Left(), rc_VP.Bottom(), rc_VP.Right(), rc_VP.Top());
  150.             // draw seq label
  151.             glColorC(m_TextColor);
  152.             float text_h = m_pTextFont->GetMetric(CGlBitmapFont::eMetric_CharHeight);
  153.             float x = rc_VP.Right() - bar_w - 2 * kSeparator - seq_sym_w;
  154.             float y = rc_VP.Bottom() + kLabelOffset;
  155.             m_pTextFont->ArrayTextOut(x, y, 0.0f, text_h + 1, m_Label.c_str(),
  156.                                       0.0f, (float) pane.GetScaleY());
  157.             // draw sequence bar
  158.             glColorC(m_SeqBarColor);
  159.             x = rc_VP.Right() - kSeparator - bar_w;
  160.             glRectd(x, rc_VP.Bottom(), x + bar_w, rc_VP.Top());
  161.             
  162.             pane.Close();
  163.             // draw sequence            
  164.             double min_h = 1.0 / seq_h;
  165.             TModelUnit scale_y = pane.GetScaleY();
  166.             if(min_h > scale_y) {    // sequence is visible
  167.                 pane.OpenOrtho();
  168.         
  169.                 TModelRect rc_model = pane.GetVisibleRect();    
  170.                 TSeqPos start = (TSeqPos) floor(rc_model.Bottom());
  171.                 TSeqPos stop = (TSeqPos) ceil(rc_model.Top());
  172.             
  173.                 // get the sequence                
  174.                 CSeqVector v_seq = m_Handle.GetSeqVector();
  175.                 string seq;
  176.                 v_seq.GetSeqData(start, stop, seq);
  177.                 fill(seq.begin(), seq.end(), 'T'); // ### temp hack
  178.                 
  179.                 glColorC(m_TextColor);
  180.                 x += kSeqBarMargin;
  181.                 y = start + 0.5;
  182.                 m_pSeqFont->ArrayTextOut(x, y, 0.0f, 1.0f, seq.c_str(), 
  183.                                          0.0f, (float) scale_y);
  184.                 pane.Close();            
  185.             }               
  186.          }         
  187.     }
  188. }
  189. END_NCBI_SCOPE
  190. /*
  191.  * ===========================================================================
  192.  * $Log: seq_graph.cpp,v $
  193.  * Revision 1000.2  2004/06/01 21:11:17  gouriano
  194.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  195.  *
  196.  * Revision 1.5  2004/05/21 22:27:54  gorelenk
  197.  * Added PCH ncbi_pch.hpp
  198.  *
  199.  * Revision 1.4  2004/03/05 17:40:06  dicuccio
  200.  * Use sequence::GetId() instead of CSeq-id::GetStringDescr()
  201.  *
  202.  * Revision 1.3  2003/11/18 18:06:37  ucko
  203.  * Fixed gcc ERRORS - should #include <math.h>.
  204.  *
  205.  * Revision 1.2  2003/11/18 17:57:23  yazhuk
  206.  * Fixed GCC warnings
  207.  *
  208.  * Revision 1.1  2003/11/17 20:41:17  yazhuk
  209.  * Initial revision
  210.  *
  211.  * ===========================================================================
  212.  */