X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=blobdiff_plain;f=alg%2Fglseqbrowser.cpp;h=107099bd824105df653a994699472f3a122cf2fb;hb=55f0a3e9612b3e1df2c588682d7f605203eab421;hp=3342042755d16ca411a5ea5bce39e4657342c57a;hpb=4db52f646d31d4f078e145c0b23eb6fab6693d43;p=mussa.git diff --git a/alg/glseqbrowser.cpp b/alg/glseqbrowser.cpp index 3342042..107099b 100644 --- a/alg/glseqbrowser.cpp +++ b/alg/glseqbrowser.cpp @@ -26,7 +26,8 @@ GlSeqBrowser::GlSeqBrowser(const GlSeqBrowser& gt) 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) { } @@ -264,6 +265,16 @@ float GlSeqBrowser::viewportWidth() const 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() { @@ -297,14 +308,14 @@ double GlSeqBrowser::zoom() const return zoom_level; } -void GlSeqBrowser::setColorMapper(boost::shared_ptr 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() @@ -325,34 +336,36 @@ void GlSeqBrowser::clear_selection() void GlSeqBrowser::push_sequence(const Sequence& s) { - boost::shared_ptr 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 s) +void GlSeqBrowser::push_sequence(SequenceRef s) { - boost::shared_ptr 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 new_gs(new GlSequence(gs)); + GlSequenceRef new_gs(new GlSequence(gs)); push_sequence(new_gs); } -void GlSeqBrowser::push_sequence(boost::shared_ptr 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 >& GlSeqBrowser::sequences() const +const std::vector& GlSeqBrowser::sequences() const { return track_container; } @@ -450,11 +463,10 @@ list GlSeqBrowser::selectedTracks() const //! copy sequence from selected track using formating function template -void GlSeqBrowser::copySelectedTracks(std::list& result, - Item (*formatter)(boost::shared_ptr s, - int left, - int right)) +size_t GlSeqBrowser::copySelectedTracks(std::list& 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(); @@ -468,30 +480,30 @@ void GlSeqBrowser::copySelectedTracks(std::list& result, << endl; } else { // we should be safe - boost::shared_ptr 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 result; struct AsFasta { - static string formatter(boost::shared_ptr 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::iterator result_i = result.begin(); result_i != result.end(); @@ -499,52 +511,53 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer) { copy_buffer.append(*result_i); } + return base_pairs_copied; } //! copy sequence from selected tracks as new sequences -void GlSeqBrowser::copySelectedTracksAsSequences(std::list& result) +size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list& result) { struct AsSequence { - static Sequence formatter(boost::shared_ptr 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& result) { struct AsSeqLocation { - static SequenceLocation formatter(boost::shared_ptr 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 result; struct AsString { - static string formatter(boost::shared_ptr 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::iterator result_i = result.begin(); result_i != result.end(); @@ -552,7 +565,7 @@ void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer) { copy_buffer.append(*result_i); } - + return base_pairs_copied; } void GlSeqBrowser::centerOnPath(const vector& paths) @@ -689,12 +702,14 @@ void GlSeqBrowser::draw_segments() const 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 {