From 465e7bb79247630f7625022e96524a8ac1703b22 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Mon, 7 Jun 2010 08:32:47 +0000
Subject: [PATCH] New SequenceViewer, added new DisplayMode "Conservation 2"

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2346 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gui/src/CMakeLists.txt                |  2 +-
 .../gui/src/sequence/alignment_view_object.cc | 80 ++++++++++++++-----
 .../gui/src/sequence/alignment_view_object.hh | 10 ++-
 3 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/modules/gui/src/CMakeLists.txt b/modules/gui/src/CMakeLists.txt
index f8aeaaf00..744b59c57 100644
--- a/modules/gui/src/CMakeLists.txt
+++ b/modules/gui/src/CMakeLists.txt
@@ -480,7 +480,7 @@ module(NAME gui SOURCES ${OST_GUI_MOCS} ${OST_GUI_SOURCES}
                ${OST_GUI_INPUT_HEADERS}
                ${OST_GUI_DATA_VIEWER_HEADERS}
                ${OST_GUI_HEADERS}
-       DEPENDS_ON gfx io mol_alg
+       DEPENDS_ON gfx io mol_alg seq_alg
        LINK ${QT_LIBRARIES} ${PYTHON_LIBRARIES} ${BOOST_PYTHON_LIBRARIES} ${SPNAV_LIBRARIES})
 include_directories(${PYTHON_INCLUDE_PATH})
 qt4_add_resources(OST_QT_RESOURCE dngr.qrc)
diff --git a/modules/gui/src/sequence/alignment_view_object.cc b/modules/gui/src/sequence/alignment_view_object.cc
index c7be971ea..dc7197641 100644
--- a/modules/gui/src/sequence/alignment_view_object.cc
+++ b/modules/gui/src/sequence/alignment_view_object.cc
@@ -28,6 +28,7 @@
 #include <ost/mol/view_op.hh>
 
 #include <ost/seq/aligned_region.hh>
+#include <ost/seq/alg/conservation.hh>
 
 #include "sequence_row.hh"
 #include "secstr_row.hh"
@@ -83,10 +84,11 @@ QColor GetForeGroundColor(QColor background){
 
 }
 
-
 QMap<QString,int> AlignmentViewObject::group_map_ = GetGroupMap();
 
