Getting closer to a subanalysis mode
[mussa.git] / alg / glsequence.cpp
index 8af0adbe03fbdbc3af960e8efa9d40ad626f6af9..54a13fad5af915e8dd28190ceae135147e43b9ca 100644 (file)
@@ -6,7 +6,8 @@
 #include <stdexcept>
 using namespace std;
 
-GlSequence::GlSequence(const Sequence &s, AnnotationColors& cm) 
+GlSequence::GlSequence(boost::shared_ptr<Sequence> s, 
+                       boost::shared_ptr<AnnotationColors> cm) 
   : seq(s),
     seq_x(0.0), 
     seq_y(0.0), 
@@ -33,7 +34,7 @@ GlSequence::GlSequence(const GlSequence &s)
 GlSequence &GlSequence::operator=(const GlSequence & s)
 {
   if (this != &s) {
-    const_cast<Sequence &>(seq) = s.seq;
+    seq = s.seq;
     seq_x = s.seq_x;
     seq_y = s.seq_y;
     seq_z = s.seq_z;
@@ -47,7 +48,7 @@ GlSequence &GlSequence::operator=(const GlSequence & s)
 
 const Sequence& GlSequence::sequence() const
 {
-  return seq;
+  return *seq;
 }
 
 void GlSequence::setX(GLfloat value)
@@ -82,7 +83,7 @@ GLfloat GlSequence::height() const
 
 GLfloat GlSequence::length() const
 {
-  return seq.size();
+  return seq->size();
 }
 
 Sequence::size_type GlSequence::leftbase(GLfloat left) const
@@ -90,8 +91,8 @@ Sequence::size_type GlSequence::leftbase(GLfloat left) const
   left = ceil(left - seq_x);
   if (left < 0)
     return 0;
-  else if (left > seq.size() )
-    return seq.size();
+  else if (left > seq->size() )
+    return seq->size();
   else
     return (Sequence::size_type)left;
 }
@@ -99,8 +100,8 @@ Sequence::size_type GlSequence::leftbase(GLfloat left) const
 Sequence::size_type GlSequence::rightbase(GLfloat right) const
 {
   right = floor(right) - seq_x;
-  if (right > seq.size())
-    return seq.size();
+  if (right > seq->size())
+    return seq->size();
   else if ( right < 0) 
     return 0;
   else 
@@ -109,30 +110,30 @@ Sequence::size_type GlSequence::rightbase(GLfloat right) const
 
 Sequence::const_iterator GlSequence::sequence_begin() const
 {
-  return seq.begin();
+  return seq->begin();
 }
 
 Sequence::const_iterator GlSequence::sequence_end() const
 {
-  return seq.end();
+  return seq->end();
 }
 
 Sequence::const_iterator 
 GlSequence::sequence_begin(GLfloat left, GLfloat right) const
 {
-  if ( leftbase(left) > seq.size() or left > right )
-    return seq.end();
+  if ( leftbase(left) > seq->size() or left > right )
+    return seq->end();
   else
-    return seq.begin() + leftbase(left);
+    return seq->begin() + leftbase(left);
 }
 
 Sequence::const_iterator 
 GlSequence::sequence_end(GLfloat left, GLfloat right) const
 {
-  if ( rightbase(right) > seq.size() or left > right )
-    return seq.end();
+  if ( rightbase(right) > seq->size() or left > right )
+    return seq->end();
   else
-    return seq.begin() + rightbase(right); 
+    return seq->begin() + rightbase(right); 
 }
 
 
@@ -221,15 +222,15 @@ void GlSequence::draw_track(GLfloat left, GLfloat right) const
 {
   glColor3fv(drawColor.get());
   // draw main sequence track
-  draw_box(left, right, seq_x, seq_x+seq.size(), seq_height, 0.0);
+  draw_box(left, right, seq_x, seq_x+seq->size(), seq_height, 0.0);
 }
 
 void GlSequence::draw_annotations(GLfloat left, GLfloat right) const
 {
   // draw annotations
   GLfloat annotation_z = seq_z + 10.0;
-  const std::list<annot>& annots = seq.annotations();
-  const std::list<motif>& motifs = seq.motifs();
+  const std::list<annot>& annots = seq->annotations();
+  const std::list<motif>& motifs = seq->motifs();
   for (std::list<annot>::const_iterator annot_itor = annots.begin();
        annot_itor != annots.end();
        ++annot_itor)
@@ -243,7 +244,7 @@ void GlSequence::draw_annotations(GLfloat left, GLfloat right) const
        motifs_itor != motifs.end();
        ++motifs_itor)
   {
-    glColor3fv(color_mapper.lookup("motif", motifs_itor->sequence).get());
+    glColor3fv(color_mapper->lookup("motif", motifs_itor->sequence).get());
     draw_box(left, right, seq_x+motifs_itor->start, seq_x+motifs_itor->end, 
              seq_height, annotation_z+1.0);
   }
@@ -321,7 +322,7 @@ void GlSequence::draw_sequence(GLfloat left, GLfloat right) const
   assert(seq_end - seq_itor >= 0);
   while(seq_itor != seq_end)
   {
-    assert ( basepair < seq.size() );
+    assert ( basepair < seq->size() );
     glPushMatrix();
     glTranslatef( seq_x+leftbase(left) + basepair, seq_y, 1.0 );
     glScalef(0.1, 1.0, 1.0);