color_mapper->appendInstanceColor("motif", motif, color);
}
-void Mussa::add_motifs(const vector<string>& motifs,
+void Mussa::set_motifs(const vector<string>& motifs,
const vector<Color>& colors)
{
if (motifs.size() != colors.size()) {
throw mussa_error("motif and color vectors must be the same size");
}
+ motif_sequences.clear();
for(size_t i = 0; i != motifs.size(); ++i)
{
add_motif(motifs[i], colors[i]);
void save_old();
void load_old(char * load_file_path, int s_num);
- // manage motif lists
- void add_motif(const std::string& motifs,
- const Color& colors);
- //! add vector of motifs and colors to our motif collection
- /*! this depends on sets and color maps being unique
+ // manage motif lists
+ //! add a motif it wont be applied until update_sequences_motif is called
+ void add_motif(const std::string& motifs, const Color& colors);
+ //! add vector of motifs and colors to our motif collection
+ /*! this will automatically call update_sequences_motif
+ * this depends on sets and color maps being unique
* (aka if you add the same item more than once it doesn't
- * increase the size of the data structure
+ * increase the size of the data structure)
*/
- void add_motifs(const std::vector<std::string>& motifs,
+ void set_motifs(const std::vector<std::string>& motifs,
const std::vector<Color>& colors);
//! load motifs from an ifstream
/*! The file should look something like
a_motif = motif_normalize(a_motif);
//std::cout << "motif is: " << a_motif << std::endl;
- if (a_motif != "")
+ if (a_motif.size() > 0)
{
//std::cout << "Sequence: none blank motif\n";
motif_scan(a_motif, &motif_match_starts);
a_motif_rc = rc_motif(a_motif);
// make sure not to do search again if it is a palindrome
- if (a_motif_rc != a_motif)
+ if (a_motif_rc != a_motif) {
motif_scan(a_motif_rc, &motif_match_starts);
+ }
}
return motif_match_starts;
}
Mussa m1;
m1.append_sequence("AAAAGGGGTTTT");
m1.append_sequence("GGGCCCCTTGGTT");
- m1.add_motifs(motifs, colors);
+ m1.set_motifs(motifs, colors);
int first_size = m1.motifs().size();
BOOST_CHECK_EQUAL( first_size, 1 );
- m1.add_motifs(motifs, colors);
+ BOOST_REQUIRE(first_size > 0);
+ BOOST_CHECK_EQUAL(*(m1.motifs().begin()), motifs.front());
+ // make sure that our sequences have the right number of motifs
+ BOOST_CHECK_EQUAL(m1.sequences()[0]->motifs().size(), 1);
+ BOOST_CHECK_EQUAL(m1.sequences()[1]->motifs().size(), 1); // because of rc
+
+ // verify that setting the motif clears the arrays
+ m1.set_motifs(motifs, colors);
BOOST_CHECK_EQUAL( first_size, m1.motifs().size() );
+ // make sure that our sequences have the right number of motifs
+ BOOST_CHECK_EQUAL(m1.sequences()[0]->motifs().size(), 1);
+ BOOST_CHECK_EQUAL(m1.sequences()[1]->motifs().size(), 1);
+
+ // add a different motif
+ motifs.clear();
+ motifs.push_back("CCTTGG");
+ BOOST_CHECK_EQUAL(motifs.size(), 1);
+ m1.set_motifs(motifs, colors);
+ BOOST_CHECK_EQUAL(m1.motifs().size(), 1);
+ BOOST_REQUIRE(m1.motifs().size() > 0);
+ BOOST_CHECK_EQUAL(*(m1.motifs().begin()), motifs.front());
+ BOOST_CHECK_EQUAL(m1.sequences()[0]->motifs().size(), 0);
+ BOOST_CHECK_EQUAL(m1.sequences()[1]->motifs().size(), 1);
+
+ // try a motif that doesn't exist
+ motifs.clear();
+ motifs.push_back("CCTTGG");
+ BOOST_CHECK_EQUAL(motifs.size(), 1);
+ m1.set_motifs(motifs, colors);
+ BOOST_CHECK_EQUAL(m1.motifs().size(), 1);
+ BOOST_CHECK_EQUAL(m1.sequences()[0]->motifs().size(), 0);
+ BOOST_CHECK_EQUAL(m1.sequences()[1]->motifs().size(), 1);
+
}
static void
BOOST_CHECK( motif_end == s1.motifs().end() );
BOOST_CHECK( motif_i == motif_end );
-
+ // this shouldn't show up
s1.add_motif(bogus);
BOOST_CHECK( s1.motifs().begin() == s1.motifs().end() );
+ BOOST_CHECK_EQUAL( s1.motifs().size(), 0 );
+
s1.add_motif(m);
BOOST_CHECK( s1.motifs().begin() != s1.motifs().end() );
BOOST_CHECK_EQUAL( s1.motifs().size(), 2 );
}
}
+BOOST_AUTO_TEST_CASE( motif_annotation_update )
+{
+ string s("CCGTCCCCCATCATCGCGGCTCTCCGAGAGTCCCGCGCCCCACTCCCGGC"
+ "ACCCACCTGACCGCGGGCGGCTCCGGCCCCGCTTCGCCCCACTGCGATCA"
+ "GTCGCGTCCCGCAGGCCAGGCACGCCCCGCCGCTCCCGCTGCGCCGGGCG"
+ "TCTGGGACCTCGGGCGGCTCCTCCGAGGGGCGGGGCAGCCGGGAGCCACG"
+ "CCCCCGCAGGTGAGCCGGCCACGCCCACCGCCCGTGGGAAGTTCAGCCTC"
+ "GGGGCTCCAGCCCCGCGGGAATGGCAGAACTTCGCACGCGGAACTGGTAA"
+ "CCTCCAGGACACCTCGAATCAGGGTGATTGTAGCGCAGGGGCCTTGGCCA"
+ "AGCTAAAACTTTGGAAACTTTAGATCCCAGACAGGTGGCTTTCTTGCAGT");
+ Sequence seq(s);
+
+ // starting conditions
+ BOOST_CHECK_EQUAL(seq.annotations().size(), 0);
+ BOOST_CHECK_EQUAL(seq.motifs().size(), 0);
+ seq.add_annotation(annot(0, 10, "0-10", "0-10"));
+ seq.add_annotation(annot(10, 20, "10-20", "10-20"));
+ seq.add_annotation(annot(0, 20, "0-20", "0-20"));
+ BOOST_CHECK_EQUAL(seq.annotations().size(), 3);
+ BOOST_CHECK_EQUAL(seq.motifs().size(), 0);
+ seq.add_motif("CCGTCCC");
+ BOOST_CHECK_EQUAL(seq.annotations().size(), 3);
+ BOOST_CHECK_EQUAL(seq.motifs().size(), 1);
+ seq.clear_motifs();
+ BOOST_CHECK_EQUAL(seq.annotations().size(), 3);
+ BOOST_CHECK_EQUAL(seq.motifs().size(), 0);
+}
+
BOOST_AUTO_TEST_CASE( out_operator )
{
string s("AAGGCCTT");
colors.push_back((*md_i)->color());
}
}
- analysis->add_motifs(motifs, colors);
+ analysis->set_motifs(motifs, colors);
emit changedMotifs();
}