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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: genome_policy.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:12:41  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: genome_policy.cpp,v 1000.2 2004/06/01 21:12:41 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.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <gui/widgets/seq_graphic/genome_policy.hpp>
  42. #include <objmgr/util/sequence.hpp>
  43. #include <gui/objutils/label.hpp>
  44. BEGIN_NCBI_SCOPE
  45. USING_SCOPE(objects);
  46. //const TModelUnit kOneRowHeight      = 6.0f;
  47. TModelUnit kGenomeSpacerSize = 3.0f; // 3 pixels befween layout objects
  48. CGenomePolicy::CGenomePolicy()
  49. {
  50. }
  51. //
  52. // draw a given feature in a given mode
  53. //
  54. void 
  55. CGenomePolicy::x_DrawFeature(CGlPane& pane, const CLayoutFeat* feat, 
  56.                     GLfloat row_y, EObj_IterMode mode, bool selected) const
  57. {
  58.     const TModelRect& rcV = pane.GetVisibleRect();
  59.     const TModelRect& rcM = pane.GetModelLimitsRect();
  60.     
  61.     TModelUnit offsetX = pane.GetOffsetX();
  62.     TModelUnit offsetY = pane.GetOffsetY();
  63.     
  64.     TSeqPos from = feat->GetLocation().GetTotalRange().GetFrom();
  65.     TSeqPos to   = feat->GetLocation().GetTotalRange().GetTo();
  66.     
  67.     TModelRect frc;
  68.     frc.SetLeft(from);
  69.     frc.SetRight(to);    
  70.     TModelRect inrc = frc.IntersectWith(rcV);
  71.     
  72.     GLfloat th = m_Font_Helv8.TextHeight();
  73.     
  74.     GLfloat line_y1  = feat->IsHiddenLabel() ? row_y + 2 : row_y + th + 5;
  75.     GLfloat line_y2  = line_y1 + 3;
  76.     GLfloat line_ym  = line_y1 + 1;
  77.     
  78.     GLfloat title_y  = row_y + th + 2;
  79.     GLfloat off      = rcM.Top() > 0 ? th : 0;
  80.     switch (mode) {
  81.     default:
  82.         break;
  83.     case eDrawObjectLines:
  84.         // straight line
  85.         x_SetFeatureColor(feat);
  86.         glVertex2f(from - offsetX, line_ym - offsetY);
  87.         glVertex2f(to - offsetX,   line_ym - offsetY);
  88.         // Draw selection
  89.         if (selected) {
  90.             x_Color(CSeqGraphicColorConfig::eSelection_Feature);
  91.             x_DrawSelection(pane, from, line_y1, to, line_y2);
  92.         }
  93.                 
  94.         break;
  95.     case eDrawObjectQuads:
  96.         // Highlight named Seq Annotations
  97.         if (feat->GetMappedFeature().GetAnnot().IsNamed()) {
  98.             CSeq_annot_Handle annot = feat->GetMappedFeature().GetAnnot();
  99.             size_t idx = x_GetSeqAnnotIndex(annot);
  100.             
  101.             TModelUnit h = x_GetRowHeight(pane, feat, selected);
  102.             CGlColor color = m_ColorTable.GetColor(idx);
  103.             glColor4f(color.GetRed(), color.GetGreen(), color.GetBlue(), 0.1f);
  104.             
  105.             // add small overhang of 5 pixels (left and right)
  106.             TModelUnit over = pane.UnProjectWidth(5);
  107.             
  108.             glVertex2f(from - offsetX - over, row_y - offsetY);
  109.             glVertex2f(from - offsetX - over, row_y+h - offsetY);
  110.             glVertex2f(to - offsetX+1+over, row_y+h - offsetY);
  111.             glVertex2f(to - offsetX+1+over, row_y - offsetY);
  112.         }
  113.         x_SetFeatureColor(feat);
  114.         
  115.         // quad for each interval (exon)
  116.         ITERATE (vector<TSeqRange>, iter, feat->GetIntervals()) {
  117.             const TSeqRange& curr = *iter;
  118.             TModelUnit f = curr.GetFrom();
  119.             TModelUnit t = curr.GetTo()+1;// + (neg_strand ? 0.0f : 1.0f);
  120.             
  121.             if (pane.ProjectX(t) - pane.ProjectX(f) <= 1.0f) {
  122.                 t = f + pane.UnProjectWidth(1);
  123.             }
  124.             glVertex2f(f - offsetX, line_y1 - offsetY);
  125.             glVertex2f(f - offsetX, line_y2 - offsetY);
  126.             glVertex2f(t - offsetX, line_y2 - offsetY);
  127.             glVertex2f(t - offsetX, line_y1 - offsetY);
  128.         }
  129.         
  130.         break;
  131.     case eDrawObjectLabel:
  132.         if (feat->IsHiddenLabel()) return;
  133.         // do not even try to draw labels if less than 1 letter width
  134.         if (inrc.Width() <= pane.UnProjectWidth(m_MinLabelWidth)) {
  135.             return;
  136.         }
  137.         
  138.         string fl_both;
  139.         string fl_type;
  140.         string fl_content;
  141.         string fl_out;
  142.         x_GetLabels(feat->GetFeature(), m_Handle.GetScope(),
  143.                     &fl_type, &fl_content, &fl_both);
  144.         GLfloat widthP     = inrc.Width() / pane.GetScaleX(); // width in pixels
  145.         GLfloat lw_type    = m_Font_Helv8.TextWidth(fl_type.c_str() );
  146.         if ( lw_type * 3 < widthP) { // 3 widths of eType label width
  147.             fl_out = m_Font_Helv8.Truncate(fl_both.c_str(), widthP);
  148.         } else {
  149.             fl_out = m_Font_Helv8.Truncate(fl_content.c_str(), widthP);
  150.         }
  151.         
  152.             if (selected) {
  153.             x_Color(CSeqGraphicColorConfig::eSelLabel_Feature);
  154.         } else {
  155.             x_Color(CSeqGraphicColorConfig::eLabel_Feature);
  156.         }
  157.         GLfloat xM = x_CenterText(pane, inrc, 
  158.                     m_Font_Helv8.TextWidth(fl_out.c_str()));
  159.         m_Font_Helv8.TextOut(xM - offsetX, 
  160.                     title_y - off - offsetY, fl_out.c_str());
  161.         break;
  162.     }
  163. }
  164. void 
  165. CGenomePolicy::x_DrawFeatPack(CGlPane& pane, const CLayoutFeatPack* pack,
  166.                     GLfloat row_y, EObj_IterMode mode, bool selected) const
  167. {
  168.     const TModelRect& rcV = pane.GetVisibleRect();
  169.     const TModelRect& rcM = pane.GetModelLimitsRect();
  170.     
  171.     TModelUnit offsetX = pane.GetOffsetX();
  172.     TModelUnit offsetY = pane.GetOffsetY();
  173.     
  174.     TSeqPos from = pack->GetLocation().GetTotalRange().GetFrom();
  175.     TSeqPos to   = pack->GetLocation().GetTotalRange().GetTo();
  176.     
  177.     TModelRect frc;
  178.     frc.SetLeft(from);
  179.     frc.SetRight(to);    
  180.     TModelRect inrc = frc.IntersectWith(rcV);
  181.     GLfloat th       = m_Font_Helv8.TextHeight();
  182.     GLfloat title_y  = row_y + th + 2;
  183.     GLfloat off      = rcM.Top() > 0 ? th : 0;
  184.     
  185.     switch (mode) {
  186.     default:
  187.         break;
  188.     case eDrawObjectLines:
  189.     case eDrawObjectQuads:
  190.         ITERATE (CLayoutFeat::TFeatList, iter, pack->GetFeatures()) {
  191.             const CLayoutFeat* feat = *iter;
  192.             x_DrawFeature(pane, feat, row_y, mode, selected);
  193.         }    
  194.         break;
  195.     case eDrawObjectLabel:
  196.         // do not even try to draw labels if less than 1 letter width
  197.         if (inrc.Width() <= pane.UnProjectWidth(m_MinLabelWidth)) {
  198.             return;
  199.         }
  200.         string out = NStr::UIntToString(pack->GetFeatures().size()) + " mRNA(s)";
  201.         
  202.         GLfloat widthP     = inrc.Width() / pane.GetScaleX(); // width in pixels
  203.         string fl_out = m_Font_Helv8.Truncate(out.c_str(), widthP);
  204.         
  205.         if (selected) {
  206.             x_Color(CSeqGraphicColorConfig::eSelLabel_Feature);
  207.         } else {
  208.             x_Color(CSeqGraphicColorConfig::eLabel_Feature);
  209.         }
  210.         GLfloat xM = x_CenterText(pane, inrc, 
  211.                     m_Font_Helv8.TextWidth(fl_out.c_str()));
  212.         m_Font_Helv8.TextOut(xM - offsetX, 
  213.                     title_y - off - offsetY, fl_out.c_str());
  214.         break;
  215.     }
  216. }
  217. void 
  218. CGenomePolicy::x_DrawComments(CGlPane& pane, const CLayoutComment* comm,
  219.                     GLfloat row_y, EObj_IterMode mode, bool selected) const
  220. {
  221.     const TModelRect& rcV = pane.GetVisibleRect();
  222.     const TModelRect& rcM = pane.GetModelLimitsRect();
  223.     
  224.     TModelUnit offsetX = pane.GetOffsetX();
  225.     TModelUnit offsetY = pane.GetOffsetY();
  226.     
  227.     GLfloat th = m_Font_Helv8.TextHeight();
  228.     GLfloat title_y  = row_y + th + 1;
  229.     GLfloat off = rcM.Top() > 0 ? th : 0;
  230.     switch (mode) {
  231.     default:
  232.     case eDrawObjectLines:
  233.     case eDrawObjectQuads:
  234.         break;
  235.     case eDrawObjectLabel:
  236.         const string& out = comm->GetComment();
  237.         x_Color(CSeqGraphicColorConfig::eFG_Comment);
  238.         m_Font_Helv8.TextOut(rcV.Left() - offsetX, 
  239.                     title_y - off - offsetY, out.c_str());
  240.         break;
  241.     }
  242. }
  243. // draw proteint product and label only when selected
  244. void CGenomePolicy::x_DrawProteinProduct(CGlPane& pane, const CLayoutFeat* feat, 
  245.                     GLfloat row_y, EProtSeqType type, bool selected) const
  246. {
  247.     // label for original protein only and when product is accessible
  248.     if (type == eTranslatedSeq  ||  !feat->GetFeature().IsSetProduct()) {
  249.         return; // not drawing labels or no product
  250.     }
  251.     
  252.     const TModelRect& rcV = pane.GetVisibleRect();
  253.     const TModelRect& rcM = pane.GetModelLimitsRect();
  254.     
  255.     TModelUnit offsetX = pane.GetOffsetX();
  256.     TModelUnit offsetY = pane.GetOffsetY();
  257.     
  258.     TSeqPos from = feat->GetLocation().GetTotalRange().GetFrom();
  259.     TSeqPos to   = feat->GetLocation().GetTotalRange().GetTo();
  260.     TModelRect frc;
  261.     frc.SetLeft(from);
  262.     frc.SetRight(to);
  263.     TModelRect inrc = frc.IntersectWith(rcV);
  264.     
  265.     // do not do anything if there is no spac for even one letter
  266.     if (inrc.Width() < pane.UnProjectWidth(m_MinLabelWidth)) {
  267.         return;
  268.     }
  269.     GLfloat scaleX  = pane.GetScaleX();
  270.     GLfloat th      = m_Font_Helv8.TextHeight();
  271.     GLfloat title_y = row_y + th + 2;
  272.     GLfloat off     = rcM.Top() > 0 ? th - 1 : 0;
  273.     const CSeq_loc& product = feat->GetFeature().GetProduct();
  274.     string prot_label;
  275.     CLabel::GetLabel(product, &prot_label,
  276.                      CLabel::eDefault, &m_Handle.GetScope());
  277.     string out = m_Font_Helv10.Truncate(prot_label.c_str(), 
  278.                                 inrc.Width() / scaleX);
  279.     GLfloat xM = x_CenterText(pane, inrc, 
  280.                                 m_Font_Helv10.TextWidth(out.c_str()));
  281.     x_Color(selected ? CSeqGraphicColorConfig::eSelLabel_ProtProduct :
  282.                        CSeqGraphicColorConfig::eLabel_ProtProduct);
  283.     m_Font_Helv8.TextOut(xM - offsetX, title_y - off - offsetY, out.c_str());
  284. }
  285. TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane, 
  286.                 const CLayoutFeatPack* pack, bool selected) const
  287. {
  288.     return 12.0f;
  289. }
  290. TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane, 
  291.                 const CLayoutFeat* feat, bool selected) const
  292. {
  293.     if (feat->IsHiddenLabel()) {
  294.         return 3.0f + kGenomeSpacerSize; // 3 pixel is the width of feature
  295.     } else {
  296.         return 3.0f + m_Font_Helv8.TextHeight() + 2 * kGenomeSpacerSize; // 3 pixel is the width of feature
  297.     }
  298. }
  299. TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane, 
  300.                     const CLayoutProtProd* prot, bool selected) const
  301. {
  302.     if (prot->IsHiddenLabel()) {
  303.         return 3.0f + kGenomeSpacerSize; // 3 pixel is the width of feature
  304.     } else {
  305.         return 3.0f + m_Font_Helv8.TextHeight() + 2 * kGenomeSpacerSize; // 3 pixel is the width of feature
  306.     }
  307. }
  308. TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane, 
  309.                     const CLayoutComment* comm, bool selected) const
  310. {
  311.     return m_Font_Helv8.TextHeight() + kGenomeSpacerSize;
  312.     
  313. }
  314. TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane, 
  315.                     const CLayoutHistogram* hist, bool selected) const
  316. {
  317.     return 10.0f + kGenomeSpacerSize; // 10 pixels for histogram in this policy
  318. }
  319. void CGenomePolicy::x_GetTitle(const CLayoutFeatPack* pack, string* title,
  320.         CLabel::ELabelType type) const
  321. {
  322.     *title = NStr::UIntToString(pack->GetFeatures().size()) + " mRNA(s)";
  323. }
  324. END_NCBI_SCOPE
  325. /*
  326.  * ===========================================================================
  327.  * $Log: genome_policy.cpp,v $
  328.  * Revision 1000.2  2004/06/01 21:12:41  gouriano
  329.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  330.  *
  331.  * Revision 1.10  2004/05/21 22:27:55  gorelenk
  332.  * Added PCH ncbi_pch.hpp
  333.  *
  334.  * Revision 1.9  2004/05/14 15:57:11  lebedev
  335.  * Optional argument to specify the type of title/tooltip added
  336.  *
  337.  * Revision 1.8  2004/05/07 15:37:35  dicuccio
  338.  * Use CLabel instead of CSeqUtils::GetLabel()
  339.  *
  340.  * Revision 1.7  2004/04/14 11:25:02  lebedev
  341.  * Use x_DrawSelection from the base class
  342.  *
  343.  * Revision 1.6  2004/04/07 13:11:46  dicuccio
  344.  * Use CSeq_annot_Handle for proper annotation name handling
  345.  *
  346.  * Revision 1.5  2004/03/30 13:58:37  lebedev
  347.  * Use elements colors from configuration instead of setting colors directly.
  348.  *
  349.  * Revision 1.4  2004/03/23 12:33:56  lebedev
  350.  * Made sequence and histograms bars a layout objects in the object panel.
  351.  * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel.
  352.  *
  353.  * Revision 1.3  2004/03/11 17:53:06  dicuccio
  354.  * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange
  355.  *
  356.  * Revision 1.2  2004/03/05 17:41:29  dicuccio
  357.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  358.  *
  359.  * Revision 1.1  2004/02/24 14:43:49  lebedev
  360.  * Initial revision
  361.  *
  362.  * ===========================================================================
  363.  */