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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cross_panel_ir.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:06:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cross_panel_ir.cpp,v 1000.1 2004/06/01 21:06:37 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:  Vlad Lebedev
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <gui/widgets/aln_crossaln/cross_panel_ir.hpp>
  39. #include <objmgr/seq_vector.hpp>
  40. #include <gui/objutils/utils.hpp>
  41. #include <gui/opengl/glcolortable.hpp>
  42. BEGIN_NCBI_SCOPE
  43. USING_SCOPE(objects);
  44. const TModelUnit   kSeqMapBarHeight = 3.0f;
  45. CCrossPanelIR::CCrossPanelIR()
  46.     : m_Font_Bitmap9x15(CGlBitmapFont::eBitmap9x15)
  47. {
  48.     m_OneCharWidth = int( m_Font_Bitmap9x15.TextWidth("A") );
  49. }
  50. CCrossPanelIR::~CCrossPanelIR()
  51. {
  52. }
  53. void CCrossPanelIR::SetProportions(TModelUnit k, TModelUnit dx)
  54. {
  55.     m_K = k;
  56.     m_Dx = dx;
  57. }
  58. void CCrossPanelIR::SetShifts(TModelUnit sh1, TModelUnit sh2)
  59. {
  60.     m_Sh1 = sh1;
  61.     m_Sh2 = sh2;
  62. }
  63. void CCrossPanelIR::SetDataSource(CCrossAlnDataSource* ds)
  64. {
  65.     m_DS = ds;
  66. }
  67. void CCrossPanelIR::Render(CGlPane& pane)
  68. {
  69.     const TModelRect& rcV = pane.GetVisibleRect();
  70.     
  71.     m_OffsetX = pane.GetOffsetX();
  72.     m_OffsetY = pane.GetOffsetY();
  73.         
  74.     pane.OpenOrtho();
  75.     
  76.     // 1) Draw Black bars
  77.     CBioseq_Handle hndl1 = m_DS->GetQueryHandle();
  78.     CBioseq_Handle hndl2 = m_DS->GetSubjectHandle();
  79.     
  80.     TSeqPos s1 = hndl1.GetSeqVector(CBioseq_Handle::eCoding_Iupac).size();
  81.     TSeqPos s2 = hndl2.GetSeqVector(CBioseq_Handle::eCoding_Iupac).size();
  82.     TModelUnit x1 = x_Seq2Lim1(0);  // Convert from sequence to limits
  83.     TModelUnit x2 = x_Seq2Lim1(s1);
  84.     
  85.     TModelUnit xx1 = x_Seq2Lim2(0);
  86.     TModelUnit xx2 = x_Seq2Lim2(s2);
  87.     glColor3f(0.07f, 0.07f, 0.07f);
  88.     glBegin(GL_QUADS);
  89.         glVertex2f(x1, rcV.Top() + 5 - m_OffsetY);
  90.         glVertex2f(x2, rcV.Top() + 5 - m_OffsetY);
  91.         glVertex2f(x2, rcV.Top() + 17 - m_OffsetY);
  92.         glVertex2f(x1, rcV.Top() + 17 - m_OffsetY);
  93.     
  94.         glVertex2f(xx1, rcV.Bottom() - 5 - m_OffsetY);
  95.         glVertex2f(xx2, rcV.Bottom() - 5 - m_OffsetY);
  96.         glVertex2f(xx2, rcV.Bottom() - 18 - m_OffsetY);
  97.         glVertex2f(xx1, rcV.Bottom() - 18 - m_OffsetY);
  98.     glEnd();
  99.     
  100.     // 2) Draw cross alignment lines
  101.     glEnable(GL_BLEND);
  102.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  103.     glEnable(GL_LINE_SMOOTH);
  104.     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  105.     glLineWidth(1.5f);
  106.     x_DrawCrossAlignment(pane, GL_QUADS    );  // Draw our quads
  107.     x_DrawCrossAlignment(pane, GL_LINE_LOOP);  // Draw the outline
  108.     // 3) Draw two Sequences
  109.     bool seq_fit1 = x_IsSeqLettersFit1(pane);
  110.     bool seq_fit2 = x_IsSeqLettersFit2(pane);
  111.     
  112.     GLfloat y1 = rcV.Top() + m_Font_Bitmap9x15.TextHeight() + 5;
  113.     GLfloat y2 = rcV.Bottom() - m_Font_Bitmap9x15.TextHeight() + 3;
  114.     
  115.     TModelUnit one1 = pane.UnProjectWidth(m_OneCharWidth);
  116.     TModelUnit add1 = (1.0f - one1) / 2.0f;
  117.     
  118.     TModelUnit one2 = pane.UnProjectWidth(m_OneCharWidth) / m_K;
  119.     TModelUnit add2 = (1.0f - one2) / 2.0f;
  120.     
  121.     //cout << "m_K: " << m_K << "  /  one1: " << one1 << "  /  one2: " << one2 << endl;
  122.     
  123.     char bases[2];
  124.     bases[1] = '';
  125.     string seq1, seq2;
  126.     glColor3f(0.55f, 0.55f, 0.55f);
  127.     if (seq_fit1) {  // sequence 1 fit
  128.         TModelUnit l1 = x_Lim2Seq1( rcV.Left () );
  129.         TModelUnit r1 = x_Lim2Seq1( rcV.Right() );
  130.         if (l1 < 0) l1 = 0;
  131.         x_GetSequence(hndl1, l1, r1, seq1);
  132.         
  133.         for (TSeqPos bp = 0;  bp != seq1.length();  bp++) {
  134.             bases[0] = seq1[bp];
  135.             m_Font_Bitmap9x15.TextOut(x_Seq2Lim1(TSeqPos(l1) + bp) + add1,
  136.                                       y1 - m_OffsetY, bases);
  137.         }
  138.     }
  139.     
  140.     if (seq_fit2) {  // sequence 2 fit
  141.         TModelUnit l2 = x_Lim2Seq2( rcV.Left () );
  142.         TModelUnit r2 = x_Lim2Seq2( rcV.Right() );
  143.         if (l2 < 0) l2 = 0;
  144.         x_GetSequence(hndl2, l2, r2, seq2);
  145.         
  146.         for (TSeqPos bp = 0;  bp != seq2.length();  bp++) {
  147.             bases[0] = seq2[bp];
  148.             m_Font_Bitmap9x15.TextOut(x_Seq2Lim2(TSeqPos(l2) + bp) + add2,
  149.                                       y2 - m_OffsetY, bases);
  150.         }
  151.     }
  152.     
  153.     // 4) Highlight mismatches (and draw connection lines)
  154.     if (seq_fit1  ||  seq_fit2) {
  155.         const CCrossAlnDataSource::THitAdapterCont& hits = m_DS->GetHits();        
  156.         ITERATE(CCrossAlnDataSource::THitAdapterCont, iter, hits) {
  157.             for (size_t idx = 0;  idx != (*iter).GetElemsCount();  idx++) {
  158.                 CHitElemDataAdapter elem = (*iter).GetElem(idx);
  159.                 if (elem.GetQueryStart() < 0  || elem.GetSubjectStart() < 0 ) {
  160.                     continue;
  161.                 }
  162.                 
  163.                 TSeqPos from1 = elem.GetQueryStart();
  164.                 TSeqPos from2 = elem.GetSubjectStart();
  165.                 TSeqPos to1   = from1 + elem.GetLength();
  166.                 TSeqPos to2   = from2 + elem.GetLength();
  167.                 //cout << "from1: " << from1 << " : to1: " << to1 << "   /   from2: " << from2 << " : to2: " << to2 << endl;
  168.                 
  169.                 x_GetSequence(hndl1, from1, to1, seq1);
  170.                 x_GetSequence(hndl2, from2, to2, seq2);
  171.     
  172.                 GLfloat y1 = rcV.Top() + m_Font_Bitmap9x15.TextHeight() + 5;
  173.                 GLfloat y2 = rcV.Bottom() - m_Font_Bitmap9x15.TextHeight() + 3;
  174.                 
  175.                 TSeqPos bp = 0;
  176.                 for (TSeqPos pos = 0;  pos != to1 - from1;  pos++) {
  177.                     GLfloat x1 = x_Seq2Lim1(from1 + pos);
  178.                     GLfloat x2 = x_Seq2Lim2(from2 + pos);
  179.                     
  180.                     // Draw lines to connect mismatches
  181.                     glColor3f(1.0f, 1.0f, 1.0f);  // black
  182.                     
  183.                     if (seq1[bp] != seq2[bp]) {
  184.                         if (seq_fit1  &&  seq_fit2) {
  185.                             glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
  186.                             
  187.                             glBegin(GL_LINES);
  188.                             glVertex2f(x1  , rcV.Top()    + 17 - m_OffsetY);
  189.                             glVertex2f(x2  , rcV.Bottom() - 18 - m_OffsetY);
  190.                             glVertex2f(x1+1, rcV.Top()    + 17 - m_OffsetY);
  191.                             glVertex2f(x2+1, rcV.Bottom() - 18 - m_OffsetY);
  192.                             glEnd();
  193.                         }
  194.                         glColor3f(1.0f, 0.0f, 0.0f);
  195.                     }
  196.                     
  197.                     if (seq_fit1) {
  198.                         bases[0] = seq1[bp];
  199.                         m_Font_Bitmap9x15.TextOut(x1 + add1, 
  200.                                                 y1 - m_OffsetY, bases);
  201.                     }
  202.     
  203.                     if (seq_fit2) {
  204.                         bases[0] = seq2[bp];
  205.                         m_Font_Bitmap9x15.TextOut(x2 + add2, 
  206.                                                 y2 - m_OffsetY, bases);
  207.                     }
  208.                     bp++;
  209.                 } // for: pos
  210.             } // size_t
  211.         } // for: map
  212.     }
  213.     
  214.     glDisable(GL_BLEND);
  215.     glDisable(GL_LINE_SMOOTH);
  216.     glLineWidth(1.0f);
  217.     pane.Close();
  218. }
  219. void CCrossPanelIR::x_DrawCrossAlignment(CGlPane& pane, GLenum shape)
  220. {
  221.     const TModelRect& rcV = pane.GetVisibleRect();
  222.     const CCrossAlnDataSource::THitAdapterCont& hits = m_DS->GetHits();
  223.     int count = 0;
  224.     ITERATE(CCrossAlnDataSource::THitAdapterCont, iter, hits) {
  225.         count += (*iter).GetElemsCount();
  226.     }
  227.     
  228.     CGlColorTable table(count, 0.5f, 0.75f);
  229.     ITERATE(CCrossAlnDataSource::THitAdapterCont, iter, hits) {
  230.         for (size_t idx = 0;  idx != (*iter).GetElemsCount();  idx++) {
  231.             CHitElemDataAdapter elem = (*iter).GetElem(idx);
  232.             if (elem.GetQueryStart() < 0  || elem.GetSubjectStart() < 0 ) {
  233.                 continue;
  234.             }
  235.             
  236.             TSeqPos from1 = elem.GetQueryStart();
  237.             TSeqPos from2 = elem.GetSubjectStart();
  238.             TSeqPos to1   = from1 + elem.GetLength();
  239.             TSeqPos to2   = from2 + elem.GetLength();
  240.             
  241.             TModelUnit x_from1 = x_Seq2Lim1(from1);
  242.             TModelUnit x_to1   = x_Seq2Lim1(to1);
  243.     
  244.             TModelUnit x_from2 = x_Seq2Lim2(from2);
  245.             TModelUnit x_to2   = x_Seq2Lim2(to2);
  246.             
  247.             CGlColor color = table.GetColor(idx);
  248.             glColor4f(color.GetRed(), color.GetGreen(), color.GetBlue(), 
  249.                 shape == GL_QUADS ? 0.4 : 0.8);
  250.     
  251.             glBegin(shape);
  252.             glVertex2f(x_from1, rcV.Top() + 19 - m_OffsetY);
  253.             glVertex2f(x_to1,   rcV.Top() + 19 - m_OffsetY);
  254.             glVertex2f(x_to2,   rcV.Bottom() - 21 - m_OffsetY);
  255.             glVertex2f(x_from2, rcV.Bottom() - 21 - m_OffsetY);
  256.             glEnd();
  257.         }
  258.     }    
  259. }
  260. void CCrossPanelIR::x_GetSequence(const CBioseq_Handle& handle,
  261.             TModelUnit from, TModelUnit to, string& buffer) const
  262. {
  263.     buffer.erase();
  264.     CSeqVector s_vec =
  265.         handle.GetSeqVector(CBioseq_Handle::eCoding_Iupac);
  266.     s_vec.GetSeqData(TSeqPos(from), TSeqPos(to), buffer);
  267. }
  268. // Convert sequence to limits
  269. TModelUnit CCrossPanelIR::x_Seq2Lim1(TModelUnit seq)
  270. {
  271.     if (m_Dx < 0) return seq - m_Dx - m_OffsetX;
  272.     else return seq - m_OffsetX;
  273. }
  274. TModelUnit CCrossPanelIR::x_Seq2Lim2(TModelUnit seq)
  275. {
  276.     if (m_Dx > 0) return (seq + m_Dx - m_Sh2 ) * m_K + m_Sh1 - m_OffsetX;
  277.     else return (seq - m_Sh2) * m_K + m_Sh1 - m_OffsetX;
  278. }
  279. // Convert limits to sequence
  280. TModelUnit CCrossPanelIR::x_Lim2Seq1(TModelUnit lim)
  281. {
  282.     if (m_Dx < 0) return lim + m_Dx;
  283.     else return lim;
  284. }
  285. TModelUnit CCrossPanelIR::x_Lim2Seq2(TModelUnit lim)
  286. {
  287.     if (m_Dx > 0) return (lim - m_Sh1) / m_K -m_Dx + m_Sh2;
  288.     else return (lim - m_Sh1) / m_K + m_Sh2;
  289. }
  290. bool CCrossPanelIR::x_IsSeqLettersFit1(CGlPane& pane) const
  291. {
  292.     return pane.GetScaleX() <= 1.0f / 8.0f;
  293. }
  294. bool CCrossPanelIR::x_IsSeqLettersFit2(CGlPane& pane) const
  295. {
  296.     return pane.GetScaleX() / m_K <= 1.0f / 8.0f;
  297. }
  298. // IRenderable
  299. TVPRect CCrossPanelIR::GetVPRect()
  300. {
  301.     TVPRect rc(0, 0);
  302.     rc.SetSize(0, 0);
  303.     return rc;
  304. }
  305. TModelRect CCrossPanelIR::GetModelRect()
  306. {
  307.     TModelRect rc(0, 0);
  308.     rc.SetSize(0, 0);
  309.     return rc;
  310. }
  311.     
  312. END_NCBI_SCOPE
  313. /*
  314.  * ===========================================================================
  315.  * $Log: cross_panel_ir.cpp,v $
  316.  * Revision 1000.1  2004/06/01 21:06:37  gouriano
  317.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  318.  *
  319.  * Revision 1.6  2004/05/21 22:27:52  gorelenk
  320.  * Added PCH ncbi_pch.hpp
  321.  *
  322.  * Revision 1.5  2004/05/03 13:23:57  dicuccio
  323.  * gui/utils --> gui/objutils where needed
  324.  *
  325.  * Revision 1.4  2004/03/11 17:50:41  dicuccio
  326.  * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange
  327.  * instead of TRange
  328.  *
  329.  * Revision 1.3  2003/12/23 12:59:42  ucko
  330.  * Avoid deque<>::const_iterator::operator->, which fails to compile on
  331.  * GCC 2.95.x due to a typo in its STL implementation. :-/
  332.  *
  333.  * Revision 1.2  2003/12/22 16:51:33  lebedev
  334.  * Use CHitElemDataAdapter to get start/length from datasource
  335.  *
  336.  * Revision 1.1  2003/12/22 13:12:34  lebedev
  337.  * Initial revision
  338.  *
  339.  * ===========================================================================
  340.  */