#include "alg/glseqbrowser.hpp"
#include "mussa_exceptions.hpp"
+#include <math.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
viewport_center(gt.viewport_center),
zoom_level(gt.zoom_level),
color_mapper(gt.color_mapper),
- track_container(gt.track_container)
+ track_container(gt.track_container),
+ path_segments(gt.path_segments)
{
}
}
}
+float GlSeqBrowser::get_pixel_width() const
+{
+ GLint viewport[4];
+ glGetIntegerv(GL_VIEWPORT, viewport);
+ GLint vp_width = viewport[3]; // grab the viewport width
+
+ return round((cur_ortho.right-cur_ortho.left)/vp_width);
+}
+
void GlSeqBrowser::setViewportCenter(float x)
{
update_viewport(x, zoom_level);
return cur_ortho.right - cur_ortho.left;
}
+int GlSeqBrowser::viewportPixelHeight() const
+{
+ return viewport_size.y;
+}
+
+int GlSeqBrowser::viewportPixelWidth() const
+{
+ return viewport_size.x;
+}
+
double GlSeqBrowser::zoomOut()
{
return zoom_level;
}
-void GlSeqBrowser::setColorMapper(boost::shared_ptr<AnnotationColors> cm)
+void GlSeqBrowser::setColorMapper(AnnotationColorsRef cm)
{
color_mapper = cm;
}
-const AnnotationColors& GlSeqBrowser::colorMapper()
+const AnnotationColorsRef GlSeqBrowser::colorMapper()
{
- return *color_mapper;
+ return color_mapper;
}
void GlSeqBrowser::clear()
void GlSeqBrowser::push_sequence(const Sequence& s)
{
- boost::shared_ptr<Sequence> seq_copy(new Sequence(s));
- GlSequence gs(seq_copy, color_mapper);
+ GlSequenceRef gs(new GlSequence(s, color_mapper));
push_sequence(gs);
}
-
-void GlSeqBrowser::push_sequence(boost::shared_ptr<Sequence> s)
+void GlSeqBrowser::push_sequence(SequenceRef s)
{
- boost::shared_ptr<GlSequence> gs(new GlSequence(s, color_mapper));
+ GlSequenceRef gs(new GlSequence(*s, color_mapper));
push_sequence(gs);
}
void GlSeqBrowser::push_sequence(GlSequence gs)
{
- boost::shared_ptr<GlSequence> new_gs(new GlSequence(gs));
+ GlSequenceRef new_gs(new GlSequence(gs));
push_sequence(new_gs);
}
-void GlSeqBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
+void GlSeqBrowser::push_sequence(GlSequenceRef gs)
{
+ GlSequenceRef new_gs(new GlSequence(gs));
+ // mark where the sequence is
+ new_gs->add_annotations_for_defined_sequence(draw_track);
+
clear_links();
- track_container.push_back(gs);
+ track_container.push_back(new_gs);
update_layout();
if (track_container.size() > 1)
path_segments.push_back(pair_segment_map());
}
-const std::vector<boost::shared_ptr<GlSequence> >& GlSeqBrowser::sequences() const
+const std::vector<GlSequenceRef >& GlSeqBrowser::sequences() const
{
return track_container;
}
//! copy sequence from selected track using formating function
template<class Item>
-void GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
- Item (*formatter)(boost::shared_ptr<Sequence> s,
- int left,
- int right))
+size_t GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
+ Item (*formatter)(const Sequence& s, int left, int right))
{
+ size_t base_pairs_copied = 0;
result.clear();
for(selected_track_iterator track_i = selected_tracks.begin();
<< endl;
} else {
// we should be safe
- boost::shared_ptr<Sequence> seq = track_container[track_index]->sequence();
+ Sequence seq(*track_container[track_index]);
result.push_back(formatter(seq, track_i->left, track_i->right));
+ base_pairs_copied += max(track_i->right-track_i->left, 0);
}
}
+ return base_pairs_copied;
}
//! copy sequence from selected tracks as FASTA sequences
-void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
+size_t GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
{
std::list<std::string> result;
struct AsFasta {
- static string formatter(boost::shared_ptr<Sequence> seq,
- int left,
- int right)
+ static string formatter(const Sequence& seq, int left, int right)
{
stringstream s;
- s << ">" << seq->get_fasta_header()
+ s << ">" << seq.get_fasta_header()
<< "|" << "subregion=" << left << "-" << right+1
<< std::endl
- << seq->subseq(left, right-left+1) << std::endl;
+ << seq.subseq(left, right-left+1) << std::endl;
return s.str();
}
};
- copySelectedTracks(result, AsFasta::formatter);
+ size_t base_pairs_copied = copySelectedTracks(result, AsFasta::formatter);
// I wish there was some way to use for_each and bind here
for (list<string>::iterator result_i = result.begin();
result_i != result.end();
{
copy_buffer.append(*result_i);
}
+ return base_pairs_copied;
}
//! copy sequence from selected tracks as new sequences
-void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
+size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
{
struct AsSequence {
- static Sequence formatter(boost::shared_ptr<Sequence> seq,
+ static Sequence formatter(const Sequence& seq,
int left,
int right)
{
- return seq->subseq(left, right-left+1);
+ return seq.subseq(left, right-left+1);
}
};
- copySelectedTracks(result, AsSequence::formatter);
+ return copySelectedTracks(result, AsSequence::formatter);
}
-void GlSeqBrowser::copySelectedTracksAsSeqLocation(
+size_t GlSeqBrowser::copySelectedTracksAsSeqLocation(
std::list<SequenceLocation>& result)
{
struct AsSeqLocation {
- static SequenceLocation formatter(boost::shared_ptr<Sequence> seq,
+ static SequenceLocation formatter(const Sequence& seq,
int left,
int right)
{
return SequenceLocation(seq, left, right);
}
};
- copySelectedTracks(result, AsSeqLocation::formatter);
+ return copySelectedTracks(result, AsSeqLocation::formatter);
}
//! copy sequence from selected tracks as plain sequences
-void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
+size_t GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
{
std::list<string> result;
struct AsString {
- static string formatter(boost::shared_ptr<Sequence> seq,
+ static string formatter(const Sequence& seq,
int left,
int right)
{
stringstream s;
- s << seq->subseq(left, right-left+1) << std::endl;
+ s << seq.subseq(left, right-left+1);
return s.str();
}
};
- copySelectedTracks(result, AsString::formatter);
+ size_t base_pairs_copied = copySelectedTracks(result, AsString::formatter);
// I wish there was some way to use for_each and bind here
for (list<string>::iterator result_i = result.begin();
result_i != result.end();
{
copy_buffer.append(*result_i);
}
-
+ return base_pairs_copied;
}
void GlSeqBrowser::centerOnPath(const vector<int>& paths)
glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
const float zdepth = -1.0;
+ const float min_segment_width = max((float)(1.0), get_pixel_width());
+
// each vector contains path_segment_maps of all the connections
// between this track and the next
path_segment_map_vector::const_iterator psmv_i;
back_inserter(selected));
if (not s.reversed) {
+ // forward
if (selected_paths.size() == 0 or selected.size() > 0) {
glColor4f(1.0, 0.0, 0.0, 1.0);
} else {
glColor4f(1.0, 0.7, 0.7, 0.4);
}
} else {
+ // reverse
if (selected_paths.size() == 0 or selected.size() > 0) {
glColor4f(0.0, 0.0, 1.0, 1.0);
} else {
+ track_container[path_index]->x();
float seq_end_x = s.end.x
+ track_container[path_index+1]->x();
- // add in length
- float seq_start_x_length = s.start.x
+ if (s.length <= min_segment_width) {
+ // use lines for elements of length <=1 or < 1 pixel.
+ // and try to center the line
+ const float offset = s.length * 0.5;
+ glBegin(GL_LINES);
+ glVertex3f(seq_start_x+offset, s.start.y, -1);
+ glVertex3f(seq_end_x +offset, s.end.y, -1);
+ glEnd();
+ } else {
+ // otherwise use quads
+ // compute length
+ float seq_start_x_length = s.start.x
+ + s.length
+ + track_container[path_index]->x();
+ float seq_end_x_length = s.end.x
+ s.length
- + track_container[path_index]->x();
- float seq_end_x_length = s.end.x
- + s.length
- + track_container[path_index+1]->x();
- //glBegin(GL_LINES);
- // glVertex3f(seq_start_x, s.start.y, -1);
- // glVertex3f(seq_end_x , s.end.y, -1);
- //glEnd();
-
- glBegin(GL_QUADS);
- glVertex3f(seq_start_x, s.start.y, zdepth);
- glVertex3f(seq_end_x, s.end.y, zdepth);
- glVertex3f(seq_end_x_length, s.end.y, zdepth);
- glVertex3f(seq_start_x_length, s.start.y, zdepth);
- glEnd();
+ + track_container[path_index+1]->x();
+ glBegin(GL_QUADS);
+ glVertex3f(seq_start_x, s.start.y, zdepth);
+ glVertex3f(seq_end_x, s.end.y, zdepth);
+ glVertex3f(seq_end_x_length, s.end.y, zdepth);
+ glVertex3f(seq_start_x_length, s.start.y, zdepth);
+ glEnd();
+ }
// clear the names
glPopName(); glPopName(); glPopName();
}