add Mussa::save_motif()
[mussa.git] / alg / mussa.cpp
index 634cb6d58dae2c72f032657dfe75152df8ab8bf1..18539b83ed44860f8439c5378c39352a2381197c 100644 (file)
@@ -802,8 +802,9 @@ struct push_back_motif {
     name.clear();
     // be nice if glsequence was a subclass of sequence so we could
     // just attach colors directly to the motif.
-    Color c(red, green, blue);
+    Color c(red, green, blue, alpha);
     color_mapper->appendInstanceColor("motif", seq.c_str(), c);
+    alpha = 1.0;
     motifs.insert(seq);
     ++parsed;
   };
@@ -839,19 +840,29 @@ void Mussa::load_motifs(std::istream &in)
   }
   // parse our string
   bool ok = spirit::parse(data.begin(), data.end(),
-     *( 
+     *(
        ( 
         (
          (+spirit::chset<>(alphabet))[spirit::assign_a(seq)] >> 
          +spirit::space_p
         ) >>
         !(
-          (spirit::alpha_p >> *spirit::graph_p)[spirit::assign_a(name)]
-          >> +spirit::space_p
+          (
+            // names can either be letter followed by non-space characters
+            (spirit::alpha_p >> *spirit::graph_p)[spirit::assign_a(name)]
+            |
+            // or a quoted string
+            (
+             spirit::ch_p('"') >> 
+               (+(~spirit::ch_p('"')))[spirit::assign_a(name)] >>
+             spirit::ch_p('"')
+            )
+          ) >> +spirit::space_p
         ) >>
         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
+        spirit::real_p[spirit::assign_a(blue)] >> +spirit::space_p >>
+        !(spirit::real_p[spirit::assign_a(alpha)] >> +spirit::space_p)
        )[push_back_motif(motif_sequences, color_mapper, seq, name, red, green, blue, alpha, parsed)]
      )).full;
   if (not ok) {
@@ -864,6 +875,28 @@ void Mussa::load_motifs(std::istream &in)
   update_sequences_motifs();
 }
 
+void Mussa::save_motifs(fs::path filename)
+{
+  fs::ofstream out_stream;
+  out_stream.open(filename, ofstream::out);
+  save_motifs(out_stream);
+}
+
+void Mussa::save_motifs(std::ostream& out)
+{
+  for(motif_set::iterator motif_i = motif_sequences.begin();
+      motif_i != motif_sequences.end();
+      ++motif_i)
+  {
+    out << motif_i->get_sequence() << " ";
+    if (motif_i->get_name().size() > 0) {
+      out << "\"" << motif_i->get_name() << "\" ";
+    }
+    out << color_mapper->lookup("motif", motif_i->get_sequence());
+    out << std::endl;
+  }
+}
+
 void Mussa::update_sequences_motifs()
 {
   // once we've loaded all the motifs from the file,