I wish I'd stop cutting-n-pasting the name of the class from the .cpp
[mussa.git] / alg / mussa.hpp
index dbb04f5ce9dfab73e9d84d13dbae142b06f9d78c..6a0ca4eeca4743df44d7af040233d788c40ed147 100644 (file)
@@ -13,7 +13,8 @@
 //                        ----------------------------------------
 //                          ---------- mussa_class.hh -----------
 //                        ----------------------------------------
-#include <QObject> 
+#include <QObject>
+#include <QString> 
 
 #include <boost/filesystem/path.hpp>
 #include <boost/shared_ptr.hpp>
 
 std::string int_to_str(int an_int);
 
+class Mussa;
+//! provide a simple name to point to our Mussa shared_ptr
+typedef boost::shared_ptr<Mussa> MussaRef;
+
 class Mussa : public QObject
 {
     Q_OBJECT 
 
 signals:
     //! call whatever signaling system we want
-    void progress(const std::string& description, int cur, int max);
+    void progress(const QString& description, int cur, int max);
+    //! triggered when our state changes between unsaved(true) and saved(false)
+    void isModified(bool);
 
 public:
+    typedef std::set<Sequence> motif_set;
     enum analysis_modes { TransitiveNway, RadialNway, EntropyNway, 
                           RecursiveNway };
 
     Mussa();
     Mussa(const Mussa &);
 
-    void save();
+    //! dynamically construct a new Mussa object and return a reference to it
+    static MussaRef init();
+    
+    //! save all of mussa
+    void save(boost::filesystem::path save_path="");
+    //! save all of mussa
+    void save(const std::string& save_path) {
+      save(boost::filesystem::path(save_path));
+    }
     //! save the nway comparison
     void save_muway(boost::filesystem::path save_path);
     //! load a saved analysis directory
     void load(boost::filesystem::path ana_path);
+    //! load a saved analysis 
+    void load(const std::string& ana_path) { 
+       load(boost::filesystem::path(ana_path)); 
+    }
+    // ! return path to the where the analysis is stored
+    boost::filesystem::path get_analysis_path() const;
+    //! set analysis path
+    void set_analysis_path(boost::filesystem::path);
 
     //! clear parameters and initialize data lists
     void clear();
 
     //! set parameters from a file - 'mupa' ~ mussa parameters
-    void load_mupa_file(std::string para_file_path) { load_mupa_file(boost::filesystem::path(para_file_path));}
+    void load_mupa_file(const std::string& para_file_path) {
+      load_mupa_file(boost::filesystem::path(para_file_path));
+    }
     void load_mupa_file(boost::filesystem::path para_file_path);
+    //! load mussa parameters from a stream, specifing output location
+    void load_mupa_stream(
+           std::istream & para_file, 
+           boost::filesystem::path& file_path_base
+         );
+    
 
     // set parameters individually (eg from user input into gui classes)
     //! set analysis name
     void set_name(std::string a_name);
     //! return name for this analysis
-    std::string get_name();
+    std::string get_name() const;
+    //! return a reasonable window title for this analysis
+    /*! this returns the "variable" portion for a title
+     */
+    std::string get_title() const;
 
     //! return number of sequences in this analyzis
     /*! this returns either the_seqs.size() or seq_files.size()
@@ -85,13 +121,27 @@ public:
     //! must be in range [threshold..window size]
     void set_soft_threshold(int sft_thres);
     int get_soft_threshold() const;
+
+    //! should we append the window size to the analysis name
+    void set_append_window(bool v);
+    //! should we append the window size to the analysis name
+    bool get_append_window();
+
+    //! should we append the threshold to the analysis name
+    void set_append_threshold(bool v);
+    //! should we append the threshold to the analysis name
+    bool get_append_threshold();
  
     void set_analysis_mode(enum analysis_modes new_ana_mode);
     enum analysis_modes get_analysis_mode() const;
     //! return a string name for an analysis mode
     std::string get_analysis_mode_name() const;
+    //! set our current dirty state
+    void set_dirty(bool);
     //! return if we have unsaved changes
-    bool is_dirty() const { return dirty; }
+    bool is_dirty() const;
+    //! is there anything loaded into this analysis?
+    bool empty() const;
 
     //! return the refined paths found by the nway analysis.
     const NwayPaths& paths() const;
@@ -110,7 +160,7 @@ public:
      */
     void analyze();
     /*! Run the nway filtering algorithm, 
-     *  this might be used when changing the soft threshhold?
+     *  automatically called when the soft threshhold has changed?
      */
     void nway();
 
@@ -157,18 +207,24 @@ public:
      */
     void set_motifs(const std::vector<Sequence>& motifs, 
                     const std::vector<Color>& colors);
-    //! load motifs from an ifstream
     /*! The file should look something like
      *  <sequence> <red> <green> <blue>
      *  where sequence is a string of IUPAC symbols
      *  and red,green,blue are a white space separated list of floats
      *  in the range [0.0, 1.0]
      */
-    void load_motifs(std::istream &);
     //! load a list of motifs from a file named filename
     void load_motifs(boost::filesystem::path filename);
+    //! load motifs from an ifstream
+    /*! \sa Mussa::load_motifs(boost::filesystem::path)
+     */
+    void load_motifs(std::istream &);
+    //! save motif list to the specified filename
+    void save_motifs(boost::filesystem::path filename);
+    //! save motif list to an ostream
+    void save_motifs(std::ostream &);
     //! return our motifs;
-    const std::set<Sequence>& motifs() const;
+    const motif_set& motifs() const;
 
     //! return color mapper
     boost::shared_ptr<AnnotationColors> colorMapper();
@@ -203,9 +259,11 @@ public:
     NwayPaths the_paths;
 
     //! motif list
-    std::set<Sequence> motif_sequences;
+    motif_set motif_sequences;
     //! color manager
     boost::shared_ptr<AnnotationColors> color_mapper;
+    //! path to our analysis
+    boost::filesystem::path analysis_path;
     //! flag indicating if we have unsaved changes
     bool dirty;