// Helper functor to append created motifs to our Mussa analysis
struct push_back_motif {
- std::set<Sequence>& motif_set;
+ Mussa::motif_set& motifs;
boost::shared_ptr<AnnotationColors> color_mapper;
std::string& seq_string;
std::string& name;
float& green;
float& blue;
float& alpha;
+ int& parsed;
- push_back_motif(std::set<Sequence>& motif_set_,
+ push_back_motif(Mussa::motif_set& motifs_,
boost::shared_ptr<AnnotationColors> color_mapper_,
std::string& seq_,
std::string& name_,
- float &red_, float &green_, float &blue_, float &alpha_)
- : motif_set(motif_set_),
+ float &red_, float &green_, float &blue_, float &alpha_,
+ int &parsed_)
+ : motifs(motifs_),
color_mapper(color_mapper_),
seq_string(seq_),
name(name_),
red(red_),
green(green_),
blue(blue_),
- alpha(alpha_)
+ alpha(alpha_),
+ parsed(parsed_)
{
}
// just attach colors directly to the motif.
Color c(red, green, blue);
color_mapper->appendInstanceColor("motif", seq.c_str(), c);
- motif_set.insert(seq);
+ motifs.insert(seq);
+ ++parsed;
};
};
+void Mussa::load_motifs(fs::path filename)
+{
+ fs::ifstream f;
+ f.open(filename, ifstream::in);
+ load_motifs(f);
+}
+
// I mostly split the ifstream out so I can use a stringstream to test it.
void Mussa::load_motifs(std::istream &in)
{
float green = 0.0;
float blue = 0.0;
float alpha = 1.0;
+ int parsed = 1;
// slurp our data into a string
std::streamsize bytes_read = 1;
spirit::real_p[spirit::assign_a(red)] >> +spirit::space_p >>
spirit::real_p[spirit::assign_a(green)] >> +spirit::space_p >>
spirit::real_p[spirit::assign_a(blue)] >> +spirit::space_p
- )[push_back_motif(motif_sequences, color_mapper, seq, name, red, green, blue, alpha)]
+ )[push_back_motif(motif_sequences, color_mapper, seq, name, red, green, blue, alpha, parsed)]
)).full;
if (not ok) {
- std::clog << "Error parsing motif stream " << std::endl;
+ stringstream msg;
+ msg << "Error parsing motif #" << parsed;
+ // erase our potentially broken motif list
+ motif_sequences.clear();
+ throw motif_load_error(msg.str());
}
update_sequences_motifs();
}
-void Mussa::load_motifs(fs::path filename)
-{
- fs::ifstream f;
- f.open(filename, ifstream::in);
- load_motifs(f);
-}
-
void Mussa::update_sequences_motifs()
{
// once we've loaded all the motifs from the file,