using namespace std;
+GlSeqBrowser::SequenceLocation::SequenceLocation(
+ const Sequence& s,
+ int l,
+ int c
+) : sequence(s), left(l), count(c)
+{
+}
+
GlSeqBrowser::GlSeqBrowser()
: border_width(25),
cur_ortho(400.0, 0.0, 600.0, 0.0),
}
//! copy sequence from selected track using formating function
-void GlSeqBrowser::copySelectedTracks(std::string& copy_buffer,
- format_track formatter)
+template<class Item>
+void GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
+ Item (*formatter)(const Sequence& s, int left, int right))
{
- copy_buffer.clear();
+ result.clear();
for(selected_track_iterator track_i = selected_tracks.begin();
track_i != selected_tracks.end();
} else {
// we should be safe
const Sequence& seq = track_container[track_index].sequence();
- copy_buffer += formatter(seq, track_i->left, track_i->right);
+ result.push_back(formatter(seq, track_i->left, track_i->right));
}
}
}
//! copy sequence from selected tracks as FASTA sequences
void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
{
+ std::list<std::string> result;
struct AsFasta {
static string formatter(const Sequence& seq, int left, int right)
{
return s.str();
}
};
- copySelectedTracks(copy_buffer, AsFasta::formatter);
+ 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();
+ ++result_i)
+ {
+ copy_buffer.append(*result_i);
+ }
}
//! copy sequence from selected tracks as new sequences
-/*
-void GlSeqBrowser::copySelectedTracksAsSequence(std::string& copy_buffer)
+void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
{
struct AsSequence {
- static string formatter(const Sequence& seq, int left, int right)
+ static Sequence formatter(const Sequence& seq, int left, int right)
{
- stringstream s;
- s << ">" << seq.get_header()
- << "|" << "subregion=" << left << "-" << right+1
- << std::endl
- << seq.subseq(left, right-left+1) << std::endl;
- return s.str();
+ return seq.subseq(left, right-left+1);
+ }
+ };
+ copySelectedTracks(result, AsSequence::formatter);
+}
+
+void GlSeqBrowser::copySelectedTracksAsSeqLocation(
+ std::list<GlSeqBrowser::SequenceLocation>& result)
+{
+ struct AsSeqLocation {
+ static GlSeqBrowser::SequenceLocation
+ formatter(const Sequence& seq, int left, int right)
+ {
+ return SequenceLocation(seq, left, right);
}
};
- copySelectedTracks(copy_buffer, AsFasta::formatter);
+ copySelectedTracks(result, AsSeqLocation::formatter);
}
-*/
//! copy sequence from selected tracks as plain sequences
void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
{
+ std::list<string> result;
struct AsString {
static string formatter(const Sequence& seq, int left, int right)
{
}
};
- copySelectedTracks(copy_buffer, AsString::formatter);
+ 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();
+ ++result_i)
+ {
+ copy_buffer.append(*result_i);
+ }
+
}
void GlSeqBrowser::centerOnPath(const vector<int>& paths)
void link(const std::vector<int>& path, const std::vector<bool>& isRC, int length);
//! returns the index of pathids based on order added by link
const std::set<int>& selectedPaths() const;
- //! define our function for formating sequence copy
- typedef std::string format_track(const Sequence& s, int left, int right);
//! copy sequence from selected track using formating function
- void copySelectedTracks(std::string& copy_buffer, format_track func);
- //! copy sequence from selected tracks as plain sequences
- void copySelectedTracksAsString(std::string& copy_buffer);
+ template<class Item>
+ void copySelectedTracks(std::list<Item>& result,
+ Item (*format_track)(const Sequence& s, int left, int right));
//! copy sequence from selected tracks as FASTA sequences
void copySelectedTracksAsFasta(std::string& copy_buffer);
+ //! copy sequence from selected tracks as a list of sequences
+ void copySelectedTracksAsSequences(std::list<Sequence>& result);
+ //! copy sequence from selected tracks as plain sequences
+ void copySelectedTracksAsString(std::string& copy_buffer);
+
+ //! convenience structure for holding selected track segments
+ struct SequenceLocation {
+ const Sequence& sequence;
+ int left;
+ int count;
+ SequenceLocation(const Sequence& s, int l, int c);
+ };
+ //! copy tracks as a sequence and its coordinates
+ void copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& result);
//! Provide a logical name for a type discriminator for our glName stack
}
-// takes a string and sets it as the next seq
-void
-Mussa::add_a_seq(string a_seq)
+void Mussa::append_sequence(Sequence a_seq)
{
- Sequence aSeq(a_seq);
- the_seqs.push_back(aSeq);
+ the_seqs.push_back(a_seq);
}
const vector<Sequence>&
void nway();
//! appends a string sequence to the list of the_seqs
- void add_a_seq(std::string a_seq);
+ // void append_sequence(std::string a_seq);
+ //! appends a sequence to the list of the_seqs
+ void append_sequence(Sequence a_seq);
+
//! Load a sequence from a fasta file and any annotations
/*! \param[in] seq_file the full path to the fasta file
* \param[in] annot_file the full path to an annotation file,
{
}
+Sequence::Sequence(const char *seq)
+{
+ set_filtered_sequence(seq);
+}
+
Sequence::Sequence(const std::string& seq)
- : std::string(),
- header(""),
- species("")
{
set_filtered_sequence(seq);
}
header = s.header;
species = s.species;
annots = s.annots;
+ motif_list = s.motif_list;
}
return *this;
}
-Sequence &Sequence::operator=(const std::string& s)
-{
- set_filtered_sequence(s);
- return *this;
-}
-
static void multiplatform_getline(std::istream& in, std::string& line)
{
line.clear();
public:
Sequence();
~Sequence();
+ Sequence(const char* seq);
Sequence(const std::string& seq);
Sequence(const Sequence& seq);
//! assignment to constant sequences
Sequence &operator=(const Sequence&);
- Sequence &operator=(const std::string &);
//! set sequence to a (sub)string containing nothing but AGCTN
void set_filtered_sequence(const std::string& seq,
std::string s2("TTTTNNNN");
Mussa analysis;
- analysis.add_a_seq(s0);
- analysis.add_a_seq(s1);
- analysis.add_a_seq(s2);
+ analysis.append_sequence(s0);
+ analysis.append_sequence(s1);
+ analysis.append_sequence(s2);
BOOST_CHECK_EQUAL( analysis.sequences().size(), 3 );
BOOST_CHECK_EQUAL( analysis.sequences()[0], s0);
istringstream test_istream(data);
Mussa m1;
- m1.add_a_seq("AAAAGGGGTTTT");
- m1.add_a_seq("GGGCCCCTTGGTT");
+ m1.append_sequence("AAAAGGGGTTTT");
+ m1.append_sequence("GGGCCCCTTGGTT");
m1.load_motifs(test_istream);
for (vector<Sequence>::const_iterator seq_i = m1.sequences().begin();
colors.push_back(Color(1.0, 0.0, 0.0));
Mussa m1;
- m1.add_a_seq("AAAAGGGGTTTT");
- m1.add_a_seq("GGGCCCCTTGGTT");
+ m1.append_sequence("AAAAGGGGTTTT");
+ m1.append_sequence("GGGCCCCTTGGTT");
m1.add_motifs(motifs, colors);
int first_size = m1.motifs().size();
BOOST_CHECK_EQUAL( first_size, 1 );
Sequence seq1(s1);
Mussa analysis;
- analysis.add_a_seq(s0);
- analysis.add_a_seq(s1);
+ analysis.append_sequence(s0);
+ analysis.append_sequence(s1);
analysis.set_threshold(3);
analysis.set_window(4);
analysis.analyze();
}
+BOOST_AUTO_TEST_CASE( subanalysis )
+{
+ Sequence s1("AATGAAGATTTTAATGCTTTAATTTTGTTTTGTAAACTTCGAATTTCCAAAATTTGAAA");
+ Sequence s2("AGGAGCAAGTTCGCTTCATCGAGAATTTTTAATTTTTAGTCAAATTTTCCAATGTCTGA");
+
+ Mussa analysis;
+ analysis.append_sequence(s1);
+ analysis.append_sequence(s2);
+ analysis.set_threshold(8);
+ analysis.set_window(8);
+ analysis.analyze();
+
+ NwayPaths perfect_path = analysis.paths();
+ int perfect_match_count = perfect_path.pathz.size();
+
+ Sequence sub1 = s1.subseq(2, s1.size()-4);
+ Sequence sub2 = s2.subseq(2, s2.size()-4);
+ Mussa subanalysis;
+ subanalysis.append_sequence(sub1);
+ subanalysis.append_sequence(sub2);
+ subanalysis.set_threshold(7);
+ subanalysis.set_window(8);
+ subanalysis.analyze();
+ NwayPaths one_mismatch_path = subanalysis.paths();
+ int one_mismatch_count = one_mismatch_path.pathz.size();
+
+ BOOST_CHECK( perfect_match_count < one_mismatch_count );
+}
string s2("TTTTNNNN");
Mussa analysis;
- analysis.add_a_seq(s0);
- analysis.add_a_seq(s1);
- analysis.add_a_seq(s2);
+ analysis.append_sequence(s0);
+ analysis.append_sequence(s1);
+ analysis.append_sequence(s2);
analysis.set_window(4);
analysis.set_threshold(3);
analysis.analyze();
Sequence seq1(s1);
Mussa analysis;
- analysis.add_a_seq(s0);
- analysis.add_a_seq(s1);
+ analysis.append_sequence(s0);
+ analysis.append_sequence(s1);
analysis.set_window(4);
analysis.set_threshold(3);
analysis.analyze();
// now that we've got some data lets see if it crashes
Mussa m1;
- m1.add_a_seq(seq1);
- m1.add_a_seq(seq2);
- m1.add_a_seq(seq3);
+ m1.append_sequence(seq1);
+ m1.append_sequence(seq2);
+ m1.append_sequence(seq3);
m1.set_window(10);
m1.set_threshold(8);
.def("analyze", &Mussa::analyze, "Run the analysis")
.def("paths", &Mussa::paths, py::return_internal_reference<>())
//.def("sequences", &Mussa::sequences)
- .def("addSequence", &Mussa::add_a_seq)
+ .def("addSequence", &Mussa::append_sequence)
;
py::enum_<Mussa::analysis_modes>("analysis_modes")
IntAction.hpp
MussaAlignedWindow.hpp
MussaWindow.hpp
+ SubanalysisWindow.hpp
ThresholdWidget.hpp
ZoomWidget.hpp
motif_editor/MotifDetail.hpp
IntAction.cpp
MussaAlignedWindow.cpp
MussaWindow.cpp
+ SubanalysisWindow.cpp
ThresholdWidget.cpp
ZoomWidget.cpp
motif_editor/MotifDetail.cpp
this, SLOT(createNewAnalysis()));
createNewAnalysisAction->setIcon(QIcon(":/icons/filenew.png"));
- createSubAnalysisAction = new QAction(tr("Define SubAnalysis"), this);
+ createSubAnalysisAction = new QAction(tr("Add to Subanalysis"), this);
connect(createSubAnalysisAction, SIGNAL(triggered()),
this, SLOT(createSubAnalysis()));
newMenu->addAction(createNewAnalysisAction);
newMenu->addAction(loadMupaAction);
newMenu->addAction(loadSavedAnalysisAction);
- //newMenu->addAction(createSubAnalysisAction);
newMenu->addSeparator();
newMenu->addAction(loadMotifListAction);
newMenu->addAction(saveMotifListAction);
newMenu = menuBar()->addMenu(tr("&Edit"));
newMenu->addAction(&browser.getCopySelectedSequenceAsFastaAction());
+ newMenu->addAction(createSubAnalysisAction);
newMenu = menuBar()->addMenu(tr("&View"));
newMenu->addAction(editMotifsAction);
// add some extra features to the context menu
QMenu& popupMenu = browser.getPopupMenu();
popupMenu.addAction(viewMussaAlignmentAction);
+ popupMenu.addAction(createSubAnalysisAction);
}
void MussaWindow::setupAssistant()
void MussaWindow::createSubAnalysis()
{
- NotImplementedBox();
+ if (not subanalysis_window.isVisible()) {
+ subanalysis_window.show();
+ }
}
void MussaWindow::editMotifs()
#include "qui/motif_editor/MotifEditor.hpp"
#include "qui/mussa_setup_dialog/MussaSetupDialog.hpp"
#include "qui/seqbrowser/SequenceBrowserWidget.hpp"
+#include "qui/SubanalysisWindow.hpp"
#include "qui/ThresholdWidget.hpp"
#include "qui/ZoomWidget.hpp"
std::list<boost::shared_ptr<MussaAlignedWindow> > aligned_windows;
MotifEditor *motif_editor;
MussaSetupDialog setup_analysis_dialog;
+ SubanalysisWindow subanalysis_window;
// display our wonderful mussa output
SequenceBrowserWidget browser;
--- /dev/null
+#include "qui/SubanalysisWindow.hpp"
+
+#include <QTextEdit>
+#include <QPushButton>
+
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+
+SubanalysisWindow::SubanalysisWindow(QWidget *parent)
+ : QWidget(parent),
+ text(0),
+ ok(0),
+ cancel(0)
+{
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ QVBoxLayout *verticalLayout = new QVBoxLayout();
+
+ ok = new QPushButton(tr("&OK"), this);
+ cancel = new QPushButton(tr("Cancel"), this);
+ text = new QTextEdit(this);
+
+ buttonLayout->addWidget(ok);
+ buttonLayout->addWidget(cancel);
+ verticalLayout->addWidget(text);
+ verticalLayout->addLayout(buttonLayout);
+ setLayout(verticalLayout);
+}
--- /dev/null
+#ifndef _SUBANALYSIS_H_
+#define _SUBANALYSIS_H_
+
+#include <QWidget>
+
+class QTextEdit;
+class QPushButton;
+
+class SubanalysisWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ SubanalysisWindow(QWidget *parent = 0);
+
+private:
+ QTextEdit *text;
+ QPushButton *ok;
+ QPushButton *cancel;
+};
+#endif