throw errors when spirit parsing fails
[mussa.git] / alg / mussa.cpp
index 50991c1e1d1411a574f9663b6f43ffbacfa8a0ef..634cb6d58dae2c72f032657dfe75152df8ab8bf1 100644 (file)
@@ -764,7 +764,7 @@ void Mussa::set_motifs(const vector<Sequence>& motifs,
 
 // 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;
@@ -772,20 +772,23 @@ struct push_back_motif {
   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_)
   {
   }
 
@@ -801,10 +804,18 @@ struct push_back_motif {
     // 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)
 {
@@ -816,6 +827,7 @@ 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;
@@ -840,21 +852,18 @@ void Mussa::load_motifs(std::istream &in)
         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,