ticket:62 fix local alignment
[mussa.git] / alg / mussa.hpp
1 #ifndef _MUSSA_CLASS_H_
2 #define _MUSSA_CLASS_H_
3 //  This file is part of the Mussa source distribution.
4 //  http://mussa.caltech.edu/
5 //  Contact author: Tristan  De Buysscher, tristan@caltech.edu
6
7 // This program and all associated source code files are Copyright (C) 2005
8 // the California Institute of Technology, Pasadena, CA, 91125 USA.  It is
9 // under the GNU Public License; please see the included LICENSE.txt
10 // file for more information, or contact Tristan directly.
11
12
13 //                        ----------------------------------------
14 //                          ---------- mussa_class.hh -----------
15 //                        ----------------------------------------
16 #include <boost/filesystem/path.hpp>
17
18 #include <list>
19 #include <string>
20 #include <vector>
21 #include <set>
22 #include <istream>
23
24 #include "alg/annotation_colors.hpp"
25 #include "alg/nway_paths.hpp"
26 #include "alg/sequence.hpp"
27
28 std::string int_to_str(int an_int);
29
30 class Mussa
31 {
32   friend class ConnWindow;
33   public:
34     enum analysis_modes { TransitiveNway, RadialNway, EntropyNway, 
35                           RecursiveNway };
36
37     Mussa();
38     Mussa(const Mussa &);
39
40     void save();
41     //! save the nway comparison
42     void save_muway(boost::filesystem::path save_path);
43     //! load a saved analysis directory
44     void load(boost::filesystem::path ana_path);
45
46     //! clear parameters and initialize data lists
47     void clear();
48
49     //! set parameters from a file - 'mupa' ~ mussa parameters
50     void load_mupa_file(std::string para_file_path) { load_mupa_file(boost::filesystem::path(para_file_path));}
51     void load_mupa_file(boost::filesystem::path para_file_path);
52
53     // set parameters individually (eg from user input into gui classes)
54     //! set analysis name
55     void set_name(std::string a_name);
56     //! return name for this analysis
57     std::string get_name();
58
59     //! return number of sequences in this analyzis
60     /*! this returns either the_seqs.size() or seq_files.size()
61      *  depending on which has data loaded in
62      *  (silly delayed loading of sequence data)
63      */
64     int size() const;
65     //! set number of bases for this window size
66     void set_window(int a_window);
67     //! get number of bases for the sliding window
68     int get_window() const;
69     //! set number of bases that must match for a window to be saved
70     void set_threshold(int a_threshold);
71     //! get number of bases that must match for a window to be saved
72     int get_threshold() const;
73     void set_soft_thres(int sft_thres);
74     int get_soft_thres() const;
75  
76     void set_analysis_mode(enum analysis_modes new_ana_mode);
77     enum analysis_modes get_analysis_mode() const;
78     //! return a string name for an analysis mode
79     std::string get_analysis_mode_name() const;
80
81     //! return the refined paths found by the nway analysis.
82     const NwayPaths& paths() const;
83
84     //! given selected_paths, and view_paths, compute per base pair matches
85     //template <class IteratorT>
86     void createLocalAlignment(std::list<ConservedPath>::iterator begin, 
87                               std::list<ConservedPath>::iterator end,
88                               std::list<ConservedPath::path_type>& result,
89                               std::list<std::vector<bool> >& reversed);
90
91     //! run seqcomp and the nway filtering algorithm.
92     /*!analyze will run seqcomp and then the nway algorithm
93      * on whatever sequences have been loaded into this mussa instance.
94      * w & t are for command line override functionality, set to 0 to ignore
95      * \throws mussa_analysis_error 
96      */
97     void analyze(int w=0, int t=0, 
98                  enum analysis_modes ana_mode=TransitiveNway,
99                  double ent_thres=0.0);
100     /*! Run the nway filtering algorithm, 
101      *  this might be used when changing the soft threshhold?
102      */
103     void nway();
104
105     //! appends a string sequence to the list of the_seqs
106     void add_a_seq(std::string a_seq);
107     //! Load a sequence from a fasta file and any annotations
108     /*! \param[in] seq_file the full path to the fasta file
109      *  \param[in] annot_file the full path to an annotation file,
110      *             if is an empty string, we won't bother loading anything
111      *  \param[in] fasta_index specify which sequence in a multisequence fasta
112      *             file
113      *  \param[in] sub_seq_start starting slice index to select a subsequence
114      *             use 0 start from the beginning.
115      *  \param[in] sub_seq_end ending slice index to select a subsequence
116      *             use 0 to go to the end.
117      */
118     void load_sequence(boost::filesystem::path seq_file, 
119                        boost::filesystem::path annot_file, 
120                        int fasta_index, int sub_seq_start=0, int sub_seq_end=0);
121     //! allow examining the sequences we have loaded
122     const std::vector<Sequence>& sequences() const;
123
124     // deprecated - support bridge for python version of mussa
125     // these save & load from the old file format
126     void save_old();
127     void load_old(char * load_file_path, int s_num);
128
129     // manage motif lists
130     //! add vector of motifs and colors to our motif collection
131     /*! this depends on sets and color maps being unique
132      *  (aka if you add the same item more than once it doesn't
133      *  increase the size of the data structure
134      */
135     void add_motifs(const std::vector<std::string>& motifs, 
136                     const std::vector<Color>& colors);
137     //! load motifs from an ifstream
138     /*! The file should look something like
139      *  <sequence> <red> <green> <blue>
140      *  where sequence is a string of IUPAC symbols
141      *  and red,green,blue are a white space separated list of floats
142      *  in the range [0.0, 1.0]
143      */
144     void load_motifs(std::istream &);
145     //! load a list of motifs from a file named filename
146     void load_motifs(boost::filesystem::path filename);
147     //! return our motifs;
148     const std::set<std::string>& motifs() const;
149
150     //! return color mapper
151     AnnotationColors& colorMapper();
152
153   private:
154     //! push motifs to our attached sequences
155     void update_sequences_motifs();
156
157     // Private variables
158     // parameters needed for a mussa analysis
159     //! name of this analysis. (will also be used when saving an analysis)
160     std::string analysis_name;
161     //! how many base pairs to include in a sliding window
162     int window;
163     //! how many base pairs need to match order to record a window as conserved
164     int threshold;
165     int soft_thres;
166     //! which nway comparison algorithm to use.
167     enum analysis_modes ana_mode;
168     double ent_thres;
169     //! should we append _w<window_size> to the saved analysis
170     bool win_append; 
171     //! should we append _t<threshold> to the saved analysis
172     bool thres_append;
173
174     //! sequence data
175     std::vector<Sequence> the_seqs;
176     //! the seqcomp data
177     std::vector<std::vector<FLPs> > all_comps;
178     //! N-way data, ie the mussa results  
179     NwayPaths the_paths;
180
181     //! motif list
182     std::set<std::string> motif_sequences;
183     //! color manager
184     AnnotationColors color_mapper;
185
186     // Private methods
187     //! loads sequence and annotations from fasta and annotation file
188     void seqcomp();
189
190 };
191 #endif