textaln_panel.cpp
来自「ncbi源码」· C++ 代码 · 共 890 行 · 第 1/2 页
CPP
890 行
/* * =========================================================================== * PRODUCTION $Log: textaln_panel.cpp,v $ * PRODUCTION Revision 1000.2 2004/06/01 21:08:00 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12 * PRODUCTION * =========================================================================== *//* $Id: textaln_panel.cpp,v 1000.2 2004/06/01 21:08:00 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Vlad Lebedev * */#include <ncbi_pch.hpp>#include "panel.hpp"#include <gui/widgets/aln_data/align_ds.hpp>#include <gui/opengl/glcolortable.hpp>#include <gui/opengl/glbitmapfont.hpp>#include <objects/seqloc/Seq_id.hpp>#include <objmgr/util/feature.hpp>#include <objmgr/util/sequence.hpp>#include <FL/fl_draw.H>#include <FL/Fl_Tooltip.H>BEGIN_NCBI_SCOPEUSING_SCOPE(ncbi::objects);const int kFontSize = 10; // font size for labels and sequenceconst int kFontWidth = 9; // font widthconst int kCellWidth = 10; // size of one element in the gridconst int kCellHeight = 13; // do not set less than that// or features may not fitconst size_t kUnknowIdx = ((size_t) (-1));const string kLabels = "Labels";const string kPosition = "Position";CTextAlnPanel::CTextAlnPanel(int x, int y, int w, int h, const char* label) : Fl_Gl_Window(x, y, w, h, label) , m_Font_8x13(CGlBitmapFont::eBitmap8x13){ m_DS = NULL; m_BackgroundColor = FL_WHITE; m_SelectionColor = FL_BLUE; m_NumbersColor = FL_BLUE; m_GridColor = FL_GRAY; m_SequenceColor = FL_BLACK; m_MismatchColor = FL_RED; m_AlnWidth = 0; m_AlnHeight = 0; m_Anchor = kUnknowIdx; m_ShowSeqAsDots = false; m_featDisp = CTextAlnView::eOff;}CTextAlnPanel::~CTextAlnPanel(){ // delete m_DS;}TSignedSeqPos CTextAlnPanel::x_GetStartAt(size_t idx, TNumseg seg) const{ return m_DS->GetAlnMgr().GetStart(idx, seg);}TSeqPos CTextAlnPanel::x_GetAlnWidth(void) const{ return m_DS->GetAlnMgr().GetAlnStop();}CTextAlnPanel::TDim CTextAlnPanel::x_GetAlnHeigth(void) const{ return m_DS->GetAlnMgr().GetNumRows();}void CTextAlnPanel::x_PrepareData(void){ m_ScrX = 0; m_ScrY = 0; m_AlnWidth = x_GetAlnWidth(); m_AlnHeight = x_GetAlnHeigth(); m_ParaG.clear(); for (TNumrow idx = 0; idx != m_AlnHeight; idx++) { if (m_featDisp == CTextAlnView::eAll || (m_featDisp == CTextAlnView::eBase && idx == 0)) { x_AddFeaturesAtIndex(idx); } CParaG para(CParaG::eSequence, idx); m_ParaG.push_back(para); x_AddInsertsAtIndex(idx); }}void CTextAlnPanel::x_AddInsertsAtIndex(size_t idx){ CRef<CAlnMap::CAlnChunkVec> chunk_vec = m_DS->GetAlnMgr().GetAlnChunks (idx, CAlnMap::TSignedRange(0, m_AlnWidth), CAlnVec::fInsertsOnly); if (chunk_vec->size() > 0) { CParaG para(CParaG::eInsertion, idx); m_ParaG.push_back(para); }}void CTextAlnPanel::x_AddFeaturesAtIndex(size_t idx){ const CBioseq_Handle& handle = m_DS->GetAlnMgr().GetBioseqHandle(idx); for (CFeat_CI feat_it(handle, 0, 0, CSeqFeatData::e_not_set); feat_it; ++feat_it) { CSeqFeatData::E_Choice type = (*feat_it).GetData().Which(); if (type == CSeqFeatData::e_Gene || type == CSeqFeatData::e_Rna || type == CSeqFeatData::e_Cdregion || type == CSeqFeatData::e_Prot) { const CMappedFeat& feat = *feat_it; CParaG para(CParaG::eFeature, idx, new CLayoutFeat(*new CMappedFeat(feat))); m_ParaG.push_back(para); } }}void CTextAlnPanel::ShowSequenceAsDots(bool show_dots){ m_ShowSeqAsDots = show_dots; redraw();}void CTextAlnPanel::SetAnchor(size_t idx){ m_Anchor = idx; m_DS->SetAlnMgr().SetAnchor(idx); x_PrepareData(); invalidate(); redraw();}void CTextAlnPanel::UnsetAnchor(void){ m_Anchor = kUnknowIdx; m_DS->SetAlnMgr().UnsetAnchor(); x_PrepareData(); invalidate(); redraw();}void CTextAlnPanel::SetDataSource(CAlignDataSource* ds){ m_DS = ds; m_RowSelect.clear(); // reset selections m_ColSelect.clear(); for (TNumrow idx = 0; idx != x_GetAlnHeigth(); idx++) m_RowSelect.push_back(false); for (size_t idx = 0; idx != x_GetAlnWidth(); idx++) m_ColSelect.push_back(false); x_PrepareData(); invalidate(); redraw();}void CTextAlnPanel::SelectAll(bool flag){ if ( !m_DS ) return; for (size_t idx = 0; idx != m_RowSelect.size(); idx++) m_RowSelect[idx] = flag; if (!flag) for (size_t idx = 0; idx != m_ColSelect.size(); idx++) m_ColSelect[idx] = flag; redraw();}void CTextAlnPanel::x_DrawSelection(int size, ESelectionType type) const{ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.1f, 0.1f, 0.1f, 0.1f); glBegin(GL_QUADS); if (type == eRow) { for (TNumrow row = 0; row != m_ParaG.size(); row++) { if (m_RowSelect[m_ParaG[row].GetIndex()]) { GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight; glVertex2f(0.0f, yy + kCellHeight); glVertex2f(size, yy + kCellHeight); glVertex2f(size, yy); glVertex2f(0.0f, yy); } } } else { for (TSeqPos col = 0; col != m_AlnWidth; col++) { if (m_ColSelect[col]) { GLfloat xx = GLfloat(col - m_ScrX) * kCellWidth; glVertex2f(xx, size); glVertex2f(xx + kCellWidth, size); glVertex2f(xx + kCellWidth, 0.0f); glVertex2f(xx, 0.0f); } } } glEnd(); glDisable(GL_BLEND);}void CTextAlnPanel::x_DrawGrid(){ gl_color(m_GridColor); glBegin(GL_LINES); for (TSeqPos col = 0; col != m_AlnWidth + 1; col++) { GLfloat xx = GLfloat(col - m_ScrX) * kCellWidth; glVertex2f(xx, 0.0f); glVertex2f(xx, m_Height); } for (TNumrow row = 0; row != m_ParaG.size(); row++) { GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight; glVertex2f(0.0f, yy); glVertex2f(m_BP[2], yy); } glEnd(); x_DrawSelection(m_BP[2], eRow); x_DrawSelection(m_BP[3], eCol);}void CTextAlnPanel::x_DrawSequence(TNumrow row, size_t idx) const{ string seq_draw, seq_base; TSeqPos start = m_ScrX; TSeqPos finish = m_ScrX + m_BP[2] / kCellWidth; m_DS->GetAlnMgr().GetAlnSeqString(seq_draw, idx, CAlnMap::TSignedRange(start, finish)); m_DS->GetAlnMgr().GetAlnSeqString(seq_base, 0, CAlnMap::TSignedRange(start, finish)); GLfloat yy = GLfloat(row - m_ScrY + 1) * kCellHeight + 1; for (TSeqPos x = 0; x != seq_draw.length(); x++) { GLfloat xx = GLfloat(x * kCellWidth); string seq_this = seq_draw.substr(x, 1); string seq_other = seq_base.substr(x, 1); if (seq_this == " ") seq_this = "-"; // AlnMgr problem fix if (seq_this != seq_other) { gl_color(m_MismatchColor); // color mismatches } else { gl_color(m_SequenceColor); if (m_ShowSeqAsDots && idx != 0 && seq_this != "-") { // draw dots instead (but not on the base sequence) seq_this = "."; } } m_Font_8x13.TextOut(xx, yy - 2, seq_this.c_str()); }}void CTextAlnPanel::x_DrawFeatures(TNumrow row, size_t idx) const{ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GLfloat width = 3; const CSeq_loc& loc = m_ParaG[row].Feature()->GetLocation(); switch (m_ParaG[row].Feature()->GetFeature().GetData().Which()) { case CSeqFeatData::e_Gene: glColor4f(0.0f, 1.0f, 0.0f, 0.33f); width = 3.0f; break; case CSeqFeatData::e_Rna: glColor4f(0.0f, 0.0f, 1.0f, 0.5f); width = 5.0f; break; case CSeqFeatData::e_Cdregion: glColor4f(1.0f, 0.0f, 0.0f, 0.33f); width = 7.0f; break; case CSeqFeatData::e_Prot: glColor4f(1.0f, 1.0f, 1.0f, 0.5f); width = 9.0f; break; default: break; } TSignedSeqPos s_from = loc.GetTotalRange().GetFrom(); TSignedSeqPos s_to = loc.GetTotalRange().GetTo(); TSignedSeqPos al_from = m_DS->GetAlnMgr().GetAlnPosFromSeqPos (idx, s_from); TSignedSeqPos al_to = m_DS->GetAlnMgr().GetAlnPosFromSeqPos (idx, s_to); if (al_from == -1) al_from = 0; if (al_to == -1) al_to = m_AlnWidth; // some times it happends al_from = al_from - m_ScrX; // adjust with scroll values al_to = al_to - m_ScrX + 1; if (al_from < 0) al_from = 0; GLfloat xx1 = al_from * kCellWidth; GLfloat xx2 = al_to * kCellWidth; GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight + GLfloat(kCellHeight / 2); x_DrawLine(xx1, yy, xx2, yy, width); glDisable(GL_BLEND);}void CTextAlnPanel::x_DrawInsertions(TNumrow row, size_t idx) const{ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(1.5f); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); CGlBitmapFont f(CGlBitmapFont::eHelvetica10); GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight; CRef<CAlnMap::CAlnChunkVec> chunk_vec = m_DS->GetAlnMgr().GetAlnChunks (idx, CAlnMap::TSignedRange(0, m_AlnWidth), CAlnVec::fInsertsOnly | CAlnVec::fIgnoreGaps); string ins_str; CGlColorTable table(chunk_vec->size(), 0.5f, 0.75f); for (int i = 0; i < chunk_vec->size(); i++) { // for each chunk CConstRef<CAlnMap::CAlnChunk> chunk = (*chunk_vec)[i]; TSeqPos seq_from = chunk->GetRange().GetFrom(); TSeqPos seq_to = chunk->GetRange().GetTo(); TSeqPos aln_from = chunk->GetAlnRange().GetFrom(); m_DS->GetAlnMgr().GetSeqString(ins_str, idx, seq_from, seq_to); string to_draw = x_PreprocessSeq(ins_str); TSeqPos ins_len = ins_str.length(); GLfloat ww = gl_width(to_draw.c_str()); GLfloat xx = GLfloat((aln_from - m_ScrX - 1) * kCellWidth) - ww / 2.0f; CGlColor color = table.GetColor(i); glColor4f(color.GetRed(), color.GetGreen(), color.GetBlue(), 0.4f); glBegin(GL_TRIANGLE_FAN); glVertex2f(xx, yy); glVertex2f(xx, yy + kCellHeight); glVertex2f(xx + ww, yy + kCellHeight); glVertex2f(xx + ww, yy); glVertex2f(xx + ww / 2, yy - 6); glEnd(); gl_color(FL_RED); //m_SequenceColor); // sequence f.TextOut(xx, yy + kCellHeight, to_draw.c_str()); string label = NStr::UIntToString(ins_len); ww = gl_width(label.c_str()); xx = GLfloat((aln_from - m_ScrX - 1) * kCellWidth) - ww / 2.0f; gl_color(FL_BLACK); // size f.TextOut(xx, yy + kCellHeight / 2, label.c_str()); } glLineWidth(1.0f); glDisable(GL_BLEND); glDisable(GL_POLYGON_SMOOTH);}void CTextAlnPanel::x_DrawTextPanel(void){ x_ActivateViewPort(m_BP); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); x_DrawGrid(); TNumrow startY = m_ScrY; TNumrow finishY = m_ScrY + m_Height / kCellHeight; for (TNumrow row = startY; row != finishY && row < m_ParaG.size(); row++) { CParaG para = m_ParaG[row]; switch(para.GetType()) { case CParaG::eFeature: x_DrawFeatures(row, para.GetIndex()); break; case CParaG::eSequence: x_DrawSequence(row, para.GetIndex()); break; case CParaG::eInsertion: x_DrawInsertions(row, para.GetIndex()); break; } } glPopAttrib();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?