-const QString AlignmentViewObject::conservation_mode = "Highlight conservation";
+
+const QString AlignmentViewObject::conservation_mode_1 = "Highlight conservation 1";
+const QString AlignmentViewObject::conservation_mode_2 = "Highlight conservation 2";
 
 AlignmentViewObject::AlignmentViewObject(const seq::AlignmentHandle& alignment, QObject* parent): SequenceViewObject(parent), alignment_(alignment)
 {
@@ -95,6 +97,18 @@ AlignmentViewObject::AlignmentViewObject(const seq::AlignmentHandle& alignment,
     this->AddSequence(seq_handle, seq_handle.GetName().c_str());
   }
 
+  std::vector<Real> values = seq::alg::Conservation(alignment,false);
+
+  gradient_.SetColorAt(0,gfx::Color(0,0,1));
+  gradient_.SetColorAt(0.5,gfx::Color(1,1,1));
+  gradient_.SetColorAt(1,gfx::Color(1,0,0));
+  //Calculate Conservation Mode 1
+  for(unsigned int i=0; i<values.size(); i++){
+    gfx::Color color = gradient_.GetColorAt(values[i]);
+    conservation_1_[i] = QColor(color.Red()*255,color.Green()*255,color.Blue()*255);
+  }
+
+  //Calculate Conservation Mode 2
   for(int j=0; j<alignment.GetLength(); j++){
     int group = 0;
     QString element = "";
@@ -120,49 +134,71 @@ AlignmentViewObject::AlignmentViewObject(const seq::AlignmentHandle& alignment,
 
     }
     if(element.size()==1){
-      conservation_[j] = QColor(175,175,175);
+      conservation_2_[j] = QColor(175,175,175);
     }
     else if(group > 0){
-      conservation_[j] = QColor(200,200,200);
+      conservation_2_[j] = QColor(200,200,200);
     }
     else{
-      conservation_[j] = Qt::transparent;
+      conservation_2_[j] = Qt::transparent;
     }
   }
-  this->AddDisplayMode(conservation_mode);
+  this->AddDisplayMode(conservation_mode_1);
+  this->AddDisplayMode(conservation_mode_2);
 }
 
 
 QVariant AlignmentViewObject::GetData(int row, int column, int role)
 {
-  if(column > 0 && this->GetCurrentDisplayMode() == conservation_mode){
-    if(role == Qt::UserRole+3 ){
-      if(column -1 < conservation_.size()){
-        return QVariant(conservation_[column-1]);
+  if(column > 0){
+    if(this->GetCurrentDisplayMode() == conservation_mode_1){
+      if(role == Qt::UserRole+3 ){
+        if(column -1 < conservation_1_.size()){
+          return QVariant(conservation_1_[column-1]);
+        }
+          return QVariant(Qt::transparent);
       }
+
+      if(role == Qt::ForegroundRole){
+        if(column -1 < conservation_1_.size()){
+          if(conservation_1_[column-1].red()>128){
+            return QVariant(Qt::black);
+          }
+          else{
+            return QVariant(Qt::white);
+          }
+        }
         return QVariant(Qt::transparent);
+      }
     }
-
-    if(role == Qt::ForegroundRole){
-      if(column -1 < conservation_.size()){
-          return QVariant(Qt::black);
+    else if(this->GetCurrentDisplayMode() == conservation_mode_2){
+      if(role == Qt::UserRole+3 ){
+        if(column -1 < conservation_2_.size()){
+          return QVariant(conservation_2_[column-1]);
+        }
+        return QVariant(Qt::transparent);
+      }
+      if(role == Qt::ForegroundRole){
+        if(column -1 < conservation_2_.size()){
+            return QVariant(Qt::black);
         }
         return QVariant(Qt::transparent);
+      }
     }
-
   }
-
   return BaseViewObject::GetData(row,column,role);
 }
 
 void AlignmentViewObject::SetDisplayMode(const QString& mode)
 {
-  if(this->display_modes_.contains(mode) && mode == conservation_mode){
-    for(int i=0 ; i<this->GetRowCount(); i++){
-      BaseRow* row = this->GetRow(i);
-      row->RemovePainter(seq_secondary_structure_painter);
-      row->RemovePainter(align_properties_painter);
-      row->InsertPainter(conservation_painter,1);
+  if(this->display_modes_.contains(mode)){
+    if(mode == conservation_mode_1 || mode == conservation_mode_2){
+      for(int i=0 ; i<this->GetRowCount(); i++){
+        BaseRow* row = this->GetRow(i);
+        row->RemovePainter(seq_secondary_structure_painter);
+        row->RemovePainter(align_properties_painter);
+        row->InsertPainter(conservation_painter,1);
+      }
     }
   }
   SequenceViewObject::SetDisplayMode(mode);
diff --git a/modules/gui/src/sequence/alignment_view_object.hh b/modules/gui/src/sequence/alignment_view_object.hh
index 242e1efea..b8fee2800 100644
--- a/modules/gui/src/sequence/alignment_view_object.hh
+++ b/modules/gui/src/sequence/alignment_view_object.hh
@@ -25,6 +25,8 @@
 
 #include <ost/seq/alignment_handle.hh>
 
+#include <ost/gfx/gradient.hh>
+
 #include "sequence_view_object.hh"
 
 namespace ost { namespace gui {
@@ -37,18 +39,20 @@ public:
   AlignmentViewObject(const seq::AlignmentHandle& alignment, QObject* parent = 0);
 
   QVariant GetData(int row, int column, int role);
-
   const seq::AlignmentHandle& GetAlignment();
 
   void SetDisplayMode(const QString& mode);
 
 private:
+  gfx::Gradient gradient_;
   seq::AlignmentHandle alignment_;
-  QMap<int, QColor> conservation_;
+  QMap<int, QColor> conservation_1_;
+  QMap<int, QColor> conservation_2_;
 
   static QMap<QString,int> group_map_;
 
-  static const QString conservation_mode;
+  static const QString conservation_mode_1;
+  static const QString conservation_mode_2;
 };
 
 
-- 
GitLab