1 #include "alg/glsequence.hpp"
9 GlSequence::GlSequence(const Sequence &s, AnnotationColors& cm)
16 drawColor(0.0, 0.0, 0.0),
17 char_pix_per_world_unit(5.0)
21 GlSequence::GlSequence(const GlSequence &s)
26 seq_height(s.seq_height),
27 color_mapper(s.color_mapper),
28 drawColor(s.drawColor),
29 char_pix_per_world_unit(s.char_pix_per_world_unit)
33 GlSequence &GlSequence::operator=(const GlSequence & s)
36 const_cast<Sequence &>(seq) = s.seq;
40 seq_height = s.seq_height;
41 color_mapper = s.color_mapper;
42 drawColor = s.drawColor;
43 assert(char_pix_per_world_unit == s.char_pix_per_world_unit);
48 const Sequence& GlSequence::sequence() const
53 void GlSequence::setX(GLfloat value)
58 GLfloat GlSequence::x() const
63 void GlSequence::setY(GLfloat value)
68 GLfloat GlSequence::y() const
73 GLfloat GlSequence::height() const
78 GLfloat GlSequence::length() const
83 Sequence::size_type GlSequence::leftbase(GLfloat left) const
89 else if (left > seq.size() )
92 return (Sequence::size_type)left;
95 Sequence::size_type GlSequence::rightbase(GLfloat right) const
99 if (right > seq.size())
102 return (Sequence::size_type)right;
105 Sequence::const_iterator GlSequence::sequence_begin() const
110 Sequence::const_iterator GlSequence::sequence_end() const
115 Sequence::const_iterator
116 GlSequence::sequence_begin(GLfloat left, GLfloat right) const
118 // the following code will be wrong when sequences can be slid around
119 // so make sure we break.
122 if ( leftbase(left) > seq.size() or left > right )
125 return seq.begin() + leftbase(left);
128 Sequence::const_iterator
129 GlSequence::sequence_end(GLfloat left, GLfloat right) const
131 // the following code will be wrong when sequences can be slid around
132 // so make sure we break.
135 if ( rightbase(right) > seq.size() or left > right )
138 return seq.begin() + rightbase(right);
142 //! set default track draw color
143 void GlSequence::setColor(Color &c)
148 //! get default track draw color
149 Color GlSequence::color()
155 int GlSequence::get_viewport_pixel_width()
158 glGetIntegerv(GL_VIEWPORT, viewport);
159 return viewport[3]; // grab the viewport width
162 bool GlSequence::is_sequence_renderable(GLfloat left,
164 int viewport_width) const
166 // if called with default argument, go get the viewable width
167 if (viewport_width == -1) {
168 viewport_width = get_viewport_pixel_width();
170 GLfloat world_width = right - left;
171 GLfloat pixels_needed = (char_pix_per_world_unit * world_width);
173 // if the number of pixels taken up by rendering the characters
174 // that'd show up in the current ortho width is less than the window
175 // width we can actually draw something
176 return pixels_needed < viewport_width;
180 void GlSequence::draw(GLfloat left, GLfloat right) const
182 if ( not is_sequence_renderable(left, right) ) {
183 draw_track(left, right);
185 draw_sequence(left, right);
187 draw_annotations(left, right);
190 void GlSequence::draw_box(GLfloat left, GLfloat right,
191 GLfloat height, GLfloat z) const
193 GLfloat offset = height/2.0;
194 GLfloat top = seq_y + offset;
195 GLfloat bottom = seq_y - offset;
198 glVertex3f(left, top, z);
199 glVertex3f(left, bottom, z);
200 glVertex3f(right, bottom, z);
201 glVertex3f(right, top, z);
205 void GlSequence::draw_track(GLfloat left, GLfloat right) const
207 glColor3fv(drawColor.get());
208 // draw main sequence track
209 draw_box(seq_x, seq_x+seq.size(), seq_height, 0.0);
212 void GlSequence::draw_annotations(GLfloat left, GLfloat right) const
215 glLineWidth(seq_height);
216 GLfloat annotation_z = seq_z + 1.0;
217 const std::list<annot>& annots = seq.annotations();
218 const std::list<motif>& motifs = seq.motifs();
219 for (std::list<annot>::const_iterator annot_itor = annots.begin();
220 annot_itor != annots.end();
221 ++annot_itor, ++annotation_z)
223 glColor3f(0.0, 0.5, 0.0);
224 draw_box(seq_x+annot_itor->start, seq_x+annot_itor->end,
225 seq_height, annotation_z);
228 for (std::list<motif>::const_iterator motifs_itor = motifs.begin();
229 motifs_itor != motifs.end();
230 ++motifs_itor, ++annotation_z)
232 glColor3fv(color_mapper.lookup("motif", motifs_itor->sequence).get());
233 draw_box(seq_x+motifs_itor->start, seq_x+motifs_itor->end,
234 seq_height, annotation_z);
240 const int STROKE = 2;
243 typedef struct charpoint {
249 {0, -5, PT}, {2.5, 5, PT}, {5, -5, STROKE},
250 {0.75, -2, PT}, {4.25, -2, END}
254 {2.5, -5, PT}, {2.5,5, STROKE}, {0, 5, PT}, {5, 5, END}
258 {5, 3, PT}, {3, 5, PT}, {2, 5, PT}, {0, 3, PT}, {0, -3, PT},
259 {2, -5, PT}, {3, -5, PT}, {5, -3, STROKE},
260 {2.5, -1, PT}, {5, -1,PT}, {5, -5, END}
264 {4.9, 3, PT}, {3, 5, PT}, {2, 5, PT}, {0, 3, PT}, {0, -3, PT},
265 {2, -5, PT}, {3, -5, PT}, {5, -3, END}
268 CP Xdata[] = {{ 0, 5, PT}, {5, -5,STROKE},{0,-5,PT},{5, 5, END}};
269 CP Ndata[] = {{ 0, -5, PT}, {0, 5, PT}, {5, -5, PT}, {5, 5, END}};
271 static void drawLetter(CP *l, GLfloat z)
273 glBegin(GL_LINE_STRIP);
277 glVertex3f(l->x, l->y, z);
280 glVertex3f(l->x, l->y, z);
282 glBegin(GL_LINE_STRIP);
285 glVertex3f(l->x, l->y, z);
290 throw runtime_error("data structure failure");
296 void GlSequence::draw_sequence(GLfloat left, GLfloat right) const
298 // FIXME: basically this needs to be greater than the number of annotations
299 const GLfloat z = 30;
301 glColor3fv(drawColor.get());
303 Sequence::const_iterator seq_itor = sequence_begin(left, right);
304 Sequence::const_iterator seq_end = sequence_end(left, right);
305 Sequence::size_type basepair = 0;
307 assert(seq_end - seq_itor >= 0);
308 while(seq_itor != seq_end)
310 assert ( basepair < seq.size() );
312 glTranslatef( leftbase(left) + basepair, seq_y, 1.0 );
313 glScalef(0.1, 1.0, 1.0);
316 drawLetter(Adata, z);
319 drawLetter(Tdata, z);
322 drawLetter(Gdata, z);
325 drawLetter(Cdata, z);
328 drawLetter(Ndata, z);
331 drawLetter(Xdata, z);
340 bool operator==(const GlSequence &left, const GlSequence &right)
342 return ( (left.seq_x == right.seq_x) and
343 (left.seq_y == right.seq_y) and
344 (left.seq_z == right.seq_z) and
345 (left.seq_height == right.seq_height) and
346 (left.drawColor == right.drawColor));